X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Factions%2Fdesktop.c;h=4489f8122dfbbea9da5e2b02f2f90fa5577bb50a;hb=42a58fcd2d8bcc79caa22872b712a779df354b6d;hp=2d2014e40024950fab13ce092dc98563fd6e9b4e;hpb=6973d5b8a50844ef8eecf076f8f15d5ece4270ef;p=chaz%2Fopenbox diff --git a/openbox/actions/desktop.c b/openbox/actions/desktop.c index 2d2014e4..4489f812 100644 --- a/openbox/actions/desktop.c +++ b/openbox/actions/desktop.c @@ -1,9 +1,13 @@ #include "openbox/actions.h" #include "openbox/screen.h" +#include "openbox/client.h" #include typedef struct { + gboolean last; guint desktop; + gboolean send; + gboolean follow; } Options; static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); @@ -25,9 +29,21 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) Options *o; o = g_new0(Options, 1); + o->follow = TRUE; + + if ((n = parse_find_node("desktop", node))) { + gchar *s = parse_string(doc, n); + if (!g_ascii_strcasecmp(s, "last")) + o->last = TRUE; + else + o->desktop = parse_int(doc, n) - 1; + g_free(s); + } + if ((n = parse_find_node("send", node))) + o->send = parse_bool(doc, n); + if ((n = parse_find_node("follow", node))) + o->follow = parse_bool(doc, n); - if ((n = parse_find_node("desktop", node))) - o->desktop = parse_int(doc, n) - 1; return o; } @@ -42,9 +58,23 @@ static void free_func(gpointer options) static gboolean run_func(ObActionsData *data, gpointer options) { Options *o = options; + guint d; - if (o->desktop < screen_num_desktops) - screen_set_desktop(o->desktop, TRUE); + if (o->last) + d = screen_last_desktop; + else + d = o->desktop; + if (d < screen_num_desktops && d != screen_desktop) { + gboolean go = !o->send; + if (o->send) { + if (data->client && client_normal(data->client)) { + client_set_desktop(data->client, d, o->follow, FALSE); + go = TRUE; + } + } + if (go) + screen_set_desktop(d, TRUE); + } return FALSE; }