]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
center the text and icon vertically
[chaz/openbox] / openbox / action.c
index 797552f69abd2c649704f496fcf29c5798ef2795..5cc0bb213dd44debeefd1c0fc81063ec007b9acb 100644 (file)
@@ -293,6 +293,7 @@ void setup_action_cycle_windows_next(ObAction **a, ObUserAction uact)
     (*a)->data.cycle.forward = TRUE;
     (*a)->data.cycle.dialog = TRUE;
     (*a)->data.cycle.dock_windows = FALSE;
+    (*a)->data.cycle.all_desktops = FALSE;
 }
 
 void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact)
@@ -302,6 +303,7 @@ void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact)
     (*a)->data.cycle.forward = FALSE;
     (*a)->data.cycle.dialog = TRUE;
     (*a)->data.cycle.dock_windows = FALSE;
+    (*a)->data.cycle.all_desktops = FALSE;
 }
 
 void setup_action_movefromedge_north(ObAction **a, ObUserAction uact)
@@ -1009,6 +1011,9 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                     act->data.cycle.dialog = parse_bool(doc, n);
                 if ((n = parse_find_node("panels", node->xmlChildrenNode)))
                     act->data.cycle.dock_windows = parse_bool(doc, n);
+                if ((n = parse_find_node("allDesktops",
+                                         node->xmlChildrenNode)))
+                    act->data.cycle.all_desktops = parse_bool(doc, n);
             } else if (act->func == action_directional_focus) {
                 if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
                     act->data.interdiraction.dialog = parse_bool(doc, n);
@@ -1194,10 +1199,9 @@ void action_execute(union ActionData *data)
 void action_activate(union ActionData *data)
 {
     if (data->client.any.c) {
-        /* similar to the openbox dock for dockapps, don't let user actions
-           give focus to 3rd-party docks (panels) either (unless they ask for
-           it themselves). */
-        if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+        if (!data->any.button || client_mouse_focusable(data->client.any.c) ||
+            data->any.context != OB_FRAME_CONTEXT_CLIENT)
+        {
             /* if using focus_delay, stop the timer now so that focus doesn't
                go moving on us */
             event_halt_focus_delay();
@@ -1215,10 +1219,9 @@ void action_activate(union ActionData *data)
 void action_focus(union ActionData *data)
 {
     if (data->client.any.c) {
-        /* similar to the openbox dock for dockapps, don't let user actions
-           give focus to 3rd-party docks (panels) either (unless they ask for
-           it themselves). */
-        if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+        if (!data->any.button || client_mouse_focusable(data->client.any.c) ||
+            data->any.context != OB_FRAME_CONTEXT_CLIENT)
+        {
             /* if using focus_delay, stop the timer now so that focus doesn't
                go moving on us */
             event_halt_focus_delay();
@@ -1512,35 +1515,24 @@ void action_send_to_desktop(union ActionData *data)
         data->sendto.desk == DESKTOP_ALL) {
         client_set_desktop(c, data->sendto.desk, data->sendto.follow);
         if (data->sendto.follow)
-            screen_set_desktop(data->sendto.desk);
+            screen_set_desktop(data->sendto.desk, TRUE);
     }
 }
 
 void action_desktop(union ActionData *data)
 {
-    static guint first = (unsigned) -1;
-
-    if (data->inter.any.interactive && first == (unsigned) -1)
-        first = screen_desktop;
-
     if (!data->inter.any.interactive ||
         (!data->inter.cancel && !data->inter.final))
     {
         if (data->desktop.desk < screen_num_desktops ||
             data->desktop.desk == DESKTOP_ALL)
         {
-            screen_set_desktop(data->desktop.desk);
+            screen_set_desktop(data->desktop.desk, TRUE);
             if (data->inter.any.interactive)
                 screen_desktop_popup(data->desktop.desk, TRUE);
         }
-    } else if (data->inter.cancel) {
-        screen_set_desktop(first);
-    }
-
-    if (!data->inter.any.interactive || data->inter.final) {
+    } else
         screen_desktop_popup(0, FALSE);
-        first = (unsigned) -1;
-    }
 }
 
 void action_desktop_dir(union ActionData *data)
@@ -1554,10 +1546,9 @@ void action_desktop_dir(union ActionData *data)
                              data->desktopdir.inter.final,
                              data->desktopdir.inter.cancel);
     if (!data->sendtodir.inter.any.interactive ||
-        !data->sendtodir.inter.final ||
-        data->sendtodir.inter.cancel)
+        (data->sendtodir.inter.final && !data->sendtodir.inter.cancel))
     {
-        screen_set_desktop(d);
+        if (d != screen_desktop) screen_set_desktop(d, TRUE);
     }
 }
 
@@ -1574,18 +1565,17 @@ void action_send_to_desktop_dir(union ActionData *data)
                              data->sendtodir.inter.final,
                              data->sendtodir.inter.cancel);
     if (!data->sendtodir.inter.any.interactive ||
-        !data->sendtodir.inter.final ||
-        data->sendtodir.inter.cancel)
+        (data->sendtodir.inter.final && !data->sendtodir.inter.cancel))
     {
         client_set_desktop(c, d, data->sendtodir.follow);
-        if (data->sendtodir.follow)
-            screen_set_desktop(d);
+        if (data->sendtodir.follow && d != screen_desktop)
+            screen_set_desktop(d, TRUE);
     }
 }
 
 void action_desktop_last(union ActionData *data)
 {
-    screen_set_desktop(screen_last_desktop);
+    screen_set_desktop(screen_last_desktop, TRUE);
 }
 
 void action_toggle_decorations(union ActionData *data)
