| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, this | 
					
						
							|  |  |  |  *    list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
					
						
							|  |  |  |  *    this list of conditions and the following disclaimer in the documentation | 
					
						
							|  |  |  |  *    and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
					
						
							|  |  |  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
					
						
							|  |  |  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
					
						
							|  |  |  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
					
						
							|  |  |  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
					
						
							|  |  |  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  | #include <LibCore/CConfigFile.h>
 | 
					
						
							| 
									
										
										
										
											2020-02-06 12:04:00 +01:00
										 |  |  | #include <LibGfx/SystemTheme.h>
 | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 11:56:38 +01:00
										 |  |  | namespace Gfx { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  | static SystemTheme dummy_theme; | 
					
						
							|  |  |  | static const SystemTheme* theme_page = &dummy_theme; | 
					
						
							|  |  |  | static RefPtr<SharedBuffer> theme_buffer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const SystemTheme& current_system_theme() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASSERT(theme_page); | 
					
						
							|  |  |  |     return *theme_page; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int current_system_theme_buffer_id() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASSERT(theme_buffer); | 
					
						
							|  |  |  |     return theme_buffer->shared_buffer_id(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void set_system_theme(SharedBuffer& buffer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     theme_buffer = buffer; | 
					
						
							|  |  |  |     theme_page = (SystemTheme*)theme_buffer->data(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RefPtr<SharedBuffer> load_system_theme(const String& path) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-02-02 12:34:39 +01:00
										 |  |  |     auto file = Core::ConfigFile::open(path); | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  |     auto buffer = SharedBuffer::create_with_size(sizeof(SystemTheme)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto* data = (SystemTheme*)buffer->data(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-06 01:47:55 +02:00
										 |  |  |     auto get_color = [&](auto& name) { | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  |         auto color_string = file->read_entry("Colors", name); | 
					
						
							|  |  |  |         auto color = Color::from_string(color_string); | 
					
						
							|  |  |  |         if (!color.has_value()) | 
					
						
							|  |  |  |             return Color(Color::Black); | 
					
						
							|  |  |  |         return color.value(); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 20:57:54 +01:00
										 |  |  | #define DO_COLOR(x) \
 | 
					
						
							| 
									
										
										
										
											2020-01-06 01:47:55 +02:00
										 |  |  |     data->color[(int)ColorRole::x] = get_color(#x) | 
					
						
							| 
									
										
										
										
											2019-12-24 20:57:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     DO_COLOR(DesktopBackground); | 
					
						
							|  |  |  |     DO_COLOR(ThreedHighlight); | 
					
						
							|  |  |  |     DO_COLOR(ThreedShadow1); | 
					
						
							|  |  |  |     DO_COLOR(ThreedShadow2); | 
					
						
							|  |  |  |     DO_COLOR(HoverHighlight); | 
					
						
							|  |  |  |     DO_COLOR(Selection); | 
					
						
							|  |  |  |     DO_COLOR(SelectionText); | 
					
						
							|  |  |  |     DO_COLOR(Window); | 
					
						
							|  |  |  |     DO_COLOR(WindowText); | 
					
						
							|  |  |  |     DO_COLOR(Base); | 
					
						
							| 
									
										
										
										
											2019-12-24 22:01:32 +01:00
										 |  |  |     DO_COLOR(BaseText); | 
					
						
							| 
									
										
										
										
											2019-12-24 20:57:54 +01:00
										 |  |  |     DO_COLOR(Button); | 
					
						
							|  |  |  |     DO_COLOR(ButtonText); | 
					
						
							|  |  |  |     DO_COLOR(DesktopBackground); | 
					
						
							|  |  |  |     DO_COLOR(ActiveWindowBorder1); | 
					
						
							|  |  |  |     DO_COLOR(ActiveWindowBorder2); | 
					
						
							|  |  |  |     DO_COLOR(ActiveWindowTitle); | 
					
						
							|  |  |  |     DO_COLOR(InactiveWindowBorder1); | 
					
						
							|  |  |  |     DO_COLOR(InactiveWindowBorder2); | 
					
						
							|  |  |  |     DO_COLOR(InactiveWindowTitle); | 
					
						
							|  |  |  |     DO_COLOR(MovingWindowBorder1); | 
					
						
							|  |  |  |     DO_COLOR(MovingWindowBorder2); | 
					
						
							|  |  |  |     DO_COLOR(MovingWindowTitle); | 
					
						
							|  |  |  |     DO_COLOR(HighlightWindowBorder1); | 
					
						
							|  |  |  |     DO_COLOR(HighlightWindowBorder2); | 
					
						
							|  |  |  |     DO_COLOR(HighlightWindowTitle); | 
					
						
							|  |  |  |     DO_COLOR(MenuStripe); | 
					
						
							|  |  |  |     DO_COLOR(MenuBase); | 
					
						
							| 
									
										
										
										
											2019-12-26 00:58:46 +01:00
										 |  |  |     DO_COLOR(MenuBaseText); | 
					
						
							| 
									
										
										
										
											2019-12-24 20:57:54 +01:00
										 |  |  |     DO_COLOR(MenuSelection); | 
					
						
							| 
									
										
										
										
											2019-12-26 00:58:46 +01:00
										 |  |  |     DO_COLOR(MenuSelectionText); | 
					
						
							| 
									
										
										
										
											2020-01-06 01:47:55 +02:00
										 |  |  |     DO_COLOR(RubberBandFill); | 
					
						
							|  |  |  |     DO_COLOR(RubberBandBorder); | 
					
						
							| 
									
										
										
										
											2020-01-13 20:33:15 +01:00
										 |  |  |     DO_COLOR(Link); | 
					
						
							|  |  |  |     DO_COLOR(ActiveLink); | 
					
						
							|  |  |  |     DO_COLOR(VisitedLink); | 
					
						
							| 
									
										
										
										
											2019-12-23 20:24:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     buffer->seal(); | 
					
						
							|  |  |  |     buffer->share_globally(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return buffer; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-02-06 11:56:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |