]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkinput.c
Change FSF Address
[~andy/gtk] / gdk / win32 / gdkinput.c
index ddf1d91e7f24ac6d846d3732e08528abb40e0b08..31b7d41d3e10908836f05c60eb9269a70348aded 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
 #include "config.h"
 
 #include "gdkdisplay.h"
-#include "gdkinput.h"
+#include "gdkdevice.h"
+#include "gdkdisplayprivate.h"
 
 #include "gdkprivate-win32.h"
-#include "gdkinput-win32.h"
-
-static GdkDeviceAxis gdk_input_core_axes[] = {
-  { GDK_AXIS_X, 0, 0 },
-  { GDK_AXIS_Y, 0, 0 }
-};
-
-/* Global variables  */
+#include "gdkdevicemanager-win32.h"
 
 gint              _gdk_input_ignore_core;
 
 GList            *_gdk_input_devices;
 GList            *_gdk_input_windows;
 
-void
-_gdk_init_input_core (GdkDisplay *display)
-{
-  display->core_pointer = g_object_new (GDK_TYPE_DEVICE, NULL);
-  
-  display->core_pointer->name = "Core Pointer";
-  display->core_pointer->source = GDK_SOURCE_MOUSE;
-  display->core_pointer->mode = GDK_MODE_SCREEN;
-  display->core_pointer->has_cursor = TRUE;
-  display->core_pointer->num_axes = 2;
-  display->core_pointer->axes = gdk_input_core_axes;
-  display->core_pointer->num_keys = 0;
-  display->core_pointer->keys = NULL;
-}
-
-GType
-gdk_device_get_type (void)
-{
-  static GType object_type = 0;
-
-  if (!object_type)
-    {
-      static const GTypeInfo object_info =
-       {
-         sizeof (GdkDeviceClass),
-         (GBaseInitFunc) NULL,
-         (GBaseFinalizeFunc) NULL,
-         (GClassInitFunc) NULL,
-         NULL,                 /* class_finalize */
-         NULL,                 /* class_data */
-         sizeof (GdkDevicePrivate),
-         0,                    /* n_preallocs */
-         (GInstanceInitFunc) NULL,
-       };
-      
-      object_type = g_type_register_static (G_TYPE_OBJECT,
-                                            g_intern_static_string ("GdkDevice"),
-                                            &object_info, 0);
-    }
-  
-  return object_type;
-}
-
 GList *
 gdk_devices_list (void)
 {
-  return gdk_display_list_devices (_gdk_display);
+  return _gdk_win32_display_list_devices (_gdk_display);
 }
 
 GList *
-gdk_display_list_devices (GdkDisplay *dpy)
+_gdk_win32_display_list_devices (GdkDisplay *dpy)
 {
   g_return_val_if_fail (dpy == _gdk_display, NULL);
 
-  _gdk_input_wintab_init_check ();
   return _gdk_input_devices;
 }
 
