Leakfixes from Padraig O'Briain for bug #361386 and bug #369377.
[platform/core/uifw/at-spi2-atk.git] / registryd / deviceeventcontroller.c
index 95640d8..66cc323 100644 (file)
@@ -221,7 +221,6 @@ spi_dec_replace_map_keysym (DEControllerPrivateData *priv, KeyCode keycode, KeyS
   if (desc && desc->map)
     {
       gint offset = desc->map->key_sym_map[keycode].offset;
-      long old_sym = desc->map->syms[offset]; 
       desc->map->syms[offset] = keysym; 
     }
   else
@@ -446,7 +445,10 @@ spi_dec_button_update_and_emit (SpiDEController *controller,
        e.source = BONOBO_OBJREF (controller->registry->desktop);
        e.detail1 = last_mouse_pos->x;
        e.detail2 = last_mouse_pos->y;
-       spi_init_any_nil (&e.any_data);
+       spi_init_any_nil (&e.any_data, 
+                   spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+                   Accessibility_ROLE_UNKNOWN,
+                   "");
        CORBA_exception_init (&ev);
        if (!is_consumed)
          {
@@ -456,6 +458,8 @@ spi_dec_button_update_and_emit (SpiDEController *controller,
          }
        else
          spi_dec_set_unlatch_pending (controller, mask_return);
+
+        CORBA_free (e.any_data._value);
       }
       return TRUE;
     }
@@ -471,6 +475,7 @@ spi_dec_mouse_check (SpiDEController *controller,
                     int *x, int *y, gboolean *moved)
 {
   Accessibility_Event e;
+  Accessibility_EventDetails *details;
   CORBA_Environment ev;
   int win_x_return,win_y_return;
   unsigned int mask_return;
@@ -500,22 +505,32 @@ spi_dec_mouse_check (SpiDEController *controller,
       e.source = BONOBO_OBJREF (controller->registry->desktop);
       e.detail1 = *x;
       e.detail2 = *y;
-      spi_init_any_nil (&e.any_data);
+      spi_init_any_nil (&e.any_data,
+                   spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+                   Accessibility_ROLE_UNKNOWN,
+                   "");
       CORBA_exception_init (&ev);
       Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
                                          &e,
                                          &ev);
+      details = e.any_data._value;
+      CORBA_free (details);
       e.type = "mouse:rel";  
       e.source = BONOBO_OBJREF (controller->registry->desktop);
       e.detail1 = *x - last_mouse_pos->x;
       e.detail2 = *y - last_mouse_pos->y;
-      spi_init_any_nil (&e.any_data);
+      spi_init_any_nil (&e.any_data,
+                   spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+                   Accessibility_ROLE_UNKNOWN,
+                   "");
       CORBA_exception_init (&ev);
       last_mouse_pos->x = *x;
       last_mouse_pos->y = *y;
       Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
                                          &e,
                                          &ev);
+      details = e.any_data._value;
+      CORBA_free (details);
       *moved = True;
     }
   else
@@ -548,11 +563,15 @@ spi_dec_emit_modifier_event (SpiDEController *controller, guint prev_mask,
   e.source = BONOBO_OBJREF (controller->registry->desktop);
   e.detail1 = prev_mask & key_modifier_mask;
   e.detail2 = current_mask & key_modifier_mask;
-  spi_init_any_nil (&e.any_data);
+  spi_init_any_nil (&e.any_data,
+                   spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+                   Accessibility_ROLE_UNKNOWN,
+                   "");
   CORBA_exception_init (&ev);
   Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
                                      &e,
                                      &ev);
+  CORBA_free (e.any_data._value);
 }
 
 static gboolean
@@ -617,9 +636,12 @@ spi_dec_ungrab_mouse (gpointer data)
 static void
 spi_dec_init_mouse_listener (SpiRegistry *registry)
 {
+#ifdef GRAB_BUTTON
   Display *display = spi_get_display ();
+#endif
   g_timeout_add (100, spi_dec_poll_mouse_idle, registry);
 
+#ifdef GRAB_BUTTON
   if (display)
     {
       if (XGrabButton (display, AnyButton, AnyModifier,
@@ -636,6 +658,7 @@ spi_dec_init_mouse_listener (SpiRegistry *registry)
       fprintf (stderr, "mouse buttons grabbed\n");
 #endif
     }
+#endif
 }
 
 /**
@@ -918,8 +941,9 @@ spi_controller_notify_mouselisteners (SpiDEController                 *controlle
   GSList  *notify = NULL, *l2;
   GList  **listeners = &controller->mouse_listeners;
   gboolean is_consumed;
+#ifdef SPI_KEYEVENT_DEBUG
   gboolean found = FALSE;
-
+#endif
   if (!listeners)
     {
       return FALSE;
@@ -938,7 +962,9 @@ spi_controller_notify_mouselisteners (SpiDEController                 *controlle
               /* we clone (don't dup) the listener, to avoid refcount inc. */
               notify = g_slist_prepend (notify,
                                         spi_listener_clone (listener, ev));
+#ifdef SPI_KEYEVENT_DEBUG
                found = TRUE;
+#endif
             }
          }
     }
