Merge lp:~agateau/unity-2d/unity-core into lp:unity-2d

Proposed by Aurélien Gâteau on 2011-07-27
Status: Merged
Approved by: Florian Boucault on 2011-07-27
Approved revision: 687
Merged at revision: 609
Proposed branch: lp:~agateau/unity-2d/unity-core
Merge into: lp:unity-2d
Diff against target: 4163 lines (+1408/-2079)
48 files modified
CMakeLists.txt (+3/-3)
debian/control (+5/-4)
debian/unity-2d-panel.install (+0/-2)
libunity-2d-private/Unity2d/CMakeLists.txt (+1/-1)
libunity-2d-private/Unity2d/launcherapplication.cpp (+3/-5)
libunity-2d-private/Unity2d/plugin.cpp (+0/-4)
libunity-2d-private/Unity2d/screeninfo.cpp (+1/-3)
libunity-2d-private/Unity2d/windowinfo.cpp (+1/-3)
libunity-2d-private/Unity2d/workspacesinfo.cpp (+1/-3)
libunity-2d-private/src/CMakeLists.txt (+1/-0)
libunity-2d-private/src/debug.cpp (+23/-0)
libunity-2d-private/src/debug_p.h (+6/-0)
libunity-2d-private/src/unity2dapplication.cpp (+18/-0)
panel/CMakeLists.txt (+3/-5)
panel/app/CMakeLists.txt (+3/-1)
panel/app/main.cpp (+4/-2)
panel/app/panelmanager.cpp (+33/-46)
panel/app/panelmanager.h (+2/-0)
panel/app/unity2dstyle.cpp (+0/-98)
panel/app/unity2dstyle.h (+0/-44)
panel/applets/CMakeLists.txt (+10/-26)
panel/applets/appname/appnameapplet.cpp (+5/-10)
panel/applets/appname/appnameapplet.h (+3/-1)
panel/applets/appname/com.canonical.AppMenu.Registrar.xml (+0/-82)
panel/applets/appname/menubarwidget.cpp (+78/-279)
panel/applets/appname/menubarwidget.h (+25/-66)
panel/applets/appname/registrar.cpp (+0/-138)
panel/applets/appname/registrar.h (+0/-85)
panel/applets/common/fakecairo.h (+125/-0)
panel/applets/common/indicatorentrywidget.cpp (+388/-0)
panel/applets/common/indicatorentrywidget.h (+81/-0)
panel/applets/common/indicatorsmanager.cpp (+176/-0)
panel/applets/common/indicatorsmanager.h (+70/-0)
panel/applets/common/indicatorwidget.cpp (+53/-0)
panel/applets/common/indicatorwidget.h (+52/-0)
panel/applets/common/panelstyle.cpp (+175/-0)
panel/applets/common/panelstyle.h (+59/-0)
panel/applets/indicator-config.h.in (+0/-7)
panel/applets/indicator/abstractindicator.cpp (+0/-43)
panel/applets/indicator/abstractindicator.h (+0/-53)
panel/applets/indicator/datetimeindicator.cpp (+0/-94)
panel/applets/indicator/datetimeindicator.h (+0/-53)
panel/applets/indicator/indicator.c (+0/-525)
panel/applets/indicator/indicator.h (+0/-45)
panel/applets/indicator/indicatorapplet.cpp (+0/-114)
panel/applets/indicator/indicatorapplet.h (+0/-60)
panel/applets/indicator/indicatorservicemanager.cpp (+0/-120)
panel/applets/indicator/indicatorservicemanager.h (+0/-54)
To merge this branch: bzr merge lp:~agateau/unity-2d/unity-core
Reviewer Review Type Date Requested Status
Tim Penhey 2011-07-27 Pending
Florian Boucault 2011-07-27 Pending
Review via email: mp+69451@code.launchpad.net

This proposal supersedes a proposal from 2011-07-25.

Commit message

[panel] Refactor panel to use the unity-panel-service shared with Unity 3D.

Description of the change

This branch is an heavy refactor of unity-2d-panel to use the new unity-panel-service provided by Unity 3D. It has been developed on Oneiric and most likely will not build and work properly on Natty as it depends on GTK3 and UnityCore, a new library provided by Unity 3D.

To post a comment you must log in.
Tim Penhey (thumper) wrote : Posted in a previous version of this proposal

Hi Aurélien,

I notice you have a GConnector class. It covers a very similar area to Neil's
latest work -
https://code.launchpad.net/~njpatel/unity/nicer-glib-signals/+merge/67439

I also notice you aren't using namespaces for your top level classes - like
the GConnector. Have you considered using one?

A slight niggle, <string> is in the C++ standard library, not the STL (they
don't say we work for pedantical for nothing).

Redeclaring nux::Color is a dangerous thing. Slightly convoluted due to the
actual nux Color being nux::color::Color, which is then used in the nux
namespace. That is probably the only reason you are not getting linker errors
with this.

review: Needs Information
Aurélien Gâteau (agateau) wrote : Posted in a previous version of this proposal

> Hi Aurélien,
>
> I notice you have a GConnector class. It covers a very similar area to Neil's
> latest work -
> https://code.launchpad.net/~njpatel/unity/nicer-glib-signals/+merge/67439

Yes, I discussed it briefly with Neil during Platform Rally, but from what I
understand it imposes the use of sigc++ signals. We already deal with GObject
and Qt signals so I prefer not adding another signal system to our stack
(granted, the code in this branch uses sigc++ signals when we deal with
UnityCore so this may be a moot point)

> I also notice you aren't using namespaces for your top level classes - like
> the GConnector. Have you considered using one?

Not really. GConnector is in libunity-2d-private, which is not supposed to be
reused outside of unity-2d. Therefore I don't see an advantage in using
namespaces here.

> A slight niggle, <string> is in the C++ standard library, not the STL (they
> don't say we work for pedantical for nothing).

Will fix :)

> Redeclaring nux::Color is a dangerous thing. Slightly convoluted due to the
> actual nux Color being nux::color::Color, which is then used in the nux
> namespace. That is probably the only reason you are not getting linker errors
> with this.

Granted, this code is hackish. It cannot cause link errors though:
nux::Color is in Nux and we only link to NuxCore, not to Nux. I would have
used nux::Color directly instead of reimplementing it otherwise.

This code is part of a fake Cairo API used to draw the border behind the active
menubar item:

I expected the corresponding code in unity-3d to continue to evolve based on
adjustments from Design and more drawing code to be added later on. It would
have been a pain to catch up with it if I had rewritten the whole drawing code
using Qt painting API. Instead I opted to fake the Cairo API, this way I
expected to be able to catch up by simply copying the drawing code from
unity-3d.

It turned out to be a not-so-smart move in the end because by the time I was
done with my fake Cairo API, Cimi started redoing the panel drawing code using
GTK3 style API :/. I plan on investigating whether it is possible for us to
directly call the GTK3 style API to paint on QWidgets so that we can keep
rendering synchronized. At this point this whole fake Cairo code should be
scrapped.

Tim Penhey (thumper) wrote : Posted in a previous version of this proposal

On Tue, 12 Jul 2011 21:12:39 you wrote:
> > I also notice you aren't using namespaces for your top level classes -
> > like the GConnector. Have you considered using one?
>
> Not really. GConnector is in libunity-2d-private, which is not supposed to
> be reused outside of unity-2d. Therefore I don't see an advantage in using
> namespaces here.

You could say the same about unity, but I'm pushing for "namespace unity" (and
implementing).

> > Redeclaring nux::Color is a dangerous thing. Slightly convoluted due to
> > the actual nux Color being nux::color::Color, which is then used in the
> > nux namespace. That is probably the only reason you are not getting
> > linker errors with this.
>
> Granted, this code is hackish. It cannot cause link errors though:
> nux::Color is in Nux and we only link to NuxCore, not to Nux. I would have
> used nux::Color directly instead of reimplementing it otherwise.

No. nux::Color is in NuxCore, not Nux.

> This code is part of a fake Cairo API used to draw the border behind the
> active menubar item:
>
> I expected the corresponding code in unity-3d to continue to evolve based
> on adjustments from Design and more drawing code to be added later on. It
> would have been a pain to catch up with it if I had rewritten the whole
> drawing code using Qt painting API. Instead I opted to fake the Cairo API,
> this way I expected to be able to catch up by simply copying the drawing
> code from unity-3d.
>
> It turned out to be a not-so-smart move in the end because by the time I
> was done with my fake Cairo API, Cimi started redoing the panel drawing
> code using GTK3 style API :/. I plan on investigating whether it is
> possible for us to directly call the GTK3 style API to paint on QWidgets
> so that we can keep rendering synchronized. At this point this whole fake
> Cairo code should be scrapped.

Sure.

Aurélien Gâteau (agateau) wrote : Posted in a previous version of this proposal

> On Tue, 12 Jul 2011 21:12:39 you wrote:
> > > I also notice you aren't using namespaces for your top level classes -
> > > like the GConnector. Have you considered using one?
> >
> > Not really. GConnector is in libunity-2d-private, which is not supposed to
> > be reused outside of unity-2d. Therefore I don't see an advantage in using
> > namespaces here.
>
> You could say the same about unity, but I'm pushing for "namespace unity" (and
> implementing).

Not exactly, at least libunity-core is used by both unity-2d and unity-3d.

> > > Redeclaring nux::Color is a dangerous thing. Slightly convoluted due to
> > > the actual nux Color being nux::color::Color, which is then used in the
> > > nux namespace. That is probably the only reason you are not getting
> > > linker errors with this.
> >
> > Granted, this code is hackish. It cannot cause link errors though:
> > nux::Color is in Nux and we only link to NuxCore, not to Nux. I would have
> > used nux::Color directly instead of reimplementing it otherwise.
>
> No. nux::Color is in NuxCore, not Nux.

Oh. Will fix.

Aurélien

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

lp:unity-2d/4.0 saw quite a few updates which caused a couple of conflicts. Do you mind fixing them while I do the code review?

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

It seems like quite a few panel bugs got fixed by this piece, nice!

I don't see any background gradient in the panel anymore, is that expected?
Also the datetime indicator is there but tiny (easy to spot by navigating with the keyboard in the panel).

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

> Also the datetime indicator is there but tiny (easy to spot by navigating with
> the keyboard in the panel).

This is fixed now for some reason.

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

* Height of 24 pixels is hardcoded in various places. It would be nice to define it only once.

* Texts in panel do not have a shadow (sunken) like in Unity 3D.
* In the indicator with the username displayed in it (is it called 'me menu'?), the icon is not vertically centered like in Unity 3D.

* In panel/applets/appname/menubarwidget.cpp:

