]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
leave things how we found them !
[chaz/openbox] / openbox / client.c
index f1cbdc8d13ff024fe72529a1c2ff18992d84a34a..e77a4ea6f9e141eb6d5acf61c71f45fea503b35b 100644 (file)
@@ -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);
 
@@ -853,9 +853,11 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
     gint ox = *x, oy = *y;
     gboolean rudel = rude, ruder = rude, rudet = rude, rudeb = rude;
     gint fw, fh;
+    Rect desired;
 
+    RECT_SET(desired, *x, *y, w, h);
     all_a = screen_area(self->desktop);
-    mon_a = screen_area_monitor(self->desktop, client_monitor(self));
+    mon_a = screen_area_monitor(self->desktop, screen_find_monitor(&desired));
 
     /* get where the frame would be */
     frame_client_gravity(self->frame, x, y, w, h);
@@ -1585,7 +1587,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 +1687,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 +1723,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 +1750,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);
 
@@ -3272,10 +3282,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 +3319,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 +3581,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.029707 seconds and 4 git commands to generate.