]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
make putting plugin menus in a menu closer to working..
[chaz/openbox] / openbox / action.c
index 275ba96a42c1088cb5db8499e875786080be1866..01176294ac2275faadec53949400b1b8ec38562a 100644 (file)
@@ -232,6 +232,26 @@ void setup_action_movetoedge_west(ObAction *a)
     a->data.diraction.direction = OB_DIRECTION_WEST;
 }
 
+void setup_action_growtoedge_north(ObAction *a)
+{
+    a->data.diraction.direction = OB_DIRECTION_NORTH;
+}
+
+void setup_action_growtoedge_south(ObAction *a)
+{
+    a->data.diraction.direction = OB_DIRECTION_SOUTH;
+}
+
+void setup_action_growtoedge_east(ObAction *a)
+{
+    a->data.diraction.direction = OB_DIRECTION_EAST;
+}
+
+void setup_action_growtoedge_west(ObAction *a)
+{
+    a->data.diraction.direction = OB_DIRECTION_WEST;
+}
+
 void setup_action_top_layer(ObAction *a)
 {
     a->data.layer.layer = 1;
@@ -294,6 +314,11 @@ ActionString actionstrings[] =
         action_directional_focus,
         setup_action_directional_focus_northwest
     },
+    {
+        "activate",
+        action_activate,
+        NULL,
+    },
     {
         "focus",
         action_focus,
@@ -614,6 +639,26 @@ ActionString actionstrings[] =
         action_movetoedge,
         setup_action_movetoedge_east
     },
+    {
+        "growtoedgenorth",
+        action_growtoedge,
+        setup_action_growtoedge_north
+    },
+    {
+        "growtoedgesouth",
+        action_growtoedge,
+        setup_action_growtoedge_south
+    },
+    {
+        "growtoedgewest",
+        action_growtoedge,
+        setup_action_growtoedge_west
+    },
+    {
+        "growtoedgeeast",
+        action_growtoedge,
+        setup_action_growtoedge_east
+    },
     {
         NULL,
         NULL,
@@ -671,6 +716,9 @@ ObAction *action_parse(xmlDocPtr doc, xmlNodePtr node)
             } else if (act->func == action_send_to_desktop_dir) {
                 if ((n = parse_find_node("wrap", node->xmlChildrenNode)))
                     act->data.sendtodir.wrap = parse_bool(doc, n);
+            } else if (act->func == action_activate) {
+                if ((n = parse_find_node("here", node->xmlChildrenNode)))
+                    act->data.activate.here = parse_bool(doc, n);
             }
         }
         g_free(actname);
@@ -695,6 +743,12 @@ void action_execute(union ActionData *data)
     }
 }
 
+void action_activate(union ActionData *data)
+{
+    if (data->activate.c)
+        client_activate(data->activate.c, data->activate.here);
+}
+
 void action_focus(union ActionData *data)
 {
     if (data->client.c)
@@ -918,9 +972,6 @@ void action_send_to_desktop_dir(union ActionData *data)
     d = screen_cycle_desktop(data->sendtodir.dir, data->sendtodir.wrap,
                              data->sendtodir.linear,
                              data->sendtodir.final, data->sendtodir.cancel);
-
-    g_message("sendto %d", d);
-
     client_set_desktop(c, d, TRUE);
     screen_set_desktop(d);
 }
@@ -1171,12 +1222,12 @@ void action_directional_focus(union ActionData *data)
         return;
     if ((nf = client_find_directional(data->diraction.c,
                                       data->diraction.direction)))
-        client_activate(nf);
+        client_activate(nf, FALSE);
 }
 
 void action_movetoedge(union ActionData *data)
 {
-    int x, y, h, w;
+    int x, y;
     ObClient *c = data->diraction.c;
 
     if (!c)
@@ -1184,20 +1235,20 @@ void action_movetoedge(union ActionData *data)
     x = c->frame->area.x;
     y = c->frame->area.y;
     
-    h = screen_area(c->desktop)->height;
-    w = screen_area(c->desktop)->width;
     switch(data->diraction.direction) {
     case OB_DIRECTION_NORTH:
-        y = 0;
+        y = client_directional_edge_search(c, OB_DIRECTION_NORTH);
         break;
     case OB_DIRECTION_WEST:
-        x = 0;
+        x = client_directional_edge_search(c, OB_DIRECTION_WEST);
         break;
     case OB_DIRECTION_SOUTH:
-        y = h - c->frame->area.height;
+        y = client_directional_edge_search(c, OB_DIRECTION_SOUTH) -
+            c->frame->area.height;
         break;
     case OB_DIRECTION_EAST:
-        x = w - c->frame->area.width;
+        x = client_directional_edge_search(c, OB_DIRECTION_EAST) -
+            c->frame->area.width;
         break;
     default:
         g_assert_not_reached();
@@ -1208,6 +1259,68 @@ void action_movetoedge(union ActionData *data)
 
 }
 
+void action_growtoedge(union ActionData *data)
+{
+    int x, y, width, height, dest;
+    ObClient *c = data->diraction.c;
+    Rect *a = screen_area(c->desktop);
+
+    if (!c)
+        return;
+    
+    x = c->frame->area.x;
+    y = c->frame->area.y;
+    width = c->frame->area.width;
+    height = c->frame->area.height;
+
+    switch(data->diraction.direction) {
+    case OB_DIRECTION_NORTH:
+        dest = client_directional_edge_search(c, OB_DIRECTION_NORTH);
+        if (a->y == y)
+            height = c->frame->area.height / 2;
+        else {
+            height = c->frame->area.y + c->frame->area.height - dest;
+            y = dest;
+        }
+        break;
+    case OB_DIRECTION_WEST:
+        dest = client_directional_edge_search(c, OB_DIRECTION_WEST);
+        if (a->x == x)
+            width = c->frame->area.width / 2;
+        else {
+            width = c->frame->area.x + c->frame->area.width - dest;
+            x = dest;
+        }
+        break;
+    case OB_DIRECTION_SOUTH:
+        dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH);
+        if (a->y + a->height == y + c->frame->area.height) {
+            height = c->frame->area.height / 2;
+            y = a->y + a->height - height;
+        } else
+            height = dest - c->frame->area.y;
+        y += (height - c->frame->area.height) % c->size_inc.height;
+        height -= (height - c->frame->area.height) % c->size_inc.height;
+        break;
+    case OB_DIRECTION_EAST:
+        dest = client_directional_edge_search(c, OB_DIRECTION_EAST);
+        if (a->x + a->width == x + c->frame->area.width) {
+            width = c->frame->area.width / 2;
+            x = a->x + a->width - width;
+        } else
+            width = dest - c->frame->area.x;
+        x += (width - c->frame->area.width) % c->size_inc.width;
+        width -= (width - c->frame->area.width) % c->size_inc.width;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+    frame_frame_gravity(c->frame, &x, &y);
+    width -= c->frame->size.left + c->frame->size.right;
+    height -= c->frame->size.top + c->frame->size.bottom;
+    client_configure(c, OB_CORNER_TOPLEFT, x, y, width, height, TRUE, TRUE);
+}
+
 void action_send_to_layer(union ActionData *data)
 {
     if (data->layer.c)
This page took 0.026559 seconds and 4 git commands to generate.