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