1 /*
2 * Copyright 2010-2015, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Clemens Zeidler <haiku@clemens-zeidler.de>
7 * Ingo Weinhold <ingo_weinhold@gmx.de>
8 */
9
10
11 #include "SATDecorator.h"
12
13 #include <new>
14
15 #include <GradientLinear.h>
16 #include <WindowPrivate.h>
17
18 #include "DrawingEngine.h"
19 #include "SATWindow.h"
20
21
22 //#define DEBUG_SATDECORATOR
23 #ifdef DEBUG_SATDECORATOR
24 # define STRACE(x) debug_printf x
25 #else
26 # define STRACE(x) ;
27 #endif
28
29
30 static const rgb_color kFrameColors[4] = {
31 { 152, 152, 152, 255 },
32 { 240, 240, 240, 255 },
33 { 152, 152, 152, 255 },
34 { 108, 108, 108, 255 }
35 };
36
37 static const rgb_color kHighlightFrameColors[6] = {
38 { 52, 52, 52, 255 },
39 { 140, 140, 140, 255 },
40 { 124, 124, 124, 255 },
41 { 108, 108, 108, 255 },
42 { 52, 52, 52, 255 },
43 { 8, 8, 8, 255 }
44 };
45
SATDecorator(DesktopSettings & settings,BRect frame,Desktop * desktop)46 SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame,
47 Desktop* desktop)
48 :
49 DefaultDecorator(settings, frame, desktop)
50 {
51 }
52
53
54 void
UpdateColors(DesktopSettings & settings)55 SATDecorator::UpdateColors(DesktopSettings& settings)
56 {
57 DefaultDecorator::UpdateColors(settings);
58
59 // Called during construction, and during any changes
60 fHighlightTabColor = tint_color(fFocusTabColor, B_DARKEN_2_TINT);
61 fHighlightTabColorLight = tint_color(fHighlightTabColor,
62 (B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2);
63 fHighlightTabColorBevel = tint_color(fHighlightTabColor, B_LIGHTEN_2_TINT);
64 fHighlightTabColorShadow= tint_color(fHighlightTabColor,
65 (B_DARKEN_1_TINT + B_NO_TINT) / 2);
66 }
67
68
69 void
GetComponentColors(Component component,uint8 highlight,ComponentColors _colors,Decorator::Tab * _tab)70 SATDecorator::GetComponentColors(Component component, uint8 highlight,
71 ComponentColors _colors, Decorator::Tab* _tab)
72 {
73 DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
74
75 // Get the standard colors from the DefaultDecorator
76 DefaultDecorator::GetComponentColors(component, highlight, _colors, tab);
77
78 // Now we need to make some changes if the Stack and tile highlight is used
79 if (highlight != HIGHLIGHT_STACK_AND_TILE)
80 return;
81
82 if (tab && tab->isHighlighted == false
83 && (component == COMPONENT_TAB || component == COMPONENT_CLOSE_BUTTON
84 || component == COMPONENT_ZOOM_BUTTON)) {
85 return;
86 }
87
88 switch (component) {
89 case COMPONENT_TAB:
90 _colors[COLOR_TAB_FRAME_LIGHT] = kFrameColors[0];
91 _colors[COLOR_TAB_FRAME_DARK] = kFrameColors[3];
92 _colors[COLOR_TAB] = fHighlightTabColor;
93 _colors[COLOR_TAB_LIGHT] = fHighlightTabColorLight;
94 _colors[COLOR_TAB_BEVEL] = fHighlightTabColorBevel;
95 _colors[COLOR_TAB_SHADOW] = fHighlightTabColorShadow;
96 _colors[COLOR_TAB_TEXT] = fFocusTextColor;
97 break;
98
99 case COMPONENT_CLOSE_BUTTON:
100 case COMPONENT_ZOOM_BUTTON:
101 _colors[COLOR_BUTTON] = fHighlightTabColor;
102 _colors[COLOR_BUTTON_LIGHT] = fHighlightTabColorLight;
103 break;
104
105 case COMPONENT_LEFT_BORDER:
106 case COMPONENT_RIGHT_BORDER:
107 case COMPONENT_TOP_BORDER:
108 case COMPONENT_BOTTOM_BORDER:
109 case COMPONENT_RESIZE_CORNER:
110 default:
111 _colors[0] = kHighlightFrameColors[0];
112 _colors[1] = kHighlightFrameColors[1];
113 _colors[2] = kHighlightFrameColors[2];
114 _colors[3] = kHighlightFrameColors[3];
115 _colors[4] = kHighlightFrameColors[4];
116 _colors[5] = kHighlightFrameColors[5];
117 break;
118 }
119 }
120
121
SATWindowBehaviour(Window * window,StackAndTile * sat)122 SATWindowBehaviour::SATWindowBehaviour(Window* window, StackAndTile* sat)
123 :
124 DefaultWindowBehaviour(window),
125
126 fStackAndTile(sat)
127 {
128 }
129
130
131 bool
AlterDeltaForSnap(Window * window,BPoint & delta,bigtime_t now)132 SATWindowBehaviour::AlterDeltaForSnap(Window* window, BPoint& delta,
133 bigtime_t now)
134 {
135 if (DefaultWindowBehaviour::AlterDeltaForSnap(window, delta, now) == true)
136 return true;
137
138 SATWindow* satWindow = fStackAndTile->GetSATWindow(window);
139 if (satWindow == NULL)
140 return false;
141 SATGroup* group = satWindow->GetGroup();
142 if (group == NULL)
143 return false;
144
145 BRect groupFrame = group->WindowAt(0)->CompleteWindowFrame();
146 for (int32 i = 1; i < group->CountItems(); i++)
147 groupFrame = groupFrame | group->WindowAt(i)->CompleteWindowFrame();
148
149 return fMagneticBorder.AlterDeltaForSnap(window->Screen(),
150 groupFrame, delta, now);
151 }
152