Merge lp:~ivenvd/compiz/compiz.fix_1082265 into lp:compiz/0.9.9

Proposed by Iven Hsu
Status: Merged
Approved by: Daniel van Vugt
Approved revision: 3487
Merged at revision: 3488
Proposed branch: lp:~ivenvd/compiz/compiz.fix_1082265
Merge into: lp:compiz/0.9.9
Diff against target: 246 lines (+118/-8)
4 files modified
kde/window-decorator-kde4/decorator.cpp (+52/-0)
kde/window-decorator-kde4/decorator.h (+7/-0)
kde/window-decorator-kde4/window.cpp (+38/-8)
kde/window-decorator-kde4/window.h (+21/-0)
To merge this branch: bzr merge lp:~ivenvd/compiz/compiz.fix_1082265
Reviewer Review Type Date Requested Status
Daniel van Vugt Approve
PS Jenkins bot continuous-integration Pending
Review via email: mp+136837@code.launchpad.net

Commit message

Add appmenu support for KWD. (LP: #1082265)

To post a comment you must log in.
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

I'm not going to test KDE, but it doesn't break anything Ubuntu cares about with GTK at least.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'kde/window-decorator-kde4/decorator.cpp'
2--- kde/window-decorator-kde4/decorator.cpp 2012-09-07 22:37:20 +0000
3+++ kde/window-decorator-kde4/decorator.cpp 2012-11-29 03:30:25 +0000
4@@ -61,6 +61,10 @@
5 #define SHADOW_COLOR_GREEN 0x0000
6 #define SHADOW_COLOR_BLUE 0x0000
7
8+static const char *KDED_SERVICE = "org.kde.kded";
9+static const char *KDED_APPMENU_PATH = "/modules/appmenu";
10+static const char *KDED_INTERFACE = "org.kde.kded";
11+
12 int blurType = BLUR_TYPE_NONE;
13
14 decor_shadow_t *KWD::Decorator::mNoBorderShadow = 0;
15@@ -166,6 +170,16 @@
16 CompositeRedirectManual);
17
18 XMapWindow (QX11Info::display (), mCompositeWindow);
19+
20+ QDBusConnection dbus = QDBusConnection::sessionBus ();
21+ dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showRequest",
22+ this, SIGNAL (showRequest (qulonglong)));
23+ dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuAvailable",
24+ this, SLOT (menuAvailable (qulonglong)));
25+ dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "clearMenus",
26+ this, SLOT (clearMenus ()));
27+ dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuHidden",
28+ this, SIGNAL (menuHidden ()));
29 }
30
31 KWD::Decorator::~Decorator (void)
32@@ -790,6 +804,9 @@
33
34 client->updateFrame (frame);
35 }
36+
37+ if (mWindowsMenu.removeOne (id))
38+ mClients[id]->setAppMenuAvailable ();
39 }
40 else
41 {
42@@ -1002,3 +1019,38 @@
43 mSwitcher = new Switcher (mCompositeWindow, win);
44 }
45 }
46+
47+void
48+KWD::Decorator::showRequest (qulonglong id)
49+{
50+ if (mClients.contains (id))
51+ mClients[id]->emitShowRequest ();
52+}
53+
54+void
55+KWD::Decorator::menuAvailable (qulonglong id)
56+{
57+ if (mClients.contains (id))
58+ mClients[id]->setAppMenuAvailable ();
59+ else
60+ mWindowsMenu.append (id);
61+}
62+
63+void
64+KWD::Decorator::clearMenus ()
65+{
66+ QMap < WId, KWD::Window * >::ConstIterator it;
67+
68+ for (it = mClients.constBegin (); it != mClients.constEnd (); it++)
69+ it.value ()->setAppMenuUnavailable ();
70+
71+ mWindowsMenu.clear ();
72+}
73+
74+void
75+KWD::Decorator::menuHidden (qulonglong id)
76+{
77+ if (mClients.contains (id))
78+ mClients[id]->emitMenuHidden ();
79+}
80+
81
82=== modified file 'kde/window-decorator-kde4/decorator.h'
83--- kde/window-decorator-kde4/decorator.h 2012-09-07 22:37:20 +0000
84+++ kde/window-decorator-kde4/decorator.h 2012-11-29 03:30:25 +0000
85@@ -163,6 +163,11 @@
86
87 void plasmaThemeChanged ();
88
89+ void showRequest (qulonglong wid);
90+ void menuAvailable (qulonglong wid);
91+ void menuHidden (qulonglong wid);
92+ void clearMenus ();
93+
94 private:
95 static PluginManager *mPlugins;
96 static KWD::Options *mOptions;
97@@ -183,6 +188,8 @@
98
99 Switcher *mSwitcher;
100
101+ QList<WId> mWindowsMenu;
102+
103 static KWD::Decorator *mSelf; /* XXX: Remove */
104 };
105 }
106
107=== modified file 'kde/window-decorator-kde4/window.cpp'
108--- kde/window-decorator-kde4/window.cpp 2012-11-26 07:13:04 +0000
109+++ kde/window-decorator-kde4/window.cpp 2012-11-29 03:30:25 +0000
110@@ -60,8 +60,16 @@
111 #include <QStyle>
112 #include <QPainter>
113
114+#include <QDBusMessage>
115+#include <QDBusConnection>
116+#include <QDBusPendingCall>
117+
118 #include "paintredirector.h"
119
120+static const char *KDED_SERVICE = "org.kde.kded";
121+static const char *KDED_APPMENU_PATH = "/modules/appmenu";
122+static const char *KDED_INTERFACE = "org.kde.kded";
123+
124 KWD::Window::Window (WId parentId,
125 WId clientId,
126 WId frame,
127@@ -80,6 +88,7 @@
128 mAdvancedMenu (0),
129 mOpacityMenu (0),
130 mDesktopMenu (0),
131+ mAppMenuAvailable (false),
132 mProcessKiller (this),
133 mKeys (this),
134 mResizeOpAction (0),
135@@ -557,12 +566,31 @@
136 void
137 KWD::Window::showApplicationMenu (const QPoint &p)
138 {
139+ QList<QVariant> args = QList<QVariant> () << p.x () << p.y () << qulonglong (mClientId);
140+ QDBusMessage method = QDBusMessage::createMethodCall (
141+ KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showMenu");
142+ method.setArguments (args);
143+ QDBusConnection::sessionBus ().asyncCall (method);
144 }
145
146 bool
147 KWD::Window::menuAvailable () const
148 {
149- return false;
150+ return mAppMenuAvailable;
151+}
152+
153+void
154+KWD::Window::setAppMenuAvailable ()
155+{
156+ mAppMenuAvailable = true;
157+ emit appMenuAvailable ();
158+}
159+
160+void
161+KWD::Window::setAppMenuUnavailable ()
162+{
163+ mAppMenuAvailable = false;
164+ emit appMenuUnavailable ();
165 }
166
167 KWD::Options::MouseCommand
168@@ -932,15 +960,17 @@
169 void
170 KWD::Window::createDecoration (void)
171 {
172- KDecoration *decor;
173-
174 if (mDecor)
175 return;
176
177- decor = Decorator::pluginManager ()->createDecoration (this);
178- decor->init ();
179-
180- mDecor = decor;
181+ mDecor = Decorator::pluginManager ()->createDecoration (this);
182+
183+ connect(this, SIGNAL(showRequest()), mDecor, SIGNAL(showRequest()));
184+ connect(this, SIGNAL(appMenuAvailable()), mDecor, SIGNAL(appMenuAvailable()));
185+ connect(this, SIGNAL(appMenuUnavailable()), mDecor, SIGNAL(appMenuUnavailable()));
186+ connect(this, SIGNAL(menuHidden()), mDecor, SIGNAL(menuHidden()));
187+
188+ mDecor->init ();
189 mDecor->widget ()->installEventFilter (this);
190
191 if (mType != Normal2D)
192@@ -952,7 +982,7 @@
193
194 mPadding.top = mPadding.bottom = mPadding.left = mPadding.right = 0;
195
196- if (KDecorationUnstable *deco2 = dynamic_cast<KDecorationUnstable*>(decor))
197+ if (KDecorationUnstable *deco2 = dynamic_cast<KDecorationUnstable*>(mDecor))
198 deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom);
199
200 if (mType == Normal2D && mFrame)
201
202=== modified file 'kde/window-decorator-kde4/window.h'
203--- kde/window-decorator-kde4/window.h 2012-11-26 07:13:04 +0000
204+++ kde/window-decorator-kde4/window.h 2012-11-29 03:30:25 +0000
205@@ -214,6 +214,19 @@
206
207 virtual bool eventFilter (QObject *o, QEvent *e);
208
209+ void emitShowRequest ()
210+ {
211+ emit showRequest ();
212+ }
213+
214+ void emitMenuHidden ()
215+ {
216+ emit menuHidden ();
217+ }
218+
219+ void setAppMenuAvailable ();
220+ void setAppMenuUnavailable ();
221+
222 private:
223 void createDecoration (void);
224 void resizeDecoration (bool force = false);
225@@ -239,6 +252,12 @@
226
227 void decorRepaintPending ();
228
229+ signals:
230+ void showRequest ();
231+ void appMenuAvailable ();
232+ void appMenuUnavailable ();
233+ void menuHidden ();
234+
235 private:
236 Type mType;
237 WId mParentId;
238@@ -268,6 +287,8 @@
239 QMenu *mDesktopMenu;
240 unsigned long mState;
241
242+ bool mAppMenuAvailable;
243+
244 QProcess mProcessKiller;
245 KActionCollection mKeys;
246 bool mFakeRelease;

Subscribers

People subscribed via source and target branches