@@ -1056,12 +1082,16 @@ spi_device_event_controller_forward_mouse_event (SpiDEController *controller,
       e.source = BONOBO_OBJREF (controller->registry->desktop);
       e.detail1 = last_mouse_pos->x;
       e.detail2 = last_mouse_pos->y;
-      spi_init_any_nil (&e.any_data);
+      spi_init_any_nil (&e.any_data,
+                   spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+                   Accessibility_ROLE_UNKNOWN,
+                   "");
       CORBA_exception_init (&ev);
       
       Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
                                          &e,
                                          &ev);
+      CORBA_free (e.any_data._value);
     }
 
   xkb_mod_unlatch_occurred = (xevent->type == ButtonPress ||
@@ -1405,7 +1435,7 @@ spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event,
 
 static gboolean
 spi_controller_notify_keylisteners (SpiDEController                 *controller,
-                                   const Accessibility_DeviceEvent *key_event,
+                                   Accessibility_DeviceEvent       *key_event,
                                    CORBA_boolean                    is_system_global,
                                    CORBA_Environment               *ev)
 {
@@ -1419,6 +1449,10 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
       return FALSE;
     }
 
+  /* set the NUMLOCK event mask bit if appropriate: see bug #143702 */
+  if (key_event->modifiers & _numlock_physical_mask)
+      key_event->modifiers |= SPI_KEYMASK_NUMLOCK;
+
   for (l = *key_listeners; l; l = l->next)
     {
        DEControllerKeyListener *key_listener = l->data;
@@ -1449,7 +1483,8 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
       DEControllerKeyListener *key_listener = l2->data;            
       Accessibility_DeviceEventListener ls = key_listener->listener.object;
 
-      is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev);
+      is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev) &&
+                   key_listener->mode->preemptive;
 
       if (BONOBO_EX (ev))
         {
@@ -1478,7 +1513,7 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
 }
 
 static gboolean
-spi_clear_error_state ()
+spi_clear_error_state (void)
 {
        gboolean retval = spi_error_code != 0;
        spi_error_code = 0;
@@ -2217,7 +2252,6 @@ impl_generate_keyboard_event (PortableServer_Servant           servant,
 {
   SpiDEController *controller =
        SPI_DEVICE_EVENT_CONTROLLER (bonobo_object (servant));
-  long key_synth_code;
   gint err;
   KeySym keysym;
 
@@ -2233,7 +2267,6 @@ impl_generate_keyboard_event (PortableServer_Servant           servant,
    */
   
   gdk_error_trap_push ();
-  key_synth_code = keycode;
 
   switch (synth_type)
     {
@@ -2262,7 +2295,7 @@ impl_generate_keyboard_event (PortableServer_Servant           servant,
                               keystring);
              break;
     }
-  if (err = gdk_error_trap_pop ())
+  if ((err = gdk_error_trap_pop ()))
     {
       DBG (-1, g_warning ("Error [%d] emitting keystroke", err));
     }
@@ -2357,7 +2390,9 @@ impl_notify_listeners_sync (PortableServer_Servant           servant,
   g_print ("notifylistening listeners synchronously: controller %p, event id %d\n",
           controller, (int) event->id);
 #endif
-  return spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev) ?
+  return spi_controller_notify_keylisteners (controller,
+                                            (Accessibility_DeviceEvent *) 
+                                            event, CORBA_FALSE, ev) ?
          CORBA_TRUE : CORBA_FALSE; 
 }
 
@@ -2372,7 +2407,8 @@ impl_notify_listeners_async (PortableServer_Servant           servant,
 #ifdef SPI_DEBUG
   fprintf (stderr, "notifying listeners asynchronously\n");
 #endif
-  spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev); 
+  spi_controller_notify_keylisteners (controller, (Accessibility_DeviceEvent *)
+                                     event, CORBA_FALSE, ev); 
 }
 
 static void
@@ -2482,6 +2518,7 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller,
 {
   CORBA_Environment ev;
   Accessibility_DeviceEvent key_event;
+  gboolean ret;
 
   g_assert (event->type == KeyPress || event->type == KeyRelease);
 
@@ -2493,7 +2530,9 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller,
     spi_controller_update_key_grabs (controller, &key_event);
 
   /* relay to listeners, and decide whether to consume it or not */
-  return spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev);
+  ret = spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev);
+  CORBA_free(key_event.event_string);
+  return ret;
 }
 
 SpiDEController *
@@ -2515,7 +2554,6 @@ is_key_released (KeyCode code)
 {
   char keys[32];
   int down;
-  int i;
 
   XQueryKeymap (spi_get_display (), keys);
   down = BIT (keys, code);