xwm: Fix the window decoration hints.
authorDima Ryazanov <dima@gmail.com>
Mon, 4 May 2015 02:56:37 +0000 (19:56 -0700)
committerBryce Harrington <bryce@osg.samsung.com>
Fri, 15 May 2015 03:32:02 +0000 (20:32 -0700)
Enable all hints by default. This fixes the "Maximize" button in apps that
don't set any hints - e.g., xclock or Firefox. (There's still a problem, though:
"decorate" is sometimes treated as a boolean, sometimes as a bitmask.)

Handle MWM_DECOR_ALL correctly. It looks like it's supposed to invert the values
of the rest of the flags.

Signed-off-by: Dima Ryazanov <dima@gmail.com>
Reviewed-By: Giulio Camuffo <giuliocamuffo@gmail.com>
xwayland/window-manager.c

index 039f0cd0f292d40ac832088a56998802800d38e1..1ea2c4c1e3482738696aa0bffe2a3f97fba94ea3 100644 (file)
@@ -94,6 +94,10 @@ struct motif_wm_hints {
 #define MWM_DECOR_MINIMIZE      (1L << 5)
 #define MWM_DECOR_MAXIMIZE      (1L << 6)
 
+#define MWM_DECOR_EVERYTHING \
+       (MWM_DECOR_BORDER | MWM_DECOR_RESIZEH | MWM_DECOR_TITLE | \
+        MWM_DECOR_MENU | MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE)
+
 #define MWM_INPUT_MODELESS 0
 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
 #define MWM_INPUT_SYSTEM_MODAL 2
@@ -425,7 +429,7 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
                                             props[i].atom,
                                             XCB_ATOM_ANY, 0, 2048);
 
-       window->decorate = !window->override_redirect;
+       window->decorate = window->override_redirect ? 0 : MWM_DECOR_EVERYTHING;
        window->size_hints.flags = 0;
        window->motif_hints.flags = 0;
        window->delete_window = 0;
@@ -495,9 +499,15 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
                        memcpy(&window->motif_hints,
                               xcb_get_property_value(reply),
                               sizeof window->motif_hints);
-                       if (window->motif_hints.flags & MWM_HINTS_DECORATIONS)
-                               window->decorate =
-                                       window->motif_hints.decorations;
+                       if (window->motif_hints.flags & MWM_HINTS_DECORATIONS) {
+                               if (window->motif_hints.decorations & MWM_DECOR_ALL)
+                                       /* MWM_DECOR_ALL means all except the other values listed. */
+                                       window->decorate =
+                                               MWM_DECOR_EVERYTHING & (~window->motif_hints.decorations);
+                               else
+                                       window->decorate =
+                                               window->motif_hints.decorations;
+                       }
                        break;
                default:
                        break;