New message: remove_desktop

This commit is contained in:
Bastien Dejean 2013-06-01 12:00:26 +02:00
parent e01130f5d1
commit d9ffb7050f
10 changed files with 47 additions and 7 deletions

View file

@ -159,6 +159,8 @@ The following messages are handled:
- `rename CURRENT_NAME NEW_NAME` — Rename the desktop named `CURRENT_NAME` to `NEW_NAME`.
- `remove_desktop DESKTOP_NAME ...` — Remove the given desktops.
- `cycle_monitor next|prev` — Select the next or previous monitor.
- `cycle_desktop next|prev [--skip-free|--skip-occupied]` — Select the next or previous desktop.

View file

@ -1,6 +1,6 @@
_bspc()
{
local messages='get set list list_desktops list_monitors list_windows list_rules list_history presel cancel ratio pad focus shift swap push pull cycle nearest biggest circulate grab_pointer track_pointer ungrab_pointer toggle_fullscreen toggle_floating toggle_locked toggle_visibility close kill send_to drop_to send_to_monitor drop_to_monitor use use_monitor alternate alternate_desktop alternate_monitor add add_in rename_monitor rename cycle_monitor cycle_desktop layout cycle_layout rotate flip balance rule remove_rule put_status adopt_orphans restore_layout restore_history quit'
local messages='get set list list_desktops list_monitors list_windows list_rules list_history presel cancel ratio pad focus shift swap push pull cycle nearest biggest circulate grab_pointer track_pointer ungrab_pointer toggle_fullscreen toggle_floating toggle_locked toggle_visibility close kill send_to drop_to send_to_monitor drop_to_monitor use use_monitor alternate alternate_desktop alternate_monitor add add_in rename_monitor rename remove_desktop cycle_monitor cycle_desktop layout cycle_layout rotate flip balance rule remove_rule put_status adopt_orphans restore_layout restore_history quit'
local settings='focused_border_color active_border_color normal_border_color presel_border_color focused_locked_border_color active_locked_border_color normal_locked_border_color urgent_border_color border_width window_gap split_ratio top_padding right_padding bottom_padding left_padding wm_name borderless_monocle gapless_monocle focus_follows_pointer adaptative_raise apply_shadow_property auto_alternate focus_by_distance'

View file

@ -222,6 +222,9 @@ Rename the monitor named CURRENT_NAME to NEW_NAME.
.BI rename " CURRENT_NAME NEW_NAME"
Rename the desktop named CURRENT_NAME to NEW_NAME.
.TP
.BI remove_desktop " DESKTOP_NAME ..."
Remove the given desktops.
.TP
.BI cycle_monitor " next|prev"
Select the next or previous monitor.
.TP

View file

@ -424,6 +424,17 @@ void process_message(char *msg, char *rsp)
for (char *name = strtok(NULL, TOK_SEP); name != NULL; name = strtok(NULL, TOK_SEP))
add_desktop(mon, make_desktop(name));
return;
} else if (strcmp(cmd, "remove_desktop") == 0) {
for (char *name = strtok(NULL, TOK_SEP); name != NULL; name = strtok(NULL, TOK_SEP)) {
desktop_location_t loc;
if (locate_desktop(name, &loc)) {
if (loc.desktop->root == NULL && loc.monitor->desk_head != loc.monitor->desk_tail)
remove_desktop(loc.monitor, loc.desktop);
}
}
desktop_show(mon->desk);
update_current();
return;
} else if (strcmp(cmd, "focus") == 0) {
if (mon->desk->focus == NULL || mon->desk->focus->client->fullscreen)
return;

11
rules.c
View file

@ -40,6 +40,17 @@ void remove_rule_by_uid(unsigned int uid)
remove_rule(find_rule(uid));
}
void prune_rules(desktop_t *d)
{
rule_t *r = rule_head;
while (r != NULL) {
rule_t *next = r->next;
if (r->effect.desktop == d)
remove_rule(r);
r = next;
}
}
rule_t *find_rule(unsigned int uid)
{
for (rule_t *r = rule_head; r != NULL; r = r->next)

View file

@ -4,6 +4,7 @@
void add_rule(rule_t *);
void remove_rule(rule_t *);
void remove_rule_by_uid(unsigned int);
void prune_rules(desktop_t *);
rule_t *find_rule(unsigned int);
bool is_match(rule_t *, xcb_window_t);
void handle_rules(xcb_window_t, monitor_t **, desktop_t **, bool *, bool *, bool *, bool *, bool *, bool *);

7
tree.c
View file

@ -779,11 +779,8 @@ void select_desktop(monitor_t *m, desktop_t *d)
PRINTF("select desktop %s\n", d->name);
if (visible) {
for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
window_show(n->client->window);
for (node_t *n = first_extrema(mon->desk->root); n != NULL; n = next_leaf(n, mon->desk->root))
window_hide(n->client->window);
desktop_show(d);
desktop_hide(mon->desk);
}
mon->last_desk = mon->desk;

View file

@ -4,6 +4,7 @@
#include <xcb/xcb_event.h>
#include "bspwm.h"
#include "window.h"
#include "rules.h"
#include "ewmh.h"
#include "settings.h"
#include "types.h"
@ -173,13 +174,13 @@ void unlink_desktop(monitor_t *m, desktop_t *d)
m->last_desk = NULL;
if (m->desk == d)
m->desk = (m->last_desk == NULL ? m->desk_head : m->last_desk);
d->next = d->prev = NULL;
}
void remove_desktop(monitor_t *m, desktop_t *d)
{
PRINTF("remove desktop %s\n", d->name);
prune_rules(d);
unlink_desktop(m, d);
empty_desktop(d);
free(d);

View file

@ -557,6 +557,18 @@ void toggle_visibility(void)
update_current();
}
void desktop_show(desktop_t *d)
{
for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
window_show(n->client->window);
}
void desktop_hide(desktop_t *d)
{
for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
window_hide(n->client->window);
}
void enable_motion_recorder(void)
{
window_raise(motion_recorder);

View file

@ -42,6 +42,8 @@ void window_set_visibility(xcb_window_t, bool);
void window_hide(xcb_window_t);
void window_show(xcb_window_t);
void toggle_visibility(void);
void desktop_show(desktop_t *);
void desktop_hide(desktop_t *);
void enable_motion_recorder(void);
void disable_motion_recorder(void);
void clear_input_focus(void);