-void
-gdk_device_set_source (GdkDevice      *device,
-                      GdkInputSource  source)
-{
-  g_return_if_fail (device != NULL);
-
-  device->source = source;
-}
-
-void
-gdk_device_set_key (GdkDevice      *device,
-                   guint           index,
-                   guint           keyval,
-                   GdkModifierType modifiers)
-{
-  g_return_if_fail (device != NULL);
-  g_return_if_fail (index < device->num_keys);
-
-  device->keys[index].keyval = keyval;
-  device->keys[index].modifiers = modifiers;
-}
-
-void
-gdk_device_set_axis_use (GdkDevice   *device,
-                        guint        index,
-                        GdkAxisUse   use)
-{
-  g_return_if_fail (device != NULL);
-  g_return_if_fail (index < device->num_axes);
-
-  device->axes[index].use = use;
-
-  switch (use)
-    {
-    case GDK_AXIS_X:
-    case GDK_AXIS_Y:
-      device->axes[index].min = 0.;
-      device->axes[index].max = 0.;
-      break;
-    case GDK_AXIS_XTILT:
-    case GDK_AXIS_YTILT:
-      device->axes[index].min = -1.;
-      device->axes[index].max = 1;
-      break;
-    default:
-      device->axes[index].min = 0.;
-      device->axes[index].max = 1;
-      break;
-    }
-}
-
-gboolean
-gdk_device_get_history  (GdkDevice         *device,
-                        GdkWindow         *window,
-                        guint32            start,
-                        guint32            stop,
-                        GdkTimeCoord    ***events,
-                        gint              *n_events)
-{
-  g_return_val_if_fail (window != NULL, FALSE);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
-  g_return_val_if_fail (events != NULL, FALSE);
-  g_return_val_if_fail (n_events != NULL, FALSE);
-
-  if (n_events)
-    *n_events = 0;
-  if (events)
-    *events = NULL;
-
-  if (GDK_WINDOW_DESTROYED (window))
-    return FALSE;
-    
-  if (GDK_IS_CORE (device))
-    return FALSE;
-  else
-    return _gdk_device_get_history (device, window, start, stop, events, n_events);
-}
-
-GdkTimeCoord ** 
-_gdk_device_allocate_history (GdkDevice *device,
-                             gint       n_events)
-{
-  GdkTimeCoord **result = g_new (GdkTimeCoord *, n_events);
-  gint i;
-
-  for (i=0; i<n_events; i++)
-    result[i] = g_malloc (sizeof (GdkTimeCoord) -
-                         sizeof (double) * (GDK_MAX_TIMECOORD_AXES - device->num_axes));
-
-  return result;
-}
-
-void 
-gdk_device_free_history (GdkTimeCoord **events,
-                        gint           n_events)
-{
-  gint i;
-  
-  for (i=0; i<n_events; i++)
-    g_free (events[i]);
-
-  g_free (events);
-}
-
-GdkInputWindow *
-_gdk_input_window_find(GdkWindow *window)
-{
-  GList *tmp_list;
-
-  for (tmp_list=_gdk_input_windows; tmp_list; tmp_list=tmp_list->next)
-    if (((GdkInputWindow *)(tmp_list->data))->window == window)
-      return (GdkInputWindow *)(tmp_list->data);
-
-  return NULL;      /* Not found */
-}
-
 /* FIXME: this routine currently needs to be called between creation
    and the corresponding configure event (because it doesn't get the
    root_relative_geometry).  This should work with
@@ -233,214 +65,61 @@ _gdk_input_window_find(GdkWindow *window)
 
 void
 gdk_input_set_extension_events (GdkWindow *window, gint mask,
-                               GdkExtensionMode mode)
+                                GdkExtensionMode mode)
 {
-  GdkWindowObject *window_private;
-  GList *tmp_list;
-  GdkInputWindow *iw;
+  GdkDeviceManager *device_manager;
+  GList *devices, *d;
 
-  g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  window_private = (GdkWindowObject*) window;
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
   if (mode == GDK_EXTENSION_EVENTS_NONE)
     mask = 0;
 
-  if (mask != 0)
-    {
-      _gdk_input_wintab_init_check ();
+  window->extension_events = mask;
 
-      iw = g_new(GdkInputWindow,1);
+  device_manager = gdk_display_get_device_manager (_gdk_display);
+  devices = gdk_device_manager_list_devices (device_manager,
+                                             GDK_DEVICE_TYPE_FLOATING);
 
-      iw->window = window;
-      iw->mode = mode;
-
-      iw->obscuring = NULL;
-      iw->num_obscuring = 0;
-      iw->grabbed = FALSE;
-
-      _gdk_input_windows = g_list_append(_gdk_input_windows,iw);
-      window_private->extension_events = mask;
-
-      /* Add enter window events to the event mask */
-      if (g_list_length (_gdk_input_devices) > 1)
-       gdk_window_set_events (window,
-                              gdk_window_get_events (window) | 
-                              GDK_ENTER_NOTIFY_MASK);
-    }
-  else
+  for (d = devices; d; d = d->next)
     {
-      iw = _gdk_input_window_find (window);
-      if (iw)
-       {
-         _gdk_input_windows = g_list_remove(_gdk_input_windows,iw);
-         g_free(iw);
-       }
+      GdkDevice *dev;
+      gint dev_mask;
 
-      window_private->extension_events = 0;
-    }
+      dev = d->data;
+      dev_mask = mask;
 
-  for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
-    {
-      GdkDevicePrivate *gdkdev = tmp_list->data;
+      if (gdk_device_get_mode (dev) == GDK_MODE_DISABLED ||
+          (!gdk_device_get_has_cursor (dev) && mode == GDK_EXTENSION_EVENTS_CURSOR))
+        dev_mask = 0;
 
-      if (!GDK_IS_CORE (gdkdev))
-       {
-         if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
-             && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
-           _gdk_input_enable_window (window,gdkdev);
-         else
-           _gdk_input_disable_window (window,gdkdev);
-       }
+      gdk_window_set_device_events (window, dev, mask);
     }