@@ -1597,7 +1587,8 @@ void action_toggle_decorations(union ActionData *data)
     client_action_end(data);
 }
 
-static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch)
+static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
+                           gboolean shaded)
 {
     /* let's make x and y client relative instead of screen relative */
     x = x - cx;
@@ -1637,11 +1628,11 @@ static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch)
       |CCCCCCC              |     A           B     |              DDDDDDD|
       |       CCCCCCCC      |     A |       | B     |      DDDDDDDD       |
       |               CCCCCCC      A         B      DDDDDDD               |
-      - - - - - - - - - - - +CCCCCCC+aaaaaaa+DDDDDDD+ - - - - - - - - - - -
-      |                     |       b       c       |                     |
-      |             west    |       b  move c       |   east              |
-      |                     |       b       c       |                     |
-      - - - - - - - - - - - +EEEEEEE+ddddddd+FFFFFFF+- - - - - - - - - - - 
+      - - - - - - - - - - - +CCCCCCC+aaaaaaa+DDDDDDD+ - - - - - - - - - - - -
+      |                     |       b       c       |                     | sh
+      |             west    |       b  move c       |   east              | ad
+      |                     |       b       c       |                     | ed
+      - - - - - - - - - - - +EEEEEEE+ddddddd+FFFFFFF+- - - - - - - - - - -  -
       |               EEEEEEE      G         H      FFFFFFF               |
       |       EEEEEEEE      |     G |       | H     |      FFFFFFFF       |
       |EEEEEEE              |     G           H     |              FFFFFFF|
@@ -1658,6 +1649,15 @@ static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch)
       +---------------------G-------|-------|-------H---------------------+
     */
 
+    if (shaded) {
+        /* for shaded windows, you can only resize west/east and move */
+        if (b)
+            return prop_atoms.net_wm_moveresize_size_left;
+        if (c)
+            return prop_atoms.net_wm_moveresize_size_right;
+        return prop_atoms.net_wm_moveresize_move;
+    }
+
     if (y < A && y >= C)
         return prop_atoms.net_wm_moveresize_size_topleft;
     else if (y >= A && y >= B && a)
@@ -1697,8 +1697,6 @@ void action_moveresize(union ActionData *data)
     ObClient *c = data->moveresize.any.c;
     guint32 corner;
 
-    if (!client_normal(c)) return;
-
     if (data->moveresize.keyboard) {
         corner = (data->moveresize.move ?
                   prop_atoms.net_wm_moveresize_move_keyboard :
@@ -1715,27 +1713,7 @@ void action_moveresize(union ActionData *data)
                               c->area.width + c->frame->size.left +
                               c->frame->size.right,
                               c->area.height + c->frame->size.top +
-                              c->frame->size.bottom));
-        const gchar *c;
-        if (corner == prop_atoms.net_wm_moveresize_size_topright)
-            c = "topright";
-        else if (corner == prop_atoms.net_wm_moveresize_size_top)
-            c = "top";
-        else if (corner == prop_atoms.net_wm_moveresize_size_topleft)
-            c = "topleft";
-        else if (corner == prop_atoms.net_wm_moveresize_size_right)
-            c = "right";
-        else if (corner == prop_atoms.net_wm_moveresize_move)
-            c = "middle";
-        else if (corner == prop_atoms.net_wm_moveresize_size_left)
-            c = "left";
-        else if (corner == prop_atoms.net_wm_moveresize_size_bottomright)
-            c = "bottomright";
-        else if (corner == prop_atoms.net_wm_moveresize_size_bottom)
-            c = "bottom";
-        else if (corner == prop_atoms.net_wm_moveresize_size_bottomleft)
-            c = "bottomleft";
-        ob_debug("corner: %s\n", c);
+                              c->frame->size.bottom, c->shaded));
     }
 
     moveresize_start(c, data->any.x, data->any.y, data->any.button, corner);
@@ -1771,6 +1749,7 @@ void action_cycle_windows(union ActionData *data)
     event_halt_focus_delay();
 
     focus_cycle(data->cycle.forward,
+                data->cycle.all_desktops,
                 data->cycle.dock_windows,
                 data->cycle.linear, data->any.interactive,
                 data->cycle.dialog,
This page took 0.031014 seconds and 4 git commands to generate.