Merge lp:~dyams/unity-2d/mm-updates-pips into lp:unity-2d
- mm-updates-pips
- Merge into trunk
Proposed by
Lohith D Shivamurthy
Status: | Superseded |
---|---|
Proposed branch: | lp:~dyams/unity-2d/mm-updates-pips |
Merge into: | lp:unity-2d |
Diff against target: |
1218 lines (+638/-222) 15 files modified
libunity-2d-private/src/launcherapplication.cpp (+88/-0) libunity-2d-private/src/launcherapplication.h (+5/-0) libunity-2d-private/src/launcheritem.cpp (+6/-0) libunity-2d-private/src/launcheritem.h (+2/-0) libunity-2d-private/src/screeninfo.cpp (+15/-0) libunity-2d-private/src/screeninfo.h (+2/-0) shell/Shell.qml (+5/-1) shell/app/CMakeLists.txt (+2/-0) shell/app/shell.cpp (+3/-51) shell/app/shelldeclarativeview.cpp (+52/-147) shell/app/shelldeclarativeview.h (+16/-20) shell/app/shellmanager.cpp (+380/-0) shell/app/shellmanager.h (+58/-0) shell/launcher/LauncherList.qml (+3/-2) shell/launcher/LauncherLoader.qml (+1/-1) |
To merge this branch: | bzr merge lp:~dyams/unity-2d/mm-updates-pips |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Astals Cid | Pending | ||
Review via email: mp+93350@code.launchpad.net |
Commit message
Description of the change
[shell]
To post a comment you must log in.
- 922. By Lohith D Shivamurthy
-
fix comments
Unmerged revisions
- 922. By Lohith D Shivamurthy
-
fix comments
- 921. By Lohith D Shivamurthy
-
[shell] update pips to show whether application belongs to current screen or not
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'libunity-2d-private/src/launcherapplication.cpp' |
2 | --- libunity-2d-private/src/launcherapplication.cpp 2012-02-06 12:07:47 +0000 |
3 | +++ libunity-2d-private/src/launcherapplication.cpp 2012-02-16 08:16:20 +0000 |
4 | @@ -43,6 +43,7 @@ |
5 | // libunity-2d |
6 | #include <unity2dtr.h> |
7 | #include <debug_p.h> |
8 | +#include <screeninfo.h> |
9 | |
10 | // Qt |
11 | #include <Qt> |
12 | @@ -62,6 +63,14 @@ |
13 | #include <libsn/sn.h> |
14 | } |
15 | |
16 | +#define GOBJECT_CALLBACK0(callbackName, slot) \ |
17 | +static void \ |
18 | +callbackName(GObject* src, QObject* dst) \ |
19 | +{ \ |
20 | + QMetaObject::invokeMethod(dst, slot); \ |
21 | +} |
22 | +GOBJECT_CALLBACK0(geometryChangedCB, "onWindowGeometryChanged") |
23 | + |
24 | const char* SHORTCUT_NICK_PROPERTY = "nick"; |
25 | |
26 | LauncherApplication::LauncherApplication() |
27 | @@ -91,6 +100,7 @@ |
28 | |
29 | LauncherApplication::~LauncherApplication() |
30 | { |
31 | + disconnectWindowSignals(); |
32 | } |
33 | |
34 | bool |
35 | @@ -526,6 +536,29 @@ |
36 | WnckWindow* window = wnck_window_get(xids->at(i)); |
37 | g_signal_connect(G_OBJECT(window), "workspace-changed", |
38 | G_CALLBACK(LauncherApplication::onWindowWorkspaceChanged), this); |
39 | + g_signal_connect(G_OBJECT(window), "geometry-changed", G_CALLBACK(geometryChangedCB), this); |
40 | + } |
41 | +} |
42 | + |
43 | +void |
44 | +LauncherApplication::disconnectWindowSignals() |
45 | +{ |
46 | + if (m_application == NULL || m_application->running() == false) { |
47 | + return; |
48 | + } |
49 | + |
50 | + QScopedPointer<BamfUintList> xids(m_application->xids()); |
51 | + int size = xids->size(); |
52 | + if (size < 1) { |
53 | + return; |
54 | + } |
55 | + |
56 | + WnckScreen* screen = wnck_screen_get_default(); |
57 | + wnck_screen_force_update(screen); |
58 | + |
59 | + for (int i = 0; i < size; ++i) { |
60 | + WnckWindow* window = wnck_window_get(xids->at(i)); |
61 | + g_signal_handlers_disconnect_by_func(window, gpointer(geometryChangedCB), this); |
62 | } |
63 | } |
64 | |
65 | @@ -537,6 +570,7 @@ |
66 | WnckWindow* wnck_window = wnck_window_get(window->xid()); |
67 | g_signal_connect(G_OBJECT(wnck_window), "workspace-changed", |
68 | G_CALLBACK(LauncherApplication::onWindowWorkspaceChanged), this); |
69 | + g_signal_connect(G_OBJECT(window), "geometry-changed", G_CALLBACK(geometryChangedCB), this); |
70 | } |
71 | } |
72 | |
73 | @@ -665,6 +699,42 @@ |
74 | return windowCount; |
75 | } |
76 | |
77 | +int |
78 | +LauncherApplication::windowCountOnCurrentScreen(int screen) |
79 | +{ |
80 | + int windowCount = 0; |
81 | + |
82 | + if (!m_application) { |
83 | + return windowCount; |
84 | + } |
85 | + |
86 | + ScreenInfo screenInfo(screen); |
87 | + QScopedPointer<BamfUintList> xids(m_application->xids()); |
88 | + for (int i = 0; i < xids->size(); i++) { |
89 | + /* When geting the wnck window, it's possible we get a NULL |
90 | + return value because wnck hasn't updated its internal list yet, |
91 | + so we need to force it once to be sure */ |
92 | + WnckWindow *window = wnck_window_get(xids->at(i)); |
93 | + if (window == NULL) { |
94 | + wnck_screen_force_update(wnck_screen_get_default()); |
95 | + window = wnck_window_get(xids->at(i)); |
96 | + if (window == NULL) { |
97 | + continue; |
98 | + } |
99 | + } |
100 | + |
101 | + // Check the window screen |
102 | + int x, y, width, height; |
103 | + wnck_window_get_geometry(window, &x, &y, &width, &height); |
104 | + QRect windowRect(x, y, width, height); |
105 | + QPoint pos = windowRect.center(); |
106 | + if (ScreenInfo::screenNumber(pos) == screen) { |
107 | + windowCount++; |
108 | + } |
109 | + } |
110 | + return windowCount; |
111 | +} |
112 | + |
113 | void |
114 | LauncherApplication::activate() |
115 | { |
116 | @@ -986,6 +1056,18 @@ |
117 | return false; |
118 | } |
119 | |
120 | +bool |
121 | +LauncherApplication::belongsToDifferentScreen(int screen) |
122 | +{ |
123 | + int totalWindows = windowCount(); |
124 | + int windowsInCurrentScreen = windowCountOnCurrentScreen(screen); |
125 | + if (totalWindows > 0 && windowsInCurrentScreen == 0) { |
126 | + return true; |
127 | + } |
128 | + |
129 | + return false; |
130 | +} |
131 | + |
132 | void |
133 | LauncherApplication::onIndicatorMenuUpdated() |
134 | { |
135 | @@ -1110,6 +1192,12 @@ |
136 | } |
137 | |
138 | void |
139 | +LauncherApplication::onWindowGeometryChanged() |
140 | +{ |
141 | + windowGeometryChanged(); |
142 | +} |
143 | + |
144 | +void |
145 | LauncherApplication::onDragEnter(DeclarativeDragDropEvent* event) |
146 | { |
147 | QList<QUrl> urls = validateUrisForLaunch(event->mimeData()); |
148 | |
149 | === modified file 'libunity-2d-private/src/launcherapplication.h' |
150 | --- libunity-2d-private/src/launcherapplication.h 2012-02-06 12:07:47 +0000 |
151 | +++ libunity-2d-private/src/launcherapplication.h 2012-02-16 08:16:20 +0000 |
152 | @@ -105,7 +105,9 @@ |
153 | |
154 | Q_INVOKABLE virtual void createMenuActions(); |
155 | Q_INVOKABLE virtual bool belongsToDifferentWorkspace(); |
156 | + Q_INVOKABLE virtual bool belongsToDifferentScreen(int screen); |
157 | Q_INVOKABLE void connectWindowSignals(); |
158 | + void disconnectWindowSignals(); |
159 | |
160 | void updateOverlaysState(const QString& sender, const QMap<QString, QVariant>& properties); |
161 | |
162 | @@ -151,6 +153,8 @@ |
163 | void onDragEnter(DeclarativeDragDropEvent*); |
164 | void onDrop(DeclarativeDragDropEvent*); |
165 | |
166 | + void onWindowGeometryChanged(); |
167 | + |
168 | private: |
169 | QPointer<BamfApplication> m_application; |
170 | QFileSystemWatcher *m_desktopFileWatcher; |
171 | @@ -175,6 +179,7 @@ |
172 | void createDynamicMenuActions(); |
173 | void createStaticMenuActions(); |
174 | int windowCountOnCurrentWorkspace(); |
175 | + int windowCountOnCurrentScreen(int); |
176 | template<typename T> |
177 | bool updateOverlayState(const QMap<QString, QVariant>& properties, |
178 | const QString& propertyName, T* member); |
179 | |
180 | === modified file 'libunity-2d-private/src/launcheritem.cpp' |
181 | --- libunity-2d-private/src/launcheritem.cpp 2012-02-06 12:07:47 +0000 |
182 | +++ libunity-2d-private/src/launcheritem.cpp 2012-02-16 08:16:20 +0000 |
183 | @@ -93,6 +93,12 @@ |
184 | } |
185 | |
186 | bool |
187 | +LauncherItem::belongsToDifferentScreen(int) |
188 | +{ |
189 | + return false; |
190 | +} |
191 | + |
192 | +bool |
193 | LauncherItem::progressBarVisible() const |
194 | { |
195 | return false; |
196 | |
197 | === modified file 'libunity-2d-private/src/launcheritem.h' |
198 | --- libunity-2d-private/src/launcheritem.h 2012-02-06 12:07:47 +0000 |
199 | +++ libunity-2d-private/src/launcheritem.h 2012-02-16 08:16:20 +0000 |
200 | @@ -80,6 +80,7 @@ |
201 | Q_INVOKABLE virtual void createMenuActions() = 0; |
202 | Q_INVOKABLE virtual void launchNewInstance(); |
203 | Q_INVOKABLE virtual bool belongsToDifferentWorkspace(); |
204 | + Q_INVOKABLE virtual bool belongsToDifferentScreen(int); |
205 | |
206 | protected: |
207 | LauncherContextualMenu* m_menu; |
208 | @@ -102,6 +103,7 @@ |
209 | void emblemVisibleChanged(bool); |
210 | void emblemChanged(QString); |
211 | void windowWorkspaceChanged(); |
212 | + void windowGeometryChanged(); |
213 | |
214 | public Q_SLOTS: |
215 | /* Default implementation of drag’n’drop handling, should be overridden in |
216 | |
217 | === modified file 'libunity-2d-private/src/screeninfo.cpp' |
218 | --- libunity-2d-private/src/screeninfo.cpp 2012-02-01 16:28:13 +0000 |
219 | +++ libunity-2d-private/src/screeninfo.cpp 2012-02-16 08:16:20 +0000 |
220 | @@ -198,6 +198,21 @@ |
221 | return m_corner; |
222 | } |
223 | |
224 | +int |
225 | +ScreenInfo::cursorScreen() |
226 | +{ |
227 | + QDesktopWidget* desktop = QApplication::desktop(); |
228 | + QPoint cursorPos(QCursor::pos()); |
229 | + return desktop->screenNumber(cursorPos); |
230 | +} |
231 | + |
232 | +int |
233 | +ScreenInfo::screenNumber(QPoint point) |
234 | +{ |
235 | + QDesktopWidget* desktop = QApplication::desktop(); |
236 | + return desktop->screenNumber(point); |
237 | +} |
238 | + |
239 | void |
240 | ScreenInfo::setCorner(Corner corner) |
241 | { |
242 | |
243 | === modified file 'libunity-2d-private/src/screeninfo.h' |
244 | --- libunity-2d-private/src/screeninfo.h 2012-02-01 15:01:21 +0000 |
245 | +++ libunity-2d-private/src/screeninfo.h 2012-02-16 08:16:20 +0000 |
246 | @@ -39,6 +39,8 @@ |
247 | int screen() const; |
248 | QWidget* widget() const; |
249 | Corner corner() const; |
250 | + static int cursorScreen(); |
251 | + static int screenNumber(QPoint); |
252 | |
253 | /* Setters */ |
254 | void setScreen(int screen); |
255 | |
256 | === modified file 'shell/Shell.qml' |
257 | --- shell/Shell.qml 2012-02-13 09:15:03 +0000 |
258 | +++ shell/Shell.qml 2012-02-16 08:16:20 +0000 |
259 | @@ -106,7 +106,11 @@ |
260 | |
261 | Loader { |
262 | id: dashLoader |
263 | - source: "dash/Dash.qml" |
264 | + /* TODO : In case of multi-monitors, there should be only one dash, |
265 | + which could be moved to any screen. |
266 | + ATM, we are displaying dash for the leftmost screen only. other screens will not support dash yet. |
267 | + */ |
268 | + source: (declarativeView.isTopLeftShell ? "dash/Dash.qml" : "") |
269 | anchors.top: parent.top |
270 | x: Utils.isLeftToRight() ? launcherLoader.width : shell.width - width - launcherLoader.width |
271 | onLoaded: item.focus = true |
272 | |
273 | === modified file 'shell/app/CMakeLists.txt' |
274 | --- shell/app/CMakeLists.txt 2012-02-13 23:46:04 +0000 |
275 | +++ shell/app/CMakeLists.txt 2012-02-16 08:16:20 +0000 |
276 | @@ -8,12 +8,14 @@ |
277 | dashdbus.cpp |
278 | launcherdbus.cpp |
279 | shelldeclarativeview.cpp |
280 | + shellmanager.cpp |
281 | ) |
282 | |
283 | set(shell_MOC_HDRS |
284 | dashdbus.h |
285 | launcherdbus.h |
286 | shelldeclarativeview.h |
287 | + shellmanager.h |
288 | ) |
289 | |
290 | qt4_wrap_cpp(shell_MOC_SRCS ${shell_MOC_HDRS}) |
291 | |
292 | === modified file 'shell/app/shell.cpp' |
293 | --- shell/app/shell.cpp 2012-02-13 23:46:04 +0000 |
294 | +++ shell/app/shell.cpp 2012-02-16 08:16:20 +0000 |
295 | @@ -21,30 +21,16 @@ |
296 | // QT |
297 | #include <QApplication> |
298 | #include <QDebug> |
299 | -#include <QtDeclarative> |
300 | -#include <QDeclarativeEngine> |
301 | -#include <QDeclarativeView> |
302 | -#include <QDesktopWidget> |
303 | -#include <QDBusConnection> |
304 | -#include <QDBusConnectionInterface> |
305 | -#include <QDeclarativeContext> |
306 | -#include <QAbstractEventDispatcher> |
307 | #include <QDir> |
308 | - |
309 | -// X11 |
310 | -#include <X11/Xlib.h> |
311 | +#include <QUrl> |
312 | |
313 | // unity-2d |
314 | #include <gnomesessionclient.h> |
315 | #include <unity2dapplication.h> |
316 | -#include <unity2ddebug.h> |
317 | |
318 | // Local |
319 | #include "config.h" |
320 | -#include "shelldeclarativeview.h" |
321 | -#include "dashclient.h" |
322 | -#include "dashdbus.h" |
323 | -#include "launcherdbus.h" |
324 | +#include "shellmanager.h" |
325 | |
326 | int main(int argc, char *argv[]) |
327 | { |
328 | @@ -71,32 +57,7 @@ |
329 | GnomeSessionClient client(INSTALL_PREFIX "/share/applications/unity-2d-shell.desktop"); |
330 | client.connectToSessionManager(); |
331 | |
332 | - qmlRegisterType<ShellDeclarativeView>("Unity2d", 1, 0, "ShellDeclarativeView"); |
333 | - ShellDeclarativeView view; |
334 | - view.setAccessibleName("Shell"); |
335 | - if (arguments.contains("-opengl")) { |
336 | - view.setUseOpenGL(true); |
337 | - } |
338 | - |
339 | - application.installX11EventFilter(&view); |
340 | - |
341 | - view.engine()->addImportPath(unity2dImportPath()); |
342 | - view.engine()->setBaseUrl(QUrl::fromLocalFile(unity2dDirectory() + "/shell/")); |
343 | - |
344 | - /* Load the QML UI, focus and show the window */ |
345 | - view.setResizeMode(QDeclarativeView::SizeViewToRootObject); |
346 | - view.rootContext()->setContextProperty("declarativeView", &view); |
347 | - // WARNING This declaration of dashClient used to be in Unity2d/plugin.cpp |
348 | - // but it lead to locks when both the shell and the spread were started |
349 | - // at the same time since SpreadMonitor QDBusServiceWatcher::serviceRegistered |
350 | - // and DashClient QDBusServiceWatcher::serviceRegistered |
351 | - // triggered at the same time ending up with both creating QDBusInterface |
352 | - // to eachother in the main thread meaning they would block |
353 | - // In case you need to have a DashClient in the spread the fix for the problem |
354 | - // is moving the QDbusInterface creation to a thread so it does not block |
355 | - // the main thread |
356 | - view.rootContext()->setContextProperty("dashClient", DashClient::instance()); |
357 | - view.setSource(rootFileUrl); |
358 | + ShellManager shells(rootFileUrl); |
359 | |
360 | /* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes (launched |
361 | applications) to use the same client id. |
362 | @@ -113,14 +74,5 @@ |
363 | (see e.g. https://bugs.launchpad.net/bugs/684471). */ |
364 | QDir::setCurrent(QDir::homePath()); |
365 | |
366 | - DashDBus dashDBus(&view); |
367 | - if (!dashDBus.connectToBus()) { |
368 | - qCritical() << "Another instance of the Dash already exists. Quitting."; |
369 | - return -1; |
370 | - } |
371 | - |
372 | - LauncherDBus launcherDBus(&view); |
373 | - launcherDBus.connectToBus(); |
374 | - |
375 | return application.exec(); |
376 | } |
377 | |
378 | === modified file 'shell/app/shelldeclarativeview.cpp' |
379 | --- shell/app/shelldeclarativeview.cpp 2012-02-13 23:46:04 +0000 |
380 | +++ shell/app/shelldeclarativeview.cpp 2012-02-16 08:16:20 +0000 |
381 | @@ -22,11 +22,6 @@ |
382 | // libunity-2d-private |
383 | #include <debug_p.h> |
384 | #include <hotkey.h> |
385 | -#include <hotkeymonitor.h> |
386 | -#include <keyboardmodifiersmonitor.h> |
387 | -#include <keymonitor.h> |
388 | -#include <dashclient.h> |
389 | -#include <launcherclient.h> |
390 | #include <screeninfo.h> |
391 | #include <strutmanager.h> |
392 | |
393 | @@ -47,46 +42,20 @@ |
394 | #include <X11/Xlib.h> |
395 | #include <X11/Xatom.h> |
396 | |
397 | -static const int KEY_HOLD_THRESHOLD = 250; |
398 | - |
399 | static const char* COMMANDS_LENS_ID = "commands.lens"; |
400 | |
401 | -ShellDeclarativeView::ShellDeclarativeView() |
402 | +ShellDeclarativeView::ShellDeclarativeView(const QUrl &sourceFileUrl, bool isTopLeftShell, int screen) |
403 | : Unity2DDeclarativeView() |
404 | , m_mode(DesktopMode) |
405 | , m_expanded(true) |
406 | , m_active(false) |
407 | - , m_superKeyPressed(false) |
408 | - , m_superKeyHeld(false) |
409 | + , m_isTopLeftShell(isTopLeftShell) |
410 | + , m_sourceFileUrl(sourceFileUrl) |
411 | { |
412 | setAttribute(Qt::WA_X11NetWmWindowTypeDock, true); |
413 | setTransparentBackground(QX11Info::isCompositingManagerRunning()); |
414 | |
415 | - m_screenInfo = new ScreenInfo(ScreenInfo::TopLeft, this); |
416 | - |
417 | - m_superKeyHoldTimer.setSingleShot(true); |
418 | - m_superKeyHoldTimer.setInterval(KEY_HOLD_THRESHOLD); |
419 | - connect(&m_superKeyHoldTimer, SIGNAL(timeout()), SLOT(updateSuperKeyHoldState())); |
420 | - connect(this, SIGNAL(superKeyTapped()), SLOT(toggleDash())); |
421 | - |
422 | - connect(&launcher2dConfiguration(), SIGNAL(superKeyEnableChanged(bool)), SLOT(updateSuperKeyMonitoring())); |
423 | - updateSuperKeyMonitoring(); |
424 | - |
425 | - /* Alt+F1 reveal the launcher and gives the keyboard focus to the Dash Button. */ |
426 | - Hotkey* altF1 = HotkeyMonitor::instance().getHotkeyFor(Qt::Key_F1, Qt::AltModifier); |
427 | - connect(altF1, SIGNAL(pressed()), SLOT(onAltF1Pressed())); |
428 | - |
429 | - /* Alt+F2 shows the dash with the commands lens activated. */ |
430 | - Hotkey* altF2 = HotkeyMonitor::instance().getHotkeyFor(Qt::Key_F2, Qt::AltModifier); |
431 | - connect(altF2, SIGNAL(pressed()), SLOT(showCommandsLens())); |
432 | - |
433 | - /* Super+{n} for 0 ≤ n ≤ 9 activates the item with index (n + 9) % 10. */ |
434 | - for (Qt::Key key = Qt::Key_0; key <= Qt::Key_9; key = (Qt::Key) (key + 1)) { |
435 | - Hotkey* hotkey = HotkeyMonitor::instance().getHotkeyFor(key, Qt::MetaModifier); |
436 | - connect(hotkey, SIGNAL(pressed()), SLOT(forwardNumericHotkey())); |
437 | - hotkey = HotkeyMonitor::instance().getHotkeyFor(key, Qt::MetaModifier | Qt::ShiftModifier); |
438 | - connect(hotkey, SIGNAL(pressed()), SLOT(forwardNumericHotkey())); |
439 | - } |
440 | + m_screenInfo = new ScreenInfo(screen, this); |
441 | |
442 | connect(m_screenInfo, SIGNAL(availableGeometryChanged(QRect)), SLOT(updateShellPosition())); |
443 | updateShellPosition(); |
444 | @@ -172,6 +141,9 @@ |
445 | /* Note that this has to be called everytime the window is shown, as the WM |
446 | will remove the flags when the window is hidden */ |
447 | setWMFlags(); |
448 | + if (source().isEmpty()) { |
449 | + setSource(m_sourceFileUrl); |
450 | + } |
451 | } |
452 | |
453 | void |
454 | @@ -262,7 +234,7 @@ |
455 | } |
456 | |
457 | void |
458 | -ShellDeclarativeView::onAltF1Pressed() |
459 | +ShellDeclarativeView::toggleLauncher() |
460 | { |
461 | if (!isActiveWindow()) { |
462 | forceActivateWindow(); |
463 | @@ -279,117 +251,27 @@ |
464 | } |
465 | } |
466 | |
467 | -/* ----------------- super key handling ---------------- */ |
468 | - |
469 | -void |
470 | -ShellDeclarativeView::updateSuperKeyHoldState() |
471 | -{ |
472 | - /* If the key was released in the meantime, just do nothing, otherwise |
473 | - consider the key being held, unless we're told to ignore it. */ |
474 | - if (m_superKeyPressed && !m_superPressIgnored) { |
475 | - m_superKeyHeld = true; |
476 | - Q_EMIT superKeyHeldChanged(m_superKeyHeld); |
477 | - } |
478 | -} |
479 | - |
480 | -void |
481 | -ShellDeclarativeView::updateSuperKeyMonitoring() |
482 | -{ |
483 | - KeyboardModifiersMonitor *modifiersMonitor = KeyboardModifiersMonitor::instance(); |
484 | - KeyMonitor *keyMonitor = KeyMonitor::instance(); |
485 | - HotkeyMonitor& hotkeyMonitor = HotkeyMonitor::instance(); |
486 | - |
487 | - QVariant value = launcher2dConfiguration().property("superKeyEnable"); |
488 | - if (!value.isValid() || value.toBool() == true) { |
489 | - hotkeyMonitor.enableModifiers(Qt::MetaModifier); |
490 | - QObject::connect(modifiersMonitor, |
491 | - SIGNAL(keyboardModifiersChanged(Qt::KeyboardModifiers)), |
492 | - this, SLOT(setHotkeysForModifiers(Qt::KeyboardModifiers))); |
493 | - /* Ignore Super presses if another key was pressed simultaneously |
494 | - (i.e. a shortcut). https://bugs.launchpad.net/unity-2d/+bug/801073 */ |
495 | - QObject::connect(keyMonitor, |
496 | - SIGNAL(keyPressed()), |
497 | - this, SLOT(ignoreSuperPress())); |
498 | - setHotkeysForModifiers(modifiersMonitor->keyboardModifiers()); |
499 | - } else { |
500 | - hotkeyMonitor.disableModifiers(Qt::MetaModifier); |
501 | - QObject::disconnect(modifiersMonitor, |
502 | - SIGNAL(keyboardModifiersChanged(Qt::KeyboardModifiers)), |
503 | - this, SLOT(setHotkeysForModifiers(Qt::KeyboardModifiers))); |
504 | - QObject::disconnect(keyMonitor, |
505 | - SIGNAL(keyPressed()), |
506 | - this, SLOT(ignoreSuperPress())); |
507 | - m_superKeyHoldTimer.stop(); |
508 | - m_superKeyPressed = false; |
509 | - if (m_superKeyHeld) { |
510 | - m_superKeyHeld = false; |
511 | - Q_EMIT superKeyHeldChanged(false); |
512 | - } |
513 | - } |
514 | -} |
515 | - |
516 | -void |
517 | -ShellDeclarativeView::setHotkeysForModifiers(Qt::KeyboardModifiers modifiers) |
518 | -{ |
519 | - /* This is the new new state of the Super key (AKA Meta key), while |
520 | - m_superKeyPressed is the previous state of the key at the last modifiers change. */ |
521 | - bool superKeyPressed = modifiers.testFlag(Qt::MetaModifier); |
522 | - |
523 | - if (m_superKeyPressed != superKeyPressed) { |
524 | - m_superKeyPressed = superKeyPressed; |
525 | - if (superKeyPressed) { |
526 | - m_superPressIgnored = false; |
527 | - /* If the key is pressed, start up a timer to monitor if it's being held short |
528 | - enough to qualify as just a "tap" or as a proper hold */ |
529 | - m_superKeyHoldTimer.start(); |
530 | - } else { |
531 | - m_superKeyHoldTimer.stop(); |
532 | - |
533 | - /* If the key is released, and was not being held, it means that the user just |
534 | - performed a "tap". Unless we're told to ignore that tap, that is. */ |
535 | - if (!m_superKeyHeld && !m_superPressIgnored) { |
536 | - Q_EMIT superKeyTapped(); |
537 | - } |
538 | - /* Otherwise the user just terminated a hold. */ |
539 | - else if(m_superKeyHeld){ |
540 | - m_superKeyHeld = false; |
541 | - Q_EMIT superKeyHeldChanged(m_superKeyHeld); |
542 | - } |
543 | - } |
544 | - } |
545 | -} |
546 | - |
547 | -void |
548 | -ShellDeclarativeView::ignoreSuperPress() |
549 | -{ |
550 | - /* There was a key pressed, ignore current super tap/hold */ |
551 | - m_superPressIgnored = true; |
552 | -} |
553 | - |
554 | -void |
555 | -ShellDeclarativeView::forwardNumericHotkey() |
556 | -{ |
557 | - Hotkey* hotkey = qobject_cast<Hotkey*>(sender()); |
558 | - if (hotkey != NULL) { |
559 | - /* Shortcuts from 1 to 9 should activate the items with index |
560 | - from 1 to 9 (index 0 being the so-called "BFB" or Dash launcher). |
561 | - Shortcut for 0 should activate item with index 10. |
562 | - In other words, the indexes are activated in the same order as |
563 | - the keys appear on a standard keyboard. */ |
564 | - Qt::Key key = hotkey->key(); |
565 | - if (key >= Qt::Key_1 && key <= Qt::Key_9) { |
566 | - int index = key - Qt::Key_0; |
567 | - if (hotkey->modifiers() & Qt::ShiftModifier) { |
568 | - Q_EMIT newInstanceShortcutPressed(index); |
569 | - } else { |
570 | - Q_EMIT activateShortcutPressed(index); |
571 | - } |
572 | - } else if (key == Qt::Key_0) { |
573 | - if (hotkey->modifiers() & Qt::ShiftModifier) { |
574 | - Q_EMIT newInstanceShortcutPressed(10); |
575 | - } else { |
576 | - Q_EMIT activateShortcutPressed(10); |
577 | - } |
578 | +void |
579 | +ShellDeclarativeView::processNumericHotkey(Hotkey* hotkey) |
580 | +{ |
581 | + /* Shortcuts from 1 to 9 should activate the items with index |
582 | + from 1 to 9 (index 0 being the so-called "BFB" or Dash launcher). |
583 | + Shortcut for 0 should activate item with index 10. |
584 | + In other words, the indexes are activated in the same order as |
585 | + the keys appear on a standard keyboard. */ |
586 | + Qt::Key key = hotkey->key(); |
587 | + if (key >= Qt::Key_1 && key <= Qt::Key_9) { |
588 | + int index = key - Qt::Key_0; |
589 | + if (hotkey->modifiers() & Qt::ShiftModifier) { |
590 | + Q_EMIT newInstanceShortcutPressed(index); |
591 | + } else { |
592 | + Q_EMIT activateShortcutPressed(index); |
593 | + } |
594 | + } else if (key == Qt::Key_0) { |
595 | + if (hotkey->modifiers() & Qt::ShiftModifier) { |
596 | + Q_EMIT newInstanceShortcutPressed(10); |
597 | + } else { |
598 | + Q_EMIT activateShortcutPressed(10); |
599 | } |
600 | } |
601 | } |
602 | @@ -466,3 +348,26 @@ |
603 | { |
604 | return m_monitoredAreaContainsMouse; |
605 | } |
606 | + |
607 | +void |
608 | +ShellDeclarativeView::setIsTopLeftShell(bool ashell) |
609 | +{ |
610 | + if (m_isTopLeftShell == ashell) { |
611 | + return; |
612 | + } |
613 | + |
614 | + m_isTopLeftShell = ashell; |
615 | + Q_EMIT isTopLeftShellChanged(m_isTopLeftShell); |
616 | +} |
617 | + |
618 | +void |
619 | +ShellDeclarativeView::setScreenNumber(int screen) |
620 | +{ |
621 | + m_screenInfo->setScreen(screen); |
622 | +} |
623 | + |
624 | +int |
625 | +ShellDeclarativeView::screenNumber() const |
626 | +{ |
627 | + return m_screenInfo->screen(); |
628 | +} |
629 | |
630 | === modified file 'shell/app/shelldeclarativeview.h' |
631 | --- shell/app/shelldeclarativeview.h 2012-02-13 23:46:04 +0000 |
632 | +++ shell/app/shelldeclarativeview.h 2012-02-16 08:16:20 +0000 |
633 | @@ -27,6 +27,7 @@ |
634 | class LauncherClient; |
635 | class DashDBus; |
636 | class ScreenInfo; |
637 | +class Hotkey; |
638 | |
639 | class ShellDeclarativeView : public Unity2DDeclarativeView, public AbstractX11EventFilter |
640 | { |
641 | @@ -38,7 +39,7 @@ |
642 | Q_PROPERTY(DashMode dashMode READ dashMode WRITE setDashMode NOTIFY dashModeChanged) |
643 | Q_PROPERTY(QString activeLens READ activeLens WRITE setActiveLens NOTIFY activeLensChanged) |
644 | Q_PROPERTY(bool focus READ hasFocus NOTIFY focusChanged) // overridden to add notify |
645 | - Q_PROPERTY(bool superKeyHeld READ superKeyHeld NOTIFY superKeyHeldChanged) |
646 | + Q_PROPERTY(bool isTopLeftShell READ isTopLeftShell WRITE setIsTopLeftShell NOTIFY isTopLeftShellChanged) |
647 | Q_PROPERTY(bool haveCustomHomeShortcuts READ haveCustomHomeShortcuts) |
648 | |
649 | /* These two properties and mouse movement tracking on the widget are added here only because |
650 | @@ -56,7 +57,7 @@ |
651 | DesktopMode, |
652 | FullScreenMode |
653 | }; |
654 | - explicit ShellDeclarativeView(); |
655 | + explicit ShellDeclarativeView(const QUrl &sourceFileUrl = QUrl(), bool isTopLeftShell = false, int screen = 0); |
656 | |
657 | /* getters */ |
658 | bool dashActive() const; |
659 | @@ -64,19 +65,28 @@ |
660 | DashMode dashMode() const; |
661 | const QString& activeLens() const; |
662 | bool expanded() const; |
663 | - bool superKeyHeld() const { return m_superKeyHeld; } |
664 | QRect monitoredArea() const; |
665 | bool monitoredAreaContainsMouse() const; |
666 | + bool isTopLeftShell() const { return m_isTopLeftShell; } |
667 | |
668 | /* setters */ |
669 | Q_SLOT void setDashActive(bool active); |
670 | Q_INVOKABLE void setDashMode(DashMode); |
671 | Q_INVOKABLE void setActiveLens(const QString& activeLens); |
672 | Q_INVOKABLE void setExpanded(bool); |
673 | + void setScreenNumber(int); |
674 | + int screenNumber() const; |
675 | void setMonitoredArea(QRect monitoredArea); |
676 | + void setIsTopLeftShell(bool); |
677 | |
678 | virtual bool x11EventFilter(XEvent* event); |
679 | |
680 | + void toggleDash(); |
681 | + void toggleLauncher(); |
682 | + void showCommandsLens(); |
683 | + |
684 | + void processNumericHotkey(Hotkey*); |
685 | + |
686 | Q_SIGNALS: |
687 | void dashActiveChanged(bool); |
688 | void dashModeChanged(DashMode); |
689 | @@ -89,22 +99,10 @@ |
690 | void monitoredAreaContainsMouseChanged(); |
691 | |
692 | void addWebFavoriteRequested(const QUrl& url); |
693 | - void superKeyHeldChanged(bool superKeyHeld); |
694 | - void superKeyTapped(); |
695 | void activateShortcutPressed(int itemIndex); |
696 | void newInstanceShortcutPressed(int itemIndex); |
697 | void launcherFocusRequested(); |
698 | - |
699 | -private Q_SLOTS: |
700 | - void updateSuperKeyMonitoring(); |
701 | - void updateSuperKeyHoldState(); |
702 | - void setHotkeysForModifiers(Qt::KeyboardModifiers modifiers); |
703 | - void forwardNumericHotkey(); |
704 | - void ignoreSuperPress(); |
705 | - |
706 | - void toggleDash(); |
707 | - void showCommandsLens(); |
708 | - void onAltF1Pressed(); |
709 | + void isTopLeftShellChanged(bool); |
710 | |
711 | protected: |
712 | virtual void showEvent(QShowEvent *event); |
713 | @@ -126,12 +124,10 @@ |
714 | QString m_activeLens; /* Lens id of the active lens */ |
715 | bool m_active; |
716 | |
717 | - bool m_superKeyPressed; |
718 | - bool m_superKeyHeld; |
719 | - bool m_superPressIgnored; |
720 | - QTimer m_superKeyHoldTimer; |
721 | QRect m_monitoredArea; |
722 | bool m_monitoredAreaContainsMouse; |
723 | + bool m_isTopLeftShell; |
724 | + QUrl m_sourceFileUrl; |
725 | |
726 | friend class DashDBus; |
727 | friend class LauncherDBus; |
728 | |
729 | === added file 'shell/app/shellmanager.cpp' |
730 | --- shell/app/shellmanager.cpp 1970-01-01 00:00:00 +0000 |
731 | +++ shell/app/shellmanager.cpp 2012-02-16 08:16:20 +0000 |
732 | @@ -0,0 +1,380 @@ |
733 | +/* |
734 | + * This file is part of unity-2d |
735 | + * |
736 | + * Copyright 2010 Canonical Ltd. |
737 | + * |
738 | + * This program is free software; you can redistribute it and/or modify |
739 | + * it under the terms of the GNU General Public License as published by |
740 | + * the Free Software Foundation; version 3. |
741 | + * |
742 | + * This program is distributed in the hope that it will be useful, |
743 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
744 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
745 | + * GNU General Public License for more details. |
746 | + * |
747 | + * You should have received a copy of the GNU General Public License |
748 | + * along with this program. If not, see <http://www.gnu.org/licenses/> |
749 | + */ |
750 | + |
751 | +#include "shellmanager.h" |
752 | + |
753 | +// Qt |
754 | +#include <QApplication> |
755 | +#include <QDebug> |
756 | +#include <QtDeclarative> |
757 | +#include <QDeclarativeEngine> |
758 | +#include <QDeclarativeView> |
759 | +#include <QDesktopWidget> |
760 | +#include <QDBusConnection> |
761 | +#include <QDBusConnectionInterface> |
762 | +#include <QDeclarativeContext> |
763 | +#include <QAbstractEventDispatcher> |
764 | + |
765 | +// libunity-2d-private |
766 | +#include <hotkeymonitor.h> |
767 | +#include <hotkey.h> |
768 | +#include <keyboardmodifiersmonitor.h> |
769 | +#include <keymonitor.h> |
770 | +#include <screeninfo.h> |
771 | + |
772 | +// Local |
773 | +#include "shelldeclarativeview.h" |
774 | +#include "dashclient.h" |
775 | +#include "dashdbus.h" |
776 | +#include "gesturehandler.h" |
777 | +#include "launcherdbus.h" |
778 | +#include "config.h" |
779 | + |
780 | +// unity-2d |
781 | +#include <unity2ddebug.h> |
782 | +#include <unity2dapplication.h> |
783 | + |
784 | +// X11 |
785 | +#include <X11/Xlib.h> |
786 | + |
787 | +static const int KEY_HOLD_THRESHOLD = 250; |
788 | + |
789 | +struct ShellManagerPrivate |
790 | +{ |
791 | + ShellManagerPrivate() |
792 | + : q(0) |
793 | + , m_dashDBus(0) |
794 | + , m_launcherDBus(0) |
795 | + , m_superKeyPressed(false) |
796 | + , m_superKeyHeld(false) |
797 | + {} |
798 | + |
799 | + ShellDeclarativeView* initShell(bool isTopLeft, int screen); |
800 | + void updateScreenCount(int newCount); |
801 | + ShellDeclarativeView* activeShell() const; |
802 | + |
803 | + ShellManager *q; |
804 | + QList<ShellDeclarativeView *> m_viewList; |
805 | + DashDBus * m_dashDBus; |
806 | + LauncherDBus* m_launcherDBus; |
807 | + QUrl m_sourceFileUrl; |
808 | + |
809 | + bool m_superKeyPressed; |
810 | + bool m_superKeyHeld; |
811 | + bool m_superPressIgnored; |
812 | + QTimer m_superKeyHoldTimer; |
813 | +}; |
814 | + |
815 | + |
816 | +ShellDeclarativeView * |
817 | +ShellManagerPrivate::initShell(bool isTopLeft, int screen) |
818 | +{ |
819 | + const QStringList arguments = qApp->arguments(); |
820 | + ShellDeclarativeView * view = new ShellDeclarativeView(m_sourceFileUrl, isTopLeft, screen); |
821 | + view->setAccessibleName("Shell"); |
822 | + if (arguments.contains("-opengl")) { |
823 | + view->setUseOpenGL(true); |
824 | + } |
825 | + |
826 | + Unity2dApplication::instance()->installX11EventFilter(view); |
827 | + |
828 | + view->engine()->addImportPath(unity2dImportPath()); |
829 | + view->engine()->setBaseUrl(QUrl::fromLocalFile(unity2dDirectory() + "/shell/")); |
830 | + |
831 | + /* Load the QML UI, focus and show the window */ |
832 | + view->setResizeMode(QDeclarativeView::SizeViewToRootObject); |
833 | + view->rootContext()->setContextProperty("declarativeView", view); |
834 | + view->rootContext()->setContextProperty("shellManager", q); |
835 | + // WARNING This declaration of dashClient used to be in Unity2d/plugin.cpp |
836 | + // but it lead to locks when both the shell and the spread were started |
837 | + // at the same time since SpreadMonitor QDBusServiceWatcher::serviceRegistered |
838 | + // and DashClient QDBusServiceWatcher::serviceRegistered |
839 | + // triggered at the same time ending up with both creating QDBusInterface |
840 | + // to eachother in the main thread meaning they would block |
841 | + // In case you need to have a DashClient in the spread the fix for the problem |
842 | + // is moving the QDbusInterface creation to a thread so it does not block |
843 | + // the main thread |
844 | + view->rootContext()->setContextProperty("dashClient", DashClient::instance()); |
845 | + |
846 | + if (!m_dashDBus) { |
847 | + m_dashDBus = new DashDBus(view); |
848 | + if (!m_dashDBus->connectToBus()) { |
849 | + qCritical() << "Another instance of the Dash already exists. Quitting."; |
850 | + return 0; |
851 | + } |
852 | + } |
853 | + |
854 | + if (!m_launcherDBus) { |
855 | + m_launcherDBus = new LauncherDBus(view); |
856 | + m_launcherDBus->connectToBus(); |
857 | + } |
858 | + |
859 | + view->show(); |
860 | + |
861 | + return view; |
862 | +} |
863 | + |
864 | +ShellDeclarativeView * |
865 | +ShellManagerPrivate::activeShell() const |
866 | +{ |
867 | + int cursorScreen = ScreenInfo::cursorScreen(); |
868 | + Q_FOREACH(ShellDeclarativeView * shell, m_viewList) { |
869 | + if (shell->screenNumber() == cursorScreen) { |
870 | + return shell; |
871 | + } |
872 | + } |
873 | + return 0; |
874 | +} |
875 | + |
876 | +void |
877 | +ShellManagerPrivate::updateScreenCount(int newCount) |
878 | +{ |
879 | + if (newCount > 0) { |
880 | + QDesktopWidget* desktop = QApplication::desktop(); |
881 | + int size = m_viewList.size(); |
882 | + ShellDeclarativeView* shell = 0; |
883 | + |
884 | + /* The first shell is always the one on the leftmost screen. */ |
885 | + QPoint p; |
886 | + if (QApplication::isRightToLeft()) { |
887 | + p = QPoint(desktop->width() - 1, 0); |
888 | + } |
889 | + int leftmost = desktop->screenNumber(p); |
890 | + if (size > 0) { |
891 | + shell = m_viewList[0]; |
892 | + } else { |
893 | + shell = initShell(true, leftmost); |
894 | + m_viewList.append(shell); |
895 | + } |
896 | + shell->setScreenNumber(leftmost); |
897 | + |
898 | + /* Update the position of other existing Shells, and instantiate new |
899 | + Shells as needed. */ |
900 | + int i = 1; |
901 | + for (int screen = 0; screen < newCount; ++screen) { |
902 | + if (screen == leftmost) { |
903 | + continue; |
904 | + } |
905 | + if (i < size) { |
906 | + shell = m_viewList[i]; |
907 | + } else { |
908 | + shell = initShell(false, screen); |
909 | + m_viewList.append(shell); |
910 | + } |
911 | + shell->setIsTopLeftShell(false); |
912 | + shell->setScreenNumber(screen); |
913 | + ++i; |
914 | + } |
915 | + } |
916 | + /* Remove extra Shells if any. */ |
917 | + while (m_viewList.size() > newCount) { |
918 | + m_viewList.takeLast()->deleteLater(); |
919 | + } |
920 | +} |
921 | + |
922 | +/* -------------------------- ShellManager -----------------------------*/ |
923 | + |
924 | +ShellManager::ShellManager(const QUrl &sourceFileUrl, QObject* parent) : |
925 | + QObject(parent) |
926 | + ,d(new ShellManagerPrivate) |
927 | +{ |
928 | + d->q = this; |
929 | + d->m_sourceFileUrl = sourceFileUrl; |
930 | + |
931 | + qmlRegisterType<ShellDeclarativeView>("Unity2d", 1, 0, "ShellDeclarativeView"); |
932 | + |
933 | + QDesktopWidget* desktop = QApplication::desktop(); |
934 | + |
935 | + d->updateScreenCount(desktop->screenCount()); |
936 | + |
937 | + connect(desktop, SIGNAL(screenCountChanged(int)), SLOT(onScreenCountChanged(int))); |
938 | + |
939 | + d->m_superKeyHoldTimer.setSingleShot(true); |
940 | + d->m_superKeyHoldTimer.setInterval(KEY_HOLD_THRESHOLD); |
941 | + connect(&d->m_superKeyHoldTimer, SIGNAL(timeout()), SLOT(updateSuperKeyHoldState())); |
942 | + |
943 | + connect(&launcher2dConfiguration(), SIGNAL(superKeyEnableChanged(bool)), SLOT(updateSuperKeyMonitoring())); |
944 | + updateSuperKeyMonitoring(); |
945 | + |
946 | + /* Alt+F1 reveal the launcher and gives the keyboard focus to the Dash Button. */ |
947 | + Hotkey* altF1 = HotkeyMonitor::instance().getHotkeyFor(Qt::Key_F1, Qt::AltModifier); |
948 | + connect(altF1, SIGNAL(pressed()), SLOT(onAltF1Pressed())); |
949 | + |
950 | + /* Alt+F2 shows the dash with the commands lens activated. */ |
951 | + Hotkey* altF2 = HotkeyMonitor::instance().getHotkeyFor(Qt::Key_F2, Qt::AltModifier); |
952 | + connect(altF2, SIGNAL(pressed()), SLOT(onAltF2Pressed())); |
953 | + |
954 | + /* Super+{n} for 0 ≤ n ≤ 9 activates the item with index (n + 9) % 10. */ |
955 | + for (Qt::Key key = Qt::Key_0; key <= Qt::Key_9; key = (Qt::Key) (key + 1)) { |
956 | + Hotkey* hotkey = HotkeyMonitor::instance().getHotkeyFor(key, Qt::MetaModifier); |
957 | + connect(hotkey, SIGNAL(pressed()), SLOT(onNumericHotkeyPressed())); |
958 | + hotkey = HotkeyMonitor::instance().getHotkeyFor(key, Qt::MetaModifier | Qt::ShiftModifier); |
959 | + connect(hotkey, SIGNAL(pressed()), SLOT(onNumericHotkeyPressed())); |
960 | + } |
961 | +} |
962 | + |
963 | +ShellManager::~ShellManager() |
964 | +{ |
965 | + qDeleteAll(d->m_viewList); |
966 | + delete d; |
967 | +} |
968 | + |
969 | +void |
970 | +ShellManager::onScreenCountChanged(int newCount) |
971 | +{ |
972 | + d->updateScreenCount(newCount); |
973 | +} |
974 | + |
975 | +/* ----------------- super key handling ---------------- */ |
976 | + |
977 | +void |
978 | +ShellManager::updateSuperKeyHoldState() |
979 | +{ |
980 | + /* If the key was released in the meantime, just do nothing, otherwise |
981 | + consider the key being held, unless we're told to ignore it. */ |
982 | + if (d->m_superKeyPressed && !d->m_superPressIgnored) { |
983 | + d->m_superKeyHeld = true; |
984 | + Q_EMIT superKeyHeldChanged(d->m_superKeyHeld); |
985 | + } |
986 | +} |
987 | + |
988 | +void |
989 | +ShellManager::updateSuperKeyMonitoring() |
990 | +{ |
991 | + KeyboardModifiersMonitor *modifiersMonitor = KeyboardModifiersMonitor::instance(); |
992 | + KeyMonitor *keyMonitor = KeyMonitor::instance(); |
993 | + HotkeyMonitor& hotkeyMonitor = HotkeyMonitor::instance(); |
994 | + |
995 | + QVariant value = launcher2dConfiguration().property("superKeyEnable"); |
996 | + if (!value.isValid() || value.toBool() == true) { |
997 | + hotkeyMonitor.enableModifiers(Qt::MetaModifier); |
998 | + QObject::connect(modifiersMonitor, |
999 | + SIGNAL(keyboardModifiersChanged(Qt::KeyboardModifiers)), |
1000 | + this, SLOT(setHotkeysForModifiers(Qt::KeyboardModifiers))); |
1001 | + /* Ignore Super presses if another key was pressed simultaneously |
1002 | + (i.e. a shortcut). https://bugs.launchpad.net/unity-2d/+bug/801073 */ |
1003 | + QObject::connect(keyMonitor, |
1004 | + SIGNAL(keyPressed()), |
1005 | + this, SLOT(ignoreSuperPress())); |
1006 | + setHotkeysForModifiers(modifiersMonitor->keyboardModifiers()); |
1007 | + } else { |
1008 | + hotkeyMonitor.disableModifiers(Qt::MetaModifier); |
1009 | + QObject::disconnect(modifiersMonitor, |
1010 | + SIGNAL(keyboardModifiersChanged(Qt::KeyboardModifiers)), |
1011 | + this, SLOT(setHotkeysForModifiers(Qt::KeyboardModifiers))); |
1012 | + QObject::disconnect(keyMonitor, |
1013 | + SIGNAL(keyPressed()), |
1014 | + this, SLOT(ignoreSuperPress())); |
1015 | + d->m_superKeyHoldTimer.stop(); |
1016 | + d->m_superKeyPressed = false; |
1017 | + if (d->m_superKeyHeld) { |
1018 | + d->m_superKeyHeld = false; |
1019 | + Q_EMIT superKeyHeldChanged(false); |
1020 | + } |
1021 | + } |
1022 | +} |
1023 | + |
1024 | +void |
1025 | +ShellManager::setHotkeysForModifiers(Qt::KeyboardModifiers modifiers) |
1026 | +{ |
1027 | + /* This is the new new state of the Super key (AKA Meta key), while |
1028 | + d->m_superKeyPressed is the previous state of the key at the last modifiers change. */ |
1029 | + bool superKeyPressed = modifiers.testFlag(Qt::MetaModifier); |
1030 | + |
1031 | + if (d->m_superKeyPressed != superKeyPressed) { |
1032 | + d->m_superKeyPressed = superKeyPressed; |
1033 | + if (superKeyPressed) { |
1034 | + d->m_superPressIgnored = false; |
1035 | + /* If the key is pressed, start up a timer to monitor if it's being held short |
1036 | + enough to qualify as just a "tap" or as a proper hold */ |
1037 | + d->m_superKeyHoldTimer.start(); |
1038 | + } else { |
1039 | + d->m_superKeyHoldTimer.stop(); |
1040 | + |
1041 | + /* If the key is released, and was not being held, it means that the user just |
1042 | + performed a "tap". Unless we're told to ignore that tap, that is. */ |
1043 | + if (!d->m_superKeyHeld && !d->m_superPressIgnored) { |
1044 | + onSuperKeyTapped(); |
1045 | + } |
1046 | + /* Otherwise the user just terminated a hold. */ |
1047 | + else if(d->m_superKeyHeld){ |
1048 | + d->m_superKeyHeld = false; |
1049 | + Q_EMIT superKeyHeldChanged(d->m_superKeyHeld); |
1050 | + } |
1051 | + } |
1052 | + } |
1053 | +} |
1054 | + |
1055 | +void |
1056 | +ShellManager::ignoreSuperPress() |
1057 | +{ |
1058 | + /* There was a key pressed, ignore current super tap/hold */ |
1059 | + d->m_superPressIgnored = true; |
1060 | +} |
1061 | + |
1062 | +void |
1063 | +ShellManager::onSuperKeyTapped() |
1064 | +{ |
1065 | + // TODO : In future, All shells should be able to handle the Dash |
1066 | + // Note: Always, first item in the list is the topLeft shell |
1067 | + // In any case, just iterate through the list |
1068 | + Q_FOREACH(ShellDeclarativeView *shell, d->m_viewList) { |
1069 | + if (shell->isTopLeftShell()) { |
1070 | + shell->toggleDash(); |
1071 | + break; |
1072 | + } |
1073 | + } |
1074 | +} |
1075 | + |
1076 | +bool |
1077 | +ShellManager::superKeyHeld() const |
1078 | +{ |
1079 | + return d->m_superKeyHeld; |
1080 | +} |
1081 | + |
1082 | +/*------------------ Hotkeys Handling -----------------------*/ |
1083 | + |
1084 | +void |
1085 | +ShellManager::onAltF1Pressed() |
1086 | +{ |
1087 | + ShellDeclarativeView * activeShell = d->activeShell(); |
1088 | + if (activeShell) { |
1089 | + activeShell->toggleLauncher(); |
1090 | + } |
1091 | +} |
1092 | + |
1093 | +void |
1094 | +ShellManager::onAltF2Pressed() |
1095 | +{ |
1096 | + ShellDeclarativeView * activeShell = d->activeShell(); |
1097 | + if (activeShell) { |
1098 | + activeShell->showCommandsLens(); |
1099 | + } |
1100 | +} |
1101 | + |
1102 | +void |
1103 | +ShellManager::onNumericHotkeyPressed() |
1104 | +{ |
1105 | + Hotkey* hotkey = qobject_cast<Hotkey*>(sender()); |
1106 | + if (hotkey) { |
1107 | + ShellDeclarativeView * activeShell = d->activeShell(); |
1108 | + if (activeShell) { |
1109 | + activeShell->processNumericHotkey(hotkey); |
1110 | + } |
1111 | + } |
1112 | +} |
1113 | |
1114 | === added file 'shell/app/shellmanager.h' |
1115 | --- shell/app/shellmanager.h 1970-01-01 00:00:00 +0000 |
1116 | +++ shell/app/shellmanager.h 2012-02-16 08:16:20 +0000 |
1117 | @@ -0,0 +1,58 @@ |
1118 | +/* |
1119 | + * This file is part of unity-2d |
1120 | + * |
1121 | + * Copyright 2010 Canonical Ltd. |
1122 | + * |
1123 | + * This program is free software; you can redistribute it and/or modify |
1124 | + * it under the terms of the GNU General Public License as published by |
1125 | + * the Free Software Foundation; version 3. |
1126 | + * |
1127 | + * This program is distributed in the hope that it will be useful, |
1128 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1129 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1130 | + * GNU General Public License for more details. |
1131 | + * |
1132 | + * You should have received a copy of the GNU General Public License |
1133 | + * along with this program. If not, see <http://www.gnu.org/licenses/> |
1134 | + */ |
1135 | +#ifndef SHELLMANAGER_H |
1136 | +#define SHELLMANAGER_H |
1137 | + |
1138 | +#include <QObject> |
1139 | +struct ShellManagerPrivate; |
1140 | + |
1141 | +class QUrl; |
1142 | + |
1143 | +class ShellManager : public QObject |
1144 | +{ |
1145 | + Q_OBJECT |
1146 | + Q_PROPERTY(bool superKeyHeld READ superKeyHeld NOTIFY superKeyHeldChanged) |
1147 | + |
1148 | +public: |
1149 | + ShellManager(const QUrl &sourceFileUrl, QObject* parent = 0); |
1150 | + ~ShellManager(); |
1151 | + |
1152 | + bool superKeyHeld() const; |
1153 | + |
1154 | +Q_SIGNALS: |
1155 | + void superKeyHeldChanged(bool superKeyHeld); |
1156 | + |
1157 | +private Q_SLOTS: |
1158 | + void onScreenCountChanged(int); |
1159 | + |
1160 | + void updateSuperKeyMonitoring(); |
1161 | + void updateSuperKeyHoldState(); |
1162 | + void setHotkeysForModifiers(Qt::KeyboardModifiers modifiers); |
1163 | + void ignoreSuperPress(); |
1164 | + void onSuperKeyTapped(); |
1165 | + |
1166 | + void onAltF1Pressed(); |
1167 | + void onAltF2Pressed(); |
1168 | + void onNumericHotkeyPressed(); |
1169 | + |
1170 | +private: |
1171 | + Q_DISABLE_COPY(ShellManager) |
1172 | + ShellManagerPrivate * const d; |
1173 | +}; |
1174 | + |
1175 | +#endif // SHELLMANAGER_H |
1176 | |
1177 | === modified file 'shell/launcher/LauncherList.qml' |
1178 | --- shell/launcher/LauncherList.qml 2012-02-09 11:59:16 +0000 |
1179 | +++ shell/launcher/LauncherList.qml 2012-02-16 08:16:20 +0000 |
1180 | @@ -93,7 +93,7 @@ |
1181 | } |
1182 | |
1183 | function updatePips() { |
1184 | - if (item.belongsToDifferentWorkspace()) { |
1185 | + if (item.belongsToDifferentWorkspace() || item.belongsToDifferentScreen(declarativeView.screen.screen)) { |
1186 | launcherItem.pips = 1 |
1187 | launcherItem.pipSource = "launcher/artwork/launcher_arrow_outline_ltr.png"; |
1188 | } else { |
1189 | @@ -125,7 +125,7 @@ |
1190 | emblemVisible: item.emblemVisible |
1191 | |
1192 | /* Launcher of index 0 is the so-called BFB or Dash launcher */ |
1193 | - shortcutVisible: declarativeView.superKeyHeld && |
1194 | + shortcutVisible: shellManager.superKeyHeld && |
1195 | ((item.toString().indexOf("LauncherApplication") == 0 && index > 0 && index <= 10) || |
1196 | item.shortcutKey != 0) |
1197 | shortcutText: { |
1198 | @@ -310,6 +310,7 @@ |
1199 | width, height, xid) |
1200 | onWindowCountChanged: updatePips() |
1201 | onWindowWorkspaceChanged: updatePips() |
1202 | + onWindowGeometryChanged: updatePips() |
1203 | /* Not all items are applications. */ |
1204 | ignoreUnknownSignals: true |
1205 | } |
1206 | |
1207 | === modified file 'shell/launcher/LauncherLoader.qml' |
1208 | --- shell/launcher/LauncherLoader.qml 2012-02-10 11:17:36 +0000 |
1209 | +++ shell/launcher/LauncherLoader.qml 2012-02-16 08:16:20 +0000 |
1210 | @@ -70,7 +70,7 @@ |
1211 | } |
1212 | |
1213 | Connections { |
1214 | - target: declarativeView |
1215 | + target: shellManager |
1216 | onSuperKeyHeldChanged: { |
1217 | if (superKeyHeld) visibilityController.beginForceVisible() |
1218 | else visibilityController.endForceVisible() |