处理窗口创建/销毁和切换 tag 时的窗口焦点
This commit is contained in:
@@ -191,6 +191,8 @@ void client_manage(xcb_window_t window,
|
|||||||
monitor_arrange(c->monitor);
|
monitor_arrange(c->monitor);
|
||||||
monitor_draw_bar(c->monitor);
|
monitor_draw_bar(c->monitor);
|
||||||
|
|
||||||
|
if (c->tags & c->monitor->selected_tag->mask) client_focus(c);
|
||||||
|
|
||||||
xcb_flush(wm.xcb_conn);
|
xcb_flush(wm.xcb_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,6 +279,7 @@ void client_unmanage(client_t *client) {
|
|||||||
|
|
||||||
client_wipe(client);
|
client_wipe(client);
|
||||||
|
|
||||||
|
monitor_deal_focus(m);
|
||||||
monitor_arrange(m);
|
monitor_arrange(m);
|
||||||
monitor_draw_bar(m);
|
monitor_draw_bar(m);
|
||||||
xcb_flush(wm.xcb_conn);
|
xcb_flush(wm.xcb_conn);
|
||||||
@@ -295,6 +298,11 @@ void client_apply_task_geometry(client_t *client, task_in_tag_t *task) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void client_focus(client_t *client) {
|
||||||
|
wm.client_focused = client;
|
||||||
|
xwindow_focus(client ? client->window : XCB_WINDOW_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
bool client_is_visible(client_t *client) {
|
bool client_is_visible(client_t *client) {
|
||||||
return client->tags & client->monitor->selected_tag->mask;
|
return client->tags & client->monitor->selected_tag->mask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,19 @@ uint32_t monitor_initialize_tag(monitor_t *monitor, const char **tags,
|
|||||||
return tag_count;
|
return tag_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void monitor_deal_focus(monitor_t *monitor) {
|
||||||
|
if (!monitor->selected_tag->task_list) return;
|
||||||
|
|
||||||
|
client_t *client = nullptr;
|
||||||
|
for (client_t *c = wm.client_stack_list; c; c = c->stack_next) {
|
||||||
|
if (client_get_task_in_tag(c, monitor->selected_tag)) {
|
||||||
|
client = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
client_focus(client);
|
||||||
|
}
|
||||||
|
|
||||||
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask) {
|
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask) {
|
||||||
if (monitor->selected_tag->mask == tag_mask) return;
|
if (monitor->selected_tag->mask == tag_mask) return;
|
||||||
|
|
||||||
@@ -60,6 +73,8 @@ void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
monitor_deal_focus(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tag_clean(tag_t *tag) {
|
static void tag_clean(tag_t *tag) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
uint32_t monitor_initialize_tag(monitor_t *monitor, const char **tags,
|
uint32_t monitor_initialize_tag(monitor_t *monitor, const char **tags,
|
||||||
uint32_t tag_index_start_at);
|
uint32_t tag_index_start_at);
|
||||||
|
void monitor_deal_focus(monitor_t *monitor);
|
||||||
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask);
|
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask);
|
||||||
void monitor_clean(monitor_t *monitor);
|
void monitor_clean(monitor_t *monitor);
|
||||||
void monitor_init_bar(monitor_t *monitor);
|
void monitor_init_bar(monitor_t *monitor);
|
||||||
|
|||||||
Reference in New Issue
Block a user