Merge lp:~macslow/notify-osd/gravity into lp:notify-osd/trunk

Proposed by Mirco Müller
Status: Merged
Merged at revision: not available
Proposed branch: lp:~macslow/notify-osd/gravity
Merge into: lp:notify-osd/trunk
Diff against target: None lines
To merge this branch: bzr merge lp:~macslow/notify-osd/gravity
Reviewer Review Type Date Requested Status
David Barth (community) Approve
Review via email: mp+10963@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Mirco Müller (macslow) wrote :

Added gconf-key "/apps/notify-osd/gravity" to allow selecting between positioning bubbles at NorthEast (top-right, 1) or East (vertically centered at right of screen, 2) gravity.

To test it use these commands once notify-osd is started:

gconftool-2 --set /apps/notify-osd/gravity --type int 1

or

gconftool-2 --set /apps/notify-osd/gravity --type int 2

If no gconf-key is found or an out-of-bounds value is set it'll default to NorthEast gravity. If you changed the gravity gconf-key the change will only apply to the next bubble coming showing up. It will not update the position of an already shown bubble.

There is no gconf-schema file coming along with this intentionally.

Revision history for this message
David Barth (dbarth) wrote :

Thanks for putting that together quickly.

Remarks
- line 57: the comment is wrong (mentions a font size)
- it looks like the error rollback code could be factored into a helper function; but that's fine for a quick fix
- unit tests, good

review: Approve
lp:~macslow/notify-osd/gravity updated
389. By Mirco Müller

fixed comment, added error-handling function to avoid redundant code

Revision history for this message
Mirco Müller (macslow) wrote :

> Thanks for putting that together quickly.
>
> Remarks
> - line 57: the comment is wrong (mentions a font size)
> - it looks like the error rollback code could be factored into a helper
> function; but that's fine for a quick fix
> - unit tests, good

