diff --git a/src/atoms-list.txt b/src/atoms-list.txt index 757f5a7..d7a5ea1 100644 --- a/src/atoms-list.txt +++ b/src/atoms-list.txt @@ -27,6 +27,7 @@ _NET_WM_STATE _NET_WM_STATE_FULLSCREEN _NET_WM_STATE_MAXIMIZED_HORZ _NET_WM_STATE_MAXIMIZED_VERT +_NET_WM_STATE_SKIP_TASKBAR _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DIALOG _NET_SUPPORTED diff --git a/src/client.c b/src/client.c index 88e565f..ff637cb 100644 --- a/src/client.c +++ b/src/client.c @@ -366,6 +366,7 @@ void client_update_window_type(client_t *client) { if (state_reply) { xcb_atom_t state = *(xcb_atom_t *)xcb_get_property_value(state_reply); + client->skip_taskbar = state == _NET_WM_STATE_SKIP_TASKBAR; if (state == _NET_WM_STATE_FULLSCREEN) { client_set_fullscreen(client, true); } diff --git a/src/event.c b/src/event.c index 77195bb..f148e3b 100644 --- a/src/event.c +++ b/src/event.c @@ -317,12 +317,7 @@ static void enter_notify(xcb_enter_notify_event_t *ev) { if (!client || wm.client_focused == client) return; client_focus(client); -} - -static void focus_in(xcb_focus_in_event_t *ev) { - client_t *client = client_get_by_window(ev->event); - if (!client) return; - wm_set_current_monitor(client->monitor, ev->mode != XCB_NOTIFY_MODE_NORMAL); + wm_set_current_monitor(client->monitor, false); } static void selection_clear(xcb_selection_clear_event_t *ev) { @@ -353,7 +348,6 @@ static void handle_xcb_event(xcb_generic_event_t *event) { EVENT(XCB_UNMAP_NOTIFY, unmap_notify); EVENT(XCB_DESTROY_NOTIFY, destroy_notify); EVENT(XCB_ENTER_NOTIFY, enter_notify); - EVENT(XCB_FOCUS_IN, focus_in); EVENT(XCB_SELECTION_CLEAR, selection_clear); #undef EVENT diff --git a/src/monitor.c b/src/monitor.c index 2fc2c30..27dd5be 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -350,7 +350,10 @@ static void monitor_draw_tasks(monitor_t *monitor, int16_t right_edge) { if (!task_list) return; uint16_t task_count = 0; - for (task_in_tag_t *task = task_list; task; task = task->next) ++task_count; + for (task_in_tag_t *task = task_list; task; task = task->next) { + if (task->client->skip_taskbar) continue; + ++task_count; + }; if (task_count == 0) return; int16_t x = monitor->layout_symbol_extent.end; @@ -361,6 +364,8 @@ static void monitor_draw_tasks(monitor_t *monitor, int16_t right_edge) { if (task_width < wm.font_size) return; for (task_in_tag_t *task = task_list; task; task = task->next) { + if (task->client->skip_taskbar) continue; + task->bar_extent.start = x; task->bar_extent.end = x + task_width; x += task_width; diff --git a/src/types.h b/src/types.h index 9694d12..6c2aff1 100644 --- a/src/types.h +++ b/src/types.h @@ -38,6 +38,7 @@ struct client_t { bool minimize; bool sticky; bool urgent; + bool skip_taskbar; bool size_freeze; /* 尺寸冻结窗口一定是浮动窗口 */ char *class, *instance;