bool MenuBarWidget::isOpened() const
{
    // FIXME
[...]

What is the FIXME about?

* Do you know why does the shared panel backend need to know about the geometry of the indicators?

Have you tested the new panel with multiple monitors? I don't have the means to do it at the moment unfortunately.

review: Needs Fixing
Aurélien Gâteau (agateau) wrote : Posted in a previous version of this proposal

> lp:unity-2d/4.0 saw quite a few updates which caused a couple of conflicts. Do
> you mind fixing them while I do the code review?

I have a whole stack of branches right now but they are targeting trunk, not 4.0. Should I change this so they all target 4.0?

Aurélien Gâteau (agateau) wrote : Posted in a previous version of this proposal

> It seems like quite a few panel bugs got fixed by this piece, nice!
>
> I don't see any background gradient in the panel anymore, is that expected?

This is fixed in the next branch (use-gtk-rendering)

Aurélien Gâteau (agateau) wrote : Posted in a previous version of this proposal

> * Height of 24 pixels is hardcoded in various places. It would be nice to
> define it only once.

Yes, I got rid of a few of them in the use-gtk-rendering branch, but there are a few remainings.

> * Texts in panel do not have a shadow (sunken) like in Unity 3D.
> * In the indicator with the username displayed in it (is it called 'me
> menu'?), the icon is not vertically centered like in Unity 3D.

Both fixed in use-gtk-rendering.

> * In panel/applets/appname/menubarwidget.cpp:
>
> bool MenuBarWidget::isOpened() const
> {
> // FIXME
> [...]
>
> What is the FIXME about?

I just forgot to remove the comment. Fixed.

>
> * Do you know why does the shared panel backend need to know about the
> geometry of the indicators?

This is for accessibility support.

> Have you tested the new panel with multiple monitors? I don't have the means
> to do it at the moment unfortunately.

No I haven't. Will do.

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

> > lp:unity-2d/4.0 saw quite a few updates which caused a couple of conflicts.
> Do
> > you mind fixing them while I do the code review?
>
> I have a whole stack of branches right now but they are targeting trunk, not
> 4.0. Should I change this so they all target 4.0?

Please do. 4.0 is basically the branch targetting oneiric.
For this MR you can drop the prerequisite lp:~agateau/unity-2d/gtk3 as this branch cannot be merged on its own: it basically breaks the indicators more than anything else and I reviewed its code changes as part of this MR.

Florian Boucault (fboucault) wrote : Posted in a previous version of this proposal

Once you resubmitted this one and we are sure it works as before on multi monitors setup, it's good to merge (it will need a commit message).
I am onto https://code.launchpad.net/~agateau/unity-2d/use-gtk-rendering/+merge/69113 now.

lp:~agateau/unity-2d/unity-core updated on 2011-07-27
686. By Aurélien Gâteau on 2011-07-27

Sync with unity-2d/4.0

687. By Aurélien Gâteau on 2011-07-27

[panel] Make sure indicators are present on hotplugged monitor

IndicatorsManager should not be shared among panels, otherwise when a new
monitor is plugged after unity-2d-panel startup, we don't get any indicators as
no on_object_added() signal is emitted.

Tim Penhey (thumper) wrote : Posted in a previous version of this proposal

On Wed, 27 Jul 2011 23:39:33 you wrote:
> Please do. 4.0 is basically the branch targetting oneiric.
> For this MR you can drop the prerequisite lp:~agateau/unity-2d/gtk3 as this
> branch cannot be merged on its own: it basically breaks the indicators
> more than anything else and I reviewed its code changes as part of this
> MR.

Florian,

I regularly have dependent branches that can't be landed by themselves. It is
useful for review purposes. Showing particular changes in their own branch
can make reviews much easier. Merge proposals don't have to be landable by
themselves.

Launchpad knows when branches are merged, and when the subsequent merge
proposal is landed, the dependent merge proposal is marked as merged as well.

Tim

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2011-07-27 09:42:32 +0000
3+++ CMakeLists.txt 2011-07-27 15:26:24 +0000
4@@ -25,10 +25,10 @@
5 find_package(X11 REQUIRED)
6 find_package(Gettext REQUIRED)
7 pkg_check_modules(GLIB REQUIRED glib-2.0)
8-pkg_check_modules(GDK REQUIRED gdk-2.0)
9-pkg_check_modules(GTK REQUIRED gtk+-2.0)
10+pkg_check_modules(GDK REQUIRED gdk-3.0)
11+pkg_check_modules(GTK REQUIRED gtk+-3.0)
12 pkg_check_modules(GIO REQUIRED gio-2.0)
13-pkg_check_modules(WNCK REQUIRED libwnck-1.0)
14+pkg_check_modules(WNCK REQUIRED libwnck-3.0)
15
16
17 # GSettings schemas
18
19=== modified file 'debian/control'
20--- debian/control 2011-07-26 16:16:52 +0000
21+++ debian/control 2011-07-27 15:26:24 +0000
22@@ -10,17 +10,18 @@
23 libqt4-dev,
24 libqt4-opengl-dev,
25 libglib2.0-dev,
26- libwnck-dev,
27+ libwnck-3-dev,
28 libqtgconf-dev,
29 libdconf-qt-dev,
30 libqtbamf-dev,
31 libqtdee-dev,
32 libdbusmenu-qt-dev,
33 libx11-dev,
34- libindicator-dev (>= 0.3.90),
35- libgtk2.0-dev,
36+ libindicator3-dev,
37+ libgtk-3-dev,
38 libutouch-geis-dev,
39- libstartup-notification0-dev
40+ libstartup-notification0-dev,
41+ libunity-core-4.0-dev,
42 Standards-Version: 3.9.2
43 Vcs-Bzr: http://bazaar.launchpad.net/~unity-2d-team/unity-2d/oneiric
44
45
46=== modified file 'debian/unity-2d-panel.install'
47--- debian/unity-2d-panel.install 2011-01-14 21:41:39 +0000
48+++ debian/unity-2d-panel.install 2011-07-27 15:26:24 +0000
49@@ -1,4 +1,2 @@
50 usr/bin/unity-2d-panel
51 usr/share/applications/unity-2d-panel.desktop
52-usr/share/unity-2d/panel/artwork/background.png
53-usr/share/unity-2d/panel/artwork/divider.png
54
55=== modified file 'libunity-2d-private/Unity2d/CMakeLists.txt'
56--- libunity-2d-private/Unity2d/CMakeLists.txt 2011-07-27 12:33:59 +0000
57+++ libunity-2d-private/Unity2d/CMakeLists.txt 2011-07-27 15:26:24 +0000
58@@ -4,7 +4,7 @@
59 pkg_check_modules(QTDEE REQUIRED libqtdee)
60 pkg_check_modules(DBUSMENUQT REQUIRED dbusmenu-qt)
61 pkg_check_modules(STARTUPNOTIFICATION REQUIRED libstartup-notification-1.0)
62-pkg_check_modules(INDICATOR REQUIRED indicator-0.4)
63+pkg_check_modules(INDICATOR REQUIRED indicator3-0.4)
64 pkg_check_modules(DCONFQT REQUIRED dconf-qt)
65
66 # Sources
67
68=== modified file 'libunity-2d-private/Unity2d/launcherapplication.cpp'
69--- libunity-2d-private/Unity2d/launcherapplication.cpp 2011-07-13 17:42:29 +0000
70+++ libunity-2d-private/Unity2d/launcherapplication.cpp 2011-07-27 15:26:24 +0000
71@@ -14,10 +14,6 @@
72 * along with this program. If not, see <http://www.gnu.org/licenses/>.
73 */
74
75-/* Those have to be included before any QObject-style header to avoid
76- compilation errors. */
77-#include <gdk/gdk.h>
78-
79 /* Note regarding the use of wnck: it is critically important that the client
80 type be set to pager because wnck will pass that type over to the window
81 manager through XEvents.
82@@ -59,6 +55,7 @@
83 #include <QX11Info>
84
85 extern "C" {
86+#include <gdk/gdk.h>
87 #include <libsn/sn.h>
88 }
89
90@@ -649,7 +646,8 @@
91 GTimeVal timeval;
92
93 g_get_current_time (&timeval);
94- GObjectScopedPointer<GdkAppLaunchContext> context(gdk_app_launch_context_new());
95+ GdkDisplay* display = gdk_display_get_default();
96+ GObjectScopedPointer<GdkAppLaunchContext> context(gdk_display_get_app_launch_context(display));
97 /* Using GDK_CURRENT_TIME doesn’t seem to work, launched windows
98 sometimes don’t get focus (see https://launchpad.net/bugs/643616). */
99 gdk_app_launch_context_set_timestamp(context.data(), timeval.tv_sec);
100
101=== modified file 'libunity-2d-private/Unity2d/plugin.cpp'
102--- libunity-2d-private/Unity2d/plugin.cpp 2011-07-26 16:05:51 +0000
103+++ libunity-2d-private/Unity2d/plugin.cpp 2011-07-27 15:26:24 +0000
104@@ -20,10 +20,6 @@
105 /* Required otherwise using wnck_set_client_type breaks linking with error:
106 undefined reference to `wnck_set_client_type(WnckClientType)'
107 */
108-extern "C" {
109-#include <libwnck/util.h>
110-}
111-
112 #include "plugin.h"
113
114 #include "launcherapplication.h"
115
116=== modified file 'libunity-2d-private/Unity2d/screeninfo.cpp'
117--- libunity-2d-private/Unity2d/screeninfo.cpp 2011-06-27 13:43:05 +0000
118+++ libunity-2d-private/Unity2d/screeninfo.cpp 2011-07-27 15:26:24 +0000
119@@ -1,7 +1,5 @@
120 extern "C" {
121-#include <libwnck/screen.h>
122-#include <libwnck/window.h>
123-#include <libwnck/workspace.h>
124+#include <libwnck/libwnck.h>
125 }
126
127 #include "bamf-matcher.h"
128
129=== modified file 'libunity-2d-private/Unity2d/windowinfo.cpp'
130--- libunity-2d-private/Unity2d/windowinfo.cpp 2011-02-08 11:48:16 +0000
131+++ libunity-2d-private/Unity2d/windowinfo.cpp 2011-07-27 15:26:24 +0000
132@@ -14,9 +14,7 @@
133 * along with this program. If not, see <http://www.gnu.org/licenses/>.
134 */
135
136-#include <libwnck/screen.h>
137-#include <libwnck/window.h>
138-#include <libwnck/workspace.h>
139+#include <libwnck/libwnck.h>
140
141 #include <glib-2.0/glib.h>
142
143
144=== modified file 'libunity-2d-private/Unity2d/workspacesinfo.cpp'
145--- libunity-2d-private/Unity2d/workspacesinfo.cpp 2011-07-23 12:46:30 +0000
146+++ libunity-2d-private/Unity2d/workspacesinfo.cpp 2011-07-27 15:26:24 +0000
147@@ -4,9 +4,7 @@
148 #include <debug_p.h>
149
150 extern "C" {
151-#include <libwnck/screen.h>
152-#include <libwnck/window.h>
153-#include <libwnck/workspace.h>
154+#include <libwnck/libwnck.h>
155 }
156
157 #include <QAbstractEventDispatcher>
158
159=== modified file 'libunity-2d-private/src/CMakeLists.txt'
160--- libunity-2d-private/src/CMakeLists.txt 2011-07-27 09:42:32 +0000
161+++ libunity-2d-private/src/CMakeLists.txt 2011-07-27 15:26:24 +0000
162@@ -1,5 +1,6 @@
163 # Sources
164 set(libunity-2d-private_SRCS
165+ debug.cpp
166 gconnector.cpp
167 gnomesessionclient.cpp
168 keyboardmodifiersmonitor.cpp
169
170=== added file 'libunity-2d-private/src/debug.cpp'
171--- libunity-2d-private/src/debug.cpp 1970-01-01 00:00:00 +0000
172+++ libunity-2d-private/src/debug.cpp 2011-07-27 15:26:24 +0000
173@@ -0,0 +1,23 @@
174+/* This file is part of unity-2d
175+ Copyright 2011 Canonical
176+ Author: Aurelien Gateau <aurelien.gateau@canonical.com>
177+
178+ This program is free software; you can redistribute it and/or modify
179+ it under the terms of the GNU General Public License as published
180+ by the Free Software Foundation; version 3.
181+
182+ This program is distributed in the hope that it will be useful,
183+ but WITHOUT ANY WARRANTY; without even the implied warranty of
184+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
185+ GNU General Public License for more details.
186+
187+ You should have received a copy of the GNU General Public License
188+ along with this program. If not, see <http://www.gnu.org/licenses/>.
189+ */
190+// Self
191+#include <debug_p.h>
192+
193+QDebug operator<<(QDebug& dbg, const std::string& str)
194+{
195+ return dbg << QString::fromUtf8(str.c_str());
196+}
197
198=== modified file 'libunity-2d-private/src/debug_p.h'
199--- libunity-2d-private/src/debug_p.h 2011-03-28 14:06:14 +0000
200+++ libunity-2d-private/src/debug_p.h 2011-07-27 15:26:24 +0000
201@@ -17,8 +17,12 @@
202 #ifndef DEBUG_P_H
203 #define DEBUG_P_H
204
205+// Qt
206 #include <QDebug>
207
208+// STL
209+#include <string>
210+
211 #define _UQ_TRACE(level) (level().nospace() << __PRETTY_FUNCTION__ << ":").space()
212
213 // Simple macros to get KDebug like support
214@@ -62,5 +66,7 @@
215
216 #define UQ_DEBUG_BLOCK Unity2dDebugBlock __unity2dDebugBlock__(__PRETTY_FUNCTION__)
217
218+// Support for outputing std::string with qDebug
219+QDebug operator<<(QDebug& dbg, const std::string& str);
220
221 #endif /* DEBUG_P_H */
222
223=== modified file 'libunity-2d-private/src/unity2dapplication.cpp'
224--- libunity-2d-private/src/unity2dapplication.cpp 2011-07-27 11:42:46 +0000
225+++ libunity-2d-private/src/unity2dapplication.cpp 2011-07-27 15:26:24 +0000
226@@ -41,6 +41,16 @@
227 }
228 }
229
230+static bool arrayContains(char** begin, char** end, const char* string)
231+{
232+ for (char** ptr = begin; ptr != end; ++ptr) {
233+ if (strcmp(*ptr, string) == 0) {
234+ return true;
235+ }
236+ }
237+ return false;
238+}
239+
240 void Unity2dApplication::earlySetup(int& argc, char** argv)
241 {
242 // Parts of unity-2d uses GTK so it needs to be initialized
243@@ -61,6 +71,14 @@
244 if(getenv("QT_GRAPHICSSYSTEM") == 0) {
245 QApplication::setGraphicsSystem("raster");
246 }
247+
248+ /* Unless style has been specified in args, set default Qt style to
249+ * QWindowStyle to avoid loading QGtkStyle. We don't want to load QGtkStyle
250+ * because it uses libgtk2, which causes conflicts with our gtk3 code.
251+ */
252+ if (!arrayContains(argv, argv + argc, "-style")) {
253+ QApplication::setStyle(new QWindowsStyle);
254+ }
255 }
256
257 Unity2dApplication::Unity2dApplication(int& argc, char** argv)
258
259=== modified file 'panel/CMakeLists.txt'
260--- panel/CMakeLists.txt 2011-06-27 13:40:51 +0000
261+++ panel/CMakeLists.txt 2011-07-27 15:26:24 +0000
262@@ -1,5 +1,8 @@
263 project(unity-2d-panel)
264
265+# Dependencies
266+pkg_check_modules(UNITYCORE REQUIRED unity-core-4.0)
267+
268 # Source
269 include_directories(
270 ${libunity-2d-private_SOURCE_DIR}/src
271@@ -8,8 +11,3 @@
272 add_subdirectory(applets)
273 add_subdirectory(app)
274 add_subdirectory(tests)
275-
276-# Install
277-install(DIRECTORY artwork
278- DESTINATION ${UNITY_2D_DIR}/panel
279- )
280
281=== modified file 'panel/app/CMakeLists.txt'
282--- panel/app/CMakeLists.txt 2011-04-04 16:41:15 +0000
283+++ panel/app/CMakeLists.txt 2011-07-27 15:26:24 +0000
284@@ -1,7 +1,6 @@
285 set(panel_SRCS
286 main.cpp
287 panelmanager.cpp
288- unity2dstyle.cpp
289 )
290
291 qt4_automoc(${panel_SRCS})
292@@ -10,14 +9,17 @@
293 include_directories(
294 ${CMAKE_CURRENT_BINARY_DIR}
295 ${CMAKE_CURRENT_SOURCE_DIR}
296+ ${GTK_INCLUDE_DIRS}
297 ${uqapplets_SOURCE_DIR}
298 ${uqapplets_SOURCE_DIR}/common
299+ ${UNITYCORE_INCLUDE_DIRS}
300 ${libunity-2d-private_SOURCE_DIR}/src
301 )
302
303 target_link_libraries(unity-2d-panel
304 ${QT_QTGUI_LIBRARIES}
305 ${QT_QTCORE_LIBRARIES}
306+ ${GTK_LDFLAGS}
307 uqapplets
308 unity-2d-private
309 )
310
311=== modified file 'panel/app/main.cpp'
312--- panel/app/main.cpp 2011-07-18 13:47:29 +0000
313+++ panel/app/main.cpp 2011-07-27 15:26:24 +0000
314@@ -22,12 +22,12 @@
315 // Local
316 #include <config.h>
317 #include <panelmanager.h>
318+#include <panelstyle.h>
319
320 // Unity
321 #include <gnomesessionclient.h>
322 #include <unity2ddebug.h>
323 #include <unity2dapplication.h>
324-#include <unity2dstyle.h>
325 #include <unity2dtr.h>
326
327 // Qt
328@@ -54,7 +54,9 @@
329 ThemeEngineHandler handler;
330 Unity2dApplication::earlySetup(argc, argv);
331 Unity2dApplication app(argc, argv);
332- QApplication::setStyle(new Unity2dStyle);
333+
334+ // Instantiate a PanelStyle so that it configures QApplication
335+ PanelStyle::instance();
336
337 GnomeSessionClient client(INSTALL_PREFIX "/share/applications/unity-2d-panel.desktop");
338 client.connectToSessionManager();
339
340=== modified file 'panel/app/panelmanager.cpp'
341--- panel/app/panelmanager.cpp 2011-06-12 23:01:35 +0000
342+++ panel/app/panelmanager.cpp 2011-07-27 15:26:24 +0000
343@@ -24,6 +24,8 @@
344
345 // Local
346 #include <config.h>
347+#include <panelstyle.h>
348+#include <indicatorsmanager.h>
349
350 // Applets
351 #include <appindicator/appindicatorapplet.h>
352@@ -42,70 +44,55 @@
353
354 using namespace Unity2d;
355
356-static QPalette getPalette()
357-{
358- QPalette palette;
359-
360- /* Should use the panel's background provided by Unity but it turns
361- out not to be good. It would look like:
362-
363- QBrush bg(QPixmap("theme:/panel_background.png"));
364- */
365- QBrush bg(QPixmap(unity2dDirectory() + "/panel/artwork/background.png"));
366- palette.setBrush(QPalette::Window, bg);
367- palette.setBrush(QPalette::Button, bg);
368- return palette;
369-}
370-
371-static QLabel* createSeparator()
372-{
373- QLabel* label = new QLabel;
374- QPixmap pix(unity2dDirectory() + "/panel/artwork/divider.png");
375- label->setPixmap(pix);
376- label->setFixedSize(pix.size());
377- return label;
378-}
379-
380-static Unity2dPanel* instantiatePanel(int screen)
381+static QWidget* createSeparator()
382+{
383+ // Just a quick-hack: homebutton is going away anyway
384+ QWidget* widget = new QWidget;
385+ widget->setFixedWidth(6);
386+ return widget;
387+}
388+
389+PanelManager::PanelManager(QObject* parent)
390+: QObject(parent)
391+{
392+ QDesktopWidget* desktop = QApplication::desktop();
393+ for(int i = 0; i < desktop->screenCount(); ++i) {
394+ Unity2dPanel* panel = instantiatePanel(i);
395+ m_panels.append(panel);
396+ panel->show();
397+ panel->move(desktop->screenGeometry(i).topLeft());
398+ }
399+ connect(desktop, SIGNAL(screenCountChanged(int)), SLOT(onScreenCountChanged(int)));
400+}
401+
402+PanelManager::~PanelManager()
403+{
404+ qDeleteAll(m_panels);
405+}
406+
407+Unity2dPanel* PanelManager::instantiatePanel(int screen)
408 {
409 Unity2dPanel* panel = new Unity2dPanel;
410 panel->setEdge(Unity2dPanel::TopEdge);
411- panel->setPalette(getPalette());
412 panel->setFixedHeight(24);
413
414+ IndicatorsManager* indicatorsManager = new IndicatorsManager(panel);
415+
416 int leftmost = QApplication::desktop()->screenNumber(QPoint());
417 if (screen == leftmost) {
418 panel->addWidget(new HomeButtonApplet);
419 panel->addWidget(createSeparator());
420 }
421- panel->addWidget(new AppNameApplet);
422+ panel->addWidget(new AppNameApplet(indicatorsManager));
423 if (screen == leftmost) {
424 /* It doesn’t make sense to have more than one instance of the systray,
425 XEmbed’ed windows can be displayed only once anyway. */
426 panel->addWidget(new LegacyTrayApplet);
427 }
428- panel->addWidget(new IndicatorApplet);
429+ panel->addWidget(new IndicatorApplet(indicatorsManager));
430 return panel;
431 }
432
433-PanelManager::PanelManager(QObject* parent)
434- : QObject(parent)
435-{
436- QDesktopWidget* desktop = QApplication::desktop();
437- for(int i = 0; i < desktop->screenCount(); ++i) {
438- Unity2dPanel* panel = instantiatePanel(i);
439- m_panels.append(panel);
440- panel->show();
441- panel->move(desktop->screenGeometry(i).topLeft());
442- }
443- connect(desktop, SIGNAL(screenCountChanged(int)), SLOT(onScreenCountChanged(int)));
444-}
445-
446-PanelManager::~PanelManager()
447-{
448- qDeleteAll(m_panels);
449-}
450-
451 void
452 PanelManager::onScreenCountChanged(int newCount)
453 {
454
455=== modified file 'panel/app/panelmanager.h'
456--- panel/app/panelmanager.h 2011-04-04 16:41:15 +0000
457+++ panel/app/panelmanager.h 2011-07-27 15:26:24 +0000
458@@ -40,6 +40,8 @@
459 Q_DISABLE_COPY(PanelManager)
460 QList<Unity2dPanel*> m_panels;
461
462+ Unity2dPanel* instantiatePanel(int screen);
463+
464 private Q_SLOTS:
465 void onScreenCountChanged(int newCount);
466 };
467
468=== removed file 'panel/app/unity2dstyle.cpp'
469--- panel/app/unity2dstyle.cpp 2011-03-28 12:16:02 +0000
470+++ panel/app/unity2dstyle.cpp 1970-01-01 00:00:00 +0000
471@@ -1,98 +0,0 @@
472-/*
473- * Plasma applet to display DBus global menu
474- *
475- * Copyright 2009 Canonical Ltd.
476- *
477- * Authors:
478- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
479- *
480- * This program is free software; you can redistribute it and/or modify
481- * it under the terms of the GNU General Public License as published by
482- * the Free Software Foundation; version 3.
483- *
484- * This program is distributed in the hope that it will be useful,
485- * but WITHOUT ANY WARRANTY; without even the implied warranty of
486- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
487- * GNU General Public License for more details.
488- *
489- * You should have received a copy of the GNU General Public License
490- * along with this program. If not, see <http://www.gnu.org/licenses/>
491- */
492-
493-// Self
494-#include "unity2dstyle.h"
495-
496-// Local
497-
498-// libunity-2d-private
499-#include <debug_p.h>
500-#include <keyboardmodifiersmonitor.h>
501-
502-// Qt
503-#include <QGtkStyle>
504-#include <QMenu>
505-#include <QPainter>
506-#include <QStyleOptionFrame>
507-#include <QWidget>
508-
509-Unity2dStyle::Unity2dStyle()
510-: QProxyStyle(new QGtkStyle)
511-{
512-}
513-
514-void Unity2dStyle::drawControl(QStyle::ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const
515-{
516- if (element == QStyle::CE_MenuBarItem && widget) {
517- QStyleOptionMenuItem opt = *qstyleoption_cast<const QStyleOptionMenuItem*>(option);
518- if (!(opt.state & QStyle::State_Enabled) && (opt.state & QStyle::State_Sunken)) {
519- // Reset State_Sunken flag to avoid drawing a frame on a disabled menu item
520- // See https://bugs.launchpad.net/unity-2d/+bug/717744
521- opt.state ^= QStyle::State_Sunken;
522- }
523- // Skip "widget" parameter to avoid solid gray background behind the menubar items
524- QProxyStyle::drawControl(element, &opt, painter, 0);
525- } else if (element == QStyle::CE_MenuBarEmptyArea) {
526- // Avoid gray borders around the menubar items
527- } else {
528- QProxyStyle::drawControl(element, option, painter, widget);
529- }
530-}
531-
532-int Unity2dStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption* option, const QWidget* widget) const
533-{
534- if (metric == QStyle::PM_MenuBarVMargin) {
535- // Avoid one-pixel gap above menuitem
536- return 0;
537- } else {
538- return QProxyStyle::pixelMetric(metric, option, widget);
539- }
540-}
541-
542-QSize Unity2dStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption* option, const QSize& contentsSize, const QWidget* widget) const
543-{
544- QSize size = QProxyStyle::sizeFromContents(type, option, contentsSize, widget);
545- if (type == QStyle::CT_MenuBarItem && widget) {
546- // Avoid three-pixel gap below menuitem
547- size.setHeight(widget->height());
548- }
549- return size;
550-}
551-
552-int Unity2dStyle::styleHint(StyleHint hint, const QStyleOption* option, const QWidget* widget, QStyleHintReturn* returnData) const
553-{
554- if (hint == QStyle::SH_UnderlineShortcut) {
555- // The shortcut of an opened menu can be triggered without holding Alt
556- // down, so we always show the underline. For all other widgets we only
557- // show the underlines if alt is down.
558- // Note that this is a bit hackish: it only works reliably if the
559- // widget repaints itself when alt is pressed or released. For now only
560- // the MenuBarWidget from the AppNameApplets does this.
561- if (qobject_cast<const QMenu*>(widget)) {
562- return true;
563- } else {
564- return KeyboardModifiersMonitor::instance()->keyboardModifiers() == Qt::AltModifier;
565- }
566- } else {
567- return QProxyStyle::styleHint(hint, option, widget, returnData);
568- }
569-}
570
571=== removed file 'panel/app/unity2dstyle.h'
572--- panel/app/unity2dstyle.h 2011-01-26 15:50:26 +0000
573+++ panel/app/unity2dstyle.h 1970-01-01 00:00:00 +0000
574@@ -1,44 +0,0 @@
575-/*
576- * This file is part of unity-2d
577- *
578- * Copyright 2010 Canonical Ltd.
579- *
580- * Authors:
581- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
582- *
583- * This program is free software; you can redistribute it and/or modify
584- * it under the terms of the GNU General Public License as published by
585- * the Free Software Foundation; version 3.
586- *
587- * This program is distributed in the hope that it will be useful,
588- * but WITHOUT ANY WARRANTY; without even the implied warranty of
589- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
590- * GNU General Public License for more details.
591- *
592- * You should have received a copy of the GNU General Public License
593- * along with this program. If not, see <http://www.gnu.org/licenses/>
594- */
595-
596-#ifndef UNITY2DSTYLE_H
597-#define UNITY2DSTYLE_H
598-
599-// Local
600-
601-// Qt
602-#include <QProxyStyle>
603-
604-class Unity2dStyle : public QProxyStyle
605-{
606-public:
607- Unity2dStyle();
608-
609- virtual void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = 0) const;
610-
611- virtual int pixelMetric(PixelMetric metric, const QStyleOption* option = 0, const QWidget* widget = 0) const;
612-
613- virtual QSize sizeFromContents(ContentsType type, const QStyleOption* option, const QSize& contentsSize, const QWidget* widget = 0) const;
614-
615- virtual int styleHint(StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const;
616-};
617-
618-#endif /* UNITY2DSTYLE_H */
619
620=== modified file 'panel/applets/CMakeLists.txt'
621--- panel/applets/CMakeLists.txt 2011-07-27 12:33:59 +0000
622+++ panel/applets/CMakeLists.txt 2011-07-27 15:26:24 +0000
623@@ -1,25 +1,11 @@
624 project(uqapplets)
625
626-macro(read_pkg_variable cmake_var pkg pkg_var)
627- execute_process(
628- COMMAND pkg-config --variable=${pkg_var} ${pkg}
629- OUTPUT_VARIABLE tmp
630- )
631- # Remove trailing newline from ${tmp}
632- string(STRIP "${tmp}" ${cmake_var})
633-endmacro(read_pkg_variable)
634-
635 # Dependencies
636 include(FindPkgConfig)
637
638 pkg_check_modules(QTBAMF REQUIRED libqtbamf)
639 pkg_check_modules(DBUSMENUQT REQUIRED dbusmenu-qt)
640-pkg_check_modules(INDICATOR REQUIRED indicator-0.4)
641-
642-# Get indicator dirs from pkgconfig
643-read_pkg_variable(INDICATOR_DIR indicator-0.4 indicatordir)
644-read_pkg_variable(INDICATOR_ICONS_DIR indicator-0.4 iconsdir)
645-configure_file(indicator-config.h.in indicator-config.h)
646+pkg_check_modules(PANGO REQUIRED pango)
647
648 # Sources
649 set(uqapplets_SRCS
650@@ -27,16 +13,15 @@
651 appindicator/sniitem.cpp
652 appname/appnameapplet.cpp
653 appname/menubarwidget.cpp
654- appname/registrar.cpp
655 appname/windowhelper.cpp
656 common/applet.cpp
657+ common/indicatorentrywidget.cpp
658+ common/indicatorsmanager.cpp
659+ common/indicatorwidget.cpp
660+ common/panelstyle.cpp
661 homebutton/homebuttonapplet.cpp
662 homebutton/homebutton.cpp
663- indicator/abstractindicator.cpp
664- indicator/datetimeindicator.cpp
665 indicator/indicatorapplet.cpp
666- indicator/indicatorservicemanager.cpp
667- indicator/indicator.c
668 legacytray/legacytrayapplet.cpp
669 legacytray/fdoselectionmanager.cpp
670 legacytray/fdotask.cpp
671@@ -45,10 +30,6 @@
672 legacytray/x11embedpainter.cpp
673 )
674
675-qt4_add_dbus_adaptor(uqapplets_SRCS appname/com.canonical.AppMenu.Registrar.xml
676- registrar.h Registrar
677- )
678-
679 qt4_automoc(${uqapplets_SRCS})
680
681 # Build
682@@ -58,13 +39,15 @@
683 ${CMAKE_CURRENT_SOURCE_DIR}/common
684 ${CMAKE_CURRENT_SOURCE_DIR}/homebutton
685 ${CMAKE_CURRENT_SOURCE_DIR}/indicator
686+ ${CMAKE_CURRENT_SOURCE_DIR}/unitycore
687 ${QTBAMF_INCLUDE_DIRS}
688 ${DBUSMENUQT_INCLUDE_DIRS}
689 ${GTK_INCLUDE_DIRS}
690- ${INDICATOR_INCLUDE_DIRS}
691 ${WNCK_INCLUDE_DIRS}
692 ${CMAKE_CURRENT_BINARY_DIR}
693 ${X11_INCLUDE_DIR}
694+ ${UNITYCORE_INCLUDE_DIRS}
695+ ${PANGO_INCLUDE_DIRS}
696 ${libunity-2d-private_SOURCE_DIR}/src
697 )
698
699@@ -76,12 +59,13 @@
700 ${DBUSMENUQT_LDFLAGS}
701 ${QTBAMF_LDFLAGS}
702 ${GTK_LDFLAGS}
703- ${INDICATOR_LDFLAGS}
704 ${WNCK_LDFLAGS}
705 ${X11_LIBRARIES}
706 ${X11_Xrender_LIB}
707 ${X11_Xcomposite_LIB}
708 ${X11_Xdamage_LIB}
709 ${X11_Xfixes_LIB}
710+ ${UNITYCORE_LDFLAGS}
711+ ${PANGO_LDFLAGS}
712 unity-2d-private
713 )
714
715=== modified file 'panel/applets/appname/appnameapplet.cpp'
716--- panel/applets/appname/appnameapplet.cpp 2011-07-26 09:36:41 +0000
717+++ panel/applets/appname/appnameapplet.cpp 2011-07-27 15:26:24 +0000
718@@ -200,10 +200,10 @@
719 q, SLOT(updateWidgets()));
720 }
721
722- void setupMenuBarWidget()
723+ void setupMenuBarWidget(IndicatorsManager* manager)
724 {
725- m_menuBarWidget = new MenuBarWidget(0 /* Window menu */);
726- QObject::connect(m_menuBarWidget, SIGNAL(menuBarClosed()),
727+ m_menuBarWidget = new MenuBarWidget(manager);
728+ QObject::connect(m_menuBarWidget, SIGNAL(isOpenedChanged()),
729 q, SLOT(updateWidgets()));
730 QObject::connect(m_menuBarWidget, SIGNAL(isEmptyChanged()),
731 q, SLOT(updateWidgets()));
732@@ -216,21 +216,16 @@
733 }
734 };
735
736-AppNameApplet::AppNameApplet()
737+AppNameApplet::AppNameApplet(IndicatorsManager* indicatorsManager)
738 : d(new AppNameAppletPrivate)
739 {
740 d->q = this;
741 setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Minimum);
742
743- QPalette palette;
744- palette.setColor(QPalette::WindowText, Qt::white);
745- palette.setColor(QPalette::ButtonText, Qt::white);
746- setPalette(palette);
747-
748 d->setupWindowHelper();
749 d->setupLabel();
750 d->setupWindowButtonWidget();
751- d->setupMenuBarWidget();
752+ d->setupMenuBarWidget(indicatorsManager);
753 d->setupKeyboardModifiersMonitor();
754
755 QHBoxLayout* layout = new QHBoxLayout(this);
756
757=== modified file 'panel/applets/appname/appnameapplet.h'
758--- panel/applets/appname/appnameapplet.h 2011-06-06 09:06:55 +0000
759+++ panel/applets/appname/appnameapplet.h 2011-07-27 15:26:24 +0000
760@@ -29,6 +29,8 @@
761
762 class QEvent;
763
764+class IndicatorsManager;
765+
766 namespace Unity2d
767 {
768
769@@ -37,7 +39,7 @@
770 {
771 Q_OBJECT
772 public:
773- AppNameApplet();
774+ AppNameApplet(IndicatorsManager*);
775 ~AppNameApplet();
776
777 protected:
778
779=== removed file 'panel/applets/appname/com.canonical.AppMenu.Registrar.xml'
780--- panel/applets/appname/com.canonical.AppMenu.Registrar.xml 2011-02-10 01:10:19 +0000
781+++ panel/applets/appname/com.canonical.AppMenu.Registrar.xml 1970-01-01 00:00:00 +0000
782@@ -1,82 +0,0 @@
783-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
784-<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
785- <dox:d><![CDATA[
786- @mainpage
787-  
788- An interface to register menus that are associated with a window in an application.  The
789- main interface is docuemented here: @ref com::canonical::AppMenu::Registrar.
790-     
791- The actual menus are transported using the dbusmenu protocol which is available
792- here: @ref com::canonical::dbusmenu.
793- ]]></dox:d>
794- <interface name="com.canonical.AppMenu.Registrar" xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
795- <dox:d>
796- An interface to register a menu from an application's window to be displayed in another
797- window.  This manages that association between XWindow Window IDs and the dbus
798- address and object that provides the menu using the dbusmenu dbus interface.
799- </dox:d>
800- <method name="RegisterWindow">
801- <dox:d><![CDATA[
802- Associates a dbusmenu with a window
803-      
804- /note this method assumes that the connection from the caller is the DBus connection
805- to use for the object.  Applications that use multiple DBus connections will need to
806- ensure this method is called with the same connection that implmenets the object.
807- ]]></dox:d>
808- <arg name="windowId" type="u" direction="in">
809- <dox:d>The XWindow ID of the window</dox:d>
810- </arg>
811- <arg name="menuObjectPath" type="o" direction="in">
812- <dox:d>The object on the dbus interface implementing the dbusmenu interface</dox:d>
813- </arg>
814- </method>
815- <method name="UnregisterWindow">
816- <dox:d>
817- A method to allow removing a window from the database. Windows will also be removed
818- when the client drops off DBus so this is not required. It is polite though. And
819- important for testing.
820- </dox:d>
821- <arg name="windowId" type="u" direction="in">
822- <dox:d>The XWindow ID of the window</dox:d>
823- </arg>
824- </method>
825- <method name="GetMenuForWindow">
826- <dox:d>Gets the registered menu for a given window ID.</dox:d>
827- <arg name="windowId" type="u" direction="in">
828- <dox:d>The XWindow ID of the window to get</dox:d>
829- </arg>
830- <arg name="service" type="s" direction="out">
831- <dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
832- </arg>
833- <arg name="menuObjectPath" type="o" direction="out">
834- <dox:d>The path to the object which implements the com.canonical.dbusmenu interface.</dox:d>
835- </arg>
836- </method>
837- <method name="GetMenus">
838- <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MenuInfoList"/>
839- <dox:d>Gets the information on all menus that the registrar knows about. This
840- is useful for debugging or bringing up a new renderer.</dox:d>
841- <arg name="menus" type="a(uso)" direction="out">
842- <dox:d>An array of structures containing the same parameters as @GetMenuForWindow. Window ID, Service and ObjectPath.</dox:d>
843- </arg>
844- </method>
845- <signal name="WindowRegistered">
846- <dox:d>Signals when the registrar gets a new menu registered</dox:d>
847- <arg name="windowId" type="u" direction="out">
848- <dox:d>The XWindow ID of the window</dox:d>
849- </arg>
850- <arg name="service" type="s" direction="out">
851- <dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
852- </arg>
853- <arg name="menuObjectPath" type="o" direction="out">
854- <dox:d>The path to the object which implements the com.canonical.dbusmenu interface.</dox:d>
855- </arg>
856- </signal>
857- <signal name="WindowUnregistered">
858- <dox:d>Signals when the registrar removes a menu registration</dox:d>
859- <arg name="windowId" type="u" direction="out">
860- <dox:d>The XWindow ID of the window</dox:d>
861- </arg>
862- </signal>
863- </interface>
864-</node>
865
866=== modified file 'panel/applets/appname/menubarwidget.cpp'
867--- panel/applets/appname/menubarwidget.cpp 2011-07-26 09:36:41 +0000
868+++ panel/applets/appname/menubarwidget.cpp 2011-07-27 15:26:24 +0000
869@@ -20,299 +20,98 @@
870 */
871
872 // Self
873-#include "menubarwidget.h"
874+#include <menubarwidget.h>
875
876 // Local
877-#include "config.h"
878-#include "debug_p.h"
879-#include "keyboardmodifiersmonitor.h"
880-#include "registrar.h"
881-
882-// dbusmenu-qt
883-#include <dbusmenuimporter.h>
884-
885-// bamf
886-#include <bamf-matcher.h>
887-#include <bamf-window.h>
888+#include <debug_p.h>
889+#include <indicatorentrywidget.h>
890+#include <indicatorsmanager.h>
891
892 // Qt
893-#include <QActionEvent>
894 #include <QHBoxLayout>
895-#include <QLabel>
896-#include <QMenuBar>
897-#include <QTimer>
898-
899-class MyDBusMenuImporter : public DBusMenuImporter
900-{
901-public:
902- MyDBusMenuImporter(const QString &service, const QString &path, QObject *parent)
903- : DBusMenuImporter(service, path, parent)
904- , m_service(service)
905- , m_path(path)
906- {}
907-
908- QString service() const { return m_service; }
909- QString path() const { return m_path; }
910-
911-private:
912- QString m_service;
913- QString m_path;
914-};
915-
916-MenuBarWidget::MenuBarWidget(QMenu* windowMenu, QWidget* parent)
917+
918+static const int MENU_ITEM_PADDING = 6;
919+
920+MenuBarWidget::MenuBarWidget(IndicatorsManager* indicatorsManager, QWidget* parent)
921 : QWidget(parent)
922-, m_windowMenu(windowMenu)
923-{
924- m_activeWinId = 0;
925- setupRegistrar();
926- setupMenuBar();
927-
928- connect(&BamfMatcher::get_default(), SIGNAL(ActiveWindowChanged(BamfWindow*, BamfWindow*)),
929- SLOT(slotActiveWindowChanged(BamfWindow*, BamfWindow*)));
930- /* Work around a bug in BAMF: the ActiveWindowChanged signal is not emitted
931- for some windows that open maximized. This is for example the case of the
932- LibreOffice startcenter. */
933- connect(&BamfMatcher::get_default(), SIGNAL(ViewOpened(BamfView*)),
934- SLOT(slotViewOpened()));
935- updateActiveWinId(BamfMatcher::get_default().active_window());
936-}
937-
938-void MenuBarWidget::setupRegistrar()
939-{
940- m_registrar = Registrar::instance();
941- if (!m_registrar->connectToBus()) {
942- UQ_WARNING << "could not connect registrar to DBus";
943- }
944-
945- connect(m_registrar, SIGNAL(WindowRegistered(WId, const QString&, const QDBusObjectPath&)),
946- SLOT(slotWindowRegistered(WId, const QString&, const QDBusObjectPath&)));
947- connect(m_registrar, SIGNAL(WindowUnregistered(WId)),
948- SLOT(slotWindowUnregistered(WId)));
949-}
950-
951-void MenuBarWidget::setupMenuBar()
952-{
953- m_menuBar = new QMenuBar;
954- new MenuBarClosedHelper(this);
955-
956- QHBoxLayout* layout = new QHBoxLayout(this);
957- layout->setMargin(0);
958- layout->setSpacing(0);
959- layout->addWidget(m_menuBar);
960- m_menuBar->setNativeMenuBar(false);
961-
962- m_updateMenuBarTimer = new QTimer(this);
963- m_updateMenuBarTimer->setSingleShot(true);
964- m_updateMenuBarTimer->setInterval(0);
965- connect(m_updateMenuBarTimer, SIGNAL(timeout()),
966- SLOT(updateMenuBar()));
967-
968- // Repaint the menubar when modifiers change so that the shortcut underline
969- // is drawn or not
970- connect(KeyboardModifiersMonitor::instance(), SIGNAL(keyboardModifiersChanged(Qt::KeyboardModifiers)),
971- m_menuBar, SLOT(update()));
972-}
973-
974-void MenuBarWidget::slotActiveWindowChanged(BamfWindow* /*former*/, BamfWindow* current)
975-{
976- if (current) {
977- updateActiveWinId(current);
978- }
979-}
980-
981-void MenuBarWidget::slotViewOpened()
982-{
983- BamfWindow* active = BamfMatcher::get_default().active_window();
984- if (active != NULL) {
985- if (active->xid() != m_activeWinId) {
986- /* This shouldn’t be needed as BAMF should have emitted the
987- ActiveWindowChanged signal, but it sometimes doesn’t (e.g. when
988- LibreOffice startcenter starts automatically maximized). */
989- updateActiveWinId(active);
990- }
991- }
992-}
993-
994-void MenuBarWidget::slotWindowRegistered(WId wid, const QString& service, const QDBusObjectPath& menuObjectPath)
995-{
996- MyDBusMenuImporter* importer = new MyDBusMenuImporter(service, menuObjectPath.path(), this);
997- delete m_importers.take(wid);
998- m_importers.insert(wid, importer);
999- connect(importer, SIGNAL(menuUpdated()), SLOT(slotMenuUpdated()));
1000- connect(importer, SIGNAL(actionActivationRequested(QAction*)), SLOT(slotActionActivationRequested(QAction*)));
1001- QMetaObject::invokeMethod(importer, "updateMenu", Qt::QueuedConnection);
1002-}
1003-
1004-void MenuBarWidget::slotWindowUnregistered(WId wid)
1005-{
1006- MyDBusMenuImporter* importer = m_importers.take(wid);
1007- if (importer) {
1008- importer->deleteLater();
1009- }
1010- if (wid == m_activeWinId) {
1011- m_activeWinId = 0;
1012- updateMenuBar();
1013- }
1014-}
1015-
1016-void MenuBarWidget::slotMenuUpdated()
1017-{
1018- DBusMenuImporter* importer = static_cast<DBusMenuImporter*>(sender());
1019-
1020- if (m_importers.value(m_activeWinId) == importer) {
1021- updateMenuBar();
1022- }
1023-}
1024-
1025-void MenuBarWidget::slotActionActivationRequested(QAction* action)
1026-{
1027- DBusMenuImporter* importer = static_cast<DBusMenuImporter*>(sender());
1028-
1029- if (m_importers.value(m_activeWinId) == importer) {
1030- m_menuBar->setActiveAction(action);
1031- }
1032-}
1033-
1034-QMenu* MenuBarWidget::menuForWinId(WId wid) const
1035-{
1036- MyDBusMenuImporter* importer = m_importers.value(wid);
1037- return importer ? importer->menu() : 0;
1038-}
1039-
1040-void MenuBarWidget::updateActiveWinId(BamfWindow* bamfWindow)
1041-{
1042- WId id = bamfWindow ? bamfWindow->xid() : 0;
1043- if (id == m_activeWinId) {
1044- return;
1045- }
1046- if (id == window()->winId()) {
1047- // Do not update id if the active window is the one hosting this applet
1048- return;
1049- }
1050- m_activeWinId = id;
1051- updateMenuBar();
1052-}
1053-
1054-void MenuBarWidget::updateMenuBar()
1055-{
1056- WId winId = m_activeWinId;
1057- QMenu* menu = menuForWinId(winId);
1058-
1059- if (!menu) {
1060- if (winId) {
1061- menu = m_windowMenu;
1062- } else {
1063- // No active window, show a desktop menubar
1064- // FIXME: Empty menu
1065- /*
1066- menu = mEmptyMenu;
1067- */
1068- }
1069- }
1070-
1071- m_menuBar->clear();
1072- // FIXME: Empty menu
1073- if (!menu) {
1074- return;
1075- }
1076- menu->installEventFilter(this);
1077- Q_FOREACH(QAction* action, menu->actions()) {
1078- if (action->isSeparator()) {
1079- continue;
1080- }
1081- m_menuBar->addAction(action);
1082- }
1083-}
1084-
1085-bool MenuBarWidget::eventFilter(QObject* object, QEvent* event)
1086-{
1087- switch (event->type()) {
1088- case QEvent::ActionAdded:
1089- case QEvent::ActionRemoved:
1090- case QEvent::ActionChanged:
1091- m_updateMenuBarTimer->start();
1092- break;
1093- default:
1094- break;
1095- }
1096- return false;
1097+, m_indicatorsManager(indicatorsManager)
1098+, m_layout(new QHBoxLayout(this))
1099+, m_isEmpty(true)
1100+, m_isOpened(false)
1101+{
1102+ m_layout->setMargin(0);
1103+ m_layout->setSpacing(0);
1104+ indicatorsManager->indicators()->on_object_added.connect(
1105+ sigc::mem_fun(this, &MenuBarWidget::onObjectAdded)
1106+ );
1107+ indicatorsManager->indicators()->on_entry_activated.connect(
1108+ sigc::mem_fun(this, &MenuBarWidget::onEntryActivated)
1109+ );
1110+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
1111+ m_layout->addStretch();
1112 }
1113
1114 bool MenuBarWidget::isEmpty() const
1115 {
1116- return m_menuBar->actions().isEmpty();
1117+ return m_isEmpty;
1118 }
1119
1120 bool MenuBarWidget::isOpened() const
1121 {
1122- return m_menuBar->activeAction();
1123-}
1124-
1125-// MenuBarClosedHelper ----------------------------------------
1126-MenuBarClosedHelper::MenuBarClosedHelper(MenuBarWidget* widget)
1127-: QObject(widget)
1128-, m_widget(widget)
1129-{
1130- widget->m_menuBar->installEventFilter(this);
1131-}
1132-
1133-bool MenuBarClosedHelper::eventFilter(QObject* object, QEvent* event)
1134-{
1135- if (object == m_widget->m_menuBar) {
1136- switch (event->type()) {
1137- case QEvent::ActionAdded:
1138- case QEvent::ActionRemoved:
1139- case QEvent::ActionChanged:
1140- menuBarActionEvent(static_cast<QActionEvent*>(event));
1141- break;
1142- default:
1143- break;
1144- }
1145- } else {
1146- // Top-level menus
1147- if (event->type() == QEvent::Hide) {
1148- // menu hide themselves when the menubar is closed but also when
1149- // one goes from one menu to another. The way to know this is to
1150- // check the value of QMenuBar::activeAction(), but at this point
1151- // it has not been updated yet, so we check in a delayed method.
1152- QMetaObject::invokeMethod(this, "emitMenuBarClosed", Qt::QueuedConnection);
1153- }
1154- }
1155- return false;
1156-}
1157-
1158-void MenuBarClosedHelper::emitMenuBarClosed()
1159-{
1160- if (!m_widget->m_menuBar->activeAction()) {
1161- QMetaObject::invokeMethod(m_widget, "menuBarClosed");
1162- }
1163-}
1164-
1165-void MenuBarClosedHelper::menuBarActionEvent(QActionEvent* event)
1166-{
1167- QMenu* menu = event->action()->menu();
1168- if (menu) {
1169- // Install/remove event filters on top level menus so that know when
1170- // they hide themselves and can emit menuBarClosed()
1171- switch (event->type()) {
1172- case QEvent::ActionAdded:
1173- case QEvent::ActionChanged:
1174- menu->installEventFilter(this);
1175- break;
1176- case QEvent::ActionRemoved:
1177- menu->removeEventFilter(this);
1178- break;
1179- default:
1180- break;
1181- }
1182- }
1183-
1184- // Emit isEmptyChanged() if necessary
1185- QList<QAction*> actions = m_widget->m_menuBar->actions();
1186- if (event->type() == QEvent::ActionAdded && actions.count() == 1) {
1187- QMetaObject::invokeMethod(m_widget, "isEmptyChanged");
1188- } else if (event->type() == QEvent::ActionRemoved && actions.isEmpty()) {
1189- QMetaObject::invokeMethod(m_widget, "isEmptyChanged");
1190+ return m_isOpened;
1191+}
1192+
1193+void MenuBarWidget::onObjectAdded(const unity::indicator::Indicator::Ptr& indicator)
1194+{
1195+ QString name = QString::fromStdString(indicator->name());
1196+ if (name == "libappmenu.so") {
1197+ indicator->on_entry_added.connect(sigc::mem_fun(this, &MenuBarWidget::onEntryAdded));
1198+ }
1199+}
1200+
1201+void MenuBarWidget::onEntryAdded(const unity::indicator::Entry::Ptr& entry)
1202+{
1203+ IndicatorEntryWidget* widget = new IndicatorEntryWidget(entry);
1204+ widget->setPadding(MENU_ITEM_PADDING);
1205+ connect(widget, SIGNAL(isEmptyChanged()), SLOT(updateIsEmpty()));
1206+
1207+ m_widgetList.append(widget);
1208+ m_indicatorsManager->addIndicatorEntryWidget(widget);
1209+
1210+ // Insert *before* stretch
1211+ m_layout->insertWidget(m_layout->count() - 1, widget);
1212+}
1213+
1214+void MenuBarWidget::updateIsEmpty()
1215+{
1216+ bool empty = true;
1217+ Q_FOREACH(IndicatorEntryWidget* widget, m_widgetList) {
1218+ if (!widget->isEmpty()) {
1219+ empty = false;
1220+ break;
1221+ }
1222+ }
1223+ if (m_isEmpty != empty) {
1224+ m_isEmpty = empty;
1225+ isEmptyChanged();
1226+ }
1227+}
1228+
1229+void MenuBarWidget::onEntryActivated(const std::string& id)
1230+{
1231+ bool isOpened = false;
1232+ if (!id.empty()) {
1233+ // We only cares about menubar entries
1234+ Q_FOREACH(IndicatorEntryWidget* widget, m_widgetList) {
1235+ if (widget->entry()->id() == id) {
1236+ isOpened = true;
1237+ break;
1238+ }
1239+ }
1240+ }
1241+ if (m_isOpened != isOpened) {
1242+ m_isOpened = isOpened;
1243+ isOpenedChanged();
1244 }
1245 }
1246
1247
1248=== modified file 'panel/applets/appname/menubarwidget.h'
1249--- panel/applets/appname/menubarwidget.h 2011-07-26 09:36:41 +0000
1250+++ panel/applets/appname/menubarwidget.h 2011-07-27 15:26:24 +0000
1251@@ -23,86 +23,45 @@
1252 #define MENUBARWIDGET_H
1253
1254 // Qt
1255-#include <QHash>
1256 #include <QWidget>
1257
1258-class BamfWindow;
1259-
1260-class QActionEvent;
1261-class QDBusObjectPath;
1262-class QMenu;
1263-class QMenuBar;
1264-class QTimer;
1265-
1266-class MyDBusMenuImporter;
1267-class Registrar;
1268-
1269-typedef QHash<WId, MyDBusMenuImporter*> ImporterForWId;
1270-
1271-class MenuBarWidget;
1272-
1273-/**
1274- * An helper class which monitors the menubar and emits MenuBarWidget::menuBarClosed()
1275- * when necessary
1276- */
1277-class MenuBarClosedHelper : public QObject
1278-{
1279-Q_OBJECT
1280-public:
1281- MenuBarClosedHelper(MenuBarWidget*);
1282-
1283-protected:
1284- bool eventFilter(QObject*, QEvent*); //reimp
1285-
1286-private Q_SLOTS:
1287- void emitMenuBarClosed();
1288-
1289-private:
1290- MenuBarWidget* m_widget;
1291- void menuBarActionEvent(QActionEvent*);
1292-};
1293-
1294-class MenuBarWidget : public QWidget
1295-{
1296-Q_OBJECT
1297-public:
1298- MenuBarWidget(QMenu* windowMenu, QWidget* parent = 0);
1299+// libunity-core
1300+#include <UnityCore/Indicator.h>
1301+#include <UnityCore/IndicatorEntry.h>
1302+
1303+class QHBoxLayout;
1304+
1305+class IndicatorEntryWidget;
1306+class IndicatorsManager;
1307+
1308+class MenuBarWidget : public QWidget, public sigc::trackable
1309+{
1310+Q_OBJECT
1311+public:
1312+ MenuBarWidget(IndicatorsManager*, QWidget* parent = 0);
1313
1314 bool isEmpty() const;
1315 bool isOpened() const;
1316
1317 Q_SIGNALS:
1318- void menuBarClosed();
1319+ void isOpenedChanged();
1320 void isEmptyChanged();
1321
1322-protected:
1323- bool eventFilter(QObject*, QEvent*); // reimp
1324-
1325 private Q_SLOTS:
1326- void slotActiveWindowChanged(BamfWindow*, BamfWindow*);
1327- void slotViewOpened();
1328- void slotWindowRegistered(WId, const QString& service, const QDBusObjectPath& menuObjectPath);
1329- void slotWindowUnregistered(WId);
1330- void slotMenuUpdated();
1331- void slotActionActivationRequested(QAction* action);
1332- void updateMenuBar();
1333+ void updateIsEmpty();
1334
1335 private:
1336 Q_DISABLE_COPY(MenuBarWidget)
1337
1338- QMenuBar* m_menuBar;
1339- Registrar* m_registrar;
1340- ImporterForWId m_importers;
1341- WId m_activeWinId;
1342- QMenu* m_windowMenu;
1343- QTimer* m_updateMenuBarTimer;
1344-
1345- void setupRegistrar();
1346- void setupMenuBar();
1347- QMenu* menuForWinId(WId) const;
1348- void updateActiveWinId(BamfWindow*);
1349-
1350- friend class MenuBarClosedHelper;
1351+ IndicatorsManager* m_indicatorsManager;
1352+ QHBoxLayout* m_layout;
1353+ bool m_isEmpty;
1354+ bool m_isOpened;
1355+ QList<IndicatorEntryWidget*> m_widgetList;
1356+
1357+ void onObjectAdded(const unity::indicator::Indicator::Ptr&);
1358+ void onEntryAdded(const unity::indicator::Entry::Ptr&);
1359+ void onEntryActivated(const std::string&);
1360 };
1361
1362 #endif /* MENUBARWIDGET_H */
1363
1364=== removed file 'panel/applets/appname/registrar.cpp'
1365--- panel/applets/appname/registrar.cpp 2011-04-04 16:46:14 +0000
1366+++ panel/applets/appname/registrar.cpp 1970-01-01 00:00:00 +0000
1367@@ -1,138 +0,0 @@
1368-/*
1369- * Plasma applet to display application window menus
1370- *
1371- * Copyright 2010 Canonical Ltd.
1372- *
1373- * Authors:
1374- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
1375- *
1376- * This program is free software; you can redistribute it and/or modify
1377- * it under the terms of the GNU General Public License as published by
1378- * the Free Software Foundation; version 3.
1379- *
1380- * This program is distributed in the hope that it will be useful,
1381- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1382- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1383- * GNU General Public License for more details.
1384- *
1385- * You should have received a copy of the GNU General Public License
1386- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1387- */
1388-
1389-// Self
1390-#include "registrar.h"
1391-
1392-// Qt
1393-#include <QApplication>
1394-#include <QDBusMessage>
1395-#include <QDBusObjectPath>
1396-#include <QDBusServiceWatcher>
1397-
1398-// Local
1399-#include "registraradaptor.h"
1400-
1401-static const char* DBUS_SERVICE = "com.canonical.AppMenu.Registrar";
1402-static const char* DBUS_OBJECT_PATH = "/com/canonical/AppMenu/Registrar";
1403-
1404-// Marshalling code for MenuInfo
1405-QDBusArgument& operator<<(QDBusArgument& argument, const MenuInfo& info)
1406-{
1407- argument.beginStructure();
1408- argument << info.winId << info.service << info.path;
1409- argument.endStructure();
1410- return argument;
1411-}
1412-
1413-const QDBusArgument& operator>>(const QDBusArgument& argument, MenuInfo& info)
1414-{
1415- argument.beginStructure();
1416- argument >> info.winId >> info.service >> info.path;
1417- argument.endStructure();
1418- return argument;
1419-}
1420-
1421-Registrar::Registrar()
1422-: QObject()
1423-, mServiceWatcher(new QDBusServiceWatcher(this))
1424-{
1425- qDBusRegisterMetaType<MenuInfo>();
1426- qDBusRegisterMetaType<MenuInfoList>();
1427- mServiceWatcher->setConnection(QDBusConnection::sessionBus());
1428- mServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
1429- connect(mServiceWatcher, SIGNAL(serviceUnregistered(const QString&)), SLOT(slotServiceUnregistered(const QString&)));
1430-}
1431-
1432-Registrar::~Registrar()
1433-{
1434- QDBusConnection::sessionBus().unregisterService(mService);
1435-}
1436-
1437-Registrar* Registrar::instance()
1438-{
1439- static Registrar singleton;
1440- return &singleton;
1441-}
1442-
1443-bool Registrar::connectToBus(const QString& _service, const QString& _path)
1444-{
1445- mService = _service.isEmpty() ? DBUS_SERVICE : _service;
1446- QString path = _path.isEmpty() ? DBUS_OBJECT_PATH : _path;
1447-
1448- bool ok = QDBusConnection::sessionBus().registerService(mService);
1449- if (!ok) {
1450- return false;
1451- }
1452- new RegistrarAdaptor(this);
1453- QDBusConnection::sessionBus().registerObject(path, this);
1454-
1455- return true;
1456-}
1457-
1458-void Registrar::RegisterWindow(WId wid, const QDBusObjectPath& menuObjectPath)
1459-{
1460- MenuInfo info;
1461- info.winId = wid;
1462- info.service = message().service();
1463- info.path = menuObjectPath;
1464- mDb.insert(wid, info);
1465- mServiceWatcher->addWatchedService(info.service);
1466- WindowRegistered(wid, info.service, info.path);
1467-}
1468-
1469-void Registrar::UnregisterWindow(WId wid)
1470-{
1471- mDb.remove(wid);
1472- WindowUnregistered(wid);
1473-}
1474-
1475-QString Registrar::GetMenuForWindow(WId winId, QDBusObjectPath& menuObjectPath)
1476-{
1477- MenuInfo info = mDb.value(winId);
1478- QString service = info.service;
1479- menuObjectPath = info.path;
1480- return service;
1481-}
1482-
1483-MenuInfoList Registrar::GetMenus()
1484-{
1485- return mDb.values();
1486-}
1487-
1488-void Registrar::slotServiceUnregistered(const QString& service)
1489-{
1490- MenuInfoDb::Iterator
1491- it = mDb.begin(),
1492- end = mDb.end();
1493- for (;it != end;) {
1494- if (it.value().service == service) {
1495- WId id = it.key();
1496- it = mDb.erase(it);
1497- WindowUnregistered(id);
1498- } else {
1499- ++it;
1500- }
1501- }
1502- mServiceWatcher->removeWatchedService(service);
1503-}
1504-
1505-#include "registrar.moc"
1506
1507=== removed file 'panel/applets/appname/registrar.h'
1508--- panel/applets/appname/registrar.h 2011-04-04 16:47:28 +0000
1509+++ panel/applets/appname/registrar.h 1970-01-01 00:00:00 +0000
1510@@ -1,85 +0,0 @@
1511-/*
1512- * Plasma applet to display application window menus
1513- *
1514- * Copyright 2010 Canonical Ltd.
1515- *
1516- * Authors:
1517- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
1518- *
1519- * This program is free software; you can redistribute it and/or modify
1520- * it under the terms of the GNU General Public License as published by
1521- * the Free Software Foundation; version 3.
1522- *
1523- * This program is distributed in the hope that it will be useful,
1524- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1525- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1526- * GNU General Public License for more details.
1527- *
1528- * You should have received a copy of the GNU General Public License
1529- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1530- */
1531-
1532-#ifndef REGISTRAR_H
1533-#define REGISTRAR_H
1534-
1535-// Qt
1536-#include <QDBusContext>
1537-#include <QDBusObjectPath>
1538-#include <QObject>
1539-#include <QWidget> // For WId
1540-
1541-class QDBusObjectPath;
1542-class QDBusServiceWatcher;
1543-class QMenu;
1544-
1545-struct MenuInfo
1546-{
1547- MenuInfo()
1548- : winId(0)
1549- , path("/")
1550- {}
1551-
1552- uint winId;
1553- QString service;
1554- QDBusObjectPath path;
1555-};
1556-Q_DECLARE_METATYPE(MenuInfo)
1557-
1558-typedef QList<MenuInfo> MenuInfoList;
1559-Q_DECLARE_METATYPE(MenuInfoList)
1560-
1561-class Registrar : public QObject, protected QDBusContext
1562-{
1563- Q_OBJECT
1564-
1565-public:
1566- /* The registrar is a singleton shared between all instances of MenuBarWidget. */
1567- static Registrar* instance();
1568-
1569- bool connectToBus(const QString& service = QString(), const QString& objectPath = QString());
1570-
1571-Q_SIGNALS:
1572- void WindowRegistered(WId wid, const QString& service, const QDBusObjectPath&);
1573- void WindowUnregistered(WId wid);
1574-
1575-public Q_SLOTS:
1576- Q_NOREPLY void RegisterWindow(WId wid, const QDBusObjectPath& menuObjectPath);
1577- Q_NOREPLY void UnregisterWindow(WId wid);
1578- QString GetMenuForWindow(WId wid, QDBusObjectPath& menuObjectPath);
1579- MenuInfoList GetMenus();
1580-
1581-private Q_SLOTS:
1582- void slotServiceUnregistered(const QString& service);
1583-
1584-private:
1585- Registrar();
1586- Q_DISABLE_COPY(Registrar)
1587- ~Registrar();
1588-
1589- QDBusServiceWatcher* mServiceWatcher;
1590- typedef QHash<WId, MenuInfo> MenuInfoDb;
1591- MenuInfoDb mDb;
1592- QString mService;
1593-};
1594-
1595-#endif /* REGISTRAR_H */
1596
1597=== added file 'panel/applets/common/fakecairo.h'
1598--- panel/applets/common/fakecairo.h 1970-01-01 00:00:00 +0000
1599+++ panel/applets/common/fakecairo.h 2011-07-27 15:26:24 +0000
1600@@ -0,0 +1,125 @@
1601+/*
1602+ * This file is part of unity-2d
1603+ *
1604+ * Copyright 2011 Canonical Ltd.
1605+ *
1606+ * Authors:
1607+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
1608+ *
1609+ * This program is free software; you can redistribute it and/or modify
1610+ * it under the terms of the GNU General Public License as published by
1611+ * the Free Software Foundation; version 3.
1612+ *
1613+ * This program is distributed in the hope that it will be useful,
1614+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1615+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1616+ * GNU General Public License for more details.
1617+ *
1618+ * You should have received a copy of the GNU General Public License
1619+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1620+ */
1621+#ifndef FAKECAIRO_H
1622+#define FAKECAIRO_H
1623+
1624+// NuxCore
1625+#include <NuxCore/Color.h>
1626+
1627+// Qt
1628+#include <QPainter>
1629+#include <QPainterPath>
1630+
1631+/*
1632+ * This module attempts to fake Cairo calls using QPainter, making it easier to
1633+ * port Cairo paint operations to Qt
1634+ */
1635+struct fcairo_t
1636+{
1637+ fcairo_t(QPainter* _painter)
1638+ : painter(_painter)
1639+ {
1640+ painter->save();
1641+ }
1642+
1643+ ~fcairo_t()
1644+ {
1645+ painter->restore();
1646+ }
1647+
1648+ QPainter* painter;
1649+ QPainterPath path;
1650+};
1651+
1652+inline void fcairo_arc(fcairo_t& cr, qreal xc, qreal yc, qreal radius, qreal angle1, qreal angle2)
1653+{
1654+ QRectF rect(xc - radius, yc - radius, radius * 2, radius * 2);
1655+
1656+ while (angle2 < angle1) {
1657+ angle2 += 2 * M_PI;
1658+ }
1659+
1660+ qreal start = (2. - angle1 / M_PI) * 180;
1661+ qreal stop = (2. - angle2 / M_PI) * 180;
1662+ cr.path.arcTo(rect, start, stop - start);
1663+}
1664+
1665+inline void fcairo_move_to(fcairo_t& cr, qreal x, qreal y)
1666+{
1667+ cr.path.moveTo(x, y);
1668+}
1669+
1670+inline void fcairo_line_to(fcairo_t& cr, qreal x, qreal y)
1671+{
1672+ cr.path.lineTo(x, y);
1673+}
1674+
1675+inline void fcairo_fill_preserve(fcairo_t& cr)
1676+{
1677+ cr.painter->fillPath(cr.path, cr.painter->brush());
1678+}
1679+
1680+inline void fcairo_stroke(fcairo_t& cr)
1681+{
1682+ QPen pen(cr.painter->brush().color(), 1);
1683+ cr.painter->strokePath(cr.path, pen);
1684+ cr.path = QPainterPath();
1685+}
1686+
1687+typedef QGradient fcairo_pattern_t;
1688+
1689+inline fcairo_pattern_t* fcairo_pattern_create_linear (qreal x1, qreal y1, qreal x2, qreal y2)
1690+{
1691+ return new QLinearGradient(x1, y1, x2, y2);
1692+}
1693+
1694+inline void fcairo_pattern_destroy(fcairo_pattern_t* pattern)
1695+{
1696+ delete pattern;
1697+}
1698+
1699+inline void fcairo_pattern_add_color_stop_rgba(fcairo_pattern_t* pattern, qreal offset, qreal r, qreal g, qreal b, qreal a)
1700+{
1701+ pattern->setColorAt(offset, QColor::fromRgbF(r, g, b, a));
1702+}
1703+
1704+inline void fcairo_set_source(fcairo_t& cr, fcairo_pattern_t* pattern)
1705+{
1706+ cr.painter->setPen(Qt::NoPen);
1707+ cr.painter->setBrush(*pattern);
1708+}
1709+
1710+inline void fcairo_set_source_rgb(fcairo_t& cr, qreal r, qreal g, qreal b)
1711+{
1712+ cr.painter->setBrush(QColor::fromRgbF(r, g, b));
1713+}
1714+
1715+inline nux::color::Color nuxColorFromQColor(const QColor& qColor)
1716+{
1717+ nux::color::Color color;
1718+ color.red = qColor.redF();
1719+ color.green = qColor.greenF();
1720+ color.blue = qColor.blueF();
1721+ color.alpha = qColor.alphaF();
1722+ return color;
1723+}
1724+
1725+#endif /* FAKECAIRO_H */
1726
1727=== added file 'panel/applets/common/indicatorentrywidget.cpp'
1728--- panel/applets/common/indicatorentrywidget.cpp 1970-01-01 00:00:00 +0000
1729+++ panel/applets/common/indicatorentrywidget.cpp 2011-07-27 15:26:24 +0000
1730@@ -0,0 +1,388 @@
1731+/*
1732+ * This file is part of unity-2d
1733+ *
1734+ * Copyright 2011 Canonical Ltd.
1735+ *
1736+ * Authors:
1737+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
1738+ *
1739+ * This program is free software; you can redistribute it and/or modify
1740+ * it under the terms of the GNU General Public License as published by
1741+ * the Free Software Foundation; version 3.
1742+ *
1743+ * This program is distributed in the hope that it will be useful,
1744+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1745+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1746+ * GNU General Public License for more details.
1747+ *
1748+ * You should have received a copy of the GNU General Public License
1749+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1750+ */
1751+// Self
1752+#include "indicatorentrywidget.h"
1753+
1754+// Local
1755+#include <debug_p.h>
1756+#include <fakecairo.h>
1757+#include <panelstyle.h>
1758+
1759+// Qt
1760+#include <QIcon>
1761+#include <QPainter>
1762+#include <QWheelEvent>
1763+
1764+// GTK
1765+#include <gtk/gtk.h>
1766+
1767+// libc
1768+#include <time.h>
1769+
1770+static const int SPACING = 3;
1771+static const int PADDING = 3;
1772+
1773+using namespace unity::indicator;
1774+
1775+// Copied from libdbusmenu-qt
1776+static QString swapMnemonicChar(const QString &in, const char src, const char dst)
1777+{
1778+ QString out;
1779+ bool mnemonicFound = false;
1780+
1781+ for (int pos = 0; pos < in.length(); ) {
1782+ QChar ch = in[pos];
1783+ if (ch == src) {
1784+ if (pos == in.length() - 1) {
1785+ // 'src' at the end of string, skip it
1786+ ++pos;
1787+ } else {
1788+ if (in[pos + 1] == src) {
1789+ // A real 'src'
1790+ out += src;
1791+ pos += 2;
1792+ } else if (!mnemonicFound) {
1793+ // We found the mnemonic
1794+ mnemonicFound = true;
1795+ out += dst;
1796+ ++pos;
1797+ } else {
1798+ // We already have a mnemonic, just skip the char
1799+ ++pos;
1800+ }
1801+ }
1802+ } else if (ch == dst) {
1803+ // Escape 'dst'
1804+ out += dst;
1805+ out += dst;
1806+ ++pos;
1807+ } else {
1808+ out += ch;
1809+ ++pos;
1810+ }
1811+ }
1812+
1813+ return out;
1814+}
1815+
1816+IndicatorEntryWidget::IndicatorEntryWidget(const Entry::Ptr& entry)
1817+: m_entry(entry)
1818+, m_padding(PADDING)
1819+, m_hasIcon(false)
1820+, m_hasLabel(false)
1821+{
1822+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1823+ m_entry->updated.connect(sigc::mem_fun(this, &IndicatorEntryWidget::updatePix));
1824+ updatePix();
1825+}
1826+
1827+QSize IndicatorEntryWidget::minimumSizeHint() const
1828+{
1829+ return sizeHint();
1830+}
1831+
1832+QSize IndicatorEntryWidget::sizeHint() const
1833+{
1834+ return m_pix.size();
1835+}
1836+
1837+void IndicatorEntryWidget::paintEvent(QPaintEvent*)
1838+{
1839+ if (!m_pix.isNull()) {
1840+ QPainter painter(this);
1841+ if (m_entry->active()) {
1842+ paintActiveBackground(&painter);
1843+ }
1844+ painter.drawPixmap(0, 0, m_pix);
1845+ }
1846+}
1847+
1848+
1849+void IndicatorEntryWidget::paintActiveBackground(QPainter* painter)
1850+{
1851+ // This code should be kept in sync with the draw_menu_bg() function from
1852+ // plugins/unityshell/src/PanelIndicatorObjectEntryView.cpp
1853+ int radius = 4;
1854+ double x = 0;
1855+ double y = 0;
1856+ double xos = 0.5;
1857+ double yos = 0.5;
1858+ /* FIXME */
1859+ double mpi = 3.14159265358979323846;
1860+
1861+ PanelStyle* style = PanelStyle::instance();
1862+ nux::color::Color bgtop = nuxColorFromQColor(style->backgroundTopColor());
1863+ nux::color::Color bgbot = nuxColorFromQColor(style->backgroundBottomColor());
1864+ nux::color::Color line = nuxColorFromQColor(style->lineColor());
1865+
1866+ painter->setRenderHint(QPainter::Antialiasing);
1867+
1868+ fcairo_t cr(painter);
1869+
1870+ fcairo_move_to (cr, x+xos+radius, y+yos);
1871+ fcairo_arc (cr, x+xos+width()-xos*2-radius, y+yos+radius, radius, mpi*1.5, mpi*2);
1872+ fcairo_line_to (cr, x+xos+width()-xos*2, y+yos+height()-yos*2+2);
1873+ fcairo_line_to (cr, x+xos, y+yos+height()-yos*2+2);
1874+ fcairo_arc (cr, x+xos+radius, y+yos+radius, radius, mpi, mpi*1.5);
1875+
1876+ fcairo_pattern_t * pat = fcairo_pattern_create_linear (x+xos, y, x+xos, y+height()-yos*2+2);
1877+ fcairo_pattern_add_color_stop_rgba (pat, 0.0,
1878+ bgtop.red,
1879+ bgtop.green,
1880+ bgtop.blue,
1881+ 1.0f - bgbot.red);
1882+ fcairo_pattern_add_color_stop_rgba (pat, 1.0,
1883+ bgbot.red,
1884+ bgbot.green,
1885+ bgbot.blue,
1886+ 1.0f - bgtop.red);
1887+ fcairo_set_source (cr, pat);
1888+ fcairo_fill_preserve (cr);
1889+ fcairo_pattern_destroy (pat);
1890+
1891+ /*
1892+ pat = fcairo_pattern_create_linear (x+xos, y, x+xos, y+height()-yos*2+2);
1893+ fcairo_pattern_add_color_stop_rgba (pat, 0.0,
1894+ line.red,
1895+ line.green,
1896+ line.blue,
1897+ 1.0f);
1898+ fcairo_pattern_add_color_stop_rgba (pat, 1.0,
1899+ line.red,
1900+ line.green,
1901+ line.blue,
1902+ 1.0f);
1903+ fcairo_set_source (cr, pat);
1904+ */
1905+ fcairo_set_source_rgb (cr, line.red, line.green, line.blue);
1906+ fcairo_stroke (cr);
1907+ //fcairo_pattern_destroy (pat);
1908+
1909+ xos++;
1910+ yos++;
1911+
1912+ /* enlarging the area to not draw the lightborder at bottom, ugly trick :P */
1913+ fcairo_move_to (cr, x+radius+xos, y+yos);
1914+ fcairo_arc (cr, x+xos+width()-xos*2-radius, y+yos+radius, radius, mpi*1.5, mpi*2);
1915+ fcairo_line_to (cr, x+xos+width()-xos*2, y+yos+height()-yos*2+3);
1916+ fcairo_line_to (cr, x+xos, y+yos+height()-yos*2+3);
1917+ fcairo_arc (cr, x+xos+radius, y+yos+radius, radius, mpi, mpi*1.5);
1918+
1919+ /*
1920+ pat = fcairo_pattern_create_linear (x+xos, y, x+xos, y+height()-yos*2+3);
1921+ fcairo_pattern_add_color_stop_rgba (pat, 0.0,
1922+ bgbot.red,
1923+ bgbot.green,
1924+ bgbot.blue,
1925+ 1.0f);
1926+ fcairo_pattern_add_color_stop_rgba (pat, 1.0,
1927+ bgbot.red,
1928+ bgbot.green,
1929+ bgbot.blue,
1930+ 1.0f);
1931+ fcairo_set_source (cr, pat);
1932+ */
1933+ fcairo_set_source_rgb (cr, bgbot.red, bgbot.green, bgbot.blue);
1934+ fcairo_stroke (cr);
1935+ //fcairo_pattern_destroy (pat);
1936+}
1937+
1938+void IndicatorEntryWidget::updatePix()
1939+{
1940+ bool oldIsEmpty = isEmpty();
1941+
1942+ int width = m_padding;
1943+ int iconX = m_padding;
1944+ int labelX = 0;
1945+
1946+ // Compute width, labelX and update m_has{Icon,Label}
1947+ QPixmap iconPix;
1948+ if (m_entry->image_visible()) {
1949+ iconPix = decodeIcon();
1950+ m_hasIcon = !iconPix.isNull();
1951+ } else {
1952+ m_hasIcon = false;
1953+ }
1954+ if (m_hasIcon) {
1955+ width += iconPix.width();
1956+ }
1957+
1958+ QString label = QString::fromUtf8(m_entry->label().c_str());
1959+ label = swapMnemonicChar(label, '_', '&');
1960+ m_hasLabel = !label.isEmpty() && m_entry->label_visible();
1961+ if (m_hasLabel) {
1962+ if (m_hasIcon) {
1963+ width += SPACING;
1964+ }
1965+ labelX = width;
1966+ QString visibleLabel = label;
1967+ visibleLabel.remove('&');
1968+ width += fontMetrics().width(visibleLabel);
1969+ }
1970+
1971+ width += m_padding;
1972+
1973+ // Paint
1974+ QPixmap oldPix = m_pix;
1975+ if (!m_hasIcon && !m_hasLabel) {
1976+ m_pix = QPixmap();
1977+ } else {
1978+ m_pix = QPixmap(width, 24);
1979+ m_pix.fill(Qt::transparent);
1980+ QPainter painter(&m_pix);
1981+ painter.initFrom(this);
1982+ if (m_hasIcon) {
1983+ bool disabled = !m_entry->image_sensitive();
1984+ if (disabled) {
1985+ painter.setOpacity(0.5);
1986+ }
1987+ painter.drawPixmap(iconX, 0, iconPix);
1988+ if (disabled) {
1989+ painter.setOpacity(1);
1990+ }
1991+ }
1992+ if (m_hasLabel) {
1993+ PanelStyle* style = PanelStyle::instance();
1994+
1995+ int flags = Qt::AlignLeft | Qt::AlignVCenter;
1996+ flags |= m_entry->show_now() ? Qt::TextShowMnemonic : Qt::TextHideMnemonic;
1997+
1998+ // Shadow
1999+ QColor color = style->textShadowColor();
2000+ color.setAlphaF(1. - color.redF());
2001+ painter.setPen(color);
2002+ painter.drawText(labelX, 1, width - labelX, m_pix.height(), flags, label);
2003+
2004+ // Text
2005+ color = style->textColor();
2006+ color.setAlphaF(m_entry->label_sensitive() ? 1. : .5);
2007+ painter.setPen(color);
2008+ painter.drawText(labelX, 0, width - labelX, m_pix.height(), flags, label);
2009+ }
2010+ }
2011+
2012+ // Notify others we changed, but only trigger a layout update if necessary
2013+ if (m_pix.size() == oldPix.size()) {
2014+ update();
2015+ } else {
2016+ updateGeometry();
2017+ }
2018+ bool newIsEmpty = isEmpty();
2019+ if (newIsEmpty != oldIsEmpty) {
2020+ // If we emit isEmptyChanged() directly it won't reach any connected
2021+ // slot. I assume this is because this method is called as a response
2022+ // to a sigc++ signal.
2023+ QMetaObject::invokeMethod(this, "isEmptyChanged", Qt::QueuedConnection);
2024+ }
2025+}
2026+
2027+QPixmap IndicatorEntryWidget::decodeIcon()
2028+{
2029+ QPixmap pix;
2030+
2031+ int type = m_entry->image_type();
2032+
2033+ if (type == 0) {
2034+ // No icon
2035+ } else if (type == GTK_IMAGE_PIXBUF) {
2036+ QByteArray data = QByteArray::fromBase64(m_entry->image_data().c_str());
2037+ QImage image;
2038+ bool ok = image.loadFromData(data);
2039+ if (ok) {
2040+ pix = QPixmap::fromImage(image);
2041+ } else {
2042+ UQ_WARNING << "Failed to decode image";
2043+ }
2044+ } else if (type == GTK_IMAGE_ICON_NAME) {
2045+ QString name = QString::fromStdString(m_entry->image_data());
2046+ QIcon icon = QIcon::fromTheme(name);
2047+ pix = icon.pixmap(24, 24);
2048+ } else if (type == GTK_IMAGE_GICON) {
2049+ UQ_WARNING << "FIXME: Implement support for GTK_IMAGE_GICON image type";
2050+ } else {
2051+ UQ_WARNING << "Unknown image type" << m_entry->image_type();
2052+ }
2053+ return pix;
2054+}
2055+
2056+void IndicatorEntryWidget::mousePressEvent(QMouseEvent*)
2057+{
2058+ UQ_RETURN_IF_FAIL(m_hasIcon || m_hasLabel);
2059+ showMenu(Qt::LeftButton);
2060+}
2061+
2062+void IndicatorEntryWidget::mouseReleaseEvent(QMouseEvent*)
2063+{
2064+ UQ_VAR(this);
2065+ update();
2066+}
2067+
2068+void IndicatorEntryWidget::wheelEvent(QWheelEvent* event)
2069+{
2070+ m_entry->Scroll(event->delta());
2071+}
2072+
2073+void IndicatorEntryWidget::showMenu(Qt::MouseButton qtButton)
2074+{
2075+ if (m_entry->active()) {
2076+ return;
2077+ }
2078+ int nuxButton = qtButton == Qt::NoButton ? 0 : 1;
2079+ QPoint pos = mapToGlobal(rect().bottomLeft());
2080+ m_entry->ShowMenu(pos.x(), pos.y(),
2081+ time(NULL),
2082+ nuxButton
2083+ );
2084+}
2085+
2086+void IndicatorEntryWidget::setPadding(int padding)
2087+{
2088+ if (m_padding != padding) {
2089+ m_padding = padding;
2090+ updatePix();
2091+ }
2092+}
2093+
2094+bool IndicatorEntryWidget::event(QEvent* ev)
2095+{
2096+ bool ret = QWidget::event(ev);
2097+ switch (ev->type()) {
2098+ case QEvent::FontChange:
2099+ case QEvent::PaletteChange:
2100+ updatePix();
2101+ break;
2102+ default:
2103+ break;
2104+ }
2105+ return ret;
2106+}
2107+
2108+bool IndicatorEntryWidget::isEmpty() const
2109+{
2110+ return !m_hasIcon && !m_hasLabel;
2111+}
2112+
2113+unity::indicator::Entry::Ptr IndicatorEntryWidget::entry() const
2114+{
2115+ return m_entry;
2116+}
2117+
2118+#include "indicatorentrywidget.moc"
2119
2120=== added file 'panel/applets/common/indicatorentrywidget.h'
2121--- panel/applets/common/indicatorentrywidget.h 1970-01-01 00:00:00 +0000
2122+++ panel/applets/common/indicatorentrywidget.h 2011-07-27 15:26:24 +0000
2123@@ -0,0 +1,81 @@
2124+/*
2125+ * This file is part of unity-2d
2126+ *
2127+ * Copyright 2011 Canonical Ltd.
2128+ *
2129+ * Authors:
2130+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2131+ *
2132+ * This program is free software; you can redistribute it and/or modify
2133+ * it under the terms of the GNU General Public License as published by
2134+ * the Free Software Foundation; version 3.
2135+ *
2136+ * This program is distributed in the hope that it will be useful,
2137+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2138+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2139+ * GNU General Public License for more details.
2140+ *
2141+ * You should have received a copy of the GNU General Public License
2142+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2143+ */
2144+#ifndef INDICATORENTRYWIDGET_H
2145+#define INDICATORENTRYWIDGET_H
2146+
2147+// Local
2148+
2149+// libunity-core
2150+#include <UnityCore/IndicatorEntry.h>
2151+
2152+// Qt
2153+#include <QWidget>
2154+
2155+class QPainter;
2156+
2157+class IndicatorEntryWidget : public QWidget, public sigc::trackable
2158+{
2159+Q_OBJECT
2160+public:
2161+ IndicatorEntryWidget(const unity::indicator::Entry::Ptr& entry);
2162+
2163+ QSize minimumSizeHint() const;
2164+ QSize sizeHint() const;
2165+
2166+ void setPadding(int);
2167+
2168+ bool isEmpty() const;
2169+
2170+ unity::indicator::Entry::Ptr entry() const;
2171+
2172+ /**
2173+ * Shows the menu.
2174+ *
2175+ * When this method is called because of a click, button
2176+ * must be set to Qt::LeftButton.
2177+ *
2178+ * When it is called because user previously clicked an indicator and moved the
2179+ * mouse to another indicator, button must be set to Qt::NoButton.
2180+ */
2181+ void showMenu(Qt::MouseButton button);
2182+
2183+Q_SIGNALS:
2184+ void isEmptyChanged();
2185+
2186+protected:
2187+ void paintEvent(QPaintEvent*);
2188+ void mousePressEvent(QMouseEvent*);
2189+ void mouseReleaseEvent(QMouseEvent*);
2190+ void wheelEvent(QWheelEvent*);
2191+ bool event(QEvent*);
2192+
2193+private:
2194+ unity::indicator::Entry::Ptr m_entry;
2195+ QPixmap m_pix;
2196+ int m_padding;
2197+ bool m_hasIcon;
2198+ bool m_hasLabel;
2199+ void updatePix();
2200+ QPixmap decodeIcon();
2201+ void paintActiveBackground(QPainter*);
2202+};
2203+
2204+#endif /* INDICATORENTRYWIDGET_H */
2205
2206=== added file 'panel/applets/common/indicatorsmanager.cpp'
2207--- panel/applets/common/indicatorsmanager.cpp 1970-01-01 00:00:00 +0000
2208+++ panel/applets/common/indicatorsmanager.cpp 2011-07-27 15:26:24 +0000
2209@@ -0,0 +1,176 @@
2210+/*
2211+ * This file is part of unity-2d
2212+ *
2213+ * Copyright 2011 Canonical Ltd.
2214+ *
2215+ * Authors:
2216+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2217+ *
2218+ * This program is free software; you can redistribute it and/or modify
2219+ * it under the terms of the GNU General Public License as published by
2220+ * the Free Software Foundation; version 3.
2221+ *
2222+ * This program is distributed in the hope that it will be useful,
2223+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2224+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2225+ * GNU General Public License for more details.
2226+ *
2227+ * You should have received a copy of the GNU General Public License
2228+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2229+ */
2230+// Self
2231+#include "indicatorsmanager.h"
2232+
2233+// Local
2234+#include <debug_p.h>
2235+#include <indicatorentrywidget.h>
2236+
2237+// Qt
2238+#include <QApplication>
2239+#include <QTimer>
2240+#include <QX11Info>
2241+
2242+// X11
2243+#include <X11/Xlib.h>
2244+
2245+using namespace unity::indicator;
2246+
2247+IndicatorsManager::IndicatorsManager(QObject* parent)
2248+: QObject(parent)
2249+, m_indicators(new DBusIndicators)
2250+, m_geometrySyncTimer(new QTimer(this))
2251+{
2252+ m_geometrySyncTimer->setInterval(0);
2253+ m_geometrySyncTimer->setSingleShot(true);
2254+ connect(m_geometrySyncTimer, SIGNAL(timeout()), SLOT(syncGeometries()));
2255+
2256+ m_indicators->on_entry_show_menu.connect(
2257+ sigc::mem_fun(this, &IndicatorsManager::onEntryShowMenu)
2258+ );
2259+
2260+ m_indicators->on_menu_pointer_moved.connect(
2261+ sigc::mem_fun(this, &IndicatorsManager::onMenuPointerMoved)
2262+ );
2263+
2264+ m_indicators->on_entry_activate_request.connect(
2265+ sigc::mem_fun(this, &IndicatorsManager::onEntryActivateRequest)
2266+ );
2267+
2268+ m_indicators->on_synced.connect(
2269+ sigc::mem_fun(this, &IndicatorsManager::onSynced)
2270+ );
2271+}
2272+
2273+unity::indicator::DBusIndicators::Ptr IndicatorsManager::indicators() const
2274+{
2275+ return m_indicators;
2276+}
2277+
2278+void IndicatorsManager::onEntryShowMenu(const std::string& /*entryId*/, int posX, int posY, int /*timestamp*/, int /*button*/)
2279+{
2280+ // Copied from plugins/unityshell/src/PanelView.cpp, in OnEntryShowMenu()
2281+ // Without this code, menus cannot be shown from mousePressEvent() (but can
2282+ // be shown from mouseReleaseEvent())
2283+ /*
2284+ Neil explanation:
2285+ On button down, X automatically gives Qt a passive grab on the mouse this
2286+ means that, if the panel service tries to grab the pointer to show the menu
2287+ (gtk does this automatically), it fails and the menu can't show.
2288+ We connect to the on_entry_show_menu signal, which is emitted before
2289+ DBusIndicators does anything else, and just break the grab.
2290+ */
2291+ Display* display = QX11Info::display();
2292+ XUngrabPointer(display, CurrentTime);
2293+ XFlush(display);
2294+
2295+ XButtonEvent event = {
2296+ ButtonRelease,
2297+ 0,
2298+ False,
2299+ display,
2300+ 0,
2301+ 0,
2302+ 0,
2303+ CurrentTime,
2304+ posX, posY,
2305+ posX, posY,
2306+ 0,
2307+ Button1,
2308+ True
2309+ };
2310+ qApp->x11ProcessEvent(reinterpret_cast<XEvent*>(&event));
2311+}
2312+
2313+void IndicatorsManager::onMenuPointerMoved(int posX, int posY)
2314+{
2315+ QWidget* widget = QApplication::widgetAt(posX, posY);
2316+ IndicatorEntryWidget* entryWidget = qobject_cast<IndicatorEntryWidget*>(widget);
2317+ if (!entryWidget) {
2318+ return;
2319+ }
2320+ entryWidget->showMenu(Qt::NoButton);
2321+}
2322+
2323+void IndicatorsManager::onEntryActivateRequest(const std::string& entryId)
2324+{
2325+ if (entryId.empty()) {
2326+ return;
2327+ }
2328+ IndicatorEntryWidget* widget = 0;
2329+ Q_FOREACH(widget, m_widgetList) {
2330+ if (widget->entry()->id() == entryId) {
2331+ break;
2332+ }
2333+ }
2334+ if (!widget) {
2335+ UQ_WARNING << "Could not find a widget for IndicatorEntry with id" << QString::fromStdString(entryId);
2336+ return;
2337+ }
2338+ widget->showMenu(Qt::NoButton);
2339+}
2340+
2341+void IndicatorsManager::onSynced()
2342+{
2343+ QMetaObject::invokeMethod(m_geometrySyncTimer, "start", Qt::QueuedConnection);
2344+}
2345+
2346+void IndicatorsManager::addIndicatorEntryWidget(IndicatorEntryWidget* widget)
2347+{
2348+ m_widgetList.append(widget);
2349+ widget->installEventFilter(this);
2350+}
2351+
2352+bool IndicatorsManager::eventFilter(QObject*, QEvent* event)
2353+{
2354+ switch (event->type()) {
2355+ case QEvent::Show:
2356+ case QEvent::Hide:
2357+ case QEvent::Move:
2358+ case QEvent::Resize:
2359+ m_geometrySyncTimer->start();
2360+ break;
2361+ default:
2362+ break;
2363+ }
2364+ return false;
2365+}
2366+
2367+void IndicatorsManager::syncGeometries()
2368+{
2369+ EntryLocationMap locations;
2370+ Q_FOREACH(IndicatorEntryWidget* widget, m_widgetList) {
2371+ if (!widget->isVisible()) {
2372+ continue;
2373+ }
2374+ Entry::Ptr entry = widget->entry();
2375+ if (entry->IsUnused()) {
2376+ continue;
2377+ }
2378+ QPoint topLeft = widget->mapToGlobal(QPoint(0, 0));
2379+ nux::Rect rect(topLeft.x(), topLeft.y(), widget->width(), widget->height());
2380+ locations[widget->entry()->id()] = rect;
2381+ }
2382+ m_indicators->SyncGeometries("Panel", locations);
2383+}
2384+
2385+#include "indicatorsmanager.moc"
2386
2387=== added file 'panel/applets/common/indicatorsmanager.h'
2388--- panel/applets/common/indicatorsmanager.h 1970-01-01 00:00:00 +0000
2389+++ panel/applets/common/indicatorsmanager.h 2011-07-27 15:26:24 +0000
2390@@ -0,0 +1,70 @@
2391+/*
2392+ * This file is part of unity-2d
2393+ *
2394+ * Copyright 2011 Canonical Ltd.
2395+ *
2396+ * Authors:
2397+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2398+ *
2399+ * This program is free software; you can redistribute it and/or modify
2400+ * it under the terms of the GNU General Public License as published by
2401+ * the Free Software Foundation; version 3.
2402+ *
2403+ * This program is distributed in the hope that it will be useful,
2404+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2405+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2406+ * GNU General Public License for more details.
2407+ *
2408+ * You should have received a copy of the GNU General Public License
2409+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2410+ */
2411+#ifndef INDICATORSMANAGER_H
2412+#define INDICATORSMANAGER_H
2413+
2414+// Local
2415+
2416+// Qt
2417+#include <QMap>
2418+#include <QObject>
2419+
2420+// libunity-core
2421+#include <UnityCore/DBusIndicators.h>
2422+
2423+class QTimer;
2424+
2425+class IndicatorEntryWidget;
2426+
2427+/**
2428+ * Instantiates DBusIndicators and implement common behavior
2429+ */
2430+class IndicatorsManager : public QObject, public sigc::trackable
2431+{
2432+ Q_OBJECT
2433+public:
2434+ IndicatorsManager(QObject* parent);
2435+
2436+ unity::indicator::DBusIndicators::Ptr indicators() const;
2437+
2438+ void addIndicatorEntryWidget(IndicatorEntryWidget* widget);
2439+
2440+protected:
2441+ bool eventFilter(QObject*, QEvent*);
2442+
2443+private Q_SLOTS:
2444+ void syncGeometries();
2445+
2446+private:
2447+ Q_DISABLE_COPY(IndicatorsManager)
2448+ unity::indicator::DBusIndicators::Ptr m_indicators;
2449+ QTimer* m_geometrySyncTimer;
2450+
2451+ typedef QList<IndicatorEntryWidget*> IndicatorEntryWidgetList;
2452+ IndicatorEntryWidgetList m_widgetList;
2453+
2454+ void onSynced();
2455+ void onEntryShowMenu(const std::string&, int x, int y, int timestamp, int button);
2456+ void onMenuPointerMoved(int x, int y);
2457+ void onEntryActivateRequest(const std::string& entryId);
2458+};
2459+
2460+#endif /* INDICATORSMANAGER_H */
2461
2462=== added file 'panel/applets/common/indicatorwidget.cpp'
2463--- panel/applets/common/indicatorwidget.cpp 1970-01-01 00:00:00 +0000
2464+++ panel/applets/common/indicatorwidget.cpp 2011-07-27 15:26:24 +0000
2465@@ -0,0 +1,53 @@
2466+/*
2467+ * This file is part of unity-2d
2468+ *
2469+ * Copyright 2011 Canonical Ltd.
2470+ *
2471+ * Authors:
2472+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2473+ *
2474+ * This program is free software; you can redistribute it and/or modify
2475+ * it under the terms of the GNU General Public License as published by
2476+ * the Free Software Foundation; version 3.
2477+ *
2478+ * This program is distributed in the hope that it will be useful,
2479+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2480+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2481+ * GNU General Public License for more details.
2482+ *
2483+ * You should have received a copy of the GNU General Public License
2484+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2485+ */
2486+// Self
2487+#include "indicatorwidget.h"
2488+
2489+// Local
2490+#include <debug_p.h>
2491+#include <indicatorentrywidget.h>
2492+#include <indicatorsmanager.h>
2493+
2494+// Qt
2495+#include <QHBoxLayout>
2496+
2497+using namespace unity::indicator;
2498+
2499+IndicatorWidget::IndicatorWidget(const Indicator::Ptr& indicator, IndicatorsManager* manager)
2500+: m_layout(new QHBoxLayout(this))
2501+, m_indicatorsManager(manager)
2502+, m_indicator(indicator)
2503+{
2504+ m_layout->setMargin(0);
2505+ m_layout->setSpacing(0);
2506+
2507+ m_indicator->on_entry_added.connect(sigc::mem_fun(this, &IndicatorWidget::onEntryAdded));
2508+}
2509+
2510+void IndicatorWidget::onEntryAdded(const Entry::Ptr& entry)
2511+{
2512+ IndicatorEntryWidget* widget = new IndicatorEntryWidget(entry);
2513+ m_indicatorsManager->addIndicatorEntryWidget(widget);
2514+ m_layout->addWidget(widget);
2515+}
2516+
2517+
2518+#include "indicatorwidget.moc"
2519
2520=== added file 'panel/applets/common/indicatorwidget.h'
2521--- panel/applets/common/indicatorwidget.h 1970-01-01 00:00:00 +0000
2522+++ panel/applets/common/indicatorwidget.h 2011-07-27 15:26:24 +0000
2523@@ -0,0 +1,52 @@
2524+/*
2525+ * This file is part of unity-2d
2526+ *
2527+ * Copyright 2011 Canonical Ltd.
2528+ *
2529+ * Authors:
2530+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2531+ *
2532+ * This program is free software; you can redistribute it and/or modify
2533+ * it under the terms of the GNU General Public License as published by
2534+ * the Free Software Foundation; version 3.
2535+ *
2536+ * This program is distributed in the hope that it will be useful,
2537+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2538+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2539+ * GNU General Public License for more details.
2540+ *
2541+ * You should have received a copy of the GNU General Public License
2542+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2543+ */
2544+#ifndef INDICATORWIDGET_H
2545+#define INDICATORWIDGET_H
2546+
2547+// Local
2548+
2549+// libunity-core
2550+#include <UnityCore/Indicator.h>
2551+#include <UnityCore/IndicatorEntry.h>
2552+
2553+// Qt
2554+#include <QWidget>
2555+
2556+class QHBoxLayout;
2557+
2558+class IndicatorEntryWidget;
2559+class IndicatorsManager;
2560+
2561+class IndicatorWidget : public QWidget, public sigc::trackable
2562+{
2563+Q_OBJECT
2564+public:
2565+ IndicatorWidget(const unity::indicator::Indicator::Ptr& indicator, IndicatorsManager* manager);
2566+
2567+private:
2568+ QHBoxLayout* m_layout;
2569+ IndicatorsManager* m_indicatorsManager;
2570+ unity::indicator::Indicator::Ptr m_indicator;
2571+
2572+ void onEntryAdded(const unity::indicator::Entry::Ptr& entry);
2573+};
2574+
2575+#endif /* INDICATORWIDGET_H */
2576
2577=== added file 'panel/applets/common/panelstyle.cpp'
2578--- panel/applets/common/panelstyle.cpp 1970-01-01 00:00:00 +0000
2579+++ panel/applets/common/panelstyle.cpp 2011-07-27 15:26:24 +0000
2580@@ -0,0 +1,175 @@
2581+/*
2582+ * This file is part of unity-2d
2583+ *
2584+ * Copyright 2011 Canonical Ltd.
2585+ *
2586+ * Authors:
2587+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2588+ *
2589+ * This program is free software; you can redistribute it and/or modify
2590+ * it under the terms of the GNU General Public License as published by
2591+ * the Free Software Foundation; version 3.
2592+ *
2593+ * This program is distributed in the hope that it will be useful,
2594+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2595+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2596+ * GNU General Public License for more details.
2597+ *
2598+ * You should have received a copy of the GNU General Public License
2599+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2600+ */
2601+// Self
2602+#include "panelstyle.h"
2603+
2604+// libunity-2d
2605+#include <debug_p.h>
2606+#include <gconnector.h>
2607+#include <gscopedpointer.h>
2608+
2609+// Qt
2610+#include <QApplication>
2611+#include <QColor>
2612+#include <QFont>
2613+#include <QPalette>
2614+
2615+// GTK
2616+#include <gtk/gtk.h>
2617+#include <pango/pango.h>
2618+
2619+typedef void (*ColorGetter)(GtkStyleContext*, GtkStateFlags, GdkRGBA*);
2620+
2621+inline QColor colorFromContext(ColorGetter getter, GtkStyleContext* context, GtkStateFlags state)
2622+{
2623+ GdkRGBA color;
2624+ getter(context, state, &color);
2625+ return QColor::fromRgbF(color.red, color.green, color.blue, color.alpha);
2626+}
2627+
2628+class PanelStylePrivate
2629+{
2630+public:
2631+ PanelStyle* q;
2632+ GtkWidget* m_offScreenWindow;
2633+ GConnector m_gConnector;
2634+
2635+ QColor m_textColor;
2636+ QColor m_backgroundTopColor;
2637+ QColor m_backgroundBottomColor;
2638+ QColor m_textShadowColor;
2639+ QColor m_lineColor;
2640+ QFont m_font;
2641+
2642+ static void onThemeChanged(GObject*, GParamSpec*, gpointer data)
2643+ {
2644+ PanelStylePrivate* priv = reinterpret_cast<PanelStylePrivate*>(data);
2645+ priv->updatePalette();
2646+ }
2647+
2648+ static void onFontChanged(GObject*, GParamSpec*, gpointer data)
2649+ {
2650+ PanelStylePrivate* priv = reinterpret_cast<PanelStylePrivate*>(data);
2651+ priv->updateFont();
2652+ }
2653+
2654+ void updatePalette()
2655+ {
2656+ GtkStyleContext* context = gtk_widget_get_style_context(m_offScreenWindow);
2657+ UQ_RETURN_IF_FAIL(context);
2658+
2659+ m_textColor = colorFromContext(gtk_style_context_get_color, context, GTK_STATE_FLAG_NORMAL);
2660+ m_textShadowColor = colorFromContext(gtk_style_context_get_color, context, GTK_STATE_FLAG_SELECTED);
2661+ m_lineColor = colorFromContext(gtk_style_context_get_background_color, context, GTK_STATE_FLAG_NORMAL).darker(130);
2662+ m_backgroundTopColor = colorFromContext(gtk_style_context_get_background_color, context, GTK_STATE_FLAG_ACTIVE);
2663+ m_backgroundBottomColor = colorFromContext(gtk_style_context_get_background_color, context, GTK_STATE_FLAG_NORMAL);
2664+
2665+ QPalette pal;
2666+ pal.setColor(QPalette::Window, m_backgroundTopColor);
2667+ pal.setColor(QPalette::Button, m_backgroundTopColor);
2668+ pal.setColor(QPalette::Text, m_textColor);
2669+ pal.setColor(QPalette::WindowText, m_textColor);
2670+ pal.setColor(QPalette::ButtonText, m_textColor);
2671+ QApplication::setPalette(pal);
2672+ }
2673+
2674+ void updateFont()
2675+ {
2676+ gchar* fontName = 0;
2677+ g_object_get(gtk_settings_get_default(), "gtk-font-name", &fontName, NULL);
2678+ GScopedPointer<PangoFontDescription, pango_font_description_free> fontDescription(
2679+ pango_font_description_from_string(fontName)
2680+ );
2681+ g_free(fontName);
2682+
2683+ int size = pango_font_description_get_size(fontDescription.data());
2684+
2685+ m_font = QFont(
2686+ pango_font_description_get_family(fontDescription.data()),
2687+ size / PANGO_SCALE
2688+ );
2689+
2690+ QApplication::setFont(m_font);
2691+ }
2692+};
2693+
2694+PanelStyle::PanelStyle(QObject* parent)
2695+: d(new PanelStylePrivate)
2696+{
2697+ d->q = this;
2698+ d->m_offScreenWindow = gtk_offscreen_window_new();
2699+ gtk_widget_set_name(d->m_offScreenWindow, "UnityPanelWidget");
2700+ gtk_widget_set_size_request(d->m_offScreenWindow, 100, 24);
2701+ gtk_style_context_add_class(gtk_widget_get_style_context(d->m_offScreenWindow), "menubar");
2702+ gtk_widget_show_all(d->m_offScreenWindow);
2703+
2704+ d->m_gConnector.connect(gtk_settings_get_default(), "notify::gtk-theme-name",
2705+ G_CALLBACK(PanelStylePrivate::onThemeChanged), d);
2706+ d->m_gConnector.connect(gtk_settings_get_default(), "notify::gtk-font-name",
2707+ G_CALLBACK(PanelStylePrivate::onFontChanged), d);
2708+
2709+ d->updatePalette();
2710+ d->updateFont();
2711+}
2712+
2713+PanelStyle::~PanelStyle()
2714+{
2715+ gtk_widget_destroy(d->m_offScreenWindow);
2716+ delete d;
2717+}
2718+
2719+PanelStyle* PanelStyle::instance()
2720+{
2721+ static PanelStyle style;
2722+ return &style;
2723+}
2724+
2725+QColor PanelStyle::textColor() const
2726+{
2727+ return d->m_textColor;
2728+}
2729+
2730+QColor PanelStyle::backgroundTopColor() const
2731+{
2732+ return d->m_backgroundTopColor;
2733+}
2734+
2735+QColor PanelStyle::backgroundBottomColor() const
2736+{
2737+ return d->m_backgroundBottomColor;
2738+}
2739+
2740+QColor PanelStyle::textShadowColor() const
2741+{
2742+ return d->m_textShadowColor;
2743+}
2744+
2745+QColor PanelStyle::lineColor() const
2746+{
2747+ return d->m_lineColor;
2748+}
2749+
2750+QFont PanelStyle::font() const
2751+{
2752+ return d->m_font;
2753+}
2754+
2755+#include "panelstyle.moc"
2756
2757=== added file 'panel/applets/common/panelstyle.h'
2758--- panel/applets/common/panelstyle.h 1970-01-01 00:00:00 +0000
2759+++ panel/applets/common/panelstyle.h 2011-07-27 15:26:24 +0000
2760@@ -0,0 +1,59 @@
2761+/*
2762+ * This file is part of unity-2d
2763+ *
2764+ * Copyright 2011 Canonical Ltd.
2765+ *
2766+ * Authors:
2767+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2768+ *
2769+ * This program is free software; you can redistribute it and/or modify
2770+ * it under the terms of the GNU General Public License as published by
2771+ * the Free Software Foundation; version 3.
2772+ *
2773+ * This program is distributed in the hope that it will be useful,
2774+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2775+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2776+ * GNU General Public License for more details.
2777+ *
2778+ * You should have received a copy of the GNU General Public License
2779+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2780+ */
2781+#ifndef PANELSTYLE_H
2782+#define PANELSTYLE_H
2783+
2784+// Local
2785+
2786+// Qt
2787+#include <QObject>
2788+
2789+class QColor;
2790+class QFont;
2791+
2792+class PanelStylePrivate;
2793+/**
2794+ * Provides easy access to panel colors
2795+ */
2796+class PanelStyle : public QObject
2797+{
2798+ Q_OBJECT
2799+public:
2800+ PanelStyle(QObject* parent = 0);
2801+ ~PanelStyle();
2802+
2803+ static PanelStyle* instance();
2804+
2805+ QColor textColor() const;
2806+ QColor backgroundTopColor() const;
2807+ QColor backgroundBottomColor() const;
2808+ QColor textShadowColor() const;
2809+ QColor lineColor() const;
2810+
2811+ QFont font() const;
2812+
2813+private:
2814+ friend class PanelStylePrivate;
2815+ // Use a pimpl to avoid the need for gtk includes here
2816+ PanelStylePrivate* const d;
2817+};
2818+
2819+#endif /* PANELSTYLE_H */
2820
2821=== added directory 'panel/applets/indicator'
2822=== removed directory 'panel/applets/indicator'
2823=== removed file 'panel/applets/indicator-config.h.in'
2824--- panel/applets/indicator-config.h.in 2011-03-01 09:04:13 +0000
2825+++ panel/applets/indicator-config.h.in 1970-01-01 00:00:00 +0000
2826@@ -1,7 +0,0 @@
2827-#ifndef INDICATOR_CONFIG_H
2828-#define INDICATOR_CONFIG_H
2829-
2830-#define INDICATOR_ICONS_DIR "${INDICATOR_ICONS_DIR}"
2831-#define INDICATOR_DIR "${INDICATOR_DIR}"
2832-
2833-#endif /* INDICATOR_CONFIG_H */
2834
2835=== removed file 'panel/applets/indicator/abstractindicator.cpp'
2836--- panel/applets/indicator/abstractindicator.cpp 2011-01-15 01:41:03 +0000
2837+++ panel/applets/indicator/abstractindicator.cpp 1970-01-01 00:00:00 +0000
2838@@ -1,43 +0,0 @@
2839-/*
2840- * This file is part of unity-2d
2841- *
2842- * Copyright 2010 Canonical Ltd.
2843- *
2844- * Authors:
2845- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2846- *
2847- * This program is free software; you can redistribute it and/or modify
2848- * it under the terms of the GNU General Public License as published by
2849- * the Free Software Foundation; version 3.
2850- *
2851- * This program is distributed in the hope that it will be useful,
2852- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2853- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2854- * GNU General Public License for more details.
2855- *
2856- * You should have received a copy of the GNU General Public License
2857- * along with this program. If not, see <http://www.gnu.org/licenses/>.
2858- */
2859-
2860-// Self
2861-#include "abstractindicator.h"
2862-
2863-// Local
2864-
2865-// Qt
2866-#include <QAction>
2867-
2868-AbstractIndicator::AbstractIndicator(QObject* parent)
2869-: QObject(parent)
2870-{
2871-}
2872-
2873-AbstractIndicator::~AbstractIndicator()
2874-{
2875-}
2876-
2877-void AbstractIndicator::init()
2878-{
2879-}
2880-
2881-#include "abstractindicator.moc"
2882
2883=== removed file 'panel/applets/indicator/abstractindicator.h'
2884--- panel/applets/indicator/abstractindicator.h 2011-01-15 01:41:03 +0000
2885+++ panel/applets/indicator/abstractindicator.h 1970-01-01 00:00:00 +0000
2886@@ -1,53 +0,0 @@
2887-/*
2888- * This file is part of unity-2d
2889- *
2890- * Copyright 2010 Canonical Ltd.
2891- *
2892- * Authors:
2893- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2894- *
2895- * This program is free software; you can redistribute it and/or modify
2896- * it under the terms of the GNU General Public License as published by
2897- * the Free Software Foundation; version 3.
2898- *
2899- * This program is distributed in the hope that it will be useful,
2900- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2901- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2902- * GNU General Public License for more details.
2903- *
2904- * You should have received a copy of the GNU General Public License
2905- * along with this program. If not, see <http://www.gnu.org/licenses/>.
2906- */
2907-
2908-#ifndef ABSTRACTINDICATOR_H
2909-#define ABSTRACTINDICATOR_H
2910-
2911-// Local
2912-
2913-// Qt
2914-#include <QObject>
2915-
2916-class QAction;
2917-
2918-class AbstractIndicator : public QObject
2919-{
2920- Q_OBJECT
2921-public:
2922- AbstractIndicator(QObject* parent=0);
2923- ~AbstractIndicator();
2924-
2925- /**
2926- * Called when the indicator has been constructed and its owner is connected to signals.
2927- * It's the right place to emit actionAdded()
2928- */
2929- virtual void init();
2930-
2931-Q_SIGNALS:
2932- void actionAdded(QAction*);
2933- void actionRemoved(QAction*);
2934-
2935-private:
2936- Q_DISABLE_COPY(AbstractIndicator)
2937-};
2938-
2939-#endif /* ABSTRACTINDICATOR_H */
2940
2941=== removed file 'panel/applets/indicator/datetimeindicator.cpp'
2942--- panel/applets/indicator/datetimeindicator.cpp 2011-02-10 01:10:19 +0000
2943+++ panel/applets/indicator/datetimeindicator.cpp 1970-01-01 00:00:00 +0000
2944@@ -1,94 +0,0 @@
2945-/*
2946- * This file is part of unity-2d
2947- *
2948- * Copyright 2010 Canonical Ltd.
2949- *
2950- * Authors:
2951- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
2952- *
2953- * This program is free software; you can redistribute it and/or modify
2954- * it under the terms of the GNU General Public License as published by
2955- * the Free Software Foundation; version 3.
2956- *
2957- * This program is distributed in the hope that it will be useful,
2958- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2959- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2960- * GNU General Public License for more details.
2961- *
2962- * You should have received a copy of the GNU General Public License
2963- * along with this program. If not, see <http://www.gnu.org/licenses/>.
2964- */
2965-
2966-// Self
2967-#include "datetimeindicator.h"
2968-
2969-// Local
2970-#include "indicatorservicemanager.h"
2971-
2972-// dbusmenu-qt
2973-#include "dbusmenuimporter.h"
2974-
2975-// Qt
2976-#include <QAction>
2977-#include <QDateTime>
2978-
2979-// From dbus-shared.h
2980-#define SERVICE_NAME "com.canonical.indicator.datetime"
2981-#define SERVICE_IFACE "com.canonical.indicator.datetime.service"
2982-#define SERVICE_OBJ "/com.canonical/indicator/datetime/service"
2983-#define SERVICE_VERSION 1
2984-
2985-#define MENU_OBJ "/com.canonical/indicator/datetime/menu"
2986-
2987-#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item"
2988-////
2989-
2990-DateTimeIndicator::DateTimeIndicator(QObject* parent)
2991-: AbstractIndicator(parent)
2992-, m_action(new QAction(this))
2993-, m_timer(new QTimer(this))
2994-{
2995- new IndicatorServiceManager(SERVICE_NAME, SERVICE_VERSION, this);
2996-
2997- readConfig();
2998- setupMenu();
2999- setupTimer();
3000- updateText();
3001-}
3002-
3003-void DateTimeIndicator::init()
3004-{
3005- actionAdded(m_action);
3006-}
3007-
3008-void DateTimeIndicator::setupMenu()
3009-{
3010- DBusMenuImporter* importer = new DBusMenuImporter(SERVICE_NAME, MENU_OBJ, this);
3011- m_action->setMenu(importer->menu());
3012-}
3013-
3014-void DateTimeIndicator::setupTimer()
3015-{
3016- m_timer->setSingleShot(false);
3017- connect(m_timer, SIGNAL(timeout()), SLOT(updateText()));
3018- updateTimer();
3019- m_timer->start();
3020-}
3021-
3022-void DateTimeIndicator::updateTimer()
3023-{
3024- m_timer->setInterval(1000);
3025-}
3026-
3027-void DateTimeIndicator::updateText()
3028-{
3029- QString text = QDateTime::currentDateTime().toString(m_format);
3030- m_action->setText(text);
3031-}
3032-
3033-void DateTimeIndicator::readConfig()
3034-{
3035- m_format = "hh:mm:ss";
3036-}
3037-
3038-#include "datetimeindicator.moc"
3039
3040=== removed file 'panel/applets/indicator/datetimeindicator.h'
3041--- panel/applets/indicator/datetimeindicator.h 2011-01-15 01:41:03 +0000
3042+++ panel/applets/indicator/datetimeindicator.h 1970-01-01 00:00:00 +0000
3043@@ -1,53 +0,0 @@
3044-/*
3045- * This file is part of unity-2d
3046- *
3047- * Copyright 2010 Canonical Ltd.
3048- *
3049- * Authors:
3050- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3051- *
3052- * This program is free software; you can redistribute it and/or modify
3053- * it under the terms of the GNU General Public License as published by
3054- * the Free Software Foundation; version 3.
3055- *
3056- * This program is distributed in the hope that it will be useful,
3057- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3058- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3059- * GNU General Public License for more details.
3060- *
3061- * You should have received a copy of the GNU General Public License
3062- * along with this program. If not, see <http://www.gnu.org/licenses/>.
3063- */
3064-
3065-#ifndef DATETIMEINDICATOR_H
3066-#define DATETIMEINDICATOR_H
3067-
3068-// Local
3069-#include "abstractindicator.h"
3070-
3071-// Qt
3072-#include <QTimer>
3073-
3074-class DateTimeIndicator : public AbstractIndicator
3075-{
3076- Q_OBJECT
3077-public:
3078- DateTimeIndicator(QObject* parent=0);
3079-
3080- virtual void init();
3081-
3082-private Q_SLOTS:
3083- void updateText();
3084-private:
3085- Q_DISABLE_COPY(DateTimeIndicator)
3086- QAction* m_action;
3087- QTimer* m_timer;
3088- QString m_format;
3089-
3090- void setupTimer();
3091- void setupMenu();
3092- void readConfig();
3093- void updateTimer();
3094-};
3095-
3096-#endif /* DATETIMEINDICATOR_H */
3097
3098=== removed file 'panel/applets/indicator/indicator.c'
3099--- panel/applets/indicator/indicator.c 2011-07-01 03:58:28 +0000
3100+++ panel/applets/indicator/indicator.c 1970-01-01 00:00:00 +0000
3101@@ -1,525 +0,0 @@
3102-/* Copyright (c) 2009 Mark Trompell <mark@foresightlinux.org>
3103- *
3104- * This program is free software; you can redistribute it and/or modify
3105- * it under the terms of the GNU General Public License as published by
3106- * the Free Software Foundation; either version 2 of the License, or
3107- * (at your option) any later version.
3108- *
3109- * This program is distributed in the hope that it will be useful,
3110- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3111- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3112- * GNU Library General Public License for more details.
3113- *
3114- * You should have received a copy of the GNU General Public License
3115- * along with this program; if not, write to the Free Software
3116- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
3117- */
3118-
3119-#include <string.h>
3120-
3121-#include <gtk/gtk.h>
3122-#include <libindicator/indicator-object.h>
3123-
3124-#include "indicator.h"
3125-
3126-#include "indicator-config.h"
3127-
3128-/* default settings */
3129-#define DEFAULT_SETTING1 NULL
3130-#define DEFAULT_SETTING2 1
3131-#define DEFAULT_SETTING3 FALSE
3132-
3133-typedef enum {
3134- PANEL_APPLET_ORIENT_LEFT,
3135- PANEL_APPLET_ORIENT_RIGHT,
3136- PANEL_APPLET_ORIENT_TOP,
3137- PANEL_APPLET_ORIENT_BOTTOM
3138-} PanelAppletOrient;
3139-
3140-// <indicator-applet-copy>
3141-static gchar * indicator_order[] = {
3142- "libappmenu.so",
3143- "libapplication.so",
3144- "libsoundmenu.so",
3145- "libnetworkmenu.so",
3146- "libmessaging.so",
3147- "libdatetime.so",
3148- "libme.so",
3149- "libsession.so",
3150- NULL
3151-};
3152-
3153-static GtkPackDirection packdirection;
3154-static PanelAppletOrient orient;
3155-
3156-#define MENU_DATA_INDICATOR_OBJECT "indicator-object"
3157-#define MENU_DATA_INDICATOR_ENTRY "indicator-entry"
3158-
3159-#define IO_DATA_ORDER_NUMBER "indicator-order-number"
3160-
3161-static gint
3162-name2order (const gchar * name) {
3163- int i;
3164-
3165- for (i = 0; indicator_order[i] != NULL; i++) {
3166- if (g_strcmp0(name, indicator_order[i]) == 0) {
3167- return i;
3168- }
3169- }
3170-
3171- return -1;
3172-}
3173-
3174-typedef struct _incoming_position_t incoming_position_t;
3175-struct _incoming_position_t {
3176- gint objposition;
3177- gint entryposition;
3178- gint menupos;
3179- gboolean found;
3180-};
3181-
3182-/* This function helps by determining where in the menu list
3183- this new entry should be placed. It compares the objects
3184- that they're on, and then the individual entries. Each
3185- is progressively more expensive. */
3186-static void
3187-place_in_menu (GtkWidget * widget, gpointer user_data)
3188-{
3189- incoming_position_t * position = (incoming_position_t *)user_data;
3190- if (position->found) {
3191- /* We've already been placed, just finish the foreach */
3192- return;
3193- }
3194-
3195- IndicatorObject * io = INDICATOR_OBJECT(g_object_get_data(G_OBJECT(widget), MENU_DATA_INDICATOR_OBJECT));
3196- g_assert(io != NULL);
3197-
3198- gint objposition = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER));
3199- /* We've already passed it, well, then this is where
3200- we should be be. Stop! */
3201- if (objposition > position->objposition) {
3202- position->found = TRUE;
3203- return;
3204- }
3205-
3206- /* The objects don't match yet, keep looking */
3207- if (objposition < position->objposition) {
3208- position->menupos++;
3209- return;
3210- }
3211-
3212- /* The objects are the same, let's start looking at entries. */
3213- IndicatorObjectEntry * entry = (IndicatorObjectEntry *)g_object_get_data(G_OBJECT(widget), MENU_DATA_INDICATOR_ENTRY);
3214- gint entryposition = indicator_object_get_location(io, entry);
3215-
3216- if (entryposition > position->entryposition) {
3217- position->found = TRUE;
3218- return;
3219- }
3220-
3221- if (entryposition < position->entryposition) {
3222- position->menupos++;
3223- return;
3224- }
3225-
3226- /* We've got the same object and the same entry. Well,
3227- let's just put it right here then. */
3228- position->found = TRUE;
3229- return;
3230-}
3231-
3232-static void
3233-something_shown (GtkWidget * widget, gpointer user_data)
3234-{
3235- GtkWidget * menuitem = GTK_WIDGET(user_data);
3236- gtk_widget_show(menuitem);
3237-}
3238-
3239-static void
3240-something_hidden (GtkWidget * widget, gpointer user_data)
3241-{
3242- GtkWidget * menuitem = GTK_WIDGET(user_data);
3243- gtk_widget_hide(menuitem);
3244-}
3245-
3246-static void
3247-sensitive_cb (GObject * obj, GParamSpec * pspec, gpointer user_data)
3248-{
3249- g_return_if_fail(GTK_IS_WIDGET(obj));
3250- g_return_if_fail(GTK_IS_WIDGET(user_data));
3251-
3252- gtk_widget_set_sensitive(GTK_WIDGET(user_data), gtk_widget_get_sensitive(GTK_WIDGET(obj)));
3253- return;
3254-}
3255-
3256-static gboolean
3257-entry_scrolled (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
3258-{
3259- IndicatorObject *io = g_object_get_data (G_OBJECT (menuitem), MENU_DATA_INDICATOR_OBJECT);
3260- IndicatorObjectEntry *entry = g_object_get_data (G_OBJECT (menuitem), MENU_DATA_INDICATOR_ENTRY);
3261-
3262- g_return_val_if_fail(INDICATOR_IS_OBJECT(io), FALSE);
3263-
3264- g_signal_emit_by_name (io, "scroll", 1, event->direction);
3265- g_signal_emit_by_name (io, "scroll-entry", entry, 1, event->direction);
3266-
3267- return FALSE;
3268-}
3269-
3270-static void
3271-entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, GtkWidget * menubar)
3272-{
3273- g_debug("Signal: Entry Added");
3274- gboolean something_visible = FALSE;
3275- gboolean something_sensitive = FALSE;
3276-
3277- GtkWidget * menuitem = gtk_menu_item_new();
3278- GtkWidget * box = (packdirection == GTK_PACK_DIRECTION_LTR) ?
3279- gtk_hbox_new(FALSE, 3) : gtk_vbox_new(FALSE, 3);
3280-
3281- g_object_set_data (G_OBJECT (menuitem), "indicator", io);
3282- g_object_set_data (G_OBJECT (menuitem), "box", box);
3283-
3284- if (entry->image != NULL) {
3285- gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->image), FALSE, FALSE, 0);
3286- if (gtk_widget_get_visible(GTK_WIDGET(entry->image))) {
3287- something_visible = TRUE;
3288- }
3289-
3290- if (gtk_widget_get_sensitive(GTK_WIDGET(entry->image))) {
3291- something_sensitive = TRUE;
3292- }
3293-
3294- g_signal_connect(G_OBJECT(entry->image), "show", G_CALLBACK(something_shown), menuitem);
3295- g_signal_connect(G_OBJECT(entry->image), "hide", G_CALLBACK(something_hidden), menuitem);
3296-
3297- g_signal_connect(G_OBJECT(entry->image), "notify::sensitive", G_CALLBACK(sensitive_cb), menuitem);
3298- }
3299- if (entry->label != NULL) {
3300- switch(packdirection) {
3301- case GTK_PACK_DIRECTION_LTR:
3302- gtk_label_set_angle(GTK_LABEL(entry->label), 0.0);
3303- break;
3304- case GTK_PACK_DIRECTION_TTB:
3305- gtk_label_set_angle(GTK_LABEL(entry->label),
3306- (orient == PANEL_APPLET_ORIENT_LEFT) ?
3307- 270.0 : 90.0);
3308- break;
3309- default:
3310- break;
3311- }
3312- gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->label), FALSE, FALSE, 0);
3313-
3314- if (gtk_widget_get_visible(GTK_WIDGET(entry->label))) {
3315- something_visible = TRUE;
3316- }
3317-
3318- if (gtk_widget_get_sensitive(GTK_WIDGET(entry->label))) {
3319- something_sensitive = TRUE;
3320- }
3321-
3322- g_signal_connect(G_OBJECT(entry->label), "show", G_CALLBACK(something_shown), menuitem);
3323- g_signal_connect(G_OBJECT(entry->label), "hide", G_CALLBACK(something_hidden), menuitem);
3324-
3325- g_signal_connect(G_OBJECT(entry->label), "notify::sensitive", G_CALLBACK(sensitive_cb), menuitem);
3326- }
3327- gtk_container_add(GTK_CONTAINER(menuitem), box);
3328- gtk_widget_show(box);
3329-
3330- if (entry->menu != NULL) {
3331- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), GTK_WIDGET(entry->menu));
3332- }
3333-
3334- incoming_position_t position;
3335- position.objposition = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER));
3336- position.entryposition = indicator_object_get_location(io, entry);
3337- position.menupos = 0;
3338- position.found = FALSE;
3339-
3340- gtk_container_foreach(GTK_CONTAINER(menubar), place_in_menu, &position);
3341-
3342- gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), menuitem, position.menupos);
3343-
3344- if (something_visible) {
3345- gtk_widget_show(menuitem);
3346- }
3347- gtk_widget_set_sensitive(menuitem, something_sensitive);
3348-
3349- g_object_set_data(G_OBJECT(menuitem), MENU_DATA_INDICATOR_ENTRY, entry);
3350- g_object_set_data(G_OBJECT(menuitem), MENU_DATA_INDICATOR_OBJECT, io);
3351- g_signal_connect(G_OBJECT (menuitem), "scroll-event", G_CALLBACK(entry_scrolled), NULL);
3352-
3353- return;
3354-}
3355-
3356-static void
3357-entry_removed_cb (GtkWidget * widget, gpointer userdata)
3358-{
3359- gpointer data = g_object_get_data(G_OBJECT(widget), MENU_DATA_INDICATOR_ENTRY);
3360-
3361- if (data != userdata) {
3362- return;
3363- }
3364-
3365- IndicatorObjectEntry * entry = (IndicatorObjectEntry *)data;
3366- if (entry->label != NULL) {
3367- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->label), G_CALLBACK(something_shown), widget);
3368- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->label), G_CALLBACK(something_hidden), widget);
3369- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->label), G_CALLBACK(sensitive_cb), widget);
3370- }
3371- if (entry->image != NULL) {
3372- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->image), G_CALLBACK(something_shown), widget);
3373- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->image), G_CALLBACK(something_hidden), widget);
3374- g_signal_handlers_disconnect_by_func(G_OBJECT(entry->image), G_CALLBACK(sensitive_cb), widget);
3375- }
3376-
3377- gtk_widget_destroy(widget);
3378- return;
3379-}
3380-
3381-static void
3382-entry_removed (IndicatorObject * io G_GNUC_UNUSED, IndicatorObjectEntry * entry,
3383- gpointer user_data)
3384-{
3385- g_debug("Signal: Entry Removed");
3386-
3387- gtk_container_foreach(GTK_CONTAINER(user_data), entry_removed_cb, entry);
3388-
3389- return;
3390-}
3391-
3392-static void
3393-entry_moved_find_cb (GtkWidget * widget, gpointer userdata)
3394-{
3395- gpointer * array = (gpointer *)userdata;
3396- if (array[1] != NULL) {
3397- return;
3398- }
3399-
3400- gpointer data = g_object_get_data(G_OBJECT(widget), MENU_DATA_INDICATOR_ENTRY);
3401-
3402- if (data != array[0]) {
3403- return;
3404- }
3405-
3406- array[1] = widget;
3407- return;
3408-}
3409-
3410-/* Gets called when an entry for an object was moved. */
3411-static void
3412-entry_moved (IndicatorObject * io, IndicatorObjectEntry * entry,
3413- gint old G_GNUC_UNUSED, gint new G_GNUC_UNUSED, gpointer user_data)
3414-{
3415- GtkWidget * menubar = GTK_WIDGET(user_data);
3416-
3417- gpointer array[2];
3418- array[0] = entry;
3419- array[1] = NULL;
3420-
3421- gtk_container_foreach(GTK_CONTAINER(menubar), entry_moved_find_cb, array);
3422- if (array[1] == NULL) {
3423- g_warning("Moving an entry that isn't in our menus.");
3424- return;
3425- }
3426-
3427- GtkWidget * mi = GTK_WIDGET(array[1]);
3428- g_object_ref(G_OBJECT(mi));
3429- gtk_container_remove(GTK_CONTAINER(menubar), mi);
3430-
3431- incoming_position_t position;
3432- position.objposition = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER));
3433- position.entryposition = indicator_object_get_location(io, entry);
3434- position.menupos = 0;
3435- position.found = FALSE;
3436-
3437- gtk_container_foreach(GTK_CONTAINER(menubar), place_in_menu, &position);
3438-
3439- gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), mi, position.menupos);
3440-
3441- g_object_unref(G_OBJECT(mi));
3442-
3443- return;
3444-}
3445-
3446-static gboolean
3447-load_module (const gchar * name, GtkWidget * menubar)
3448-{
3449- g_debug("Looking at Module: %s", name);
3450- g_return_val_if_fail(name != NULL, FALSE);
3451-
3452- if (!g_str_has_suffix(name, G_MODULE_SUFFIX)) {
3453- return FALSE;
3454- }
3455-
3456- g_debug("Loading Module: %s", name);
3457-
3458- /* Build the object for the module */
3459- gchar * fullpath = g_build_filename(INDICATOR_DIR, name, NULL);
3460- IndicatorObject * io = indicator_object_new_from_file(fullpath);
3461- g_free(fullpath);
3462- g_return_val_if_fail(io != NULL, FALSE);
3463-
3464- /* Attach the 'name' to the object */
3465- g_object_set_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER, GINT_TO_POINTER(name2order(name)));
3466-
3467- /* Connect to its signals */
3468- g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED, G_CALLBACK(entry_added), menubar);
3469- g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED, G_CALLBACK(entry_removed), menubar);
3470- g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_MOVED, G_CALLBACK(entry_moved), menubar);
3471-
3472- /* Work on the entries */
3473- GList * entries = indicator_object_get_entries(io);
3474- GList * entry = NULL;
3475-
3476- for (entry = entries; entry != NULL; entry = g_list_next(entry)) {
3477- IndicatorObjectEntry * entrydata = (IndicatorObjectEntry *)entry->data;
3478- entry_added(io, entrydata, menubar);
3479- }
3480-
3481- g_list_free(entries);
3482-
3483- return TRUE;
3484-}
3485-// </indicator-applet-copy>
3486-
3487-
3488-/* prototypes */
3489-static gboolean
3490-on_menu_press (GtkWidget *widget, GdkEventButton *event, IndicatorPlugin *indicator);
3491-
3492-IndicatorPlugin *
3493-indicator_new ()
3494-{
3495- IndicatorPlugin *indicator;
3496- GtkOrientation orientation;
3497- gint indicators_loaded = 0;
3498-
3499- /* Hack! prevent the appmenu indicator from swallowing our own menubar */
3500- setenv("APPMENU_DISPLAY_BOTH", "1");
3501-
3502- /* allocate memory for the plugin structure */
3503- indicator = g_new (IndicatorPlugin, 1);
3504-
3505- indicator->container = gtk_plug_new(0);
3506-
3507- /* Init some theme/icon stuff */
3508- g_object_set (gtk_settings_get_default(), "gtk-theme-name", "Ambiance", NULL);
3509- g_object_set (gtk_settings_get_default(), "gtk-icon-theme-name", "ubuntu-mono-dark", NULL);
3510- gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
3511- INDICATOR_ICONS_DIR);
3512- gtk_rc_parse_string (
3513- "widget \"indicator-applet*\" style \"panel\"\n"
3514- "style \"indicator-applet-style\"\n"
3515- "{\n"
3516- " GtkMenuBar::shadow-type = none\n"
3517- " GtkMenuBar::internal-padding = 0\n"
3518- " GtkWidget::focus-line-width = 0\n"
3519- " GtkWidget::focus-padding = 0\n"
3520- "}\n"
3521- "style \"indicator-applet-menubar-style\"\n"
3522- "{\n"
3523- " GtkMenuBar::shadow-type = none\n"
3524- " GtkMenuBar::internal-padding = 0\n"
3525- " GtkWidget::focus-line-width = 0\n"
3526- " GtkWidget::focus-padding = 0\n"
3527- " GtkMenuItem::horizontal-padding = 0\n"
3528- "}\n"
3529- "style \"indicator-applet-menuitem-style\"\n"
3530- "{\n"
3531- " GtkWidget::focus-line-width = 0\n"
3532- " GtkWidget::focus-padding = 0\n"
3533- " GtkMenuItem::horizontal-padding = 0\n"
3534- "}\n"
3535- "widget \"*.indicator-applet\" style \"indicator-applet-style\""
3536- "widget \"*.indicator-applet-menuitem\" style \"indicator-applet-menuitem-style\""
3537- "widget \"*.indicator-applet-menubar\" style \"indicator-applet-menubar-style\"");
3538- gtk_widget_set_name(GTK_WIDGET (indicator->container), "indicator-applet");
3539- /* create some panel widgets */
3540-
3541- /* Build menu */
3542- indicator->menu = gtk_menu_bar_new();
3543- GTK_WIDGET_SET_FLAGS (indicator->menu, GTK_WIDGET_FLAGS(indicator->menu) | GTK_CAN_FOCUS);
3544- gtk_widget_set_name(GTK_WIDGET (indicator->menu), "indicator-applet-menubar");
3545- g_signal_connect(indicator->menu, "button-press-event", G_CALLBACK(on_menu_press), NULL);
3546- //g_signal_connect_after(indicator->menu, "expose-event", G_CALLBACK(menu_on_expose), menu);
3547- gtk_container_set_border_width(GTK_CONTAINER(indicator->menu), 0);
3548-
3549- /* load 'em */
3550- if (!g_file_test(INDICATOR_DIR, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
3551- g_warning ("%s does not exist, cannot read any indicators", INDICATOR_DIR);
3552- } else {
3553- GDir *dir;
3554- const gchar *name;
3555-
3556- dir = g_dir_open(INDICATOR_DIR, 0, NULL);
3557- while ((name = g_dir_read_name (dir)) != NULL) {
3558- if (g_strcmp0(name, "libappmenu.so") == 0) {
3559- continue;
3560- }
3561-
3562- if (load_module(name, indicator->menu)) {
3563- indicators_loaded++;
3564- } else {
3565- g_warning("Failed to load module %s", name);
3566- }
3567- }
3568- g_dir_close(dir);
3569- }
3570-
3571- if (indicators_loaded == 0) {
3572- /* A label to allow for click through */
3573- indicator->item = gtk_button_new();
3574- gtk_button_set_label(GTK_BUTTON(indicator->item), "No Indicators");
3575- gtk_widget_show(indicator->item);
3576- gtk_container_add (GTK_CONTAINER (indicator->container), indicator->item);
3577- } else {
3578- gtk_widget_show(indicator->menu);
3579- gtk_container_add (GTK_CONTAINER (indicator->container), indicator->menu);
3580- }
3581- return indicator;
3582-}
3583-
3584-
3585-
3586-void
3587-indicator_free (IndicatorPlugin *indicator)
3588-{
3589- g_free(indicator);
3590-}
3591-
3592-
3593-#if 0
3594-static gboolean
3595-indicator_size_changed (XfcePanelPlugin *plugin,
3596- gint size,
3597- IndicatorPlugin *indicator)
3598-{
3599- GtkOrientation orientation;
3600-
3601- /* get the orientation of the plugin */
3602- orientation = xfce_panel_plugin_get_orientation (plugin);
3603-
3604- /* set the widget size */
3605- if (orientation == GTK_ORIENTATION_HORIZONTAL)
3606- gtk_widget_set_size_request (GTK_WIDGET (plugin), -1, size);
3607- else
3608- gtk_widget_set_size_request (GTK_WIDGET (plugin), size, -1);
3609-
3610- /* we handled the orientation */
3611- return TRUE;
3612-}
3613-#endif
3614-
3615-
3616-static gboolean
3617-on_menu_press (GtkWidget *widget, GdkEventButton *event, IndicatorPlugin *indicator)
3618-{
3619- if (indicator != NULL && event->button == 1) /* left click only */
3620- {
3621- /* gtk_menu_popup (GTK_MENU(indicator->menu), NULL, NULL, NULL, NULL, 0,
3622- event->time);*/
3623- return TRUE;
3624- }
3625- return FALSE ;
3626-}
3627
3628=== removed file 'panel/applets/indicator/indicator.h'
3629--- panel/applets/indicator/indicator.h 2011-06-22 14:49:34 +0000
3630+++ panel/applets/indicator/indicator.h 1970-01-01 00:00:00 +0000
3631@@ -1,45 +0,0 @@
3632-/* Copyright (c) 2009 Mark Trompell <mark@foresightlinux.org>
3633- *
3634- * This program is free software; you can redistribute it and/or modify
3635- * it under the terms of the GNU General Public License as published by
3636- * the Free Software Foundation; either version 2 of the License, or
3637- * (at your option) any later version.
3638- *
3639- * This program is distributed in the hope that it will be useful,
3640- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3641- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3642- * GNU Library General Public License for more details.
3643- *
3644- * You should have received a copy of the GNU General Public License
3645- * along with this program; if not, write to the Free Software
3646- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
3647- */
3648-
3649-#ifndef __INDICATOR_H__
3650-#define __INDICATOR_H__
3651-
3652-#include <gtk/gtk.h>
3653-
3654-G_BEGIN_DECLS
3655-
3656-/* plugin structure */
3657-typedef struct _IndicatorPlugin
3658-{
3659- GtkWidget *container;
3660- /* panel widgets */
3661- GtkWidget *menu;
3662- GtkWidget *item;
3663-
3664- /* indicator settings */
3665-}
3666-IndicatorPlugin;
3667-
3668-IndicatorPlugin *
3669-indicator_new ();
3670-
3671-void
3672-indicator_free(IndicatorPlugin*);
3673-
3674-G_END_DECLS
3675-
3676-#endif /* !__INDICATOR_H__ */
3677
3678=== added file 'panel/applets/indicator/indicatorapplet.cpp'
3679--- panel/applets/indicator/indicatorapplet.cpp 1970-01-01 00:00:00 +0000
3680+++ panel/applets/indicator/indicatorapplet.cpp 2011-07-27 15:26:24 +0000
3681@@ -0,0 +1,58 @@
3682+/*
3683+ * This file is part of unity-2d
3684+ *
3685+ * Copyright 2011 Canonical Ltd.
3686+ *
3687+ * Authors:
3688+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3689+ *
3690+ * This program is free software; you can redistribute it and/or modify
3691+ * it under the terms of the GNU General Public License as published by
3692+ * the Free Software Foundation; version 3.
3693+ *
3694+ * This program is distributed in the hope that it will be useful,
3695+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3696+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3697+ * GNU General Public License for more details.
3698+ *
3699+ * You should have received a copy of the GNU General Public License
3700+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3701+ */
3702+// Self
3703+#include "indicatorapplet.h"
3704+
3705+// Local
3706+#include <debug_p.h>
3707+#include <indicatorsmanager.h>
3708+#include <indicatorwidget.h>
3709+
3710+// Qt
3711+#include <QHBoxLayout>
3712+
3713+using namespace unity::indicator;
3714+
3715+IndicatorApplet::IndicatorApplet(IndicatorsManager* manager)
3716+: m_indicatorsManager(manager)
3717+{
3718+ QHBoxLayout* layout = new QHBoxLayout(this);
3719+ layout->setMargin(0);
3720+ layout->setSpacing(0);
3721+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
3722+
3723+ m_indicatorsManager->indicators()->on_object_added.connect(
3724+ sigc::mem_fun(this, &IndicatorApplet::onObjectAdded)
3725+ );
3726+}
3727+
3728+void IndicatorApplet::onObjectAdded(Indicator::Ptr const& indicator)
3729+{
3730+ QString name = QString::fromStdString(indicator->name());
3731+ if (name == "libappmenu.so") {
3732+ // appmenu indicator is handled by AppNameApplet
3733+ return;
3734+ }
3735+ IndicatorWidget* widget = new IndicatorWidget(indicator, m_indicatorsManager);
3736+ layout()->addWidget(widget);
3737+}
3738+
3739+#include "indicatorapplet.moc"
3740
3741=== removed file 'panel/applets/indicator/indicatorapplet.cpp'
3742--- panel/applets/indicator/indicatorapplet.cpp 2011-06-22 14:49:34 +0000
3743+++ panel/applets/indicator/indicatorapplet.cpp 1970-01-01 00:00:00 +0000
3744@@ -1,114 +0,0 @@
3745-/*
3746- * This file is part of unity-2d
3747- *
3748- * Copyright 2010 Canonical Ltd.
3749- *
3750- * Authors:
3751- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3752- *
3753- * This program is free software; you can redistribute it and/or modify
3754- * it under the terms of the GNU General Public License as published by
3755- * the Free Software Foundation; version 3.
3756- *
3757- * This program is distributed in the hope that it will be useful,
3758- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3759- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3760- * GNU General Public License for more details.
3761- *
3762- * You should have received a copy of the GNU General Public License
3763- * along with this program. If not, see <http://www.gnu.org/licenses/>.
3764- */
3765-
3766-// Self
3767-#include "indicatorapplet.h"
3768-
3769-// Local
3770-#include "abstractindicator.h"
3771-#include "datetimeindicator.h"
3772-#include "debug_p.h"
3773-#include "indicator.h"
3774-
3775-// Qt
3776-#include <QAction>
3777-#include <QDBusConnection>
3778-#include <QHBoxLayout>
3779-#include <QMenu>
3780-#include <QX11EmbedContainer>
3781-
3782-// Gtk
3783-#include <gdk/gdk.h>
3784-#include <gtk/gtk.h>
3785-
3786-IndicatorApplet::IndicatorApplet()
3787-{
3788- setupUi();
3789- loadIndicators();
3790-}
3791-
3792-void IndicatorApplet::setupUi()
3793-{
3794- m_menuBar = new QMenuBar;
3795- m_menuBar->setNativeMenuBar(false);
3796- QHBoxLayout* layout = new QHBoxLayout(this);
3797- layout->setMargin(0);
3798- layout->addWidget(m_menuBar);
3799-
3800- QMetaObject::invokeMethod(this, "createGtkIndicator", Qt::QueuedConnection);
3801-}
3802-
3803-void IndicatorApplet::createGtkIndicator()
3804-{
3805- int* argc = 0;
3806- char*** argv = 0;
3807- gtk_init(argc, argv);
3808-
3809- m_container = new QX11EmbedContainer;
3810- layout()->addWidget(m_container);
3811-
3812- m_gtkIndicator = indicator_new();
3813- m_container->embedClient(gtk_plug_get_id(GTK_PLUG(m_gtkIndicator->container)));
3814- gtk_widget_show(m_gtkIndicator->container);
3815-
3816- QTimer* timer = new QTimer(this);
3817- timer->setInterval(1000);
3818- timer->setSingleShot(false);
3819- connect(timer, SIGNAL(timeout()), SLOT(adjustGtkIndicatorSize()));
3820- timer->start();
3821-}
3822-
3823-void IndicatorApplet::adjustGtkIndicatorSize()
3824-{
3825- GtkRequisition requisition;
3826- gtk_widget_size_request(m_gtkIndicator->menu, &requisition);
3827- m_container->setFixedWidth(requisition.width);
3828-}
3829-
3830-void IndicatorApplet::loadIndicators()
3831-{
3832-#if 0
3833- // FIXME: Using Qt plugins
3834- QList<AbstractIndicator*> indicators = QList<AbstractIndicator*>()
3835- << new DateTimeIndicator(this)
3836- ;
3837-
3838- Q_FOREACH(AbstractIndicator* indicator, indicators) {
3839- connect(indicator, SIGNAL(actionAdded(QAction*)), SLOT(slotActionAdded(QAction*)));
3840- connect(indicator, SIGNAL(actionRemoved(QAction*)), SLOT(slotActionRemoved(QAction*)));
3841- indicator->init();
3842- }
3843-#endif
3844-}
3845-
3846-void IndicatorApplet::slotActionAdded(QAction* action)
3847-{
3848- UQ_VAR(action->text());
3849- m_menuBar->addAction(action);
3850-}
3851-
3852-void IndicatorApplet::slotActionRemoved(QAction* action)
3853-{
3854- m_menuBar->removeAction(action);
3855-}
3856-
3857-
3858-#include "indicatorapplet.moc"
3859
3860=== added file 'panel/applets/indicator/indicatorapplet.h'
3861--- panel/applets/indicator/indicatorapplet.h 1970-01-01 00:00:00 +0000
3862+++ panel/applets/indicator/indicatorapplet.h 2011-07-27 15:26:24 +0000
3863@@ -0,0 +1,45 @@
3864+/*
3865+ * This file is part of unity-2d
3866+ *
3867+ * Copyright 2011 Canonical Ltd.
3868+ *
3869+ * Authors:
3870+ * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3871+ *
3872+ * This program is free software; you can redistribute it and/or modify
3873+ * it under the terms of the GNU General Public License as published by
3874+ * the Free Software Foundation; version 3.
3875+ *
3876+ * This program is distributed in the hope that it will be useful,
3877+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3878+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3879+ * GNU General Public License for more details.
3880+ *
3881+ * You should have received a copy of the GNU General Public License
3882+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3883+ */
3884+
3885+#ifndef INDICATORAPPLET_H
3886+#define INDICATORAPPLET_H
3887+
3888+// Local
3889+#include <applet.h>
3890+
3891+// libunity-core
3892+#include <UnityCore/Indicator.h>
3893+
3894+class IndicatorsManager;
3895+
3896+class IndicatorApplet : public Unity2d::Applet, public sigc::trackable
3897+{
3898+Q_OBJECT
3899+public:
3900+ IndicatorApplet(IndicatorsManager* manager);
3901+
3902+private:
3903+ Q_DISABLE_COPY(IndicatorApplet)
3904+ IndicatorsManager* m_indicatorsManager;
3905+ void onObjectAdded(unity::indicator::Indicator::Ptr const&);
3906+};
3907+
3908+#endif /* INDICATORAPPLET_H */
3909
3910=== removed file 'panel/applets/indicator/indicatorapplet.h'
3911--- panel/applets/indicator/indicatorapplet.h 2011-01-15 01:41:03 +0000
3912+++ panel/applets/indicator/indicatorapplet.h 1970-01-01 00:00:00 +0000
3913@@ -1,60 +0,0 @@
3914-/*
3915- * This file is part of unity-2d
3916- *
3917- * Copyright 2010 Canonical Ltd.
3918- *
3919- * Authors:
3920- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3921- *
3922- * This program is free software; you can redistribute it and/or modify
3923- * it under the terms of the GNU General Public License as published by
3924- * the Free Software Foundation; version 3.
3925- *
3926- * This program is distributed in the hope that it will be useful,
3927- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3928- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3929- * GNU General Public License for more details.
3930- *
3931- * You should have received a copy of the GNU General Public License
3932- * along with this program. If not, see <http://www.gnu.org/licenses/>.
3933- */
3934-
3935-#ifndef INDICATORAPPLET_H
3936-#define INDICATORAPPLET_H
3937-
3938-// Local
3939-#include <applet.h>
3940-
3941-// Qt
3942-#include <QDBusInterface>
3943-#include <QMenuBar>
3944-
3945-class QX11EmbedContainer;
3946-
3947-struct _IndicatorPlugin;
3948-
3949-class IndicatorApplet : public Unity2d::Applet
3950-{
3951-Q_OBJECT
3952-public:
3953- IndicatorApplet();
3954-
3955-private Q_SLOTS:
3956- void loadIndicators();
3957- void slotActionAdded(QAction*);
3958- void slotActionRemoved(QAction*);
3959- void createGtkIndicator();
3960- void adjustGtkIndicatorSize();
3961-
3962-private:
3963- Q_DISABLE_COPY(IndicatorApplet)
3964-
3965- QDBusInterface* m_watcher;
3966- QMenuBar* m_menuBar;
3967- QX11EmbedContainer* m_container;
3968- struct _IndicatorPlugin* m_gtkIndicator;
3969-
3970- void setupUi();
3971-};
3972-
3973-#endif /* INDICATORAPPLET_H */
3974
3975=== removed file 'panel/applets/indicator/indicatorservicemanager.cpp'
3976--- panel/applets/indicator/indicatorservicemanager.cpp 2011-02-10 01:10:19 +0000
3977+++ panel/applets/indicator/indicatorservicemanager.cpp 1970-01-01 00:00:00 +0000
3978@@ -1,120 +0,0 @@
3979-/*
3980- * This file is part of unity-2d
3981- *
3982- * Copyright 2010 Canonical Ltd.
3983- *
3984- * Authors:
3985- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
3986- *
3987- * This program is free software; you can redistribute it and/or modify
3988- * it under the terms of the GNU General Public License as published by
3989- * the Free Software Foundation; version 3.
3990- *
3991- * This program is distributed in the hope that it will be useful,
3992- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3993- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3994- * GNU General Public License for more details.
3995- *
3996- * You should have received a copy of the GNU General Public License
3997- * along with this program. If not, see <http://www.gnu.org/licenses/>.
3998- */
3999-
4000-// Self
4001-#include "indicatorservicemanager.h"
4002-
4003-// Local
4004-#include "debug_p.h"
4005-
4006-// Qt
4007-#include <QAction>
4008-#include <QDBusConnection>
4009-#include <QDBusConnectionInterface>
4010-#include <QDBusMessage>
4011-#include <QDBusServiceWatcher>
4012-#include <QDBusReply>
4013-#include <QDBusInterface>
4014-
4015-static const char* INDICATOR_SERVICE_INTERFACE = "com.canonical.indicator.service";
4016-static const char* INDICATOR_SERVICE_OBJECT = "/com.canonical/indicator/service";
4017-static const uint INDICATOR_SERVICE_VERSION = 1;
4018-
4019-IndicatorServiceManager::IndicatorServiceManager(const char* name, uint version, QObject* parent)
4020-: QObject(parent)
4021-, m_serviceName(name)
4022-, m_serviceVersion(version)
4023-{
4024- QDBusServiceWatcher* serviceWatcher = new QDBusServiceWatcher(this);
4025- serviceWatcher->setConnection(QDBusConnection::sessionBus());
4026- serviceWatcher->addWatchedService(m_serviceName);
4027- connect(serviceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
4028- SLOT(slotServiceOwnerChanged(QString, QString, QString)));
4029- connectToService();
4030-}
4031-
4032-IndicatorServiceManager::~IndicatorServiceManager()
4033-{
4034- unwatchService();
4035-}
4036-
4037-void IndicatorServiceManager::connectToService()
4038-{
4039- QDBusConnectionInterface* iface = QDBusConnection::sessionBus().interface();
4040- QDBusReply<bool> reply = iface->isServiceRegistered(m_serviceName);
4041- UQ_RETURN_IF_FAIL(reply.isValid());
4042-
4043- if (reply.value()) {
4044- watchService();
4045- } else {
4046- QDBusReply<void> reply = iface->startService(m_serviceName);
4047- if (!reply.isValid()) {
4048- UQ_WARNING << reply.error().message();
4049- }
4050- }
4051-}
4052-
4053-void IndicatorServiceManager::watchService()
4054-{
4055- QDBusInterface iface(m_serviceName, INDICATOR_SERVICE_OBJECT, INDICATOR_SERVICE_INTERFACE);
4056- QDBusPendingCall pending = iface.asyncCall("Watch");
4057- QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(pending, this);
4058- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(slotWatchFinished(QDBusPendingCallWatcher*)));
4059-}
4060-
4061-void IndicatorServiceManager::slotWatchFinished(QDBusPendingCallWatcher* watcher)
4062-{
4063- QDBusMessage message = watcher->reply();
4064- delete watcher;
4065- UQ_RETURN_IF_FAIL(message.type() == QDBusMessage::ReplyMessage);
4066- QVariantList args = message.arguments();
4067- UQ_RETURN_IF_FAIL(args.count() == 2);
4068-
4069- uint apiVersion = args.at(0).toUInt();
4070- uint serviceVersion = args.at(1).toUInt();
4071-
4072- if (apiVersion != INDICATOR_SERVICE_VERSION) {
4073- UQ_WARNING << "Expected api version=" << INDICATOR_SERVICE_VERSION << "got" << apiVersion << "instead";
4074- unwatchService();
4075- return;
4076- }
4077- if (serviceVersion != m_serviceVersion) {
4078- UQ_WARNING << "Expected service version=" << m_serviceVersion << "got" << serviceVersion << "instead";
4079- unwatchService();
4080- }
4081-}
4082-
4083-void IndicatorServiceManager::unwatchService()
4084-{
4085- QDBusInterface iface(m_serviceName, INDICATOR_SERVICE_OBJECT, INDICATOR_SERVICE_INTERFACE);
4086- iface.asyncCall("Unwatch");
4087-}
4088-
4089-void IndicatorServiceManager::slotServiceOwnerChanged(const QString& /*name*/, const QString& /*oldOwner*/, const QString& newOwner)
4090-{
4091- if (newOwner.isNull()) {
4092- // FIXME: Respawn
4093- } else {
4094- watchService();
4095- }
4096-}
4097-
4098-#include "indicatorservicemanager.moc"
4099
4100=== removed file 'panel/applets/indicator/indicatorservicemanager.h'
4101--- panel/applets/indicator/indicatorservicemanager.h 2011-01-15 01:41:03 +0000
4102+++ panel/applets/indicator/indicatorservicemanager.h 1970-01-01 00:00:00 +0000
4103@@ -1,54 +0,0 @@
4104-/*
4105- * This file is part of unity-2d
4106- *
4107- * Copyright 2010 Canonical Ltd.
4108- *
4109- * Authors:
4110- * - Aurélien Gâteau <aurelien.gateau@canonical.com>
4111- *
4112- * This program is free software; you can redistribute it and/or modify
4113- * it under the terms of the GNU General Public License as published by
4114- * the Free Software Foundation; version 3.
4115- *
4116- * This program is distributed in the hope that it will be useful,
4117- * but WITHOUT ANY WARRANTY; without even the implied warranty of
4118- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4119- * GNU General Public License for more details.
4120- *
4121- * You should have received a copy of the GNU General Public License
4122- * along with this program. If not, see <http://www.gnu.org/licenses/>.
4123- */
4124-
4125-#ifndef INDICATORSERVICEMANAGER_H
4126-#define INDICATORSERVICEMANAGER_H
4127-
4128-// Local
4129-
4130-// Qt
4131-#include <QObject>
4132-
4133-class QAction;
4134-class QDBusPendingCallWatcher;
4135-
4136-class IndicatorServiceManager : public QObject
4137-{
4138- Q_OBJECT
4139-public:
4140- IndicatorServiceManager(const char* name, uint version, QObject* parent=0);
4141- ~IndicatorServiceManager();
4142-
4143-private Q_SLOTS:
4144- void slotServiceOwnerChanged(const QString& name, const QString& oldOwner, const QString& newOwner);
4145- void slotWatchFinished(QDBusPendingCallWatcher*);
4146-
4147-private:
4148- Q_DISABLE_COPY(IndicatorServiceManager)
4149- QString m_serviceName;
4150- uint m_serviceVersion;
4151-
4152- void connectToService();
4153- void watchService();
4154- void unwatchService();
4155-};
4156-
4157-#endif /* INDICATORSERVICEMANAGER_H */
4158
4159=== removed directory 'panel/artwork'
4160=== removed file 'panel/artwork/background.png'
4161Binary files panel/artwork/background.png 2010-11-23 16:13:46 +0000 and panel/artwork/background.png 1970-01-01 00:00:00 +0000 differ
4162=== removed file 'panel/artwork/divider.png'
4163Binary files panel/artwork/divider.png 2010-11-23 16:13:46 +0000 and panel/artwork/divider.png 1970-01-01 00:00:00 +0000 differ

Subscribers

People subscribed via source and target branches