Merge lp:~macslow/notify-osd/gravity into lp:notify-osd/trunk
- gravity
- Merge into main
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
David Barth (community) | Approve | ||
Review via email: mp+10963@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Mirco Müller (macslow) wrote : | # |
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 | } |
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.