X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Faction.c;h=df3037daba95f377a55dad17152bdf24ff70b437;hb=b76ec18d1c8857cf32598c822364298fc535c84e;hp=6ba52c8959f13d140fbea9a3f5f0e1a7ae3adb08;hpb=eb6a2e9c4b334f53d714a2e7f10f73c63c3d2edd;p=chaz%2Fopenbox diff --git a/openbox/action.c b/openbox/action.c index 6ba52c89..df3037da 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -470,6 +470,16 @@ void setup_action_showmenu(ObAction **a, ObUserAction uact) } } +void setup_action_addremove_desktop_current(ObAction **a, ObUserAction uact) +{ + (*a)->data.addremovedesktop.current = TRUE; +} + +void setup_action_addremove_desktop_last(ObAction **a, ObUserAction uact) +{ + (*a)->data.addremovedesktop.current = FALSE; +} + void setup_action_focus(ObAction **a, ObUserAction uact) { (*a)->data.any.client_action = OB_CLIENT_ACTION_OPTIONAL; @@ -927,6 +937,26 @@ ActionString actionstrings[] = action_break_chroot, NULL }, + { + "adddesktoplast", + action_add_desktop, + setup_action_addremove_desktop_last + }, + { + "removedesktoplast", + action_remove_desktop, + setup_action_addremove_desktop_last + }, + { + "adddesktopcurrent", + action_add_desktop, + setup_action_addremove_desktop_current + }, + { + "removedesktopcurrent", + action_remove_desktop, + setup_action_addremove_desktop_current + }, { NULL, NULL, @@ -1218,59 +1248,6 @@ void action_debug(union ActionData *data) void action_execute(union ActionData *data) { - GError *e = NULL; - gchar *cmd, **argv = 0; - if (data->execute.path) { - cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL); - if (cmd) { - /* If there is a keyboard grab going on then we need to cancel - it so the application can grab things */ - event_cancel_all_key_grabs(); - - if (!g_shell_parse_argv (cmd, NULL, &argv, &e)) { - g_message(_("Failed to execute '%s': %s"), - cmd, e->message); - g_error_free(e); - } else if (data->execute.startupnotify) { - gchar *program; - - program = g_path_get_basename(argv[0]); - /* sets up the environment */ - sn_setup_spawn_environment(program, - data->execute.name, - data->execute.icon_name, - /* launch it on the current - desktop */ - screen_desktop, - data->execute.any.time); - if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | - G_SPAWN_DO_NOT_REAP_CHILD, - NULL, NULL, NULL, &e)) { - g_message(_("Failed to execute '%s': %s"), - cmd, e->message); - g_error_free(e); - sn_spawn_cancel(); - } - unsetenv("DESKTOP_STARTUP_ID"); - g_free(program); - g_strfreev(argv); - } else { - if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | - G_SPAWN_DO_NOT_REAP_CHILD, - NULL, NULL, NULL, &e)) - { - g_message(_("Failed to execute '%s': %s"), - cmd, e->message); - g_error_free(e); - } - g_strfreev(argv); - } - g_free(cmd); - } else { - g_message(_("Failed to convert the path '%s' from utf8"), - data->execute.path); - } - } } void action_activate(union ActionData *data) @@ -1338,7 +1315,7 @@ void action_raiselower(union ActionData *data) ObClient *c = data->client.any.c; client_action_start(data); - stacking_restack_request(c, NULL, Opposite, FALSE); + stacking_restack_request(c, NULL, Opposite); client_action_end(data, config_focus_under_mouse); } @@ -1407,7 +1384,7 @@ void action_toggle_omnipresent(union ActionData *data) { client_set_desktop(data->client.any.c, data->client.any.c->desktop == DESKTOP_ALL ? - screen_desktop : DESKTOP_ALL, FALSE); + screen_desktop : DESKTOP_ALL, FALSE, TRUE); } void action_move_relative_horz(union ActionData *data) @@ -1432,8 +1409,8 @@ void action_move_to_center(union ActionData *data) Rect *area; area = screen_area(c->desktop, client_monitor(c), NULL); client_action_start(data); - client_move(c, area->width / 2 - c->area.width / 2, - area->height / 2 - c->area.height / 2); + client_move(c, area->x + area->width / 2 - c->area.width / 2, + area->y + area->height / 2 - c->area.height / 2); client_action_end(data, FALSE); g_free(area); } @@ -1581,7 +1558,7 @@ void action_send_to_desktop(union ActionData *data) if (data->sendto.desk < screen_num_desktops || data->sendto.desk == DESKTOP_ALL) { - client_set_desktop(c, data->sendto.desk, data->sendto.follow); + client_set_desktop(c, data->sendto.desk, data->sendto.follow, FALSE); if (data->sendto.follow && data->sendto.desk != screen_desktop) screen_set_desktop(data->sendto.desk, TRUE); } @@ -1639,7 +1616,7 @@ void action_send_to_desktop_dir(union ActionData *data) if (!data->sendtodir.inter.any.interactive || (data->sendtodir.inter.final && !data->sendtodir.inter.cancel)) { - client_set_desktop(c, d, data->sendtodir.follow); + client_set_desktop(c, d, data->sendtodir.follow, FALSE); if (data->sendtodir.follow && d != screen_desktop) screen_set_desktop(d, TRUE); } @@ -1647,7 +1624,8 @@ void action_send_to_desktop_dir(union ActionData *data) void action_desktop_last(union ActionData *data) { - screen_set_desktop(screen_last_desktop, TRUE); + if (screen_last_desktop < screen_num_desktops) + screen_set_desktop(screen_last_desktop, TRUE); } void action_toggle_decorations(union ActionData *data) @@ -2003,3 +1981,76 @@ void action_break_chroot(union ActionData *data) /* break out of one chroot */ keyboard_reset_chains(1); } + +void action_add_desktop(union ActionData *data) +{ + client_action_start(data); + screen_set_num_desktops(screen_num_desktops+1); + + /* move all the clients over */ + if (data->addremovedesktop.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); + } + } + + client_action_end(data, config_focus_under_mouse); +} + +void action_remove_desktop(union ActionData *data) +{ + guint rmdesktop, movedesktop; + GList *it, *stacking_copy; + + if (screen_num_desktops < 2) return; + + client_action_start(data); + + /* what desktop are we removing and moving to? */ + if (data->addremovedesktop.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); + + client_action_end(data, config_focus_under_mouse); +}