A tiling window manager
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

give_window_focus: Keep utility windows on top of everything

Utility windows are used by Firefox for notifications and
Picture-in-Picture, which should be displayed over everything else.

+51 -8
+10
bar.c
··· 163 163 XUninstallColormap(dpy, current_window()->colormap); 164 164 XInstallColormap(dpy, s->def_cmap); 165 165 166 + raise_utility_windows(); 167 + 166 168 reset_alarm(); 167 169 } 168 170 ··· 178 180 if (current_window()) 179 181 XUninstallColormap(dpy, current_window()->colormap); 180 182 XInstallColormap(dpy, s->def_cmap); 183 + 184 + raise_utility_windows(); 181 185 182 186 reset_alarm(); 183 187 } ··· 489 493 (width / 2) - (defaults.bar_x_padding * 2), FONT_HEIGHT(s), 490 494 (width / 2) + defaults.bar_x_padding, 491 495 defaults.bar_y_padding); 496 + 497 + /* Our XMapRaise may have covered one */ 498 + raise_utility_windows(); 492 499 } 493 500 494 501 void ··· 806 813 } 807 814 XRaiseWindow(dpy, s->bar_window); 808 815 XClearWindow(dpy, s->bar_window); 816 + 817 + raise_utility_windows(); 818 + 809 819 XSync(dpy, False); 810 820 } 811 821
+35 -8
manage.c
··· 341 341 return window_type; 342 342 } 343 343 344 + int 345 + is_unmanaged_window_type(Window win) 346 + { 347 + Atom win_type; 348 + rp_window tmp; 349 + 350 + tmp.w = win; 351 + win_type = get_net_wm_window_type(&tmp); 352 + if (win_type == _net_wm_window_type_dock || 353 + win_type == _net_wm_window_type_splash || 354 + win_type == _net_wm_window_type_tooltip || 355 + win_type == _net_wm_window_type_utility) 356 + return 1; 357 + 358 + return 0; 359 + } 360 + 344 361 void 345 362 update_window_information(rp_window *win) 346 363 { ··· 434 451 int 435 452 unmanaged_window(Window w) 436 453 { 437 - rp_window tmp; 438 - Atom win_type; 439 454 char *wname; 440 455 int i; 441 456 ··· 455 470 456 471 free(wname); 457 472 458 - tmp.w = w; 459 - win_type = get_net_wm_window_type(&tmp); 460 - if (win_type == _net_wm_window_type_dock || 461 - win_type == _net_wm_window_type_splash || 462 - win_type == _net_wm_window_type_tooltip || 463 - win_type == _net_wm_window_type_utility) 473 + if (is_unmanaged_window_type(w)) 464 474 return 1; 465 475 466 476 return 0; ··· 956 966 if (cur->vscr == v) 957 967 hide_window(cur); 958 968 } 969 + 970 + void 971 + raise_utility_windows(void) 972 + { 973 + unsigned int i, nwins; 974 + Window dw1, dw2, *wins; 975 + 976 + XQueryTree(dpy, rp_glob_screen.root, &dw1, &dw2, &wins, &nwins); 977 + 978 + for (i = 0; i < nwins; i++) { 979 + if (is_unmanaged_window_type(wins[i]) && 980 + !is_rp_window(wins[i])) 981 + XRaiseWindow(dpy, wins[i]); 982 + } 983 + 984 + XFree(wins); 985 + }
+2
manage.h
··· 37 37 38 38 int window_is_transient(rp_window *win); 39 39 Atom get_net_wm_window_type(rp_window *win); 40 + int is_unmanaged_window_type(Window win); 40 41 void update_window_information(rp_window *win); 41 42 void map_window(rp_window *win); 42 43 ··· 54 55 void withdraw_window(rp_window *win); 55 56 void hide_others(rp_window *win); 56 57 void hide_vscreen_windows(rp_vscreen *v); 58 + void raise_utility_windows(void); 57 59 58 60 #endif /* ! _SDORFEHS_MANAGE_H */
+2
vscreen.c
··· 281 281 update_bar(v->screen); 282 282 show_frame_indicator(0); 283 283 284 + raise_utility_windows(); 285 + 284 286 /* TODO: rp_switch_vscreen_hook */ 285 287 } 286 288
+2
window.c
··· 389 389 rp_current_screen->current_vscreen = win->vscr; 390 390 set_rp_window_focus(win); 391 391 392 + raise_utility_windows(); 393 + 392 394 XSync(dpy, False); 393 395 } 394 396