-}
-
-void
-_gdk_input_window_destroy (GdkWindow *window)
-{
-  GdkInputWindow *input_window;
-
-  input_window = _gdk_input_window_find (window);
-  g_return_if_fail (input_window != NULL);
-
-  _gdk_input_windows = g_list_remove (_gdk_input_windows,input_window);
-  g_free(input_window);
-}
-
-void
-_gdk_input_crossing_event (GdkWindow *window,
-                          gboolean enter)
-{
-  GdkWindowObject *priv = (GdkWindowObject *)window;
-  GdkInputWindow *input_window;
-  gint root_x, root_y;
 
-  if (enter)
-    {
-#if 0
-      /* No idea what to do... */
-#if 0
-      gdk_input_check_proximity(display);
-#endif
-      input_window = priv->input_window;
-      if (input_window != NULL)
-       {
-         _gdk_input_get_root_relative_geometry (window, &root_x, &root_y);
-         input_window->root_x = root_x;
-         input_window->root_y = root_y;
-       }
-#endif
-    }
-  else
-    _gdk_input_ignore_core = FALSE;
+  g_list_free (devices);
 }
 
 void
-_gdk_input_exit (void)
-{
-  GList *tmp_list;
-  GdkDevicePrivate *gdkdev;
-
-  for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
-    {
-      gdkdev = (GdkDevicePrivate *)(tmp_list->data);
-      if (!GDK_IS_CORE (gdkdev))
-       {
-         gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
-
-         g_free(gdkdev->info.name);
-         g_free(gdkdev->axes);
-         g_free(gdkdev->info.axes);
-         g_free(gdkdev->info.keys);
-         g_free(gdkdev);
-       }
-    }
-
-  g_list_free(_gdk_input_devices);
-
-  for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-    g_free(tmp_list->data);
-
-  g_list_free(_gdk_input_windows);
-}
-
-gboolean
-gdk_device_get_axis (GdkDevice  *device,
-                    gdouble    *axes,
-                    GdkAxisUse  use,
-                    gdouble    *value)
-{
-  gint i;
-  
-  g_return_val_if_fail (device != NULL, FALSE);
-
-  if (axes == NULL)
-    return FALSE;
-  
-  for (i=0; i<device->num_axes; i++)
-    if (device->axes[i].use == use)
-      {
-       if (value)
-         *value = axes[i];
-       return TRUE;
-      }
-  
-  return FALSE;
-}
-
-gboolean
-gdk_device_set_mode (GdkDevice   *device,
-                    GdkInputMode mode)
+_gdk_input_init (GdkDisplay *display)
 {
-  GList *tmp_list;
-  GdkDevicePrivate *gdkdev;
-  GdkInputMode old_mode;
-  GdkInputWindow *input_window;
+  GdkDeviceManagerWin32 *device_manager;
 
-  if (GDK_IS_CORE (device))
-    return FALSE;
+  _gdk_input_ignore_core = FALSE;
 
-  gdkdev = (GdkDevicePrivate *)device;
+  device_manager = g_object_new (GDK_TYPE_DEVICE_MANAGER_WIN32,
+                                 "display", display,
+                                 NULL);
+  display->device_manager = GDK_DEVICE_MANAGER (device_manager);
 
-  if (device->mode == mode)
-    return TRUE;
+  display->core_pointer = device_manager->core_pointer;
 
-  old_mode = device->mode;
-  device->mode = mode;
+  _gdk_input_devices = g_list_append (NULL, display->core_pointer);
+  _gdk_input_devices = g_list_concat (_gdk_input_devices,
+                                      g_list_copy (device_manager->wintab_devices));
 
-  if (mode == GDK_MODE_WINDOW)
-    {
-      device->has_cursor = FALSE;
-      for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-       {
-         input_window = (GdkInputWindow *)tmp_list->data;
-         if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           _gdk_input_enable_window (input_window->window, gdkdev);
-         else
-           if (old_mode != GDK_MODE_DISABLED)
-             _gdk_input_disable_window (input_window->window, gdkdev);
-       }
-    }
-  else if (mode == GDK_MODE_SCREEN)
-    {
-      device->has_cursor = TRUE;
-      for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-       _gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window,
-                                 gdkdev);
-    }
-  else  /* mode == GDK_MODE_DISABLED */
-    {
-      for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-       {
-         input_window = (GdkInputWindow *)tmp_list->data;
-         if (old_mode != GDK_MODE_WINDOW ||
-             input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           _gdk_input_disable_window (input_window->window, gdkdev);
-       }
-    }
+  _gdk_input_wintab_init_check (device_manager);
 
-  return TRUE;
 }