1 /*
2 * This file is part of RawTherapee.
3 *
4 * Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
5 *
6 * RawTherapee is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * RawTherapee is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #include "cursormanager.h"
20
21 #include "options.h"
22 #include "rtimage.h"
23
24 CursorManager mainWindowCursorManager;
25 CursorManager editWindowCursorManager;
26
init(Glib::RefPtr<Gdk::Window> mainWindow)27 void CursorManager::init (Glib::RefPtr<Gdk::Window> mainWindow)
28 {
29
30 display = Gdk::Display::get_default ();
31 #ifndef NDEBUG
32
33 if (!display) {
34 printf("Error: no default display!\n");
35 }
36
37 #endif
38
39 Glib::RefPtr<Gdk::Pixbuf> add = RTImage::createPixbufFromFile("crosshair-small.png");
40 Glib::RefPtr<Gdk::Pixbuf> colPick = RTImage::createPixbufFromFile("color-picker-hicontrast.png");
41 Glib::RefPtr<Gdk::Pixbuf> colPickAdd = RTImage::createPixbufFromFile("color-picker-add-hicontrast.png");
42 Glib::RefPtr<Gdk::Pixbuf> cropDraw = RTImage::createPixbufFromFile("crop-point-hicontrast.png");
43 Glib::RefPtr<Gdk::Pixbuf> crosshair = RTImage::createPixbufFromFile("crosshair-hicontrast.png");
44 Glib::RefPtr<Gdk::Pixbuf> empty = RTImage::createPixbufFromFile("empty.png");
45 Glib::RefPtr<Gdk::Pixbuf> handClosed = RTImage::createPixbufFromFile("hand-closed-hicontrast.png");
46 Glib::RefPtr<Gdk::Pixbuf> handOpen = RTImage::createPixbufFromFile("hand-open-hicontrast.png");
47 Glib::RefPtr<Gdk::Pixbuf> moveBL = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png");
48 Glib::RefPtr<Gdk::Pixbuf> moveBR = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png");
49 Glib::RefPtr<Gdk::Pixbuf> moveL = RTImage::createPixbufFromFile("node-move-x-hicontrast.png");
50 Glib::RefPtr<Gdk::Pixbuf> moveR = RTImage::createPixbufFromFile("node-move-x-hicontrast.png");
51 Glib::RefPtr<Gdk::Pixbuf> moveTL = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png");
52 Glib::RefPtr<Gdk::Pixbuf> moveTR = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png");
53 Glib::RefPtr<Gdk::Pixbuf> moveX = RTImage::createPixbufFromFile("node-move-x-hicontrast.png");
54 Glib::RefPtr<Gdk::Pixbuf> moveXY = RTImage::createPixbufFromFile("node-move-xy-hicontrast.png");
55 Glib::RefPtr<Gdk::Pixbuf> moveY = RTImage::createPixbufFromFile("node-move-y-hicontrast.png");
56 Glib::RefPtr<Gdk::Pixbuf> rotate = RTImage::createPixbufFromFile("rotate-aroundnode-hicontrast.png");
57 Glib::RefPtr<Gdk::Pixbuf> wait = RTImage::createPixbufFromFile("gears.png"); // Currently unused, create *-hicontrast once used.
58
59 double s = RTScalable::getTweakedDPI() / RTScalable::baseDPI; // RTScalable::getDPI() might be preferable, however it imply a lot of work to support this option
60
61 cAdd = add ? Gdk::Cursor::create(display, add, (int)(8.*s), (int)(8.*s)) : Gdk::Cursor::create(display, Gdk::PLUS);
62 cAddPicker = colPickAdd ? Gdk::Cursor::create(display, colPickAdd, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::PLUS);
63 cCropDraw = cropDraw ? Gdk::Cursor::create(display, cropDraw, (int)(3.*s), (int)(3.*s)) : Gdk::Cursor::create(display, Gdk::DIAMOND_CROSS);
64 cCrosshair = crosshair ? Gdk::Cursor::create(display, crosshair, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CROSSHAIR);
65 cEmpty = empty ? Gdk::Cursor::create(display, empty, 12, 12) /* PNG: do not scale */ : Gdk::Cursor::create(display, Gdk::BLANK_CURSOR);
66 cHandClosed = handClosed ? Gdk::Cursor::create(display, handClosed, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND1);
67 cHandOpen = handOpen ? Gdk::Cursor::create(display, handOpen, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND2);
68 cMoveBL = moveBL ? Gdk::Cursor::create(display, moveBL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_LEFT_CORNER);
69 cMoveBR = moveBR ? Gdk::Cursor::create(display, moveBR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_RIGHT_CORNER);
70 cMoveL = moveL ? Gdk::Cursor::create(display, moveL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_LEFT_ARROW);
71 cMoveR = moveR ? Gdk::Cursor::create(display, moveR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_RIGHT_ARROW);
72 cMoveTL = moveTL ? Gdk::Cursor::create(display, moveTL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_LEFT_CORNER);
73 cMoveTR = moveTR ? Gdk::Cursor::create(display, moveTR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_RIGHT_CORNER);
74 cMoveX = moveX ? Gdk::Cursor::create(display, moveX, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_H_DOUBLE_ARROW);
75 cMoveXY = moveXY ? Gdk::Cursor::create(display, moveXY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::FLEUR);
76 cMoveY = moveY ? Gdk::Cursor::create(display, moveY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_V_DOUBLE_ARROW);
77 cRotate = rotate ? Gdk::Cursor::create(display, rotate, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::EXCHANGE);
78 cWB = colPick ? Gdk::Cursor::create(display, colPick, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::TARGET);
79 cWait = wait ? Gdk::Cursor::create(display, wait, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CLOCK);
80
81 window = mainWindow;
82 }
83
cleanup()84 void CursorManager::cleanup()
85 {
86 cAdd.reset();
87 cAddPicker.reset();
88 cCropDraw.reset();
89 cCrosshair.reset();
90 cHandClosed.reset();
91 cHandOpen.reset();
92 cEmpty.reset();
93 cMoveBL.reset();
94 cMoveBR.reset();
95 cMoveL.reset();
96 cMoveR.reset();
97 cMoveTL.reset();
98 cMoveTR.reset();
99 cMoveX.reset();
100 cMoveY.reset();
101 cMoveXY.reset();
102 cRotate.reset();
103 cWB.reset();
104 cWait.reset();
105 }
106
107 /* Set the cursor of the given window */
setCursor(Glib::RefPtr<Gdk::Window> window,CursorShape shape)108 void CursorManager::setCursor (Glib::RefPtr<Gdk::Window> window, CursorShape shape)
109 {
110 switch (shape)
111 {
112 case CursorShape::CSAddColPicker:
113 window->set_cursor(cAddPicker);
114 break;
115 case CursorShape::CSArrow:
116 window->set_cursor(); // set_cursor without any arguments to select system default
117 break;
118 case CursorShape::CSCropSelect:
119 window->set_cursor(cCropDraw);
120 break;
121 case CursorShape::CSCrosshair:
122 window->set_cursor(cCrosshair);
123 break;
124 case CursorShape::CSEmpty:
125 window->set_cursor(cEmpty);
126 break;
127 case CursorShape::CSHandClosed:
128 window->set_cursor(cHandClosed);
129 break;
130 case CursorShape::CSHandOpen:
131 window->set_cursor(cHandOpen);
132 break;
133 case CursorShape::CSMove:
134 window->set_cursor(cHandClosed);
135 break;
136 case CursorShape::CSMove1DH:
137 window->set_cursor(cMoveX);
138 break;
139 case CursorShape::CSMove1DV:
140 window->set_cursor(cMoveY);
141 break;
142 case CursorShape::CSMove2D:
143 window->set_cursor(cMoveXY);
144 break;
145 case CursorShape::CSMoveLeft:
146 window->set_cursor(cMoveL);
147 break;
148 case CursorShape::CSMoveRight:
149 window->set_cursor(cMoveR);
150 break;
151 case CursorShape::CSMoveRotate:
152 window->set_cursor(cRotate);
153 break;
154 case CursorShape::CSPlus:
155 window->set_cursor(cAdd);
156 break;
157 case CursorShape::CSResizeBottomLeft:
158 window->set_cursor(cMoveBL);
159 break;
160 case CursorShape::CSResizeBottomRight:
161 window->set_cursor(cMoveBR);
162 break;
163 case CursorShape::CSResizeDiagonal:
164 window->set_cursor(cMoveXY);
165 break;
166 case CursorShape::CSResizeHeight:
167 window->set_cursor(cMoveY);
168 break;
169 case CursorShape::CSResizeTopLeft:
170 window->set_cursor(cMoveTL);
171 break;
172 case CursorShape::CSResizeTopRight:
173 window->set_cursor(cMoveTR);
174 break;
175 case CursorShape::CSResizeWidth:
176 window->set_cursor(cMoveX);
177 break;
178 case CursorShape::CSSpotWB:
179 window->set_cursor(cWB);
180 break;
181 case CursorShape::CSStraighten:
182 window->set_cursor(cRotate);
183 break;
184 case CursorShape::CSUndefined:
185 break;
186 case CursorShape::CSWait:
187 window->set_cursor(cWait);
188 break;
189 default:
190 window->set_cursor(cCrosshair);
191 }
192 }
193
setWidgetCursor(Glib::RefPtr<Gdk::Window> window,CursorShape shape)194 void CursorManager::setWidgetCursor (Glib::RefPtr<Gdk::Window> window, CursorShape shape)
195 {
196 if (window->get_display() == mainWindowCursorManager.display) {
197 mainWindowCursorManager.setCursor(window, shape);
198 } else if (window->get_display() == editWindowCursorManager.display) {
199 editWindowCursorManager.setCursor(window, shape);
200 }
201
202 #ifndef NDEBUG
203 else {
204 printf("CursorManager::setWidgetCursor / Error: Display not found!\n");
205 }
206
207 #endif
208 }
209
setCursorOfMainWindow(Glib::RefPtr<Gdk::Window> window,CursorShape shape)210 void CursorManager::setCursorOfMainWindow (Glib::RefPtr<Gdk::Window> window, CursorShape shape)
211 {
212 if (window->get_display() == mainWindowCursorManager.display) {
213 mainWindowCursorManager.setCursor(shape);
214 } else if (window->get_display() == editWindowCursorManager.display) {
215 editWindowCursorManager.setCursor(shape);
216 }
217
218 #ifndef NDEBUG
219 else {
220 printf("CursorManager::setCursorOfMainWindow / Error: Display not found!\n");
221 }
222
223 #endif
224 }
225
226 /* Set the cursor of the main window */
setCursor(CursorShape shape)227 void CursorManager::setCursor (CursorShape shape)
228 {
229 setCursor (window, shape);
230 }
231
232