openbox/actions/addremovedesktop.c (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#include "openbox/actions.h" #include "openbox/screen.h" #include "openbox/client.h" #include "openbox/debug.h" #include <glib.h> typedef struct { gboolean current; gboolean add; } Options; static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); static gpointer setup_add_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); static gpointer setup_remove_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); static void free_func(gpointer options); static gboolean run_func(ObActionsData *data, gpointer options); void action_addremovedesktop_startup() { actions_register("AddDesktop", setup_add_func, free_func, run_func, NULL, NULL); actions_register("RemoveDesktop", setup_remove_func, free_func, run_func, NULL, NULL); } static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) { xmlNodePtr n; Options *o; o = g_new0(Options, 1); if ((n = parse_find_node("where", node))) { gchar *s = parse_string(doc, n); if (!g_ascii_strcasecmp(s, "last")) o->current = FALSE; else if (!g_ascii_strcasecmp(s, "current")) o->current = TRUE; g_free(s); } return o; } static gpointer setup_add_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) { Options *o = setup_func(i, doc, node); o->add = TRUE; return o; } static gpointer setup_remove_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) { Options *o = setup_func(i, doc, node); o->add = FALSE; return o; } static void free_func(gpointer options) { Options *o = options; g_free(o); } /* Always return FALSE because its not interactive */ static gboolean run_func(ObActionsData *data, gpointer options) { Options *o = options; actions_client_move(data, FALSE); if (o->add) { screen_set_num_desktops(screen_num_desktops+1); /* move all the clients over */ if (o->current) { GList *it; for (it = client_list; it; it = g_list_next(it)) { ObClient *c = it->data; if (c->desktop != DESKTOP_ALL && c->desktop >= screen_desktop) client_set_desktop(c, c->desktop+1, FALSE, TRUE); } } } else if (screen_num_desktops > 1) { guint rmdesktop, movedesktop; GList *it, *stacking_copy; /* what desktop are we removing and moving to? */ if (o->current) rmdesktop = screen_desktop; else rmdesktop = screen_num_desktops - 1; if (rmdesktop < screen_num_desktops - 1) movedesktop = rmdesktop + 1; else movedesktop = rmdesktop; /* make a copy of the list cuz we're changing it */ stacking_copy = g_list_copy(stacking_list); for (it = g_list_last(stacking_copy); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; guint d = c->desktop; if (d != DESKTOP_ALL && d >= movedesktop) { client_set_desktop(c, c->desktop - 1, TRUE, TRUE); ob_debug("moving window %s\n", c->title); } /* raise all the windows that are on the current desktop which is being merged */ if ((screen_desktop == rmdesktop - 1 || screen_desktop == rmdesktop) && (d == DESKTOP_ALL || d == screen_desktop)) { stacking_raise(CLIENT_AS_WINDOW(c)); ob_debug("raising window %s\n", c->title); } } } /* act like we're changing desktops */ if (screen_desktop < screen_num_desktops - 1) { gint d = screen_desktop; screen_desktop = screen_last_desktop; screen_set_desktop(d, TRUE); ob_debug("fake desktop change\n"); } screen_set_num_desktops(screen_num_desktops-1); } actions_client_move(data, TRUE); return FALSE; } |