Merge lp:~gordallott/libunity-misc/port-to-gdk3-gtk3 into lp:libunity-misc

Proposed by Gord Allott
Status: Merged
Merge reported by: Neil J. Patel
Merged at revision: not available
Proposed branch: lp:~gordallott/libunity-misc/port-to-gdk3-gtk3
Merge into: lp:libunity-misc
Diff against target: 1303 lines (+438/-262)
10 files modified
configure.ac (+3/-3)
examples/Makefile.am (+4/-4)
gtk-doc.make (+39/-20)
unity-misc/fixedtip.c (+30/-17)
unity-misc/na-tray-child.c (+39/-48)
unity-misc/na-tray-child.h (+1/-1)
unity-misc/na-tray-manager.c (+218/-87)
unity-misc/na-tray-manager.h (+17/-0)
unity-misc/na-tray.c (+76/-72)
unity-misc/na-tray.h (+11/-10)
To merge this branch: bzr merge lp:~gordallott/libunity-misc/port-to-gdk3-gtk3
Reviewer Review Type Date Requested Status
Neil J. Patel (community) Approve
Review via email: mp+64820@code.launchpad.net

Description of the change

imports from the gnome-panel notification applet for the tray stuff to push us up to gtk/gdk3

To post a comment you must log in.
Revision history for this message
Neil J. Patel (njpatel) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configure.ac'
--- configure.ac 2011-02-17 17:42:41 +0000
+++ configure.ac 2011-06-16 13:19:23 +0000
@@ -68,9 +68,9 @@
68PKG_CHECK_MODULES(UNITY_MISC,68PKG_CHECK_MODULES(UNITY_MISC,
69 glib-2.0 >= 2.2269 glib-2.0 >= 2.22
70 gobject-2.0 >= 2.2270 gobject-2.0 >= 2.22
71 gdk-x11-2.0 >= 2.1871 gdk-x11-3.0 >= 3.0
72 gtk+-2.0 >= 2.1872 gtk+-3.0 >= 3.0
73 gtk+-x11-2.0 >= 2.1873 gtk+-x11-3.0 >= 3.0
74 )74 )
75AC_SUBST(UNITY_MISC_CFLAGS)75AC_SUBST(UNITY_MISC_CFLAGS)
76AC_SUBST(UNITY_MISC_LIBS)76AC_SUBST(UNITY_MISC_LIBS)
7777
=== modified file 'examples/Makefile.am'
--- examples/Makefile.am 2011-02-13 16:15:41 +0000
+++ examples/Makefile.am 2011-06-16 13:19:23 +0000
@@ -1,5 +1,5 @@
1noinst_PROGRAMS = \1#noinst_PROGRAMS = \
2 systray2# systray
33
4AM_CPPFLAGS = \4AM_CPPFLAGS = \
5 -I$(top_srcdir) \5 -I$(top_srcdir) \
@@ -8,5 +8,5 @@
8 $(UNITY_MISC_CFLAGS) \8 $(UNITY_MISC_CFLAGS) \
9 $(MAINTAINER_CFLAGS)9 $(MAINTAINER_CFLAGS)
1010
11systray_SOURCES = systray.c11#systray_SOURCES = systray.c
12systray_LDADD = $(top_builddir)/unity-misc/libunity-misc.la $(UNITY_MISC_LIBS)12#systray_LDADD = $(top_builddir)/unity-misc/libunity-misc.la $(UNITY_MISC_LIBS)
1313
=== modified file 'gtk-doc.make'
--- gtk-doc.make 2011-02-13 16:15:41 +0000
+++ gtk-doc.make 2011-06-16 13:19:23 +0000
@@ -23,13 +23,15 @@
2323
24TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)24TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
2525
26EXTRA_DIST = \26SETUP_FILES = \
27 $(content_files) \27 $(content_files) \
28 $(HTML_IMAGES) \
29 $(DOC_MAIN_SGML_FILE) \28 $(DOC_MAIN_SGML_FILE) \
30 $(DOC_MODULE)-sections.txt \29 $(DOC_MODULE)-sections.txt \
31 $(DOC_MODULE)-overrides.txt30 $(DOC_MODULE)-overrides.txt
3231
32EXTRA_DIST = \
33 $(SETUP_FILES)
34
33DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \35DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
34 html-build.stamp pdf-build.stamp \36 html-build.stamp pdf-build.stamp \
35 setup.stamp tmpl.stamp sgml.stamp html.stamp pdf.stamp37 setup.stamp tmpl.stamp sgml.stamp html.stamp pdf.stamp
@@ -71,17 +73,20 @@
7173
72#### setup ####74#### setup ####
7375
74setup-build.stamp::76setup-build.stamp:
75 -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \77 -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
76 cp -a $(abs_srcdir)/$(DOC_MAIN_SGML_FILE) $(abs_builddir)/; \78 echo 'gtk-doc: Preparing build'; \
77 cp -a $(abs_srcdir)/$(DOC_MODULE)* $(abs_builddir)/; \79 files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
78 if test "x$(content_files)" != "x" ; then \80 if test "x$$files" != "x" ; then \
79 for file in $(content_files) ; do \81 for file in $$files ; do \
80 test -f $(abs_srcdir)/$$file || \82 test -f $(abs_srcdir)/$$file && \
81 cp -a $(abs_srcdir)/$$file $(abs_builddir)/; \83 cp -p $(abs_srcdir)/$$file $(abs_builddir)/; \
82 done \84 done \
83 fi \85 fi; \
86 test -f $(abs_srcdir)/tmpl && \
87 cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \
84 fi88 fi
89 @touch setup-build.stamp
8590
8691
87setup.stamp: setup-build.stamp92setup.stamp: setup-build.stamp
@@ -92,7 +97,7 @@
9297
93scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)98scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
94 @echo 'gtk-doc: Scanning header files'99 @echo 'gtk-doc: Scanning header files'
95 @_source_dir='' ;100 @_source_dir='' ; \
96 for i in $(DOC_SOURCE_DIR) ; do \101 for i in $(DOC_SOURCE_DIR) ; do \
97 _source_dir="$${_source_dir} --source-dir=$$i" ; \102 _source_dir="$${_source_dir} --source-dir=$$i" ; \
98 done ; \103 done ; \
@@ -111,9 +116,14 @@
111116
112#### templates ####117#### templates ####
113118
114tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt119tmpl-build.stamp: setup.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
115 @echo 'gtk-doc: Rebuilding template files'120 @echo 'gtk-doc: Rebuilding template files'
116 @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)121 @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
122 @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
123 if test -w $(abs_srcdir) ; then \
124 cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \
125 fi \
126 fi
117 @touch tmpl-build.stamp127 @touch tmpl-build.stamp
118128
119tmpl.stamp: tmpl-build.stamp129tmpl.stamp: tmpl-build.stamp
@@ -149,7 +159,15 @@
149 mkhtml_options=--path="$(abs_srcdir)"; \159 mkhtml_options=--path="$(abs_srcdir)"; \
150 fi; \160 fi; \
151 cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)161 cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
152 @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html )162 -@test "x$(HTML_IMAGES)" = "x" || \
163 for file in $(HTML_IMAGES) ; do \
164 if test -f $(abs_srcdir)/$$file ; then \
165 cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
166 fi; \
167 if test -f $(abs_builddir)/$$file ; then \
168 cp $(abs_builddir)/$$file $(abs_builddir)/html; \
169 fi; \
170 done;
153 @echo 'gtk-doc: Fixing cross-references'171 @echo 'gtk-doc: Fixing cross-references'
154 @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)172 @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
155 @touch html-build.stamp173 @touch html-build.stamp
@@ -179,10 +197,11 @@
179 rm -rf .libs197 rm -rf .libs
180198
181distclean-local:199distclean-local:
182 rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \200 rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
183 $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt201 $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
184 if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \202 if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
185 rm -f $(DOC_MAIN_SGML_FILE) $(DOC_MODULE)*; \203 rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
204 rm -rf tmpl; \
186 fi205 fi
187206
188maintainer-clean-local: clean207maintainer-clean-local: clean
@@ -234,11 +253,11 @@
234dist-hook: dist-check-gtkdoc dist-hook-local253dist-hook: dist-check-gtkdoc dist-hook-local
235 mkdir $(distdir)/tmpl254 mkdir $(distdir)/tmpl
236 mkdir $(distdir)/html255 mkdir $(distdir)/html
237 -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl256 -cp $(build)/tmpl/*.sgml $(distdir)/tmpl
238 cp $(srcdir)/html/* $(distdir)/html257 cp $(builddir)/html/* $(distdir)/html
239 -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/258 -cp $(builddir)/$(DOC_MODULE).pdf $(distdir)/
240 -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/259 -cp $(build)/$(DOC_MODULE).types $(distdir)/
241 -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/260 -cp $(build)/$(DOC_MODULE)-sections.txt $(distdir)/
242 cd $(distdir) && rm -f $(DISTCLEANFILES)261 cd $(distdir) && rm -f $(DISTCLEANFILES)
243 $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html262 $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
244263
245264
=== modified file 'unity-misc/fixedtip.c'
--- unity-misc/fixedtip.c 2011-02-14 10:15:57 +0000
+++ unity-misc/fixedtip.c 2011-06-16 13:19:23 +0000
@@ -52,17 +52,29 @@
52}52}
5353
54static gboolean54static gboolean
55expose_handler (GtkWidget *fixedtip)55na_fixed_tip_draw (GtkWidget *widget, cairo_t *cr)
56{56{
57 GtkRequisition req;57 GtkStyleContext *context;
5858 GtkStateFlags state;
59 gtk_widget_size_request (fixedtip, &req);59 int width, height;
6060
61 gtk_paint_flat_box (gtk_widget_get_style (fixedtip),61 width = gtk_widget_get_allocated_width (widget);
62 gtk_widget_get_window (fixedtip),62 height = gtk_widget_get_allocated_height (widget);
63 GTK_STATE_NORMAL, GTK_SHADOW_OUT, 63
64 NULL, fixedtip, "tooltip",64 state = gtk_widget_get_state_flags (widget);
65 0, 0, req.width, req.height);65 context = gtk_widget_get_style_context (widget);
66 gtk_style_context_save (context);
67 gtk_style_context_add_class (context, GTK_STYLE_CLASS_TOOLTIP);
68 gtk_style_context_set_state (context, state);
69
70 cairo_save (cr);
71 gtk_render_background (context, cr,
72 0., 0.,
73 (gdouble)width,
74 (gdouble)height);
75 cairo_restore (cr);
76
77 gtk_style_context_restore (context);
6678
67 return FALSE;79 return FALSE;
68}80}
@@ -70,6 +82,10 @@
70static void82static void
71na_fixed_tip_class_init (NaFixedTipClass *class)83na_fixed_tip_class_init (NaFixedTipClass *class)
72{84{
85 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
86
87 widget_class->draw = na_fixed_tip_draw;
88
73 fixedtip_signals[CLICKED] =89 fixedtip_signals[CLICKED] =
74 g_signal_new ("clicked",90 g_signal_new ("clicked",
75 G_OBJECT_CLASS_TYPE (class),91 G_OBJECT_CLASS_TYPE (class),
@@ -106,11 +122,8 @@
106 gtk_container_add (GTK_CONTAINER (fixedtip), label);122 gtk_container_add (GTK_CONTAINER (fixedtip), label);
107 fixedtip->priv->label = label;123 fixedtip->priv->label = label;
108124
109 g_signal_connect (fixedtip, "expose_event",
110 G_CALLBACK (expose_handler), NULL);
111
112 gtk_widget_add_events (GTK_WIDGET (fixedtip), GDK_BUTTON_PRESS_MASK);125 gtk_widget_add_events (GTK_WIDGET (fixedtip), GDK_BUTTON_PRESS_MASK);
113 126
114 g_signal_connect (fixedtip, "button_press_event",127 g_signal_connect (fixedtip, "button_press_event",
115 G_CALLBACK (button_press_handler), NULL);128 G_CALLBACK (button_press_handler), NULL);
116129
@@ -135,11 +148,11 @@
135148
136 gtk_window_set_screen (GTK_WINDOW (fixedtip), screen);149 gtk_window_set_screen (GTK_WINDOW (fixedtip), screen);
137150
138 gtk_widget_size_request (GTK_WIDGET (fixedtip), &req);151 gtk_widget_get_preferred_size (GTK_WIDGET (fixedtip), &req, NULL);
139152
140 gdk_window_get_origin (parent_window, &root_x, &root_y);153 gdk_window_get_origin (parent_window, &root_x, &root_y);
141 gdk_drawable_get_size (GDK_DRAWABLE (parent_window),154 parent_width = gdk_window_get_width (parent_window);
142 &parent_width, &parent_height);155 parent_height = gdk_window_get_height (parent_window);
143156
144 screen_width = gdk_screen_get_width (screen);157 screen_width = gdk_screen_get_width (screen);
145 screen_height = gdk_screen_get_height (screen);158 screen_height = gdk_screen_get_height (screen);
146159
=== modified file 'unity-misc/na-tray-child.c'
--- unity-misc/na-tray-child.c 2011-02-14 10:15:57 +0000
+++ unity-misc/na-tray-child.c 2011-06-16 13:19:23 +0000
@@ -24,7 +24,6 @@
2424
25#include "na-tray-child.h"25#include "na-tray-child.h"
2626
27#include <glib/gi18n.h>
28#include <gdk/gdk.h>27#include <gdk/gdk.h>
29#include <gdk/gdkx.h>28#include <gdk/gdkx.h>
30#include <X11/Xatom.h>29#include <X11/Xatom.h>
@@ -54,17 +53,18 @@
54 * extension. */53 * extension. */
5554
56 /* Set a transparent background */55 /* Set a transparent background */
57 GdkColor transparent = { 0, 0, 0, 0 }; /* only pixel=0 matters */56 cairo_pattern_t *transparent = cairo_pattern_create_rgba (0, 0, 0, 0);
58 gdk_window_set_background (window, &transparent);57 gdk_window_set_background_pattern (window, transparent);
59 gdk_window_set_composited (window, TRUE);58 gdk_window_set_composited (window, TRUE);
59 cairo_pattern_destroy (transparent);
6060
61 child->parent_relative_bg = FALSE;61 child->parent_relative_bg = FALSE;
62 }62 }
63 else if (visual == gdk_drawable_get_visual (GDK_DRAWABLE (gdk_window_get_parent (window))))63 else if (visual == gdk_window_get_visual (gdk_window_get_parent (window)))
64 {64 {
65 /* Otherwise, if the visual matches the visual of the parent window, we65 /* Otherwise, if the visual matches the visual of the parent window, we
66 * can use a parent-relative background and fake transparency. */66 * can use a parent-relative background and fake transparency. */
67 gdk_window_set_back_pixmap (window, NULL, TRUE);67 gdk_window_set_background_pattern (window, NULL);
6868
69 child->parent_relative_bg = TRUE;69 child->parent_relative_bg = TRUE;
70 }70 }
@@ -172,32 +172,46 @@
172}172}
173173
174/* The plug window should completely occupy the area of the child, so we won't174/* The plug window should completely occupy the area of the child, so we won't
175 * get an expose event. But in case we do (the plug unmaps itself, say), this175 * get a draw event. But in case we do (the plug unmaps itself, say), this
176 * expose handler draws with real or fake transparency.176 * draw handler draws with real or fake transparency.
177 */177 */
178static gboolean178static gboolean
179na_tray_child_expose_event (GtkWidget *widget,179na_tray_child_draw (GtkWidget *widget,
180 GdkEventExpose *event)180 cairo_t *cr)
181{181{
182 NaTrayChild *child = NA_TRAY_CHILD (widget);182 NaTrayChild *child = NA_TRAY_CHILD (widget);
183 GdkWindow *window = gtk_widget_get_window (widget);
184183
185 if (na_tray_child_has_alpha (child))184 if (na_tray_child_has_alpha (child))
186 {185 {
187 /* Clear to transparent */186 /* Clear to transparent */
188 cairo_t *cr = gdk_cairo_create (window);
189 cairo_set_source_rgba (cr, 0, 0, 0, 0);187 cairo_set_source_rgba (cr, 0, 0, 0, 0);
190 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);188 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
191 gdk_cairo_region (cr, event->region);189 cairo_paint (cr);
192 cairo_fill (cr);
193 cairo_destroy (cr);
194 }190 }
195 else if (child->parent_relative_bg)191 else if (child->parent_relative_bg)
196 {192 {
197 /* Clear to parent-relative pixmap */193 GdkWindow *window;
198 gdk_window_clear_area (window,194 cairo_surface_t *target;
199 event->area.x, event->area.y,195 GdkRectangle clip_rect;
200 event->area.width, event->area.height);196
197 window = gtk_widget_get_window (widget);
198 target = cairo_get_group_target (cr);
199
200 gdk_cairo_get_clip_rectangle (cr, &clip_rect);
201
202 /* Clear to parent-relative pixmap
203 * We need to use direct X access here because GDK doesn't know about
204 * the parent relative pixmap. */
205 cairo_surface_flush (target);
206
207 XClearArea (GDK_WINDOW_XDISPLAY (window),
208 GDK_WINDOW_XID (window),
209 clip_rect.x, clip_rect.y,
210 clip_rect.width, clip_rect.height,
211 False);
212 cairo_surface_mark_dirty_rectangle (target,
213 clip_rect.x, clip_rect.y,
214 clip_rect.width, clip_rect.height);
201 }215 }
202216
203 return FALSE;217 return FALSE;
@@ -221,7 +235,7 @@
221 widget_class->style_set = na_tray_child_style_set;235 widget_class->style_set = na_tray_child_style_set;
222 widget_class->realize = na_tray_child_realize;236 widget_class->realize = na_tray_child_realize;
223 widget_class->size_allocate = na_tray_child_size_allocate;237 widget_class->size_allocate = na_tray_child_size_allocate;
224 widget_class->expose_event = na_tray_child_expose_event;238 widget_class->draw = na_tray_child_draw;
225}239}
226240
227GtkWidget *241GtkWidget *
@@ -233,8 +247,6 @@
233 NaTrayChild *child;247 NaTrayChild *child;
234 GdkVisual *visual;248 GdkVisual *visual;
235 gboolean visual_has_alpha;249 gboolean visual_has_alpha;
236 GdkColormap *colormap;
237 gboolean new_colormap;
238 int red_prec, green_prec, blue_prec, depth;250 int red_prec, green_prec, blue_prec, depth;
239 int result;251 int result;
240252
@@ -250,7 +262,7 @@
250 gdk_error_trap_push ();262 gdk_error_trap_push ();
251 result = XGetWindowAttributes (xdisplay, icon_window,263 result = XGetWindowAttributes (xdisplay, icon_window,
252 &window_attributes);264 &window_attributes);
253 gdk_error_trap_pop ();265 gdk_error_trap_pop_ignored ();
254266
255 if (!result) /* Window already gone */267 if (!result) /* Window already gone */
256 return NULL;268 return NULL;
@@ -260,24 +272,10 @@
260 if (!visual) /* Icon window is on another screen? */272 if (!visual) /* Icon window is on another screen? */
261 return NULL;273 return NULL;
262274
263 new_colormap = FALSE;
264
265 if (visual == gdk_screen_get_rgb_visual (screen))
266 colormap = gdk_screen_get_rgb_colormap (screen);
267 else if (visual == gdk_screen_get_rgba_visual (screen))
268 colormap = gdk_screen_get_rgba_colormap (screen);
269 else if (visual == gdk_screen_get_system_visual (screen))
270 colormap = gdk_screen_get_system_colormap (screen);
271 else
272 {
273 colormap = gdk_colormap_new (visual, FALSE);
274 new_colormap = TRUE;
275 }
276
277 child = g_object_new (NA_TYPE_TRAY_CHILD, NULL);275 child = g_object_new (NA_TYPE_TRAY_CHILD, NULL);
278 child->icon_window = icon_window;276 child->icon_window = icon_window;
279277
280 gtk_widget_set_colormap (GTK_WIDGET (child), colormap);278 gtk_widget_set_visual (GTK_WIDGET (child), visual);
281279
282 /* We have alpha if the visual has something other than red, green,280 /* We have alpha if the visual has something other than red, green,
283 * and blue */281 * and blue */
@@ -292,9 +290,6 @@
292290
293 child->composited = child->has_alpha;291 child->composited = child->has_alpha;
294292
295 if (new_colormap)
296 g_object_unref (colormap);
297
298 return GTK_WIDGET (child);293 return GTK_WIDGET (child);
299}294}
300295
@@ -422,7 +417,7 @@
422 gtk_widget_get_allocation (widget, &allocation);417 gtk_widget_get_allocation (widget, &allocation);
423418
424 xev.xexpose.type = Expose;419 xev.xexpose.type = Expose;
425 xev.xexpose.window = GDK_WINDOW_XWINDOW (plug_window);420 xev.xexpose.window = GDK_WINDOW_XID (plug_window);
426 xev.xexpose.x = 0;421 xev.xexpose.x = 0;
427 xev.xexpose.y = 0;422 xev.xexpose.y = 0;
428 xev.xexpose.width = allocation.width;423 xev.xexpose.width = allocation.width;
@@ -430,15 +425,11 @@
430 xev.xexpose.count = 0;425 xev.xexpose.count = 0;
431426
432 gdk_error_trap_push ();427 gdk_error_trap_push ();
433 XSendEvent (GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)),428 XSendEvent (xdisplay,
434 xev.xexpose.window,429 xev.xexpose.window,
435 False, ExposureMask,430 False, ExposureMask,
436 &xev);431 &xev);
437 /* We have to sync to reliably catch errors from the XSendEvent(),432 gdk_error_trap_pop_ignored ();
438 * since that is asynchronous.
439 */
440 XSync (xdisplay, False);
441 gdk_error_trap_pop ();
442#else433#else
443 /* Hiding and showing is the safe way to do it, but can result in more434 /* Hiding and showing is the safe way to do it, but can result in more
444 * flickering.435 * flickering.
@@ -482,7 +473,7 @@
482473
483 gdk_error_trap_push ();474 gdk_error_trap_push ();
484 XGetClassHint (xdisplay, xwindow, &ch);475 XGetClassHint (xdisplay, xwindow, &ch);
485 gdk_error_trap_pop ();476 gdk_error_trap_pop_ignored ();
486477
487 if (res_class)478 if (res_class)
488 *res_class = NULL;479 *res_class = NULL;
489480
=== modified file 'unity-misc/na-tray-child.h'
--- unity-misc/na-tray-child.h 2011-02-14 10:15:57 +0000
+++ unity-misc/na-tray-child.h 2011-06-16 13:19:23 +0000
@@ -24,7 +24,7 @@
24#define __NA_TRAY_CHILD_H__24#define __NA_TRAY_CHILD_H__
2525
26#include <gtk/gtk.h>26#include <gtk/gtk.h>
27#include <gdk/gdkx.h>27#include <gtk/gtkx.h>
2828
29G_BEGIN_DECLS29G_BEGIN_DECLS
3030
3131
=== modified file 'unity-misc/na-tray-manager.c'
--- unity-misc/na-tray-manager.c 2011-02-14 10:15:57 +0000
+++ unity-misc/na-tray-manager.c 2011-06-16 13:19:23 +0000
@@ -26,8 +26,6 @@
2626
27#include "na-tray-manager.h"27#include "na-tray-manager.h"
2828
29#include <gdkconfig.h>
30#include <glib/gi18n.h>
31#if defined (GDK_WINDOWING_X11)29#if defined (GDK_WINDOWING_X11)
32#include <gdk/gdkx.h>30#include <gdk/gdkx.h>
33#include <X11/Xatom.h>31#include <X11/Xatom.h>
@@ -98,6 +96,25 @@
98{96{
99 manager->invisible = NULL;97 manager->invisible = NULL;
100 manager->socket_table = g_hash_table_new (NULL, NULL);98 manager->socket_table = g_hash_table_new (NULL, NULL);
99
100 manager->padding = 0;
101 manager->icon_size = 0;
102
103 manager->fg.red = 0;
104 manager->fg.green = 0;
105 manager->fg.blue = 0;
106
107 manager->error.red = 0xffff;
108 manager->error.green = 0;
109 manager->error.blue = 0;
110
111 manager->warning.red = 0xffff;
112 manager->warning.green = 0xffff;
113 manager->warning.blue = 0;
114
115 manager->success.red = 0;
116 manager->success.green = 0xffff;
117 manager->success.blue = 0;
101}118}
102119
103static void120static void
@@ -299,8 +316,8 @@
299 if (!gtk_socket_get_plug_window (GTK_SOCKET (child)))316 if (!gtk_socket_get_plug_window (GTK_SOCKET (child)))
300 {317 {
301 /* Embedding failed, we won't get a plug-removed signal */318 /* Embedding failed, we won't get a plug-removed signal */
319 /* This signal destroys the socket */
302 g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, child);320 g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, child);
303 gtk_widget_destroy (child);
304 return;321 return;
305 }322 }
306323
@@ -316,19 +333,13 @@
316 g_free (message);333 g_free (message);
317}334}
318335
319static GdkFilterReturn336static void
320na_tray_manager_handle_client_message_message_data (GdkXEvent *xev,337na_tray_manager_handle_message_data (NaTrayManager *manager,
321 GdkEvent *event,338 XClientMessageEvent *xevent)
322 gpointer data)
323{339{
324 XClientMessageEvent *xevent;340 GList *p;
325 NaTrayManager *manager;341 int len;
326 GList *p;
327 int len;
328 342
329 xevent = (XClientMessageEvent *) xev;
330 manager = data;
331
332 /* Try to see if we can find the pending message in the list */343 /* Try to see if we can find the pending message in the list */
333 for (p = manager->messages; p; p = p->next)344 for (p = manager->messages; p; p = p->next)
334 {345 {
@@ -362,8 +373,6 @@
362 break;373 break;
363 }374 }
364 }375 }
365
366 return GDK_FILTER_REMOVE;
367}376}
368377
369static void378static void
@@ -383,13 +392,17 @@
383 if (!socket)392 if (!socket)
384 return;393 return;
385394
395 timeout = xevent->data.l[2];
396 len = xevent->data.l[3];
397 id = xevent->data.l[4];
398
386 /* Check if the same message is already in the queue and remove it if so */399 /* Check if the same message is already in the queue and remove it if so */
387 for (p = manager->messages; p; p = p->next)400 for (p = manager->messages; p; p = p->next)
388 {401 {
389 PendingMessage *pmsg = p->data;402 PendingMessage *pmsg = p->data;
390403
391 if (xevent->window == pmsg->window &&404 if (xevent->window == pmsg->window &&
392 xevent->data.l[4] == pmsg->id)405 id == pmsg->id)
393 {406 {
394 /* Hmm, we found it, now remove it */407 /* Hmm, we found it, now remove it */
395 pending_message_free (pmsg);408 pending_message_free (pmsg);
@@ -399,10 +412,6 @@
399 }412 }
400 }413 }
401414
402 timeout = xevent->data.l[2];
403 len = xevent->data.l[3];
404 id = xevent->data.l[4];
405
406 if (len == 0)415 if (len == 0)
407 {416 {
408 g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0,417 g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0,
@@ -429,6 +438,9 @@
429{438{
430 GList *p;439 GList *p;
431 GtkSocket *socket;440 GtkSocket *socket;
441 long id;
442
443 id = xevent->data.l[2];
432 444
433 /* Check if the message is in the queue and remove it if so */445 /* Check if the message is in the queue and remove it if so */
434 for (p = manager->messages; p; p = p->next)446 for (p = manager->messages; p; p = p->next)
@@ -436,7 +448,7 @@
436 PendingMessage *msg = p->data;448 PendingMessage *msg = p->data;
437449
438 if (xevent->window == msg->window &&450 if (xevent->window == msg->window &&
439 xevent->data.l[4] == msg->id)451 id == msg->id)
440 {452 {
441 pending_message_free (msg);453 pending_message_free (msg);
442 manager->messages = g_list_remove_link (manager->messages, p);454 manager->messages = g_list_remove_link (manager->messages, p);
@@ -456,39 +468,6 @@
456}468}
457469
458static GdkFilterReturn470static GdkFilterReturn
459na_tray_manager_handle_client_message_opcode (GdkXEvent *xev,
460 GdkEvent *event,
461 gpointer data)
462{
463 XClientMessageEvent *xevent;
464 NaTrayManager *manager;
465
466 xevent = (XClientMessageEvent *) xev;
467 manager = data;
468
469 switch (xevent->data.l[1])
470 {
471 case SYSTEM_TRAY_REQUEST_DOCK:
472 /* Ignore this one since we don't know on which window this was received
473 * and so we can't know for which screen this is. It will be handled
474 * in na_tray_manager_window_filter() since we also receive it there */
475 break;
476
477 case SYSTEM_TRAY_BEGIN_MESSAGE:
478 na_tray_manager_handle_begin_message (manager, xevent);
479 return GDK_FILTER_REMOVE;
480
481 case SYSTEM_TRAY_CANCEL_MESSAGE:
482 na_tray_manager_handle_cancel_message (manager, xevent);
483 return GDK_FILTER_REMOVE;
484 default:
485 break;
486 }
487
488 return GDK_FILTER_CONTINUE;
489}
490
491static GdkFilterReturn
492na_tray_manager_window_filter (GdkXEvent *xev,471na_tray_manager_window_filter (GdkXEvent *xev,
493 GdkEvent *event,472 GdkEvent *event,
494 gpointer data)473 gpointer data)
@@ -498,8 +477,7 @@
498477
499 if (xevent->type == ClientMessage)478 if (xevent->type == ClientMessage)
500 {479 {
501 /* We handle this client message here. See comment in480 /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_REQUEST_DOCK */
502 * na_tray_manager_handle_client_message_opcode() for details */
503 if (xevent->xclient.message_type == manager->opcode_atom &&481 if (xevent->xclient.message_type == manager->opcode_atom &&
504 xevent->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK)482 xevent->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK)
505 {483 {
@@ -507,6 +485,29 @@
507 (XClientMessageEvent *) xevent);485 (XClientMessageEvent *) xevent);
508 return GDK_FILTER_REMOVE;486 return GDK_FILTER_REMOVE;
509 }487 }
488 /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_BEGIN_MESSAGE */
489 else if (xevent->xclient.message_type == manager->opcode_atom &&
490 xevent->xclient.data.l[1] == SYSTEM_TRAY_BEGIN_MESSAGE)
491 {
492 na_tray_manager_handle_begin_message (manager,
493 (XClientMessageEvent *) event);
494 return GDK_FILTER_REMOVE;
495 }
496 /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_CANCEL_MESSAGE */
497 else if (xevent->xclient.message_type == manager->opcode_atom &&
498 xevent->xclient.data.l[1] == SYSTEM_TRAY_CANCEL_MESSAGE)
499 {
500 na_tray_manager_handle_cancel_message (manager,
501 (XClientMessageEvent *) event);
502 return GDK_FILTER_REMOVE;
503 }
504 /* _NET_SYSTEM_TRAY_MESSAGE_DATA */
505 else if (xevent->xclient.message_type == manager->message_data_atom)
506 {
507 na_tray_manager_handle_message_data (manager,
508 (XClientMessageEvent *) event);
509 return GDK_FILTER_REMOVE;
510 }
510 }511 }
511 else if (xevent->type == SelectionClear)512 else if (xevent->type == SelectionClear)
512 {513 {
@@ -564,9 +565,6 @@
564 TRUE);565 TRUE);
565 }566 }
566567
567 //FIXME: we should also use gdk_remove_client_message_filter when it's
568 //available
569 // See bug #351254
570 gdk_window_remove_filter (window,568 gdk_window_remove_filter (window,
571 na_tray_manager_window_filter, manager); 569 na_tray_manager_window_filter, manager);
572570
@@ -585,11 +583,9 @@
585 Atom orientation_atom;583 Atom orientation_atom;
586 gulong data[1];584 gulong data[1];
587585
588 if (!manager->invisible)586 g_return_if_fail (manager->invisible != NULL);
589 return;
590 window = gtk_widget_get_window (manager->invisible);587 window = gtk_widget_get_window (manager->invisible);
591 if (!window)588 g_return_if_fail (window != NULL);
592 return;
593589
594 display = gtk_widget_get_display (manager->invisible);590 display = gtk_widget_get_display (manager->invisible);
595 orientation_atom = gdk_x11_get_xatom_by_name_for_display (display,591 orientation_atom = gdk_x11_get_xatom_by_name_for_display (display,
@@ -600,7 +596,7 @@
600 SYSTEM_TRAY_ORIENTATION_VERT;596 SYSTEM_TRAY_ORIENTATION_VERT;
601597
602 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),598 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
603 GDK_WINDOW_XWINDOW (window),599 GDK_WINDOW_XID (window),
604 orientation_atom,600 orientation_atom,
605 XA_CARDINAL, 32,601 XA_CARDINAL, 32,
606 PropModeReplace,602 PropModeReplace,
@@ -618,11 +614,9 @@
618 Atom visual_atom;614 Atom visual_atom;
619 gulong data[1];615 gulong data[1];
620616
621 if (!manager->invisible)617 g_return_if_fail (manager->invisible != NULL);
622 return;
623 window = gtk_widget_get_window (manager->invisible);618 window = gtk_widget_get_window (manager->invisible);
624 if (!window)619 g_return_if_fail (window != NULL);
625 return;
626620
627 /* The visual property is a hint to the tray icons as to what visual they621 /* The visual property is a hint to the tray icons as to what visual they
628 * should use for their windows. If the X server has RGBA colormaps, then622 * should use for their windows. If the X server has RGBA colormaps, then
@@ -638,25 +632,20 @@
638632
639 if (gdk_screen_get_rgba_visual (manager->screen) != NULL &&633 if (gdk_screen_get_rgba_visual (manager->screen) != NULL &&
640 gdk_display_supports_composite (display))634 gdk_display_supports_composite (display))
641 {635 xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (manager->screen));
642 xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (manager->screen));
643 }
644 else636 else
645 {637 {
646 /* We actually want the visual of the tray where the icons will638 /* We actually want the visual of the tray where the icons will
647 * be embedded. In almost all cases, this will be the same as the visual639 * be embedded. In almost all cases, this will be the same as the visual
648 * of the screen.640 * of the screen.
649 */641 */
650 GdkColormap *colormap;642 xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_system_visual (manager->screen));
651
652 colormap = gdk_screen_get_default_colormap (manager->screen);
653 xvisual = GDK_VISUAL_XVISUAL (gdk_colormap_get_visual (colormap));
654 }643 }
655644
656 data[0] = XVisualIDFromVisual (xvisual);645 data[0] = XVisualIDFromVisual (xvisual);
657646
658 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),647 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
659 GDK_WINDOW_XWINDOW (window),648 GDK_WINDOW_XID (window),
660 visual_atom,649 visual_atom,
661 XA_VISUALID, 32,650 XA_VISUALID, 32,
662 PropModeReplace,651 PropModeReplace,
@@ -664,6 +653,101 @@
664#endif653#endif
665}654}
666655
656static void
657na_tray_manager_set_padding_property (NaTrayManager *manager)
658{
659#ifdef GDK_WINDOWING_X11
660 GdkWindow *window;
661 GdkDisplay *display;
662 Atom atom;
663 gulong data[1];
664
665 g_return_if_fail (manager->invisible != NULL);
666 window = gtk_widget_get_window (manager->invisible);
667 g_return_if_fail (window != NULL);
668
669 display = gtk_widget_get_display (manager->invisible);
670 atom = gdk_x11_get_xatom_by_name_for_display (display,
671 "_NET_SYSTEM_TRAY_PADDING");
672
673 data[0] = manager->padding;
674
675 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
676 GDK_WINDOW_XID (window),
677 atom,
678 XA_CARDINAL, 32,
679 PropModeReplace,
680 (guchar *) &data, 1);
681#endif
682}
683
684static void
685na_tray_manager_set_icon_size_property (NaTrayManager *manager)
686{
687#ifdef GDK_WINDOWING_X11
688 GdkWindow *window;
689 GdkDisplay *display;
690 Atom atom;
691 gulong data[1];
692
693 g_return_if_fail (manager->invisible != NULL);
694 window = gtk_widget_get_window (manager->invisible);
695 g_return_if_fail (window != NULL);
696
697 display = gtk_widget_get_display (manager->invisible);
698 atom = gdk_x11_get_xatom_by_name_for_display (display,
699 "_NET_SYSTEM_TRAY_ICON_SIZE");
700
701 data[0] = manager->icon_size;
702
703 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
704 GDK_WINDOW_XID (window),
705 atom,
706 XA_CARDINAL, 32,
707 PropModeReplace,
708 (guchar *) &data, 1);
709#endif
710}
711
712static void
713na_tray_manager_set_colors_property (NaTrayManager *manager)
714{
715#ifdef GDK_WINDOWING_X11
716 GdkWindow *window;
717 GdkDisplay *display;
718 Atom atom;
719 gulong data[12];
720
721 g_return_if_fail (manager->invisible != NULL);
722 window = gtk_widget_get_window (manager->invisible);
723 g_return_if_fail (window != NULL);
724
725 display = gtk_widget_get_display (manager->invisible);
726 atom = gdk_x11_get_xatom_by_name_for_display (display,
727 "_NET_SYSTEM_TRAY_COLORS");
728
729 data[0] = manager->fg.red;
730 data[1] = manager->fg.green;
731 data[2] = manager->fg.blue;
732 data[3] = manager->error.red;
733 data[4] = manager->error.green;
734 data[5] = manager->error.blue;
735 data[6] = manager->warning.red;
736 data[7] = manager->warning.green;
737 data[8] = manager->warning.blue;
738 data[9] = manager->success.red;
739 data[10] = manager->success.green;
740 data[11] = manager->success.blue;
741
742 XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
743 GDK_WINDOW_XID (window),
744 atom,
745 XA_CARDINAL, 32,
746 PropModeReplace,
747 (guchar *) &data, 12);
748#endif
749}
750
667#ifdef GDK_WINDOWING_X11751#ifdef GDK_WINDOWING_X11
668752
669static gboolean753static gboolean
@@ -709,6 +793,9 @@
709793
710 na_tray_manager_set_orientation_property (manager);794 na_tray_manager_set_orientation_property (manager);
711 na_tray_manager_set_visual_property (manager);795 na_tray_manager_set_visual_property (manager);
796 na_tray_manager_set_padding_property (manager);
797 na_tray_manager_set_icon_size_property (manager);
798 na_tray_manager_set_colors_property (manager);
712 799
713 window = gtk_widget_get_window (invisible);800 window = gtk_widget_get_window (invisible);
714801
@@ -734,7 +821,7 @@
734 xev.data.l[0] = timestamp;821 xev.data.l[0] = timestamp;
735 xev.data.l[1] = gdk_x11_atom_to_xatom_for_display (display,822 xev.data.l[1] = gdk_x11_atom_to_xatom_for_display (display,
736 manager->selection_atom);823 manager->selection_atom);
737 xev.data.l[2] = GDK_WINDOW_XWINDOW (window);824 xev.data.l[2] = GDK_WINDOW_XID (window);
738 xev.data.l[3] = 0; /* manager specific data */825 xev.data.l[3] = 0; /* manager specific data */
739 xev.data.l[4] = 0; /* manager specific data */826 xev.data.l[4] = 0; /* manager specific data */
740827
@@ -748,6 +835,8 @@
748835
749 message_data_atom = gdk_atom_intern ("_NET_SYSTEM_TRAY_MESSAGE_DATA",836 message_data_atom = gdk_atom_intern ("_NET_SYSTEM_TRAY_MESSAGE_DATA",
750 FALSE);837 FALSE);
838 manager->message_data_atom = gdk_x11_atom_to_xatom_for_display (display,
839 message_data_atom);
751840
752 /* Add a window filter */841 /* Add a window filter */
753#if 0842#if 0
@@ -756,17 +845,8 @@
756 G_CALLBACK (na_tray_manager_selection_clear_event),845 G_CALLBACK (na_tray_manager_selection_clear_event),
757 manager);846 manager);
758#endif847#endif
759 /* This is for SYSTEM_TRAY_REQUEST_DOCK and SelectionClear */
760 gdk_window_add_filter (window,848 gdk_window_add_filter (window,
761 na_tray_manager_window_filter, manager);849 na_tray_manager_window_filter, manager);
762 /* This is for SYSTEM_TRAY_BEGIN_MESSAGE and SYSTEM_TRAY_CANCEL_MESSAGE */
763 gdk_display_add_client_message_filter (display, opcode_atom,
764 na_tray_manager_handle_client_message_opcode,
765 manager);
766 /* This is for _NET_SYSTEM_TRAY_MESSAGE_DATA */
767 gdk_display_add_client_message_filter (display, message_data_atom,
768 na_tray_manager_handle_client_message_message_data,
769 manager);
770 return TRUE;850 return TRUE;
771 }851 }
772 else852 else
@@ -850,6 +930,57 @@
850 }930 }
851}931}
852932
933void
934na_tray_manager_set_padding (NaTrayManager *manager,
935 gint padding)
936{
937 g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
938
939 if (manager->padding != padding)
940 {
941 manager->padding = padding;
942
943 na_tray_manager_set_padding_property (manager);
944 }
945}
946
947void
948na_tray_manager_set_icon_size (NaTrayManager *manager,
949 gint icon_size)
950{
951 g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
952
953 if (manager->icon_size != icon_size)
954 {
955 manager->icon_size = icon_size;
956
957 na_tray_manager_set_icon_size_property (manager);
958 }
959}
960
961void
962na_tray_manager_set_colors (NaTrayManager *manager,
963 GdkColor *fg,
964 GdkColor *error,
965 GdkColor *warning,
966 GdkColor *success)
967{
968 g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
969
970 if (!gdk_color_equal (&manager->fg, fg) ||
971 !gdk_color_equal (&manager->error, error) ||
972 !gdk_color_equal (&manager->warning, warning) ||
973 !gdk_color_equal (&manager->success, success))
974 {
975 manager->fg = *fg;
976 manager->error = *error;
977 manager->warning = *warning;
978 manager->success = *success;
979
980 na_tray_manager_set_colors_property (manager);
981 }
982}
983
853GtkOrientation984GtkOrientation
854na_tray_manager_get_orientation (NaTrayManager *manager)985na_tray_manager_get_orientation (NaTrayManager *manager)
855{986{
856987
=== modified file 'unity-misc/na-tray-manager.h'
--- unity-misc/na-tray-manager.h 2010-01-12 11:34:41 +0000
+++ unity-misc/na-tray-manager.h 2011-06-16 13:19:23 +0000
@@ -50,11 +50,18 @@
50#ifdef GDK_WINDOWING_X1150#ifdef GDK_WINDOWING_X11
51 GdkAtom selection_atom;51 GdkAtom selection_atom;
52 Atom opcode_atom;52 Atom opcode_atom;
53 Atom message_data_atom;
53#endif54#endif
54 55
55 GtkWidget *invisible;56 GtkWidget *invisible;
56 GdkScreen *screen;57 GdkScreen *screen;
57 GtkOrientation orientation;58 GtkOrientation orientation;
59 gint padding;
60 gint icon_size;
61 GdkColor fg;
62 GdkColor error;
63 GdkColor warning;
64 GdkColor success;
5865
59 GList *messages;66 GList *messages;
60 GHashTable *socket_table;67 GHashTable *socket_table;
@@ -91,6 +98,16 @@
91void na_tray_manager_set_orientation (NaTrayManager *manager,98void na_tray_manager_set_orientation (NaTrayManager *manager,
92 GtkOrientation orientation);99 GtkOrientation orientation);
93GtkOrientation na_tray_manager_get_orientation (NaTrayManager *manager);100GtkOrientation na_tray_manager_get_orientation (NaTrayManager *manager);
101void na_tray_manager_set_padding (NaTrayManager *manager,
102 gint padding);
103void na_tray_manager_set_icon_size (NaTrayManager *manager,
104 gint padding);
105void na_tray_manager_set_colors (NaTrayManager *manager,
106 GdkColor *fg,
107 GdkColor *error,
108 GdkColor *warning,
109 GdkColor *success);
110
94111
95G_END_DECLS112G_END_DECLS
96113
97114
=== modified file 'unity-misc/na-tray.c'
--- unity-misc/na-tray.c 2011-02-14 20:01:14 +0000
+++ unity-misc/na-tray.c 2011-06-16 13:19:23 +0000
@@ -29,7 +29,7 @@
2929
30#include "na-tray.h"30#include "na-tray.h"
3131
32#define ICON_SPACING 332#define ICON_SPACING 1
33#define MIN_BOX_SIZE 333#define MIN_BOX_SIZE 3
3434
35typedef struct35typedef struct
@@ -51,9 +51,6 @@
51 guint idle_redraw_id;51 guint idle_redraw_id;
5252
53 GtkOrientation orientation;53 GtkOrientation orientation;
54
55 NaTrayFilterCallback cb;
56 gpointer data;
57};54};
5855
59typedef struct56typedef struct
@@ -85,25 +82,6 @@
8582
86static void icon_tip_show_next (IconTip *icontip);83static void icon_tip_show_next (IconTip *icontip);
8784
88/* NaBox, an instantiable GtkBox */
89
90typedef GtkBox NaBox;
91typedef GtkBoxClass NaBoxClass;
92
93static GType na_box_get_type (void);
94
95G_DEFINE_TYPE (NaBox, na_box, GTK_TYPE_BOX)
96
97static void
98na_box_init (NaBox *box)
99{
100}
101
102static void
103na_box_class_init (NaBoxClass *klass)
104{
105}
106
107/* NaTray */85/* NaTray */
10886
109G_DEFINE_TYPE (NaTray, na_tray, GTK_TYPE_BIN)87G_DEFINE_TYPE (NaTray, na_tray, GTK_TYPE_BIN)
@@ -233,11 +211,6 @@
233211
234 g_assert (priv->trays_screen == trays_screen);212 g_assert (priv->trays_screen == trays_screen);
235213
236 if (priv->cb && !priv->cb (tray, icon, priv->data))
237 {
238 return;
239 }
240
241 g_hash_table_insert (trays_screen->icon_table, icon, tray);214 g_hash_table_insert (trays_screen->icon_table, icon, tray);
242215
243 position = find_icon_position (tray, icon);216 position = find_icon_position (tray, icon);
@@ -253,13 +226,18 @@
253 TraysScreen *trays_screen)226 TraysScreen *trays_screen)
254{227{
255 NaTray *tray;228 NaTray *tray;
229 NaTrayPrivate *priv;
256230
257 tray = g_hash_table_lookup (trays_screen->icon_table, icon);231 tray = g_hash_table_lookup (trays_screen->icon_table, icon);
258 if (tray == NULL)232 if (tray == NULL)
259 return;233 return;
260234
235 priv = tray->priv;
236
261 g_assert (tray->priv->trays_screen == trays_screen);237 g_assert (tray->priv->trays_screen == trays_screen);
262238
239 gtk_container_remove (GTK_CONTAINER (priv->box), icon);
240
263 g_hash_table_remove (trays_screen->icon_table, icon);241 g_hash_table_remove (trays_screen->icon_table, icon);
264 /* this will also destroy the tip associated to this icon */242 /* this will also destroy the tip associated to this icon */
265 g_hash_table_remove (trays_screen->tip_table, icon);243 g_hash_table_remove (trays_screen->tip_table, icon);
@@ -533,10 +511,10 @@
533 * gdk_window_set_composited(). We need to paint these children ourselves.511 * gdk_window_set_composited(). We need to paint these children ourselves.
534 */512 */
535static void513static void
536na_tray_expose_icon (GtkWidget *widget,514na_tray_draw_icon (GtkWidget *widget,
537 gpointer data)515 gpointer data)
538{516{
539 cairo_t *cr = data;517 cairo_t *cr = (cairo_t *) data;
540518
541 if (na_tray_child_has_alpha (NA_TRAY_CHILD (widget)))519 if (na_tray_child_has_alpha (NA_TRAY_CHILD (widget)))
542 {520 {
@@ -544,26 +522,23 @@
544522
545 gtk_widget_get_allocation (widget, &allocation);523 gtk_widget_get_allocation (widget, &allocation);
546524
547 gdk_cairo_set_source_pixmap (cr,525 cairo_save (cr);
526 gdk_cairo_set_source_window (cr,
548 gtk_widget_get_window (widget),527 gtk_widget_get_window (widget),
549 allocation.x,528 allocation.x,
550 allocation.y);529 allocation.y);
530 cairo_rectangle (cr, allocation.x, allocation.y, allocation.width, allocation.height);
531 cairo_clip (cr);
551 cairo_paint (cr);532 cairo_paint (cr);
533 cairo_restore (cr);
552 }534 }
553}535}
554536
555static void537static void
556na_tray_expose_box (GtkWidget *box,538na_tray_draw_box (GtkWidget *box,
557 GdkEventExpose *event)539 cairo_t *cr)
558{540{
559 cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (box));541 gtk_container_foreach (GTK_CONTAINER (box), na_tray_draw_icon, cr);
560
561 gdk_cairo_region (cr, event->region);
562 cairo_clip (cr);
563
564 gtk_container_foreach (GTK_CONTAINER (box), na_tray_expose_icon, cr);
565
566 cairo_destroy (cr);
567}542}
568543
569static void544static void
@@ -580,10 +555,9 @@
580 gtk_container_add (GTK_CONTAINER (tray), priv->frame);555 gtk_container_add (GTK_CONTAINER (tray), priv->frame);
581 gtk_widget_show (priv->frame);556 gtk_widget_show (priv->frame);
582557
583 priv->box = g_object_new (na_box_get_type (), NULL);558 priv->box = gtk_box_new (priv->orientation, ICON_SPACING);
584 g_signal_connect (priv->box, "expose-event",559 g_signal_connect (priv->box, "draw",
585 G_CALLBACK (na_tray_expose_box), tray);560 G_CALLBACK (na_tray_draw_box), NULL);
586 gtk_box_set_spacing (GTK_BOX (priv->box), ICON_SPACING);
587 gtk_container_add (GTK_CONTAINER (priv->frame), priv->box);561 gtk_container_add (GTK_CONTAINER (priv->frame), priv->box);
588 gtk_widget_show (priv->box);562 gtk_widget_show (priv->box);
589}563}
@@ -736,10 +710,23 @@
736}710}
737711
738static void712static void
739na_tray_size_request (GtkWidget *widget,713na_tray_get_preferred_width (GtkWidget *widget,
740 GtkRequisition *requisition)714 gint *minimal_width,
741{715 gint *natural_width)
742 gtk_widget_size_request (gtk_bin_get_child (GTK_BIN (widget)), requisition);716{
717 gtk_widget_get_preferred_width (gtk_bin_get_child (GTK_BIN (widget)),
718 minimal_width,
719 natural_width);
720}
721
722static void
723na_tray_get_preferred_height (GtkWidget *widget,
724 gint *minimal_height,
725 gint *natural_height)
726{
727 gtk_widget_get_preferred_height (gtk_bin_get_child (GTK_BIN (widget)),
728 minimal_height,
729 natural_height);
743}730}
744731
745static void732static void
@@ -747,6 +734,7 @@
747 GtkAllocation *allocation)734 GtkAllocation *allocation)
748{735{
749 gtk_widget_size_allocate (gtk_bin_get_child (GTK_BIN (widget)), allocation);736 gtk_widget_size_allocate (gtk_bin_get_child (GTK_BIN (widget)), allocation);
737 gtk_widget_set_allocation (widget, allocation);
750}738}
751739
752static void740static void
@@ -758,8 +746,8 @@
758 gobject_class->constructor = na_tray_constructor;746 gobject_class->constructor = na_tray_constructor;
759 gobject_class->set_property = na_tray_set_property;747 gobject_class->set_property = na_tray_set_property;
760 gobject_class->dispose = na_tray_dispose;748 gobject_class->dispose = na_tray_dispose;
761749 widget_class->get_preferred_width = na_tray_get_preferred_width;
762 widget_class->size_request = na_tray_size_request;750 widget_class->get_preferred_height = na_tray_get_preferred_height;
763 widget_class->size_allocate = na_tray_size_allocate;751 widget_class->size_allocate = na_tray_size_allocate;
764752
765 g_object_class_install_property753 g_object_class_install_property
@@ -789,22 +777,13 @@
789}777}
790778
791NaTray *779NaTray *
792na_tray_new_for_screen (GdkScreen *screen,780na_tray_new_for_screen (GdkScreen *screen,
793 GtkOrientation orientation,781 GtkOrientation orientation)
794 NaTrayFilterCallback cb,
795 gpointer data)
796{782{
797 NaTray *tray;783 return g_object_new (NA_TYPE_TRAY,
798
799 tray = g_object_new (NA_TYPE_TRAY,
800 "screen", screen,784 "screen", screen,
801 "orientation", orientation,785 "orientation", orientation,
802 NULL);786 NULL);
803
804 tray->priv->cb = cb;
805 tray->priv->data = data;
806
807 return tray;
808}787}
809788
810void789void
@@ -840,6 +819,39 @@
840}819}
841820
842void821void
822na_tray_set_padding (NaTray *tray,
823 gint padding)
824{
825 NaTrayPrivate *priv = tray->priv;
826
827 if (get_tray (priv->trays_screen) == tray)
828 na_tray_manager_set_padding (priv->trays_screen->tray_manager, padding);
829}
830
831void
832na_tray_set_icon_size (NaTray *tray,
833 gint size)
834{
835 NaTrayPrivate *priv = tray->priv;
836
837 if (get_tray (priv->trays_screen) == tray)
838 na_tray_manager_set_icon_size (priv->trays_screen->tray_manager, size);
839}
840
841void
842na_tray_set_colors (NaTray *tray,
843 GdkColor *fg,
844 GdkColor *error,
845 GdkColor *warning,
846 GdkColor *success)
847{
848 NaTrayPrivate *priv = tray->priv;
849
850 if (get_tray (priv->trays_screen) == tray)
851 na_tray_manager_set_colors (priv->trays_screen->tray_manager, fg, error, warning, success);
852}
853
854void
843na_tray_force_redraw (NaTray *tray)855na_tray_force_redraw (NaTray *tray)
844{856{
845 NaTrayPrivate *priv = tray->priv;857 NaTrayPrivate *priv = tray->priv;
@@ -849,11 +861,3 @@
849 if (priv->idle_redraw_id == 0)861 if (priv->idle_redraw_id == 0)
850 priv->idle_redraw_id = g_idle_add ((GSourceFunc) idle_redraw_cb, tray);862 priv->idle_redraw_id = g_idle_add ((GSourceFunc) idle_redraw_cb, tray);
851}863}
852
853NaTrayManager *
854na_tray_get_manager (NaTray *tray)
855{
856 g_return_val_if_fail (NA_IS_TRAY (tray), NULL);
857
858 return tray->priv->trays_screen->tray_manager;
859}
860864
=== modified file 'unity-misc/na-tray.h'
--- unity-misc/na-tray.h 2011-02-14 20:01:14 +0000
+++ unity-misc/na-tray.h 2011-06-16 13:19:23 +0000
@@ -29,8 +29,6 @@
29#endif29#endif
30#include <gtk/gtk.h>30#include <gtk/gtk.h>
3131
32#include <unity-misc/na-tray-manager.h>
33
34G_BEGIN_DECLS32G_BEGIN_DECLS
3533
36#define NA_TYPE_TRAY (na_tray_get_type ())34#define NA_TYPE_TRAY (na_tray_get_type ())
@@ -44,8 +42,6 @@
44typedef struct _NaTrayPrivate NaTrayPrivate;42typedef struct _NaTrayPrivate NaTrayPrivate;
45typedef struct _NaTrayClass NaTrayClass;43typedef struct _NaTrayClass NaTrayClass;
4644
47typedef gboolean (*NaTrayFilterCallback) (NaTray *tray, GtkWidget *icon, gpointer data);
48
49struct _NaTray45struct _NaTray
50{46{
51 GtkBin parent_instance;47 GtkBin parent_instance;
@@ -59,17 +55,22 @@
59};55};
6056
61GType na_tray_get_type (void);57GType na_tray_get_type (void);
62NaTray *na_tray_new_for_screen (GdkScreen *screen,58NaTray *na_tray_new_for_screen (GdkScreen *screen,
63 GtkOrientation orientation,59 GtkOrientation orientation);
64 NaTrayFilterCallback cb,
65 gpointer data);
66void na_tray_set_orientation (NaTray *tray,60void na_tray_set_orientation (NaTray *tray,
67 GtkOrientation orientation);61 GtkOrientation orientation);
68GtkOrientation na_tray_get_orientation (NaTray *tray);62GtkOrientation na_tray_get_orientation (NaTray *tray);
63void na_tray_set_padding (NaTray *tray,
64 gint padding);
65void na_tray_set_icon_size (NaTray *tray,
66 gint icon_size);
67void na_tray_set_colors (NaTray *tray,
68 GdkColor *fg,
69 GdkColor *error,
70 GdkColor *warning,
71 GdkColor *success);
69void na_tray_force_redraw (NaTray *tray);72void na_tray_force_redraw (NaTray *tray);
7073
71NaTrayManager * na_tray_get_manager (NaTray *tray);
72
73G_END_DECLS74G_END_DECLS
7475
75#endif /* __NA_TRAY_H__ */76#endif /* __NA_TRAY_H__ */

Subscribers

People subscribed via source and target branches

to all changes: