All,

The mac port of gvim has a bug in the implementation of :winpos.

Version: 7.1.82 (mac only)

Symptom:

The following command, which should do nothing, causes gvim's window
to move up the screen on the mac:

     exe "winpos " . getwinposx() . " " . getwinpoxy()

On Linux and Windows, the above command correctly does nothing[1].

The problem stems from a mis-matched pair of function calls in
src/gui_mac.c.  Vim implements the getwinposx() and getwinposy()
functions in terms of a port-specific function gui_mch_get_winpos().
In gui_mac.c, this function makes this call[2]:

     GetWindowBounds(gui.VimWindow, kWindowStructureRgn, &bounds);

The constant kWindowStructureRegion requests coordinates relative
to the outer bounds of the window.

The implementation of `:winpos x y` calls the port-specific function
gui_mch_set_winpos().  In gui_mac.c, this function make this call[3]:

     MoveWindow(gui.VimWindow, x, y, TRUE);

The coordinates of MoveWindow() are relative to the content area inside
the window; this content area is shifted down a distance equal to the
height of the title bar.  The mis-match between the two system calls
results in a vertical shift of the window in the example given above.

The attached patch fixes this problem by using the MoveWindowStructure()
function[4], whose coordinates are compatible with those used for the
GetWindowBounds() function.

Michael Henry

[1]: For the curious non-mac user: The bug may be simulated on a
correctly operating gvim using this command:

     exe "winpos " . getwinposx() . " " . (getwinpoxy() - 22)

[2]: 
http://tuvix.apple.com/documentation/macos8/HumanInterfaceToolbox/WindowManager/ProgWMacOS8.5WindowMgr/WindowMgr.41.html

[3]: http://developer.apple.com/documentation/mac/Toolbox/Toolbox-246.html

[4]: 
http://tuvix.apple.com/documentation/macos8/HumanInterfaceToolbox/WindowManager/ProgWMacOS8.5WindowMgr/WindowMgr.42.html

-------- begin patch ------------

--- src/gui_mac.c.orig  2007-08-18 17:24:21.000000000 -0400
+++ src/gui_mac.c       2007-08-18 17:56:07.000000000 -0400
@@ -3149,7 +3149,7 @@
      /* TODO:  Should make sure the window is move within range
       *       e.g.: y > ~16 [Menu bar], x > 0, x < screen width
       */
-    MoveWindow(gui.VimWindow, x, y, TRUE);
+    MoveWindowStructure(gui.VimWindow, x, y);
  }

      void



--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui