Added methods for Component Layer and MDI Z-Order information (see
[platform/core/uifw/at-spi2-atk.git] / cspi / spi-listener-impl.c
1 #include <cspi/spi-private.h>
2 #include <cspi/spi-listener-impl.h>
3
4 /*
5  * Standard event dispatcher
6  */
7
8 BONOBO_CLASS_BOILERPLATE (CSpiEventListener, cspi_event_listener,
9                           GObject, spi_event_listener_get_type ())
10
11 static void
12 cspi_event (SpiEventListener    *listener,
13             Accessibility_Event *event)
14 {
15   GSList *l;
16   CSpiEventListener *clistener = (CSpiEventListener *) listener;
17   AccessibleEvent aevent;
18
19   aevent.type    = event->type;
20   aevent.source  = cspi_object_add (event->source);
21   aevent.detail1 = event->detail1;
22   aevent.detail2 = event->detail2;
23
24   for (l = clistener->callbacks; l; l = l->next)
25     {
26       AccessibleEventListenerCB cb = l->data;
27       cb (&aevent);
28     }
29   
30   cspi_object_unref (aevent.source);
31 }
32
33 static void
34 cspi_event_listener_instance_init (CSpiEventListener *listener)
35 {
36 }
37
38 static void
39 cspi_event_listener_class_init (CSpiEventListenerClass *klass)
40 {
41   klass->event = cspi_event;
42 }
43
44 CSpiEventListener *
45 cspi_event_listener_new (void)
46 {
47   return g_object_new (cspi_event_listener_get_type (), NULL);
48 }
49
50 void
51 cspi_event_listener_add_callback (CSpiEventListener        *listener,
52                                   AccessibleEventListenerCB callback)
53 {
54   g_return_if_fail (IS_SPI_ACCESSIBLE_EVENT_SPI_LISTENER (listener));
55   listener->callbacks = g_slist_prepend (listener->callbacks, callback);
56 }
57
58 void
59 cspi_event_listener_remove_callback (CSpiEventListener        *listener,
60                                      AccessibleEventListenerCB callback)
61 {
62   g_return_if_fail (IS_CSPI_KEYSTROKE_LISTENER (listener));
63   listener->callbacks = g_slist_remove (listener->callbacks, callback);
64 }
65
66 /*
67  * Key event dispatcher
68  */
69
70 static gboolean
71 cspi_key_event (SpiKeystrokeListener          *listener,
72                 const Accessibility_KeyStroke *keystroke)
73 {
74   GSList *l;
75   CSpiKeystrokeListener *clistener = (CSpiKeystrokeListener *) listener;
76   AccessibleKeystroke akeystroke;
77   gboolean handled = FALSE;
78
79   switch (keystroke->type)
80     {
81       case Accessibility_KEY_PRESSED:
82         akeystroke.type = SPI_KEY_PRESSED;
83         break;
84       case Accessibility_KEY_RELEASED:
85         akeystroke.type = SPI_KEY_RELEASED;
86         break;
87       default:
88         akeystroke.type = 0;
89         break;
90     }
91   akeystroke.keyID     = keystroke->keyID;
92   akeystroke.keycode   = keystroke->keycode;
93   akeystroke.timestamp = keystroke->timestamp;
94   akeystroke.modifiers = keystroke->modifiers;
95
96   for (l = clistener->callbacks; l; l = l->next)
97     {
98       AccessibleKeystrokeListenerCB cb = l->data;
99       if ((handled = cb (&akeystroke)))
100         {
101           break;
102         }
103     }
104   
105   return handled;
106 }
107
108 static void
109 cspi_keystroke_listener_init (CSpiKeystrokeListener *listener)
110 {
111 }
112
113 static void
114 cspi_keystroke_listener_class_init (CSpiKeystrokeListenerClass *klass)
115 {
116   klass->key_event = cspi_key_event;
117 }
118
119 BONOBO_TYPE_FUNC (CSpiKeystrokeListener, 
120                   spi_keystroke_listener_get_type (),
121                   cspi_keystroke_listener);
122
123 CSpiKeystrokeListener *
124 cspi_keystroke_listener_new (void)
125 {
126   return g_object_new (cspi_keystroke_listener_get_type (), NULL);
127 }
128
129 void
130 cspi_keystroke_listener_add_callback (CSpiKeystrokeListener        *listener,
131                                       AccessibleKeystrokeListenerCB callback)
132 {
133   g_return_if_fail (IS_CSPI_KEYSTROKE_LISTENER (listener));
134   listener->callbacks = g_slist_prepend (listener->callbacks, callback);
135 }
136
137 void
138 cspi_keystroke_listener_remove_callback (CSpiKeystrokeListener        *listener,
139                                          AccessibleKeystrokeListenerCB callback)
140 {
141   g_return_if_fail (IS_CSPI_KEYSTROKE_LISTENER (listener));
142   listener->callbacks = g_slist_remove (listener->callbacks, callback);
143 }