]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
change the "handle" context to "bottom". add a "top" context. make the top
[chaz/openbox] / openbox / action.c
index 804fe0be76506ba55cf87d9609c6adb9ddf90eac..8e7b56a341dffe0c14a3636893396d6385201149 100644 (file)
@@ -109,6 +109,7 @@ void setup_action_directional_focus_north(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_NORTH;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_east(ObAction **a, ObUserAction uact)
@@ -117,6 +118,7 @@ void setup_action_directional_focus_east(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_EAST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_south(ObAction **a, ObUserAction uact)
@@ -125,6 +127,7 @@ void setup_action_directional_focus_south(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTH;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_west(ObAction **a, ObUserAction uact)
@@ -133,6 +136,7 @@ void setup_action_directional_focus_west(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_WEST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_northeast(ObAction **a, ObUserAction uact)
@@ -141,6 +145,7 @@ void setup_action_directional_focus_northeast(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_NORTHEAST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_southeast(ObAction **a, ObUserAction uact)
@@ -149,6 +154,7 @@ void setup_action_directional_focus_southeast(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHEAST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_southwest(ObAction **a, ObUserAction uact)
@@ -157,6 +163,7 @@ void setup_action_directional_focus_southwest(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHWEST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_directional_focus_northwest(ObAction **a, ObUserAction uact)
@@ -165,6 +172,7 @@ void setup_action_directional_focus_northwest(ObAction **a, ObUserAction uact)
     (*a)->data.interdiraction.direction = OB_DIRECTION_NORTHWEST;
     (*a)->data.interdiraction.dialog = TRUE;
     (*a)->data.interdiraction.dock_windows = FALSE;
+    (*a)->data.interdiraction.desktop_windows = FALSE;
 }
 
 void setup_action_send_to_desktop(ObAction **a, ObUserAction uact)
@@ -293,6 +301,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.desktop_windows = FALSE;
     (*a)->data.cycle.all_desktops = FALSE;
 }
 
@@ -303,6 +312,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.desktop_windows = FALSE;
     (*a)->data.cycle.all_desktops = FALSE;
 }
 
@@ -407,21 +417,21 @@ void setup_action_bottom_layer(ObAction **a, ObUserAction uact)
 void setup_action_move(ObAction **a, ObUserAction uact)
 {
     (*a)->data.moveresize.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.moveresize.move = TRUE;
     (*a)->data.moveresize.keyboard =
         (uact == OB_USER_ACTION_NONE ||
          uact == OB_USER_ACTION_KEYBOARD_KEY ||
          uact == OB_USER_ACTION_MENU_SELECTION);
+    (*a)->data.moveresize.corner = 0;
 }
 
 void setup_action_resize(ObAction **a, ObUserAction uact)
 {
     (*a)->data.moveresize.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.moveresize.move = FALSE;
     (*a)->data.moveresize.keyboard =
         (uact == OB_USER_ACTION_NONE ||
          uact == OB_USER_ACTION_KEYBOARD_KEY ||
          uact == OB_USER_ACTION_MENU_SELECTION);
+    (*a)->data.moveresize.corner = 0;
 }
 
 void setup_action_showmenu(ObAction **a, ObUserAction uact)
@@ -735,12 +745,12 @@ ActionString actionstrings[] =
     },
     {
         "move",
-        action_moveresize,
+        action_move,
         setup_action_move
     },
     {
         "resize",
-        action_moveresize,
+        action_resize,
         setup_action_resize
     },
     {
@@ -1011,6 +1021,8 @@ 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("desktop", node->xmlChildrenNode)))
+                    act->data.cycle.desktop_windows = parse_bool(doc, n);
                 if ((n = parse_find_node("allDesktops",
                                          node->xmlChildrenNode)))
                     act->data.cycle.all_desktops = parse_bool(doc, n);
@@ -1019,6 +1031,38 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                     act->data.interdiraction.dialog = parse_bool(doc, n);
                 if ((n = parse_find_node("panels", node->xmlChildrenNode)))
                     act->data.interdiraction.dock_windows = parse_bool(doc, n);
+                if ((n = parse_find_node("desktop", node->xmlChildrenNode)))
+                    act->data.interdiraction.desktop_windows =
+                        parse_bool(doc, n);
+            } else if (act->func == action_resize) {
+                if ((n = parse_find_node("edge", node->xmlChildrenNode))) {
+                    gchar *s = parse_string(doc, n);
+                    if (!g_ascii_strcasecmp(s, "top"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_top;
+                    else if (!g_ascii_strcasecmp(s, "bottom"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_bottom;
+                    else if (!g_ascii_strcasecmp(s, "left"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_left;
+                    else if (!g_ascii_strcasecmp(s, "right"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_right;
+                    else if (!g_ascii_strcasecmp(s, "topleft"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_topleft;
+                    else if (!g_ascii_strcasecmp(s, "topright"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_topright;
+                    else if (!g_ascii_strcasecmp(s, "bottomleft"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_bottomleft;
+                    else if (!g_ascii_strcasecmp(s, "bottomright"))
+                        act->data.moveresize.corner =
+                            prop_atoms.net_wm_moveresize_size_bottomright;
+                    g_free(s);
+                }
             } else if (act->func == action_raise ||
                        act->func == action_lower ||
                        act->func == action_raiselower ||
@@ -1089,7 +1133,9 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
             /* XXX UGLY HACK race with motion event starting a move and the
                button release gettnig processed first. answer: don't queue
                moveresize starts. UGLY HACK XXX */
-            if (a->data.any.interactive || a->func == action_moveresize) {
+            if (a->data.any.interactive || a->func == action_move ||
+                a->func == action_resize)
+            {
                 /* interactive actions are not queued */
                 a->func(&a->data);
             } else if ((context == OB_FRAME_CONTEXT_CLIENT ||
@@ -1698,29 +1744,39 @@ static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
 #undef d
 }
 
-void action_moveresize(union ActionData *data)
+void action_move(union ActionData *data)
 {
     ObClient *c = data->moveresize.any.c;
     guint32 corner;
 
-    if (data->moveresize.keyboard) {
-        corner = (data->moveresize.move ?
-                  prop_atoms.net_wm_moveresize_move_keyboard :
-                  prop_atoms.net_wm_moveresize_size_keyboard);
-    } else {
-        corner = (data->moveresize.move ?
-                  prop_atoms.net_wm_moveresize_move :
-                  pick_corner(data->any.x, data->any.y,
-                              c->frame->area.x, c->frame->area.y,
-                              /* use the client size because the frame
-                                 can be differently sized (shaded
-                                 windows) and we want this based on the
-                                 clients size */
-                              c->area.width + c->frame->size.left +
-                              c->frame->size.right,
-                              c->area.height + c->frame->size.top +
-                              c->frame->size.bottom, c->shaded));
-    }
+    if (data->moveresize.keyboard)
+        corner = prop_atoms.net_wm_moveresize_move_keyboard;
+    else
+        corner = prop_atoms.net_wm_moveresize_move;
+
+    moveresize_start(c, data->any.x, data->any.y, data->any.button, corner);
+}
+
+void action_resize(union ActionData *data)
+{
+    ObClient *c = data->moveresize.any.c;
+    guint32 corner;
+
+    if (data->moveresize.keyboard)
+        corner = prop_atoms.net_wm_moveresize_size_keyboard;
+    else if (data->moveresize.corner)
+        corner = data->moveresize.corner; /* it was specified in the binding */
+    else
+        corner = pick_corner(data->any.x, data->any.y,
+                             c->frame->area.x, c->frame->area.y,
+                             /* use the client size because the frame
+                                can be differently sized (shaded
+                                windows) and we want this based on the
+                                clients size */
+                             c->area.width + c->frame->size.left +
+                             c->frame->size.right,
+                             c->area.height + c->frame->size.top +
+                             c->frame->size.bottom, c->shaded);
 
     moveresize_start(c, data->any.x, data->any.y, data->any.button, corner);
 }
@@ -1757,6 +1813,7 @@ void action_cycle_windows(union ActionData *data)
     focus_cycle(data->cycle.forward,
                 data->cycle.all_desktops,
                 data->cycle.dock_windows,
+                data->cycle.desktop_windows,
                 data->cycle.linear, data->any.interactive,
                 data->cycle.dialog,
                 data->cycle.inter.final, data->cycle.inter.cancel);
@@ -1770,6 +1827,7 @@ void action_directional_focus(union ActionData *data)
 
     focus_directional_cycle(data->interdiraction.direction,
                             data->interdiraction.dock_windows,
+                            data->interdiraction.desktop_windows,
                             data->any.interactive,
                             data->interdiraction.dialog,
                             data->interdiraction.inter.final,
This page took 0.032458 seconds and 4 git commands to generate.