SystemTheme.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  4. * Copyright (c) 2022, Filiph Sandström <filiph.sandstrom@filfatstudios.com>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/ByteString.h>
  10. #include <AK/Forward.h>
  11. #include <AK/Types.h>
  12. #include <AK/Vector.h>
  13. #include <LibCore/AnonymousBuffer.h>
  14. #include <LibCore/ConfigFile.h>
  15. #include <LibGfx/Color.h>
  16. #include <LibGfx/TextAlignment.h>
  17. namespace Gfx {
  18. #define ENUMERATE_COLOR_ROLES(C) \
  19. C(Accent) \
  20. C(ActiveLink) \
  21. C(ActiveWindowBorder1) \
  22. C(ActiveWindowBorder2) \
  23. C(ActiveWindowTitle) \
  24. C(ActiveWindowTitleShadow) \
  25. C(ActiveWindowTitleStripes) \
  26. C(Base) \
  27. C(BaseText) \
  28. C(Black) \
  29. C(Blue) \
  30. C(BrightBlack) \
  31. C(BrightBlue) \
  32. C(BrightCyan) \
  33. C(BrightGreen) \
  34. C(BrightMagenta) \
  35. C(BrightRed) \
  36. C(BrightWhite) \
  37. C(BrightYellow) \
  38. C(Button) \
  39. C(ButtonText) \
  40. C(ColorSchemeBackground) \
  41. C(ColorSchemeForeground) \
  42. C(Cyan) \
  43. C(DisabledTextFront) \
  44. C(DisabledTextBack) \
  45. C(DesktopBackground) \
  46. C(FocusOutline) \
  47. C(Green) \
  48. C(Gutter) \
  49. C(GutterBorder) \
  50. C(HighlightWindowBorder1) \
  51. C(HighlightWindowBorder2) \
  52. C(HighlightWindowTitle) \
  53. C(HighlightWindowTitleShadow) \
  54. C(HighlightWindowTitleStripes) \
  55. C(HighlightSearching) \
  56. C(HighlightSearchingText) \
  57. C(HoverHighlight) \
  58. C(InactiveSelection) \
  59. C(InactiveSelectionText) \
  60. C(InactiveWindowBorder1) \
  61. C(InactiveWindowBorder2) \
  62. C(InactiveWindowTitle) \
  63. C(InactiveWindowTitleShadow) \
  64. C(InactiveWindowTitleStripes) \
  65. C(Link) \
  66. C(Magenta) \
  67. C(MenuBase) \
  68. C(MenuBaseText) \
  69. C(MenuSelection) \
  70. C(MenuSelectionText) \
  71. C(MenuStripe) \
  72. C(MovingWindowBorder1) \
  73. C(MovingWindowBorder2) \
  74. C(MovingWindowTitle) \
  75. C(MovingWindowTitleShadow) \
  76. C(MovingWindowTitleStripes) \
  77. C(PlaceholderText) \
  78. C(Red) \
  79. C(RubberBandBorder) \
  80. C(RubberBandFill) \
  81. C(Ruler) \
  82. C(RulerActiveText) \
  83. C(RulerBorder) \
  84. C(RulerInactiveText) \
  85. C(Selection) \
  86. C(SelectionText) \
  87. C(SyntaxComment) \
  88. C(SyntaxControlKeyword) \
  89. C(SyntaxIdentifier) \
  90. C(SyntaxKeyword) \
  91. C(SyntaxNumber) \
  92. C(SyntaxOperator) \
  93. C(SyntaxPreprocessorStatement) \
  94. C(SyntaxPreprocessorValue) \
  95. C(SyntaxPunctuation) \
  96. C(SyntaxString) \
  97. C(SyntaxType) \
  98. C(SyntaxFunction) \
  99. C(SyntaxVariable) \
  100. C(SyntaxCustomType) \
  101. C(SyntaxNamespace) \
  102. C(SyntaxMember) \
  103. C(SyntaxParameter) \
  104. C(TextCursor) \
  105. C(ThreedHighlight) \
  106. C(ThreedShadow1) \
  107. C(ThreedShadow2) \
  108. C(Tooltip) \
  109. C(TooltipText) \
  110. C(Tray) \
  111. C(TrayText) \
  112. C(VisitedLink) \
  113. C(White) \
  114. C(Window) \
  115. C(WindowText) \
  116. C(Yellow)
  117. #define ENUMERATE_ALIGNMENT_ROLES(C) \
  118. C(TitleAlignment)
  119. #define ENUMERATE_FLAG_ROLES(C) \
  120. C(BoldTextAsBright) \
  121. C(IsDark) \
  122. C(TitleButtonsIconOnly)
  123. #define ENUMERATE_METRIC_ROLES(C) \
  124. C(BorderThickness) \
  125. C(BorderRadius) \
  126. C(TitleHeight) \
  127. C(TitleButtonWidth) \
  128. C(TitleButtonHeight)
  129. #define ENUMERATE_PATH_ROLES(C) \
  130. C(TitleButtonIcons) \
  131. C(InactiveWindowShadow) \
  132. C(ActiveWindowShadow) \
  133. C(TaskbarShadow) \
  134. C(MenuShadow) \
  135. C(TooltipShadow) \
  136. C(ColorScheme)
  137. enum class ColorRole {
  138. NoRole,
  139. #undef __ENUMERATE_COLOR_ROLE
  140. #define __ENUMERATE_COLOR_ROLE(role) role,
  141. ENUMERATE_COLOR_ROLES(__ENUMERATE_COLOR_ROLE)
  142. #undef __ENUMERATE_COLOR_ROLE
  143. __Count,
  144. Background = Window,
  145. DisabledText = ThreedShadow1,
  146. };
  147. inline StringView to_string(ColorRole role)
  148. {
  149. switch (role) {
  150. case ColorRole::NoRole:
  151. return "NoRole"sv;
  152. #undef __ENUMERATE_COLOR_ROLE
  153. #define __ENUMERATE_COLOR_ROLE(role) \
  154. case ColorRole::role: \
  155. return #role##sv;
  156. ENUMERATE_COLOR_ROLES(__ENUMERATE_COLOR_ROLE)
  157. #undef __ENUMERATE_COLOR_ROLE
  158. default:
  159. VERIFY_NOT_REACHED();
  160. }
  161. }
  162. enum class AlignmentRole {
  163. NoRole,
  164. #undef __ENUMERATE_ALIGNMENT_ROLE
  165. #define __ENUMERATE_ALIGNMENT_ROLE(role) role,
  166. ENUMERATE_ALIGNMENT_ROLES(__ENUMERATE_ALIGNMENT_ROLE)
  167. #undef __ENUMERATE_ALIGNMENT_ROLE
  168. __Count,
  169. };
  170. inline StringView to_string(AlignmentRole role)
  171. {
  172. switch (role) {
  173. case AlignmentRole::NoRole:
  174. return "NoRole"sv;
  175. #undef __ENUMERATE_ALIGNMENT_ROLE
  176. #define __ENUMERATE_ALIGNMENT_ROLE(role) \
  177. case AlignmentRole::role: \
  178. return #role##sv;
  179. ENUMERATE_ALIGNMENT_ROLES(__ENUMERATE_ALIGNMENT_ROLE)
  180. #undef __ENUMERATE_ALIGNMENT_ROLE
  181. default:
  182. VERIFY_NOT_REACHED();
  183. }
  184. }
  185. enum class FlagRole {
  186. NoRole,
  187. #undef __ENUMERATE_FLAG_ROLE
  188. #define __ENUMERATE_FLAG_ROLE(role) role,
  189. ENUMERATE_FLAG_ROLES(__ENUMERATE_FLAG_ROLE)
  190. #undef __ENUMERATE_FLAG_ROLE
  191. __Count,
  192. };
  193. inline StringView to_string(FlagRole role)
  194. {
  195. switch (role) {
  196. case FlagRole::NoRole:
  197. return "NoRole"sv;
  198. #undef __ENUMERATE_FLAG_ROLE
  199. #define __ENUMERATE_FLAG_ROLE(role) \
  200. case FlagRole::role: \
  201. return #role##sv;
  202. ENUMERATE_FLAG_ROLES(__ENUMERATE_FLAG_ROLE)
  203. #undef __ENUMERATE_FLAG_ROLE
  204. default:
  205. VERIFY_NOT_REACHED();
  206. }
  207. }
  208. enum class MetricRole {
  209. NoRole,
  210. #undef __ENUMERATE_METRIC_ROLE
  211. #define __ENUMERATE_METRIC_ROLE(role) role,
  212. ENUMERATE_METRIC_ROLES(__ENUMERATE_METRIC_ROLE)
  213. #undef __ENUMERATE_METRIC_ROLE
  214. __Count,
  215. };
  216. inline StringView to_string(MetricRole role)
  217. {
  218. switch (role) {
  219. case MetricRole::NoRole:
  220. return "NoRole"sv;
  221. #undef __ENUMERATE_METRIC_ROLE
  222. #define __ENUMERATE_METRIC_ROLE(role) \
  223. case MetricRole::role: \
  224. return #role##sv;
  225. ENUMERATE_METRIC_ROLES(__ENUMERATE_METRIC_ROLE)
  226. #undef __ENUMERATE_METRIC_ROLE
  227. default:
  228. VERIFY_NOT_REACHED();
  229. }
  230. }
  231. enum class PathRole {
  232. NoRole,
  233. #undef __ENUMERATE_PATH_ROLE
  234. #define __ENUMERATE_PATH_ROLE(role) role,
  235. ENUMERATE_PATH_ROLES(__ENUMERATE_PATH_ROLE)
  236. #undef __ENUMERATE_PATH_ROLE
  237. __Count,
  238. };
  239. inline StringView to_string(PathRole role)
  240. {
  241. switch (role) {
  242. case PathRole::NoRole:
  243. return "NoRole"sv;
  244. #undef __ENUMERATE_PATH_ROLE
  245. #define __ENUMERATE_PATH_ROLE(role) \
  246. case PathRole::role: \
  247. return #role##sv;
  248. ENUMERATE_PATH_ROLES(__ENUMERATE_PATH_ROLE)
  249. #undef __ENUMERATE_PATH_ROLE
  250. default:
  251. VERIFY_NOT_REACHED();
  252. }
  253. }
  254. struct SystemTheme {
  255. ARGB32 color[(int)ColorRole::__Count];
  256. Gfx::TextAlignment alignment[(int)AlignmentRole::__Count];
  257. bool flag[(int)FlagRole::__Count];
  258. int metric[(int)MetricRole::__Count];
  259. char path[(int)PathRole::__Count][256]; // TODO: PATH_MAX?
  260. };
  261. Core::AnonymousBuffer& current_system_theme_buffer();
  262. void set_system_theme(Core::AnonymousBuffer);
  263. ErrorOr<Core::AnonymousBuffer> load_system_theme(Core::ConfigFile const&, Optional<ByteString> const& color_scheme = OptionalNone());
  264. ErrorOr<Core::AnonymousBuffer> load_system_theme(ByteString const& path, Optional<ByteString> const& color_scheme = OptionalNone());
  265. struct SystemThemeMetaData {
  266. ByteString name;
  267. ByteString menu_name;
  268. ByteString path;
  269. };
  270. ErrorOr<Vector<SystemThemeMetaData>> list_installed_system_themes();
  271. }
  272. using Gfx::ColorRole;