Added implementation for mouse event generation.
authorbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Tue, 12 Feb 2002 22:56:06 +0000 (22:56 +0000)
committerbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Tue, 12 Feb 2002 22:56:06 +0000 (22:56 +0000)
git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@242 e2bd861d-eb25-0410-b326-f6ed22b6b98c

ChangeLog
cspi/spi_registry.c
registryd/deviceeventcontroller.c
test/test-simple.c

index a194bbd..aaf5c84 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2002-02-12 Bill Haneman <bill.haneman@sun.com>
 
+       * registryd/deviceeventcontroller.c:
+       Added implementation for generateMouseEvent.
+
+       * cspi/spi_registry.c:
+       Connected new implementation for generateMouseEvent
+       to the C bindings.
+       
+2002-02-12 Bill Haneman <bill.haneman@sun.com>
+
        * configure.in: 0.8
        Incremented revision (but no change in public API
        outside of 'utils', which are not installed public yet.)
index 18f5dc8..cc0dca2 100644 (file)
@@ -528,18 +528,31 @@ SPI_generateKeyboardEvent (long int keyval,
  * @x: a #long indicating the screen x coordinate of the mouse event.
  * @y: a #long indicating the screen y coordinate of the mouse event.
  * @name: a string indicating which mouse event to be synthesized
- *        (e.g. "button1", "button2", "mousemove").
+ *        (e.g. "b1p", "b1c", "b2r", "rel", "abs").
  *
  * Synthesize a mouse event at a specific screen coordinate.
  * Most AT clients should use the #AccessibleAction interface when
  * tempted to generate mouse events, rather than this method.
- * Not Yet Implemented.
+ * Event names: b1p = button 1 press; b2r = button 2 release;
+ *              b3c = button 3 click; b2d = button 2 double-click;
+ *              abs = absolute motion; rel = relative motion.
  *
  * Returns: #TRUE if successful, otherwise #FALSE.
  **/
 SPIBoolean
 SPI_generateMouseEvent (long x, long y, char *name)
 {
-  return FALSE;
+  Accessibility_DeviceEventController device_event_controller = 
+         Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
+
+  cspi_return_val_if_ev ("getting event controller for mouse event gen", FALSE);
+
+  Accessibility_DeviceEventController_generateMouseEvent (device_event_controller,
+                                                         x, y, name, cspi_ev ());
+  cspi_return_val_if_ev ("generating mouse event", FALSE);
+
+  cspi_release_unref (device_event_controller);
+
+  return TRUE;
 }
 
index 153fde6..cb1db9e 100644 (file)
@@ -852,11 +852,58 @@ impl_generate_mouse_event (PortableServer_Servant servant,
                           const CORBA_char      *eventName,
                           CORBA_Environment     *ev)
 {
+  int button;
+  gboolean error = FALSE;
+  Display *display = spi_get_display ();
 #ifdef SPI_DEBUG
   fprintf (stderr, "generating mouse %s event at %ld, %ld\n",
           eventName, (long int) x, (long int) y);
 #endif
-  g_warning ("not yet implemented");
+  g_message ("mouse event synthesis\n");
+  switch (eventName[0])
+    {
+      case 'b':
+        switch (eventName[1])
+         {
+         /* TODO: check number of buttons before parsing */
+         case '1':
+                   button = 1;
+                   break;
+         case '2':
+                 button = 2;
+                 break;
+         case '3':
+                 button = 3;
+                 break;
+         default:
+                 error = TRUE;
+         }
+       if (!error)
+         {
+           if (x != -1 && y != -1)
+             {
+               XTestFakeMotionEvent (display, DefaultScreen (display),
+                                     x, y, 0);
+             }
+           XTestFakeButtonEvent (display, button, !(eventName[2] == 'r'), 0);
+           if (eventName[2] == 'c')
+             XTestFakeButtonEvent (display, button, FALSE, 1);
+           else if (eventName[2] == 'd')
+             {
+             XTestFakeButtonEvent (display, button, FALSE, 1);
+             XTestFakeButtonEvent (display, button, TRUE, 2);
+             XTestFakeButtonEvent (display, button, FALSE, 3);
+             }
+         }
+       break;
+      case 'r': /* relative motion */ 
+       XTestFakeRelativeMotionEvent (display, x, y, 0);
+        break;
+      case 'a': /* absolute motion */
+       XTestFakeMotionEvent (display, DefaultScreen (display),
+                             x, y, 0);
+        break;
+    }
 }
 
 /* Accessibility::DEController::notifyListenersSync */
index c99a61b..9f10a47 100644 (file)
@@ -707,13 +707,17 @@ test_keylisteners (void)
                        g_main_context_iteration (NULL, TRUE);
                fprintf (stderr, "r ");
        }
-
        g_assert (SPI_deregisterAccessibleKeystrokeListener (key_listener, 0));
        SPI_freeAccessibleKeySet (test_keyset);
 
        g_assert (!strcmp (stroke.keystring, "="));
        fprintf (stderr, "\n");
 
+       g_assert (SPI_generateMouseEvent (100, 100, "rel"));
+        g_assert (SPI_generateMouseEvent (-50, -50, "rel"));             
+        g_assert (SPI_generateMouseEvent (-50, -50, "rel"));             
+        g_assert (SPI_generateMouseEvent (-1, -1, "b1c")); 
+
        AccessibleKeystrokeListener_unref (key_listener);
 }