]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
oooops RECT_SET_POINT was broken
[chaz/openbox] / openbox / action.c
index 0ab8fe7bd87adf634c988d2f829cb8bb32205437..b035558dcfbcd770943682531920c19bb13c8c29 100644 (file)
@@ -314,6 +314,11 @@ ActionString actionstrings[] =
         action_directional_focus,
         setup_action_directional_focus_northwest
     },
+    {
+        "activate",
+        action_activate,
+        NULL,
+    },
     {
         "focus",
         action_focus,
@@ -329,6 +334,11 @@ ActionString actionstrings[] =
         action_iconify,
         NULL
     },
+    {
+        "raiselower",
+        action_raiselower,
+        NULL
+    },
     {
         "raise",
         action_raise,
@@ -711,6 +721,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);
@@ -735,6 +748,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)
@@ -753,6 +772,35 @@ void action_iconify(union ActionData *data)
         client_iconify(data->client.c, TRUE, TRUE);
 }
 
+void action_raiselower(union ActionData *data)
+{
+    ObClient *c = data->client.c;
+    GList *it;
+    gboolean raise = FALSE;
+
+    if (!c) return;
+
+    for (it = stacking_list; it; it = g_list_next(it)) {
+        ObClient *cit = it->data;
+
+        if (cit == c) break;
+        if (client_normal(cit) == client_normal(c) &&
+            cit->layer == c->layer &&
+            cit->frame->visible)
+        {
+            if (RECT_INTERSECTS_RECT(cit->frame->area, c->frame->area)) {
+                raise = TRUE;
+                break;
+            }
+        }
+    }
+
+    if (raise)
+        stacking_raise(CLIENT_AS_WINDOW(c));
+    else
+        stacking_lower(CLIENT_AS_WINDOW(c));
+}
+
 void action_raise(union ActionData *data)
 {
     if (data->client.c)
@@ -1208,7 +1256,7 @@ 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)
@@ -1262,7 +1310,7 @@ void action_growtoedge(union ActionData *data)
     switch(data->diraction.direction) {
     case OB_DIRECTION_NORTH:
         dest = client_directional_edge_search(c, OB_DIRECTION_NORTH);
-        if(a->y > (y - c->size_inc.height))
+        if (a->y == y)
             height = c->frame->area.height / 2;
         else {
             height = c->frame->area.y + c->frame->area.height - dest;
@@ -1271,7 +1319,7 @@ void action_growtoedge(union ActionData *data)
         break;
     case OB_DIRECTION_WEST:
         dest = client_directional_edge_search(c, OB_DIRECTION_WEST);
-        if(a->x > (x - c->size_inc.width))
+        if (a->x == x)
             width = c->frame->area.width / 2;
         else {
             width = c->frame->area.x + c->frame->area.width - dest;
@@ -1280,21 +1328,23 @@ void action_growtoedge(union ActionData *data)
         break;
     case OB_DIRECTION_SOUTH:
         dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH);
-        if(a->y + a->height <
-            (y + c->frame->area.height + c->size_inc.height)) {
+        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 + c->size_inc.width)) {
+        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();
This page took 0.02884 seconds and 4 git commands to generate.