From cf1c159ed541222aeeb03d249f1e64ef0650b2df Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 11 Feb 2021 15:12:19 -0700 Subject: [PATCH] WindowServer: Allow different shadows for active/inactive windows Also allow specifying different shadows for the task and menu bar. --- ...indow-shadow.png => frame-shadow-dark.png} | Bin .../themes/Default/frame-shadow-light.png | Bin 0 -> 5074 bytes Base/res/themes/Default.ini | 9 +++++--- Userland/Libraries/LibGfx/Palette.h | 5 ++++- Userland/Libraries/LibGfx/SystemTheme.cpp | 5 ++++- Userland/Libraries/LibGfx/SystemTheme.h | 5 ++++- Userland/Services/WindowServer/Window.cpp | 2 +- .../Services/WindowServer/WindowFrame.cpp | 21 ++++++++++++++---- Userland/Services/WindowServer/WindowFrame.h | 3 ++- .../Services/WindowServer/WindowManager.cpp | 3 +++ 10 files changed, 41 insertions(+), 12 deletions(-) rename Base/res/icons/themes/Default/{window-shadow.png => frame-shadow-dark.png} (100%) create mode 100644 Base/res/icons/themes/Default/frame-shadow-light.png diff --git a/Base/res/icons/themes/Default/window-shadow.png b/Base/res/icons/themes/Default/frame-shadow-dark.png similarity index 100% rename from Base/res/icons/themes/Default/window-shadow.png rename to Base/res/icons/themes/Default/frame-shadow-dark.png diff --git a/Base/res/icons/themes/Default/frame-shadow-light.png b/Base/res/icons/themes/Default/frame-shadow-light.png new file mode 100644 index 0000000000000000000000000000000000000000..29da33354db0ccfd82d65480a99fcc64b9056660 GIT binary patch literal 5074 zcmeAS@N?(olHy`uVBq!ia0y~yV5neVV2~4FV_;y|9?5o%fq{W7$=lt90StaR@2+QH z5N`K$aSW-rbu>0}gKVhayq)E8m60ACEiDccYB`y_I97M%1g5M`=yVk_(~Uf$A*kV? z5a6|7!vTrFfW}P$ks=xnCz}Ke8gv{vvNyI*XtCwI8UN|iy}6J3YvRMdvbWFN`M&A9 zfBL<-*2d4jynMHQ|2t#P$zSJ(q$nLXomhH;r-=DP+=RV~zn$_pEE$RxcgQF_|33Bg z*Ga!qKiT}6v+<)y?WuX;Uxi&>-7lWVdm`^d>4doxvK7Le*R{m(?bK14e){L?r&V){ z_UBd3voVsBz0R*#-t$_W1qYC&FA71fv=w?A9sEC zJACK+&K>WAcD~OqxWE6wzV(mx-F~od`GY!PMgCJ~qFf=r@z?hQU!RAY+=-gpw#H+# zr;BLDj_}IAY*vpHC(M}sB=v-43w6%=KjWeM@&G!QgDC$LHXNE70%Dr zuT9w3b!_G1z;?TkFV;clq~G%@&E@2LF)Oa+xV3x{*ECHY^V#8-5|7($om6%~%<#pc z6RUqMeYj4j{ZC{04#og0ORi6ee`>RG7GC#~dgsvS5#7~P_O)x#abLbKmI4c>)Y=Et z@w2KOep2`T_jAwN-p@{Cdh*}RT5&h_qO$YGmrRWZS_0O0C)%~%x9@t~{^2*L#XQyf z_Nph;#3pt>TWf7}Z{MQ_=Ay@a{wf{!?r(2#Tz0}Y_>4O*w?*s1YXLJ%19< zTBTj|#PHnmxCu_vo*E>zb$^w4(IGeGfF1LHi?%+))fqdayB_AL1yqO|Mo4KX1Qg8- zpHjQ+L%^wb%tzHiUKH%SpZ3Wn`AOw!weKX;thczieCCyz+|P}#gt=W{M*cDACwB94R}u4NNi>C7Z%b6^4U8>57| z?Us?Qhwu9EOrQ5z!Tuv>#=9@#NjD@acJ0@AW9AwW7oAtilkKflwy1x_!!nuu-H-Rpd%`i}e8IN)?;DETKk2BPl75&pr<|$p z{e;qqVKE;vSq^G0k<;nOD!=%CW6}kk!wc2~OY2Pd74_#`gP7|Br92Pb$W?4A@+T7` zw7%@KNPA&^=F4L~A4C5Sd_4lzHd4vgwfwfY`c?e+B4vLu9S_EQb455Ce3L9Jr{~*{r-NzFctNQD2r@H`~;ccbHg`roQ zR|!T6PMy>*?-lx>(zEnhern_eC}K z9@^aJ7H6X#;AK;k@%{P4r928-i=1A+F0?r+FRaBrscF5Ji<-;dbq-(j8oL%I96Y{C zVlQ{l=C?--`%pCz9UXvJi=2@Mb%xfw!NAyLz*UkqT;J6R6`Bc-l!8`%H7INlayLb~Pt3jFoIEAG=uEm_d)xcZ ze{E9E)wjLAtGvcU$z9_8SBZaWg3ETNxb#VET56W8^g7S_{S4pze`rlAGCt?51iMf14<*)CYxWf{bGYDNXVRD7ut$8-PO;#5 z&IL8;jf(23C+9Ev^dzlmMOt?q|M8FfEm!l*E`7T)LDWcplGefQe=|&)jn z&dDwN<39zTi1%u#3s`V}o?X+D-;efGtA5IuyF26Hbkiq_O)J_u>Kvn%)|_jfe641c z(z>bhV_Y|Ex)(gjDOcsmV^up*BNtJZ{SS0@?VscMl>M)@nPSvm)6kPV!(vt4B&Qq!!zU5z zV%BGzi1={r^sh}i7B>5@{xlQ2_R;EOquh77nO(UFf9}q>|D}3@%KjU(IK!+KblSPL zc%SUL&-;^qj=9^s>heyDY?W|7t!c?3QU239R=+NeUVlHuh5zL0w3BORonaOfITiV) zXEU3W)R%ifrVp3&@Pxa0Br=4C!xSWeBxgRz8!akj#jEm{oJ*&BIbMBrXRm#X!mfzdj$$HP>$Xlo9 zH>{RK$od%8b#n`6^$A~-yna)DNfx_67<_I2^a++hhWA+KloU>XoE!M@4V*+nZ{+lM{sN=txDp?9#I0b?? z#fM!gKJ&?Qd+C=8ht~_A-#B00cSf~ji}X|RxQg@hulsV?-h95t)PZ{&lT=GuW#Y;W zwdXlno^9Le%i^>>yl2l@rwp^CJ<0)J6#esB>w@eYQg{=V7C-s*bG>1H#|qw_?TxH= zYQNEIO8T_Ss>4a(8D(rf@ z-&^haZzcTVFzcQR`UXxGQhi$=*}h)5;;Oj5*tX9a^Q$FWZeQ2lX6NUjBT>T3z2{if zC)I!dUe?>H7z%Z_7Hyg_JzQnuCZ=ZH(_Y>;4~tm)FECm7!t`E)u#|zP_N0gte?R|j zdD5^rXHQG%#}@NDY%-C2%v`~H?AA0k2xhcQn7%os?!L$+wx{!QCY7JLk}u0=bG+sn z!`b2qHJU~F**cQ1WxY4eesW;8_X9}szVJ{Y@KAbOWo5Qo=*Q1a`Yj@9grU$E2w6?LmnBw<2C8BEAl!*ok*#~Q` z*r)H>tWlA0L|A;|`K?`T(!pQ2A5FZ;^|Q;yzUYoatKxIc;}y>5GZQL;o%!6a?zk_l zp}fWQ&gz!CEL*tEIW&)$XUOhhA#- zqp3nG+p3MaYndKS?5OKr#bbN-$)sNlX&qU8*YhKk`)XE7e43RdXgPy%{WQicoYvhP zM`N|G{i)liZoX!5doQ#5ZzI;5e#*Yv#56*`cdb<{_dF@pJk`6yX&CKlBgf? zq92dU4_7|!)EMOLvT^1VUygJ>P?XYcjos`dNhnOG*uC{6THUhnku{H=oI`I?ise8rFV z{Ep`T!WvW-rP_8UGUY^Mi)qis#=m=(Z+!N>Q)r^(#{3C$Dz>FtAC9zRSDIqf?{n0y z_jTg@^i!V>&0Lh=;QM;zU2lcZ`D%(GtE(3O_Tbxcr#dBg&Ay2#oAkABGA(R04v%?q z^VJ9U`P$KayVv*cNZYYTPWhcm{)20p-&R>Hah=b@ySB<8B52{udxpXLr*T~rT%dQ( zXyH}`rkAb7OS&%UFS@V99y|3)_aECiFF*y|wMKK7FV@$KS-v@S`zp8nG3=OolG8Kg z;j3e*E@|(gHa`3QS!I#&C8v*T^f&n=TKesN;-FvMpVL(vR}}m0gq`NoNt}Ww?yNp} zXL;yssc9!_){AMBHfqcf=&`+M&e_t`%vI4DC84JxQNHtxaM3FdeplT`^He%Ich5`X zT4@=t@OhK}xt9`&o_130g}dBCwlU7Xt$ML}?jO#g@Wk2e9d)MHb-kUo&1g;M%Iqsx zvcyUGsKaxQRbI|=IxBOpOfWupXXCRk5jUGBJP@=0_-5f&m3gwZ<=oQ0JJMx6;|$o1 zG`6~kc&{i?R#`aX9e3ZxzOzz!q0Lv%d(F(hyY)dg^)9$|hiH92wWSM(keIRr`F+$5E^4Q5^ypzgZ3Y=?ReK0)y zHq^l>?CzRLA;txh_O6i<5R_^!T&b{XrqR2dNeARlR)u}r<^9djO@2ql1IJT7Yi`f& zdH?;3N{1<1jPBE>&Ut$_$YivAKN0fg_&3IW@uT1RDxRc?MqEoszF&T#ru^igc+~)} zZ>*ceZ#{dgTEExfQlG%D8vFZc2b5dp?DARg$;U9}Z0U5jA~VJKH5ZrZg?7hS^cb@S z-j%qhFaD`bbu~w*V)3OV$$l!OJ8y>b_SDEIue{*`~NG27guuc!R%+q*L{ z_~Vi0y-9CVOE;ZE4aQ!PhFB_=Bkx_z`-YM`TnpIYv!iN6+4C)E3G`mE_gh1{gsp6c8NI+zoJ4M zoIwuSeRb-^uIV+*_uoG%Hi;H^U-hZUa)Rk*am{a^jqYrEUVgG>wc_i#pv*q=exIZJ zls<2r`27ak#TD{lyaB!&iY^>>@;lq_@N`mJw&1kiho^Ieh=iF5x=httv?^nuaZqe|MVo+Ur%80ilO;zt!htOkI@R`cujIUc`bc?2B$B*6quYyZPbM7MHY1 zjs6@iaT-rT1Vi3+^=Na z_i5Yw^x!-EW&i3kpAFBTGv*X4 zGxv$^ZDNw|(!bi99Ep1)R~=lx{E5x4cWb&`HgfNEEQ+4Bb()G0ZLzixy{=R{p> z=#KjkmvZ9t9(S{&mlj-{lW%(}zx!aFhFooBHqZ4Z9F8HkD{ODOm$!eD4+e^ik3=W_Rb~rFG)z6HiDQKX98YJk34gdg`PlpMAgd zi2T)-%Cmhm(O#cf@0W{MmBx?#6S;URTOA%96$%X1o9J;bCqM7vf7T-+9kV_3rhDwx zT6CRvmdTy4y}Q?(^cRmP$x}+y-&J;Ocolor(role); } diff --git a/Userland/Libraries/LibGfx/SystemTheme.cpp b/Userland/Libraries/LibGfx/SystemTheme.cpp index 51c31da807..6e2961a3f7 100644 --- a/Userland/Libraries/LibGfx/SystemTheme.cpp +++ b/Userland/Libraries/LibGfx/SystemTheme.cpp @@ -119,9 +119,12 @@ Core::AnonymousBuffer load_system_theme(const String& path) } while (0) DO_PATH(TitleButtonIcons, false); + DO_PATH(ActiveWindowShadow, true); + DO_PATH(InactiveWindowShadow, true); + DO_PATH(TaskBarShadow, true); + DO_PATH(MenuBarShadow, true); DO_PATH(MenuShadow, true); DO_PATH(TooltipShadow, true); - DO_PATH(WindowShadow, true); return buffer; } diff --git a/Userland/Libraries/LibGfx/SystemTheme.h b/Userland/Libraries/LibGfx/SystemTheme.h index a34872c7a6..ad7c423b92 100644 --- a/Userland/Libraries/LibGfx/SystemTheme.h +++ b/Userland/Libraries/LibGfx/SystemTheme.h @@ -144,7 +144,10 @@ enum class MetricRole { enum class PathRole { NoRole, TitleButtonIcons, - WindowShadow, + InactiveWindowShadow, + ActiveWindowShadow, + TaskBarShadow, + MenuBarShadow, MenuShadow, TooltipShadow, __Count, diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 385a9851da..0a28629e16 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -474,7 +474,7 @@ void Window::invalidate(bool invalidate_frame, bool re_render_frame) m_invalidated_frame = true; } if (re_render_frame) - frame().set_dirty(); + frame().set_dirty(true); m_dirty_rects.clear(); Compositor::the().invalidate_window(); } diff --git a/Userland/Services/WindowServer/WindowFrame.cpp b/Userland/Services/WindowServer/WindowFrame.cpp index ac8644de01..9c17e967d9 100644 --- a/Userland/Services/WindowServer/WindowFrame.cpp +++ b/Userland/Services/WindowServer/WindowFrame.cpp @@ -60,11 +60,17 @@ static Gfx::Bitmap* s_close_icon; static String s_last_title_button_icons_path; static int s_last_title_button_icons_scale; -static Gfx::Bitmap* s_window_shadow; +static Gfx::Bitmap* s_active_window_shadow; +static Gfx::Bitmap* s_inactive_window_shadow; +static Gfx::Bitmap* s_menu_bar_shadow; static Gfx::Bitmap* s_menu_shadow; +static Gfx::Bitmap* s_task_bar_shadow; static Gfx::Bitmap* s_tooltip_shadow; -static String s_last_window_shadow_path; +static String s_last_active_window_shadow_path; +static String s_last_inactive_window_shadow_path; +static String s_last_menu_bar_shadow_path; static String s_last_menu_shadow_path; +static String s_last_task_bar_shadow_path; static String s_last_tooltip_shadow_path; static Gfx::IntRect frame_rect_for_window(Window& window, const Gfx::IntRect& rect) @@ -185,8 +191,11 @@ void WindowFrame::reload_config() last_path = String::empty(); } }; - load_shadow(WindowManager::the().palette().window_shadow_path(), s_last_window_shadow_path, s_window_shadow); + load_shadow(WindowManager::the().palette().active_window_shadow_path(), s_last_active_window_shadow_path, s_active_window_shadow); + load_shadow(WindowManager::the().palette().inactive_window_shadow_path(), s_last_inactive_window_shadow_path, s_inactive_window_shadow); + load_shadow(WindowManager::the().palette().menu_bar_shadow_path(), s_last_menu_bar_shadow_path, s_menu_bar_shadow); load_shadow(WindowManager::the().palette().menu_shadow_path(), s_last_menu_shadow_path, s_menu_shadow); + load_shadow(WindowManager::the().palette().task_bar_shadow_path(), s_last_task_bar_shadow_path, s_task_bar_shadow); load_shadow(WindowManager::the().palette().tooltip_shadow_path(), s_last_tooltip_shadow_path, s_tooltip_shadow); } @@ -201,8 +210,12 @@ Gfx::Bitmap* WindowFrame::window_shadow() const return s_menu_shadow; case WindowType::Tooltip: return s_tooltip_shadow; + case WindowType::Menubar: + return s_menu_bar_shadow; + case WindowType::Taskbar: + return s_task_bar_shadow; default: - return s_window_shadow; + return m_window.is_active() ? s_active_window_shadow : s_inactive_window_shadow; } } diff --git a/Userland/Services/WindowServer/WindowFrame.h b/Userland/Services/WindowServer/WindowFrame.h index fa838c8a5b..992ce11921 100644 --- a/Userland/Services/WindowServer/WindowFrame.h +++ b/Userland/Services/WindowServer/WindowFrame.h @@ -82,9 +82,10 @@ public: return true; } - void set_dirty() + void set_dirty(bool re_render_shadow = false) { m_dirty = true; + m_shadow_dirty |= re_render_shadow; } void theme_changed() diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index a9b4c404ca..e2dc90e86a 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -1287,6 +1287,9 @@ void WindowManager::set_active_window(Window* window, bool make_input) } else { MenuManager::the().set_current_menubar(nullptr); } + + // Window shapes may have changed (e.g. shadows for inactive/active windows) + Compositor::the().invalidate_occlusions(); } void WindowManager::set_hovered_window(Window* window)