(following up to myself, first sign of madness)

On Sun, May 07, 2006 at 11:58:12AM +0100, James Harvey wrote:
> Adding debug to the code tells me that the SetWindowPos is doing the
> right thing, because a GetWindowRect immediately afterwards is returning
> the -ve coordinates passed in. So my hunch is that there's something
> else (either in vim, or else a bug in SetWindowPos) that's moving it to
> have X coordinate 0. 
> 
> I don't know vim's UI code all that well, so I'll keep digging, but does
> anyone have any other ideas of any code that might assume all window
> coordinates are +ve? 

Aha, found it. The bug is in the following code, in gui.c:

    gui_mch_set_shellsize(width, height, min_width, min_height,
                                         base_width, base_height, direction);
    if (fit_to_display)
    {
        int         x, y;

        /* Some window managers put the Vim window left of/above the screen. */
        gui_mch_update();
        if (gui_mch_get_winpos(&x, &y) == OK && (x < 0 || y < 0))
            gui_mch_set_winpos(x < 0 ? 0 : x, y < 0 ? 0 : y);
    }

On windows, with multiple monitors, gui_mch_get_winpos will definitely
return negative numbers for windows that are to the left or above the
primary monitor, and the gui_mch_set_winpos call here is the one that's
then moving the window a second time so as to not have negative
coordinates. 

If it's essential for other systems to not have negative coordinates
here, it might be worth the windows gui_mch_*_winpos functions
offsetting from the top-right of the entire virtual screen; this is
SM_XVIRTUALSCREEN and SM_VIRTUALSCREEN (from GetSystemMetrics) so as to
make all coordinates positive. 

-James

Reply via email to