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 46 SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame, 47 Desktop* desktop) 48 : 49 DefaultDecorator(settings, frame, desktop) 50 { 51 } 52 53 54 void 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 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 122 SATWindowBehaviour::SATWindowBehaviour(Window* window, StackAndTile* sat) 123 : 124 DefaultWindowBehaviour(window), 125 126 fStackAndTile(sat) 127 { 128 } 129 130 131 bool 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