]> git.sur5r.net Git - i3/i3/commitdiff
Merge pull request #1712 from Airblader/feature-next-wm-size-hints-adopted
authorMichael Stapelberg <stapelberg@users.noreply.github.com>
Mon, 3 Aug 2015 06:52:10 +0000 (23:52 -0700)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Mon, 3 Aug 2015 06:52:10 +0000 (23:52 -0700)
[Adopted] Use WM_SIZE_HINTS when available to set the geometry of floating windows

1  2 
src/manage.c

diff --combined src/manage.c
index 8dcc17a27cec45defa4d49b149823afff4ab6a29,0bea0ba8f7fcb1206acdfa8712052e29834f077b..5512602edfd6e1724b7f95780f7bdba577a32f85
@@@ -168,11 -168,20 +168,11 @@@ void manage_window(xcb_window_t window
      cwindow->id = window;
      cwindow->depth = get_visual_depth(attr->visual);
  
 -    /* We need to grab the mouse buttons for click to focus */
 +    /* We need to grab buttons 1-3 for click-to-focus and buttons 1-5
 +     * to allow for mouse bindings using --whole-window to work correctly. */
      xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
                      XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
 -                    1 /* left mouse button */,
 -                    XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
 -
 -    xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
 -                    XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
 -                    2 /* middle mouse button */,
 -                    XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
 -
 -    xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
 -                    XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
 -                    3 /* right mouse button */,
 +                    XCB_BUTTON_INDEX_ANY,
                      XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
  
      /* update as much information as possible so far (some replies may be NULL) */
      if (cwindow->dock)
          want_floating = false;
  
+     /* Plasma windows set their geometry in WM_SIZE_HINTS. */
+     if ((wm_size_hints.flags & XCB_ICCCM_SIZE_HINT_US_POSITION || wm_size_hints.flags & XCB_ICCCM_SIZE_HINT_P_POSITION) &&
+         (wm_size_hints.flags & XCB_ICCCM_SIZE_HINT_US_SIZE || wm_size_hints.flags & XCB_ICCCM_SIZE_HINT_P_SIZE)) {
+         DLOG("We are setting geometry according to wm_size_hints x=%d y=%d w=%d h=%d\n",
+              wm_size_hints.x, wm_size_hints.y, wm_size_hints.width, wm_size_hints.height);
+         geom->x = wm_size_hints.x;
+         geom->y = wm_size_hints.y;
+         geom->width = wm_size_hints.width;
+         geom->height = wm_size_hints.height;
+     }
      /* Store the requested geometry. The width/height gets raised to at least
       * 75x50 when entering floating mode, which is the minimum size for a
       * window to be useful (smaller windows are usually overlays/toolbars/…