From f052a66c5dd4e16160449263f05b4137e11b76f3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 2 May 2021 14:01:04 +0200 Subject: [PATCH] WindowServer+Base: Show alternate close button for "modified" windows Windows that are marked as modified will now have another (themable) close button. This gives an additional visual clue that some action will be required by the user before the window gets closed. The default window-close-modified icon is an "X" with "..." underneath, building on the established use of "..." in menus to signify that additional user input will be required before an action is completed. --- Base/res/icons/16x16/window-close-modified-2x.png | Bin 0 -> 167 bytes Base/res/icons/16x16/window-close-modified.png | Bin 0 -> 111 bytes .../themes/Coffee/16x16/window-close-modified.png | Bin 0 -> 831 bytes .../Redmond/16x16/window-close-modified.png | Bin 0 -> 99 bytes .../Sunshine/16x16/window-close-modified.png | Bin 0 -> 253 bytes Userland/Services/WindowServer/Window.cpp | 1 + Userland/Services/WindowServer/Window.h | 2 +- Userland/Services/WindowServer/WindowFrame.cpp | 12 +++++++++++- 8 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 Base/res/icons/16x16/window-close-modified-2x.png create mode 100644 Base/res/icons/16x16/window-close-modified.png create mode 100644 Base/res/icons/themes/Coffee/16x16/window-close-modified.png create mode 100644 Base/res/icons/themes/Redmond/16x16/window-close-modified.png create mode 100644 Base/res/icons/themes/Sunshine/16x16/window-close-modified.png diff --git a/Base/res/icons/16x16/window-close-modified-2x.png b/Base/res/icons/16x16/window-close-modified-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f714d1a2e63d85f30077bdf6e1b91b87a5586b7e GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}d7dtgArXh)PI2U8P~>1f z`v3pV>hB9$8D`}?_h6BZmT~6zSbnBZ%te0B=JWuI6Hzl8zB-jeJlJ_+6^nt=noq2L zN^6Xn-)8@4VGVcg@U>sGIek*?MT2(Mh(~UmRt+92+H06+{t5njcK(N5tWF*L&Yd!x VYo|8MXJBAp@O1TaS?83{1ONzDJ)8gl literal 0 HcmV?d00001 diff --git a/Base/res/icons/16x16/window-close-modified.png b/Base/res/icons/16x16/window-close-modified.png new file mode 100644 index 0000000000000000000000000000000000000000..95657d3e4c462c662fee201ec2edd51d611b3378 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7%sgEjLo7}wCrGgFI8d)~ z>}Wf)m=ez+ZVAr|J)ye7OY2fqF23wpva4ZYgL$TW>y8^&xQ`?l`!=P#q<>uV$#|e7?{p@x;TbdoQ|D*J1;s_ zpml%l`y=Ph_4#jXe*El#MdxLaP#Z>$JjT#2i!ED(%44>g@8R}mT;*^_S%syEU87HU zd8cRA^}>~Vli#b{KKK88L7+N^ThyfW*r?Z->=RWCPK4n_akA2?XO_J8v9s7{eBYO0EY|&1Y)v5DK z(q=vTto$VFZG2hJg;YKN>%f2 zn0=%}K6uYlL6&5`Z)`2j&4x`9M@+DcX znbq*|v#p47VF_J$S@OfTyEgCc+!1lqcXG*N+4uk3g#NOymG}IZH|&@G@c1&bNcSp7 z!C!y5FTG^ZJK=J3(PYIny^D=BMM7A$*|N_rx&A;wL%^C_>5nD5c6i6WgXjL5Zrf&j zCENDZ*6TUB=|7)1iiS3eHg_pbovFm3S71GNf|H@=cI!Qn3j;igF1+}7xP145Q_K0c zYwDc2H^G(nXwtm0)%~BJir;^cW_o=6ewpGzyJ!CwuF~l0atswPt%#dbet-Rj=xWC| zKh}qT`K`D*+paI!AkD<_3tL&sR>5O^8_Rso2%eg%^Eb}p^NT4FhX3W*d-+y=5xM$S z$J2kK(ILN%Yi<$7PAM*zn%7!aUYf~LU9G-meN9{O+hdMjjHRWyQ;dw~%=wbJovBHI zMPcqojj2I8YoEOM?j-eFx9H#T|E0-VKN;)){G0N0YNgg|?mM;V6Mf3W8WzZ3%KN_3 lHv3Xe*~)41ckjHAS5;aO?)%1>mw|zS!PC{xWt~$(695NFdIJCe literal 0 HcmV?d00001 diff --git a/Base/res/icons/themes/Redmond/16x16/window-close-modified.png b/Base/res/icons/themes/Redmond/16x16/window-close-modified.png new file mode 100644 index 0000000000000000000000000000000000000000..7eaaf706770e890d5e42bf90575a17d57f17a247 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7v^-rLLo7}wCrGfGF#lgT zBcgB-&%sqQCvrG@1o}@Z&v?(Y=upG5jRrvs40GItKek6zs53AyFnGH9xvXl`!=P89DW1gKGmA7#O-dT^vI!PA4Zwu=c!Q zDt~ADmp^&6hNp4TWM{GTLus#;YJZo|i{06tbYpI{|Np~Bl7)@_KQ3Y1l*Goy#%3$4 zx?>>^4-e1l>$=GidlIaaASqXPKRLYbV3qG&VN2wgU?^*0gPy@Zin= zM#n&d=6{Ee81e)JPD*QW72f0<@a=!%3~>hSqO6IsZL%f|3=9mOu6{1-oD!M m_progress; bool m_should_show_menubar { true }; - bool m_modified { false }; }; } diff --git a/Userland/Services/WindowServer/WindowFrame.cpp b/Userland/Services/WindowServer/WindowFrame.cpp index 21e4136b1f..167890fef2 100644 --- a/Userland/Services/WindowServer/WindowFrame.cpp +++ b/Userland/Services/WindowServer/WindowFrame.cpp @@ -38,6 +38,7 @@ static Gfx::Bitmap* s_minimize_icon; static Gfx::Bitmap* s_maximize_icon; static Gfx::Bitmap* s_restore_icon; static Gfx::Bitmap* s_close_icon; +static Gfx::Bitmap* s_close_modified_icon; static String s_last_title_button_icons_path; static int s_last_title_button_icons_scale; @@ -102,7 +103,7 @@ void WindowFrame::set_button_icons() if (m_window.is_frameless()) return; - m_close_button->set_icon(*s_close_icon); + m_close_button->set_icon(m_window.is_modified() ? *s_close_modified_icon : *s_close_icon); if (m_window.is_minimizable()) m_minimize_button->set_icon(*s_minimize_icon); if (m_window.is_resizable()) @@ -151,6 +152,15 @@ void WindowFrame::reload_config() s_close_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window-close.png", icons_scale).leak_ref(); full_path.clear(); } + if (!s_close_modified_icon || s_last_title_button_icons_path != icons_path || s_last_title_button_icons_scale != icons_scale) { + full_path.append(icons_path); + full_path.append("window-close-modified.png"); + if (s_close_modified_icon) + s_close_modified_icon->unref(); + if (!(s_close_modified_icon = Gfx::Bitmap::load_from_file(full_path.to_string(), icons_scale).leak_ref())) + s_close_modified_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window-close-modified.png", icons_scale).leak_ref(); + full_path.clear(); + } s_last_title_button_icons_path = icons_path; s_last_title_button_icons_scale = icons_scale;