Merge lp:~eeejay/notify-osd/text_iface into lp:notify-osd/trunk

Proposed by Eitan Isaacson
Status: Merged
Merged at revision: not available
Proposed branch: lp:~eeejay/notify-osd/text_iface
Merge into: lp:notify-osd/trunk
Diff against target: None lines
To merge this branch: bzr merge lp:~eeejay/notify-osd/text_iface
Reviewer Review Type Date Requested Status
Notify OSD Developers Pending
Review via email: mp+5919@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Eitan Isaacson (eeejay) wrote :

This branch adds a text interface and relevant AT-SPI events for dynamic bubble messages and titles.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/bubble-window-accessible.c'
--- src/bubble-window-accessible.c 2009-02-27 20:00:53 +0000
+++ src/bubble-window-accessible.c 2009-04-27 08:45:53 +0000
@@ -37,6 +37,7 @@
37static void bubble_window_real_initialize (AtkObject* obj,37static void bubble_window_real_initialize (AtkObject* obj,
38 gpointer data);38 gpointer data);
39static void atk_value_interface_init (AtkValueIface* iface);39static void atk_value_interface_init (AtkValueIface* iface);
40static void atk_text_interface_init (AtkTextIface* iface);
40static void bubble_window_get_current_value (AtkValue* obj,41static void bubble_window_get_current_value (AtkValue* obj,
41 GValue* value);42 GValue* value);
42static void bubble_window_get_maximum_value (AtkValue* obj,43static void bubble_window_get_maximum_value (AtkValue* obj,
@@ -46,6 +47,19 @@
46static void bubble_value_changed_event (Bubble* bubble,47static void bubble_value_changed_event (Bubble* bubble,
47 gint value,48 gint value,
48 AtkObject *obj);49 AtkObject *obj);
50static void bubble_message_body_deleted_event (Bubble* bubble,
51 const gchar* text,
52 AtkObject* obj);
53static void bubble_message_body_inserted_event (Bubble* bubble,
54 const gchar* text,
55 AtkObject* obj);
56
57static gchar* bubble_window_get_text (AtkText *obj,
58 gint start_offset,
59 gint end_offset);
60static gint bubble_window_get_character_count (AtkText *obj);
61static gunichar bubble_window_get_character_at_offset (AtkText *obj,
62 gint offset);
4963
50static void* bubble_window_accessible_parent_class;64static void* bubble_window_accessible_parent_class;
5165
@@ -76,6 +90,13 @@
76 (GInterfaceFinalizeFunc) NULL,90 (GInterfaceFinalizeFunc) NULL,
77 NULL91 NULL
78 };92 };
93
94 const GInterfaceInfo atk_text_info =
95 {
96 (GInterfaceInitFunc) atk_text_interface_init,
97 (GInterfaceFinalizeFunc) NULL,
98 NULL
99 };
79 100
80 /*101 /*
81 * Figure out the size of the class and instance102 * Figure out the size of the class and instance
@@ -100,6 +121,8 @@
100 "BubbleWindowAccessible", &tinfo, 0);121 "BubbleWindowAccessible", &tinfo, 0);
101122
102 g_type_add_interface_static (type, ATK_TYPE_VALUE, &atk_value_info);123 g_type_add_interface_static (type, ATK_TYPE_VALUE, &atk_value_info);
124
125 g_type_add_interface_static (type, ATK_TYPE_TEXT, &atk_text_info);
103 }126 }
104 127
105 return type;128 return type;
@@ -116,6 +139,17 @@
116}139}
117140
118static void141static void
142atk_text_interface_init (AtkTextIface* iface)
143{
144 g_return_if_fail (iface != NULL);
145
146 iface->get_text = bubble_window_get_text;
147 iface->get_character_count = bubble_window_get_character_count;
148 iface->get_character_at_offset = bubble_window_get_character_at_offset;
149
150}
151
152static void
119bubble_window_accessible_init (BubbleWindowAccessible *object)153bubble_window_accessible_init (BubbleWindowAccessible *object)
120{154{
121 /* TODO: Add initialization code here */155 /* TODO: Add initialization code here */
@@ -160,6 +194,16 @@
160 G_CALLBACK (bubble_value_changed_event),194 G_CALLBACK (bubble_value_changed_event),
161 obj);195 obj);
162196
197 g_signal_connect (bubble,
198 "message-body-deleted",
199 G_CALLBACK (bubble_message_body_deleted_event),
200 obj);
201
202 g_signal_connect (bubble,
203 "message-body-inserted",
204 G_CALLBACK (bubble_message_body_inserted_event),
205 obj);
206
163}207}
164208
165AtkObject*209AtkObject*
@@ -286,3 +330,108 @@
286{330{
287 g_object_notify (G_OBJECT (obj), "accessible-value");331 g_object_notify (G_OBJECT (obj), "accessible-value");
288}332}
333
334static void
335bubble_message_body_deleted_event (Bubble* bubble,
336 const gchar* text,
337 AtkObject* obj)
338{
339 /* Not getting very fancy here, delete is always complete */
340 g_signal_emit_by_name (
341 obj, "text_changed::delete", 0, g_utf8_strlen (text, -1));
342}
343
344static void
345bubble_message_body_inserted_event (Bubble* bubble,
346 const gchar* text,
347 AtkObject* obj)
348{
349 const gchar* message_body;
350
351 message_body = bubble_get_message_body (bubble);
352
353 g_signal_emit_by_name (
354 obj, "text_changed::insert",
355 g_utf8_strlen (message_body, -1) - g_utf8_strlen (text, -1),
356 g_utf8_strlen (message_body, -1));
357}
358
359static gchar*
360bubble_window_get_text (AtkText *obj,
361 gint start_offset,
362 gint end_offset)
363{
364 GtkAccessible* accessible;
365 Bubble* bubble;
366 const gchar* body_text;
367 gsize char_length;
368 glong body_strlen;
369
370 g_return_val_if_fail (BUBBLE_WINDOW_IS_ACCESSIBLE (obj), g_strdup(""));
371
372 accessible = GTK_ACCESSIBLE (obj);
373
374 g_return_val_if_fail (accessible->widget == NULL, g_strdup(""));
375
376 bubble = g_object_get_data (G_OBJECT(accessible->widget), "bubble");
377
378 if (end_offset <= start_offset)
379 return g_strdup("");
380
381 body_text = bubble_get_message_body (bubble);
382
383 body_strlen = g_utf8_strlen(body_text, -1);
384
385 if (start_offset > body_strlen)
386 start_offset = body_strlen;
387
388 if (end_offset > body_strlen || end_offset == -1)
389 end_offset = body_strlen;
390
391
392 char_length = g_utf8_offset_to_pointer (body_text, end_offset) -
393 g_utf8_offset_to_pointer (body_text, start_offset);
394
395 return g_strndup (g_utf8_offset_to_pointer(body_text, start_offset),
396 char_length);
397}
398
399static gint
400bubble_window_get_character_count (AtkText *obj)
401{
402 GtkAccessible* accessible;
403 Bubble* bubble;
404
405 g_return_val_if_fail (BUBBLE_WINDOW_IS_ACCESSIBLE (obj), 0);
406
407 accessible = GTK_ACCESSIBLE (obj);
408
409 if (accessible->widget == NULL)
410 return 0;
411
412 bubble = g_object_get_data (G_OBJECT(accessible->widget), "bubble");
413
414 return g_utf8_strlen(bubble_get_message_body (bubble), -1);
415}
416
417static gunichar
418bubble_window_get_character_at_offset (AtkText *obj,
419 gint offset)
420{
421 GtkAccessible* accessible;
422 Bubble* bubble;
423 const gchar* body_text;
424
425 g_return_val_if_fail (BUBBLE_WINDOW_IS_ACCESSIBLE (obj), 0);
426
427 accessible = GTK_ACCESSIBLE (obj);
428
429 if (accessible->widget == NULL)
430 return 0;
431
432 bubble = g_object_get_data (G_OBJECT(accessible->widget), "bubble");
433
434 body_text = bubble_get_message_body (bubble);
435
436 return g_utf8_get_char (g_utf8_offset_to_pointer (body_text, offset));
437}
289438
=== modified file 'src/bubble.c'
--- src/bubble.c 2009-04-16 14:13:47 +0000
+++ src/bubble.c 2009-04-27 08:54:00 +0000
@@ -94,6 +94,8 @@
94{94{
95 TIMED_OUT,95 TIMED_OUT,
96 VALUE_CHANGED,96 VALUE_CHANGED,
97 MESSAGE_BODY_DELETED,
98 MESSAGE_BODY_INSERTED,
97 LAST_SIGNAL99 LAST_SIGNAL
98};100};
99101
@@ -1903,6 +1905,30 @@
1903 G_TYPE_NONE,1905 G_TYPE_NONE,
1904 1,1906 1,
1905 G_TYPE_INT);1907 G_TYPE_INT);
1908
1909 g_bubble_signals[MESSAGE_BODY_DELETED] = g_signal_new (
1910 "message-body-deleted",
1911 G_OBJECT_CLASS_TYPE (gobject_class),
1912 G_SIGNAL_RUN_LAST,
1913 G_STRUCT_OFFSET (BubbleClass, message_body_deleted),
1914 NULL,
1915 NULL,
1916 g_cclosure_marshal_VOID__STRING,
1917 G_TYPE_NONE,
1918 1,
1919 G_TYPE_STRING);
1920
1921 g_bubble_signals[MESSAGE_BODY_INSERTED] = g_signal_new (
1922 "message-body-inserted",
1923 G_OBJECT_CLASS_TYPE (gobject_class),
1924 G_SIGNAL_RUN_LAST,
1925 G_STRUCT_OFFSET (BubbleClass, message_body_inserted),
1926 NULL,
1927 NULL,
1928 g_cclosure_marshal_VOID__STRING,
1929 G_TYPE_NONE,
1930 1,
1931 G_TYPE_STRING);
1906}1932}
19071933
1908/*-- public API --------------------------------------------------------------*/1934/*-- public API --------------------------------------------------------------*/
@@ -2066,6 +2092,10 @@
2066 g_string_free (priv->title, TRUE);2092 g_string_free (priv->title, TRUE);
20672093
2068 priv->title = g_string_new (title);2094 priv->title = g_string_new (title);
2095
2096 g_object_notify (
2097 G_OBJECT (gtk_widget_get_accessible (GET_PRIVATE(self)->widget)),
2098 "accessible-name");
2069}2099}
20702100
2071const gchar*2101const gchar*
@@ -2089,13 +2119,20 @@
20892119
2090 priv = GET_PRIVATE (self);2120 priv = GET_PRIVATE (self);
20912121
2092 if (priv->message_body->len != 0)2122 if (priv->message_body->len != 0) {
2123 g_signal_emit (self, g_bubble_signals[MESSAGE_BODY_DELETED],
2124 0, priv->message_body->str);
2093 g_string_free (priv->message_body, TRUE);2125 g_string_free (priv->message_body, TRUE);
20942126 }
2095 /* filter out any HTML/markup if possible */2127 /* filter out any HTML/markup if possible */
2096 text = filter_text (body);2128 text = filter_text (body);
20972129
2098 priv->message_body = g_string_new (text);2130 priv->message_body = g_string_new (text);
2131
2132 g_signal_emit (self, g_bubble_signals[MESSAGE_BODY_INSERTED], 0, text);
2133 g_object_notify (G_OBJECT (gtk_widget_get_accessible (priv->widget)),
2134 "accessible-description");
2135
2099 g_free (text);2136 g_free (text);
2100}2137}
21012138
@@ -3387,6 +3424,12 @@
3387 /* append text to current message-body */3424 /* append text to current message-body */
3388 g_string_append (GET_PRIVATE (self)->message_body, text);3425 g_string_append (GET_PRIVATE (self)->message_body, text);
33893426
3427 g_signal_emit (self, g_bubble_signals[MESSAGE_BODY_INSERTED], 0, text);
3428
3429 g_object_notify (
3430 G_OBJECT (gtk_widget_get_accessible (GET_PRIVATE(self)->widget)),
3431 "accessible-description");
3432
3390 g_free ((gpointer) text);3433 g_free ((gpointer) text);
3391}3434}
33923435
33933436
=== modified file 'src/bubble.h'
--- src/bubble.h 2009-04-09 10:44:07 +0000
+++ src/bubble.h 2009-04-23 15:22:58 +0000
@@ -76,6 +76,8 @@
76 /*< signals >*/76 /*< signals >*/
77 void (*timed_out) (Bubble* bubble);77 void (*timed_out) (Bubble* bubble);
78 void (*value_changed) (Bubble* bubble);78 void (*value_changed) (Bubble* bubble);
79 void (*message_body_deleted) (Bubble* bubble);
80 void (*message_body_inserted) (Bubble* bubble);
79};81};
8082
81GType bubble_get_type (void);83GType bubble_get_type (void);

Subscribers

People subscribed via source and target branches