Fixed comment and added error-handling helper-function in rev. 389

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/defaults.c'
2--- src/defaults.c 2009-08-26 11:17:55 +0000
3+++ src/defaults.c 2009-09-01 08:46:33 +0000
4@@ -84,12 +84,14 @@
5 PROP_TEXT_BODY_SIZE,
6 PROP_PIXELS_PER_EM,
7 PROP_SYSTEM_FONT_SIZE,
8- PROP_SCREEN_DPI
9+ PROP_SCREEN_DPI,
10+ PROP_GRAVITY
11 };
12
13 enum
14 {
15 VALUE_CHANGED,
16+ GRAVITY_CHANGED,
17 LAST_SIGNAL
18 };
19
20@@ -138,6 +140,7 @@
21 #define DEFAULT_PIXELS_PER_EM 10.0f
22 #define DEFAULT_SYSTEM_FONT_SIZE 10.0f
23 #define DEFAULT_SCREEN_DPI 96.0f
24+#define DEFAULT_GRAVITY GRAVITY_NORTH_EAST
25
26 /* these values are interpreted as milliseconds-measurements and do comply to
27 * the visual guide for jaunty-notifications */
28@@ -155,9 +158,11 @@
29 /* GConf-trees to watch */
30 #define GCONF_UI_TREE "/desktop/gnome/interface"
31 #define GCONF_FONT_TREE "/desktop/gnome/font_rendering"
32+#define GCONF_NOSD_TREE "/apps/notify-osd"
33
34 /* notify-osd settings */
35 #define GCONF_MULTIHEAD_MODE "/apps/notify-osd/multihead_mode"
36+#define GCONF_GRAVITY "/apps/notify-osd/gravity"
37
38 static guint g_defaults_signals[LAST_SIGNAL] = { 0 };
39
40@@ -272,6 +277,37 @@
41 }
42
43 static void
44+_get_gravity (Defaults* self)
45+{
46+ GError* error = NULL;
47+ Gravity gravity;
48+
49+ if (!IS_DEFAULTS (self))
50+ return;
51+
52+ // grab current gravity-setting for notify-osd from gconf
53+ error = NULL;
54+ gravity = gconf_client_get_int (self->context, GCONF_GRAVITY, &error);
55+ if (error)
56+ {
57+ // if something went wrong, assume "Sans 10" and continue
58+ gravity = DEFAULT_GRAVITY;
59+
60+ g_warning ("%s(): Got error \"%s\"\n",
61+ G_STRFUNC,
62+ error->message);
63+ g_error_free (error);
64+ }
65+
66+ // protect against out-of-bounds values for gravity
67+ if (gravity != GRAVITY_EAST && gravity != GRAVITY_NORTH_EAST)
68+ gravity = DEFAULT_GRAVITY;
69+
70+ // update stored DPI-value
71+ g_object_set (self, "gravity", gravity, NULL);
72+}
73+
74+static void
75 _font_changed (GConfClient* client,
76 guint cnxn_id,
77 GConfEntry* entry,
78@@ -373,6 +409,27 @@
79 g_signal_emit (defaults, g_defaults_signals[VALUE_CHANGED], 0);
80 }
81
82+static void
83+_gravity_changed (GConfClient* client,
84+ guint cnxn_id,
85+ GConfEntry* entry,
86+ gpointer data)
87+{
88+ Defaults* defaults;
89+
90+ if (!data)
91+ return;
92+
93+ defaults = (Defaults*) data;
94+ if (!IS_DEFAULTS (defaults))
95+ return;
96+
97+ // grab gravity setting for notify-osd from gconf
98+ _get_gravity (defaults);
99+
100+ g_signal_emit (defaults, g_defaults_signals[GRAVITY_CHANGED], 0);
101+}
102+
103 static gdouble
104 _get_average_char_width (Defaults* self)
105 {
106@@ -590,8 +647,10 @@
107 gconf_client_notify_remove (defaults->context, defaults->notifier[2]);
108 gconf_client_notify_remove (defaults->context, defaults->notifier[3]);
109 gconf_client_notify_remove (defaults->context, defaults->notifier[4]);
110+ gconf_client_notify_remove (defaults->context, defaults->notifier[5]);
111 gconf_client_remove_dir (defaults->context, GCONF_UI_TREE, NULL);
112 gconf_client_remove_dir (defaults->context, GCONF_FONT_TREE, NULL);
113+ gconf_client_remove_dir (defaults->context, GCONF_NOSD_TREE, NULL);
114 g_object_unref (defaults->context);
115
116 if (defaults->bubble_shadow_color)
117@@ -697,6 +756,23 @@
118 return;
119 }
120
121+ /* register watching all settings for notify-osd */
122+ error = NULL;
123+ gconf_client_add_dir (self->context,
124+ GCONF_NOSD_TREE,
125+ GCONF_CLIENT_PRELOAD_NONE,
126+ &error);
127+ if (error)
128+ {
129+ gconf_client_remove_dir (self->context, GCONF_UI_TREE, NULL);
130+ gconf_client_remove_dir (self->context, GCONF_FONT_TREE, NULL);
131+ g_object_unref (self->context);
132+ g_warning ("defaults_init(): Got error \"%s\"\n",
133+ error->message);
134+ g_error_free (error);
135+ return;
136+ }
137+
138 /* hook up notifier for font-name/size changes */
139 error = NULL;
140 self->notifier[0] = gconf_client_notify_add (self->context,
141@@ -801,6 +877,30 @@
142 g_error_free (error);
143 return;
144 }
145+
146+ // hook up notifiier for gravity changes
147+ error = NULL;
148+ self->notifier[5] = gconf_client_notify_add (self->context,
149+ GCONF_NOSD_TREE,
150+ _gravity_changed,
151+ (gpointer) self,
152+ NULL,
153+ &error);
154+ if (error)
155+ {
156+ gconf_client_notify_remove (self->context, self->notifier[0]);
157+ gconf_client_notify_remove (self->context, self->notifier[1]);
158+ gconf_client_notify_remove (self->context, self->notifier[2]);
159+ gconf_client_notify_remove (self->context, self->notifier[3]);
160+ gconf_client_notify_remove (self->context, self->notifier[4]);
161+ gconf_client_remove_dir (self->context, GCONF_UI_TREE, NULL);
162+ gconf_client_remove_dir (self->context, GCONF_FONT_TREE, NULL);
163+ g_object_unref (self->context);
164+ g_warning ("defaults_init(): Got error \"%s\"\n",
165+ error->message);
166+ g_error_free (error);
167+ return;
168+ }
169 }
170
171 static void
172@@ -975,6 +1075,10 @@
173 g_value_set_double (value, defaults->screen_dpi);
174 break;
175
176+ case PROP_GRAVITY:
177+ g_value_set_int (value, defaults->gravity);
178+ break;
179+
180 default :
181 G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop, spec);
182 break;
183@@ -1191,6 +1295,10 @@
184 defaults->screen_dpi = g_value_get_double (value);
185 break;
186
187+ case PROP_GRAVITY:
188+ defaults->gravity = g_value_get_int (value);
189+ break;
190+
191 default :
192 G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop, spec);
193 break;
194@@ -1241,6 +1349,7 @@
195 GParamSpec* property_pixels_per_em;
196 GParamSpec* property_system_font_size;
197 GParamSpec* property_screen_dpi;
198+ GParamSpec* property_gravity;
199
200 gobject_class->constructed = defaults_constructed;
201 gobject_class->dispose = defaults_dispose;
202@@ -1259,6 +1368,17 @@
203 G_TYPE_NONE,
204 0);
205
206+ g_defaults_signals[GRAVITY_CHANGED] = g_signal_new (
207+ "gravity-changed",
208+ G_OBJECT_CLASS_TYPE (gobject_class),
209+ G_SIGNAL_RUN_LAST,
210+ G_STRUCT_OFFSET (DefaultsClass, gravity_changed),
211+ NULL,
212+ NULL,
213+ g_cclosure_marshal_VOID__VOID,
214+ G_TYPE_NONE,
215+ 0);
216+
217 property_desktop_width = g_param_spec_int (
218 "desktop-width",
219 "desktop-width",
220@@ -1737,6 +1857,18 @@
221 PROP_SCREEN_DPI,
222 property_screen_dpi);
223
224+ property_gravity = g_param_spec_int (
225+ "gravity",
226+ "gravity",
227+ "Positional hint for placing bubbles",
228+ 0,
229+ 2,
230+ DEFAULT_GRAVITY,
231+ G_PARAM_CONSTRUCT |
232+ G_PARAM_READWRITE);
233+ g_object_class_install_property (gobject_class,
234+ PROP_GRAVITY,
235+ property_gravity);
236 }
237
238 /*-- public API --------------------------------------------------------------*/
239@@ -2500,3 +2632,16 @@
240
241 g_debug ("top corner at: %d, %d", *x, *y);
242 }
243+
244+Gravity
245+defaults_get_gravity (Defaults* self)
246+{
247+ if (!self || !IS_DEFAULTS (self))
248+ return GRAVITY_NONE;
249+
250+ Gravity gravity;
251+
252+ g_object_get (self, "gravity", &gravity, NULL);
253+
254+ return gravity;
255+}
256
257=== modified file 'src/defaults.h'
258--- src/defaults.h 2009-07-31 14:19:48 +0000
259+++ src/defaults.h 2009-09-01 08:46:33 +0000
260@@ -54,6 +54,13 @@
261 typedef struct _Defaults Defaults;
262 typedef struct _DefaultsClass DefaultsClass;
263
264+typedef enum
265+{
266+ GRAVITY_NONE = 0,
267+ GRAVITY_NORTH_EAST, // top-right of screen
268+ GRAVITY_EAST // vertically centered at right of screen
269+} Gravity;
270+
271 /* instance structure */
272 struct _Defaults
273 {
274@@ -61,7 +68,7 @@
275
276 /* private */
277 GConfClient* context;
278- guint notifier[5];
279+ guint notifier[6];
280 gint desktop_width;
281 gint desktop_height;
282 gint desktop_top;
283@@ -100,6 +107,7 @@
284 gdouble pixels_per_em;
285 gdouble system_font_size;
286 gdouble screen_dpi;
287+ Gravity gravity;
288 };
289
290 /* class structure */
291@@ -111,6 +119,9 @@
292 void (*value_changed) (Defaults* defaults); /* used to "inform" bubble
293 ** about any changes in
294 ** rendering and position */
295+ void (*gravity_changed) (Defaults* defaults); // used to "inform" about
296+ // gravity/position change
297+ // for bubbles
298 };
299
300 GType defaults_get_type (void);
301@@ -238,6 +249,9 @@
302 void
303 defaults_get_top_corner (Defaults *self, gint *x, gint *y);
304
305+Gravity
306+defaults_get_gravity (Defaults *self);
307+
308 G_END_DECLS
309
310 #endif /* __DEFAULTS_H */
311
312=== modified file 'src/display.c'
313--- src/display.c 2009-08-26 09:35:02 +0000
314+++ src/display.c 2009-08-31 13:56:28 +0000
315@@ -85,9 +85,9 @@
316 // TODO: with multi-head, in focus follow mode, there may be enough
317 // space left on the top monitor
318
319- switch (bubble_get_placement (bubble))
320+ switch (defaults_get_gravity (d))
321 {
322- case PLACEMENT_OLD:
323+ case GRAVITY_NORTH_EAST:
324 async = stack_find_bubble_on_display (self);
325 if (async != NULL)
326 {
327@@ -98,7 +98,7 @@
328 }
329 break;
330
331- case PLACEMENT_NEW:
332+ case GRAVITY_EAST:
333 y += defaults_get_desktop_height (d) / 2 -
334 EM2PIXELS (defaults_get_bubble_vert_gap (d) / 2.0f, d) -
335 bubble_get_height (bubble) +
336@@ -106,7 +106,7 @@
337 break;
338
339 default:
340- g_warning ("Unhandled bubble placement!\n");
341+ g_warning ("Unhandled gravity!\n");
342 break;
343 }
344
345@@ -241,9 +241,9 @@
346
347 d = self->defaults;
348
349- switch (bubble_get_placement (bubble))
350+ switch (defaults_get_gravity (d))
351 {
352- case PLACEMENT_OLD:
353+ case GRAVITY_NORTH_EAST:
354 if (sync_bubble != NULL && bubble_is_visible (sync_bubble))
355 {
356 d = self->defaults;
357@@ -258,7 +258,7 @@
358 }
359 break;
360
361- case PLACEMENT_NEW:
362+ case GRAVITY_EAST:
363 if (sync_bubble != NULL && bubble_is_visible (sync_bubble))
364 {
365 y += defaults_get_desktop_height (d) / 2 -
366@@ -275,7 +275,7 @@
367 break;
368
369 default:
370- g_warning ("Unhandled bubble placement!\n");
371+ g_warning ("Unhandled gravity!\n");
372 break;
373 }
374
375
376=== modified file 'src/stack.h'
377--- src/stack.h 2009-08-21 10:43:50 +0000
378+++ src/stack.h 2009-08-31 13:56:28 +0000
379@@ -61,7 +61,6 @@
380 Observer* observer;
381 GList* list;
382 guint next_id;
383-
384 };
385
386 /* class structure */
387
388=== modified file 'tests/test-defaults.c'
389--- tests/test-defaults.c 2009-08-04 17:34:48 +0000
390+++ tests/test-defaults.c 2009-08-31 13:56:28 +0000
391@@ -147,6 +147,23 @@
392 g_object_unref (defaults);
393 }
394
395+static void
396+test_defaults_get_gravity ()
397+{
398+ Defaults* defaults = defaults_new ();
399+
400+ // upon creation the gravity should not be unset
401+ g_assert_cmpint (defaults_get_gravity (defaults), !=, GRAVITY_NONE);
402+
403+ // currently the default value should be NE (top-right) gravity
404+ g_assert_cmpint (defaults_get_gravity (defaults), ==, GRAVITY_NORTH_EAST);
405+
406+ // check if we can pass "crap" to the call without causing a crash
407+ g_assert_cmpint (defaults_get_gravity (NULL), ==, GRAVITY_NONE);
408+
409+ g_object_unref (G_OBJECT (defaults));
410+}
411+
412 GTestSuite *
413 test_defaults_create_test_suite (void)
414 {
415@@ -166,6 +183,7 @@
416 g_test_suite_add(ts, TC(test_defaults_get_desktop_right));
417 g_test_suite_add(ts, TC(test_defaults_get_stack_height));
418 g_test_suite_add(ts, TC(test_defaults_get_bubble_width));
419+ g_test_suite_add(ts, TC(test_defaults_get_gravity));
420
421 return ts;
422 }

Subscribers

People subscribed via source and target branches