Loading ...
Sorry, an error occurred while loading the content.

Patch 7.3.393

Expand Messages
  • Bram Moolenaar
    Patch 7.3.393 Problem: Win32: When resizing Vim it is always moved to the primary monitor if the secondary monitor is on the left. Solution: Use the
    Message 1 of 1 , Jan 4, 2012
    • 0 Attachment
      Patch 7.3.393
      Problem: Win32: When resizing Vim it is always moved to the primary monitor
      if the secondary monitor is on the left.
      Solution: Use the nearest monitor. (Yukihiro Nakadaira)
      Files: src/gui_w32.c


      *** ../vim-7.3.392/src/gui_w32.c 2011-12-15 21:51:32.000000000 +0100
      --- src/gui_w32.c 2012-01-04 20:25:58.000000000 +0100
      ***************
      *** 1661,1669 ****
      {
      RECT workarea_rect;
      int win_width, win_height;
      - int win_xpos, win_ypos;
      WINDOWPLACEMENT wndpl;
      - int workarea_left;

      /* Try to keep window completely on screen. */
      /* Get position of the screen work area. This is the part that is not
      --- 1661,1667 ----
      ***************
      *** 1685,1693 ****
      GetWindowPlacement(s_hwnd, &wndpl);
      }

      - win_xpos = wndpl.rcNormalPosition.left;
      - win_ypos = wndpl.rcNormalPosition.top;
      -
      /* compute the size of the outside of the window */
      win_width = width + GetSystemMetrics(SM_CXFRAME) * 2;
      win_height = height + GetSystemMetrics(SM_CYFRAME) * 2
      --- 1683,1688 ----
      ***************
      *** 1697,1732 ****
      #endif
      ;

      ! /* There is an inconsistency when using two monitors and Vim is on the
      ! * second (right) one: win_xpos will be the offset from the workarea of
      ! * the left monitor. While with one monitor it's the offset from the
      ! * workarea (including a possible taskbar on the left). Detect the second
      ! * monitor by checking for the left offset to be quite big. */
      ! if (workarea_rect.left > 300)
      ! workarea_left = 0;
      ! else
      ! workarea_left = workarea_rect.left;

      ! /* If the window is going off the screen, move it on to the screen.
      ! * win_xpos and win_ypos are relative to the workarea. */
      if ((direction & RESIZE_HOR)
      ! && workarea_left + win_xpos + win_width > workarea_rect.right)
      ! win_xpos = workarea_rect.right - win_width - workarea_left;

      ! if ((direction & RESIZE_HOR) && win_xpos < 0)
      ! win_xpos = 0;

      if ((direction & RESIZE_VERT)
      ! && workarea_rect.top + win_ypos + win_height > workarea_rect.bottom)
      ! win_ypos = workarea_rect.bottom - win_height - workarea_rect.top;

      ! if ((direction & RESIZE_VERT) && win_ypos < 0)
      ! win_ypos = 0;
      !
      ! wndpl.rcNormalPosition.left = win_xpos;
      ! wndpl.rcNormalPosition.right = win_xpos + win_width;
      ! wndpl.rcNormalPosition.top = win_ypos;
      ! wndpl.rcNormalPosition.bottom = win_ypos + win_height;

      /* set window position - we should use SetWindowPlacement rather than
      * SetWindowPos as the MSDN docs say the coord systems returned by
      --- 1692,1723 ----
      #endif
      ;

      ! /* The following should take care of keeping Vim on the same monitor, no
      ! * matter if the secondary monitor is left or right of the primary
      ! * monitor. */
      ! wndpl.rcNormalPosition.right = wndpl.rcNormalPosition.left + win_width;
      ! wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + win_height;

      ! /* If the window is going off the screen, move it on to the screen. */
      if ((direction & RESIZE_HOR)
      ! && wndpl.rcNormalPosition.right > workarea_rect.right)
      ! OffsetRect(&wndpl.rcNormalPosition,
      ! workarea_rect.right - wndpl.rcNormalPosition.right, 0);

      ! if ((direction & RESIZE_HOR)
      ! && wndpl.rcNormalPosition.left < workarea_rect.left)
      ! OffsetRect(&wndpl.rcNormalPosition,
      ! workarea_rect.left - wndpl.rcNormalPosition.left, 0);

      if ((direction & RESIZE_VERT)
      ! && wndpl.rcNormalPosition.bottom > workarea_rect.bottom)
      ! OffsetRect(&wndpl.rcNormalPosition,
      ! 0, workarea_rect.bottom - wndpl.rcNormalPosition.bottom);

      ! if ((direction & RESIZE_VERT)
      ! && wndpl.rcNormalPosition.top < workarea_rect.top)
      ! OffsetRect(&wndpl.rcNormalPosition,
      ! 0, workarea_rect.top - wndpl.rcNormalPosition.top);

      /* set window position - we should use SetWindowPlacement rather than
      * SetWindowPos as the MSDN docs say the coord systems returned by
      *** ../vim-7.3.392/src/version.c 2012-01-04 19:34:32.000000000 +0100
      --- src/version.c 2012-01-04 20:28:57.000000000 +0100
      ***************
      *** 716,717 ****
      --- 716,719 ----
      { /* Add new patch number below this line */
      + /**/
      + 393,
      /**/

      --
      I wonder, do vegetarians eat fruit bats?

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ an exciting new programming language -- http://www.Zimbu.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

      --
      You received this message from the "vim_dev" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php
    Your message has been successfully submitted and would be delivered to recipients shortly.