]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
for startup notification, use the left ptr+watch if it is available, and fall back...
[chaz/openbox] / openbox / client.c
index 57d392495c91b2ce3ccae44a66e8332ed7b4fc53..0dd122148b948caf1b0305a99c6af0283fe9a463 100644 (file)
@@ -407,9 +407,9 @@ void client_manage(Window window)
 
        do this after adjusting the frame. otherwise it gets all weird and
        clients don't work right */
-    client_configure_full(self, self->area.x, self->area.y,
-                          self->area.width, self->area.height,
-                          FALSE, TRUE);
+    client_configure(self, self->area.x, self->area.y,
+                     self->area.width, self->area.height,
+                     FALSE, TRUE);
 
     /* do this after the window is placed, so the premax/prefullscreen numbers
        won't be all wacko!!
@@ -565,7 +565,7 @@ void client_unmanage(ObClient *self)
 
     /* ignore enter events from the unmap so it doesnt mess with the
        focus */
-    event_ignore_queued_enters();
+    event_ignore_all_queued_enters();
 
     mouse_grab_for_client(self, FALSE);
 
@@ -1585,7 +1585,8 @@ void client_setup_decor_and_functions(ObClient *self)
          OB_CLIENT_FUNC_SHADE |
          OB_CLIENT_FUNC_CLOSE |
          OB_CLIENT_FUNC_BELOW |
-         OB_CLIENT_FUNC_ABOVE);
+         OB_CLIENT_FUNC_ABOVE |
+         OB_CLIENT_FUNC_UNDECORATE);
 
     if (!(self->min_size.width < self->max_size.width ||
           self->min_size.height < self->max_size.height))
@@ -1684,6 +1685,11 @@ void client_setup_decor_and_functions(ObClient *self)
     if (self->max_vert && self->max_horz)
         self->decorations &= ~(OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS);
 
+    /* If there are no decorations to remove, don't allow the user to try
+       toggle the state */
+    if (self->decorations == 0)
+        self->functions &= ~OB_CLIENT_FUNC_UNDECORATE;
+
     /* finally, the user can have requested no decorations, which overrides
        everything (but doesnt give it a border if it doesnt have one) */
     if (self->undecorated) {
@@ -1715,7 +1721,7 @@ void client_setup_decor_and_functions(ObClient *self)
 
 static void client_change_allowed_actions(ObClient *self)
 {
-    gulong actions[11];
+    gulong actions[12];
     gint num = 0;
 
     /* desktop windows are kept on all desktops */
@@ -1742,6 +1748,8 @@ static void client_change_allowed_actions(ObClient *self)
         actions[num++] = prop_atoms.net_wm_action_above;
     if (self->functions & OB_CLIENT_FUNC_BELOW)
         actions[num++] = prop_atoms.net_wm_action_below;
+    if (self->functions & OB_CLIENT_FUNC_UNDECORATE)
+        actions[num++] = prop_atoms.ob_wm_action_undecorate;
 
     PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num);
 
@@ -1771,8 +1779,8 @@ void client_reconfigure(ObClient *self)
     /* by making this pass FALSE for user, we avoid the emacs event storm where
        every configurenotify causes an update in its normal hints, i think this
        is generally what we want anyways... */
-    client_configure_full(self, self->area.x, self->area.y,
-                          self->area.width, self->area.height, FALSE, TRUE);
+    client_configure(self, self->area.x, self->area.y,
+                     self->area.width, self->area.height, FALSE, TRUE);
 }
 
 void client_update_wmhints(ObClient *self)
@@ -2704,8 +2712,8 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
 }
 
 
-void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
-                           gboolean user, gboolean final)
+void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
+                      gboolean user, gboolean final)
 {
     gint oldw, oldh;
     gboolean send_resize_client;
@@ -3272,10 +3280,6 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
         }
     }
 
-    /* Grab pointer across these, so it is the same as actions. Enter events
-       won't be generated by the windows moving around */
-    grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
-
     if (max_horz != self->max_horz || max_vert != self->max_vert) {
         if (max_horz != self->max_horz && max_vert != self->max_vert) {
             /* toggling both */
@@ -3313,19 +3317,11 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
            transients needs to change */
         stacking_raise(CLIENT_AS_WINDOW(self));
 
-        /* These things below can change focus so we can't grab pointer for
-           them. Note how we have two ungrab_pointers.. */
-        ungrab_pointer();
-
         /* it also may get focused. if something is focused that shouldn't
            be focused anymore, then move the focus */
         if (focus_client && client_focus_target(focus_client) != focus_client)
             client_focus(focus_client);
     }
-    else
-        /* These things below can change focus so we can't grab pointer for
-           them. Note how we have two ungrab_pointers.. */
-        ungrab_pointer();
 
     if (iconic != self->iconic)
         client_iconify(self, iconic, FALSE, FALSE);
@@ -3583,7 +3579,11 @@ void client_set_layer(ObClient *self, gint layer)
 
 void client_set_undecorated(ObClient *self, gboolean undecorated)
 {
-    if (self->undecorated != undecorated) {
+    if (self->undecorated != undecorated &&
+        /* don't let it undecorate if the function is missing, but let 
+           it redecorate */
+        (self->functions & OB_CLIENT_FUNC_UNDECORATE || !undecorated))
+    {
         self->undecorated = undecorated;
         client_setup_decor_and_functions(self);
         client_change_state(self); /* reflect this in the state hints */
This page took 0.026568 seconds and 4 git commands to generate.