]> Pileus Git - ~andy/gtk/blob - gdk/win32/gdkinput.c
Delete leftover declarations of the obsolete Win32-only functions
[~andy/gtk] / gdk / win32 / gdkinput.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 /* This file should really be one level up, in the backend-independent
28  * GDK, and the x11/gdkinput.c could also be removed.
29  * 
30  * That stuff in x11/gdkinput.c which really *is* X11-dependent should
31  * be in x11/gdkinput-x11.c.
32  */
33
34 #include "config.h"
35
36 #include "gdkdisplay.h"
37 #include "gdkinput.h"
38 #include "gdkprivate.h"
39
40 /* When ther necessary stuff is in
41  * gdkinput.h, gdkinternals.h and
42  * gdkprivate.h, these includes shouldn't be here.
43  */
44
45 #include <windows.h>
46 #ifdef HAVE_WINTAB
47 #include <wintab.h>
48 #endif
49
50 #include "gdkinput-win32.h"
51
52 static GdkDeviceAxis gdk_input_core_axes[] = {
53   { GDK_AXIS_X, 0, 0 },
54   { GDK_AXIS_Y, 0, 0 }
55 };
56
57 /* Global variables  */
58
59 gint              _gdk_input_ignore_core;
60
61 GList            *_gdk_input_devices;
62 GList            *_gdk_input_windows;
63
64 void
65 _gdk_init_input_core (GdkDisplay *display)
66 {
67   display->core_pointer = g_object_new (GDK_TYPE_DEVICE, NULL);
68   
69   display->core_pointer->name = "Core Pointer";
70   display->core_pointer->source = GDK_SOURCE_MOUSE;
71   display->core_pointer->mode = GDK_MODE_SCREEN;
72   display->core_pointer->has_cursor = TRUE;
73   display->core_pointer->num_axes = 2;
74   display->core_pointer->axes = gdk_input_core_axes;
75   display->core_pointer->num_keys = 0;
76   display->core_pointer->keys = NULL;
77 }
78
79 static void
80 gdk_device_finalize (GObject *object)
81 {
82   g_error ("A GdkDevice object was finalized. This should not happen");
83 }
84
85 static void
86 gdk_device_class_init (GObjectClass *class)
87 {
88   class->finalize = gdk_device_finalize;
89 }
90
91 GType
92 gdk_device_get_type (void)
93 {
94   static GType object_type = 0;
95
96   if (!object_type)
97     {
98       static const GTypeInfo object_info =
99       {
100         sizeof (GdkDeviceClass),
101         (GBaseInitFunc) NULL,
102         (GBaseFinalizeFunc) NULL,
103         (GClassInitFunc) gdk_device_class_init,
104         NULL,           /* class_finalize */
105         NULL,           /* class_data */
106         sizeof (GdkDevicePrivate),
107         0,              /* n_preallocs */
108         (GInstanceInitFunc) NULL,
109       };
110       
111       object_type = g_type_register_static (G_TYPE_OBJECT,
112                                             "GdkDevice",
113                                             &object_info, 0);
114     }
115   
116   return object_type;
117 }
118
119 GList *
120 gdk_devices_list (void)
121 {
122   return _gdk_input_devices;
123 }
124
125 void
126 gdk_device_set_source (GdkDevice      *device,
127                        GdkInputSource  source)
128 {
129   g_return_if_fail (device != NULL);
130
131   device->source = source;
132 }
133
134 void
135 gdk_device_set_key (GdkDevice      *device,
136                     guint           index,
137                     guint           keyval,
138                     GdkModifierType modifiers)
139 {
140   g_return_if_fail (device != NULL);
141   g_return_if_fail (index < device->num_keys);
142
143   device->keys[index].keyval = keyval;
144   device->keys[index].modifiers = modifiers;
145 }
146
147 void
148 gdk_device_set_axis_use (GdkDevice   *device,
149                          guint        index,
150                          GdkAxisUse   use)
151 {
152   g_return_if_fail (device != NULL);
153   g_return_if_fail (index < device->num_axes);
154
155   device->axes[index].use = use;
156
157   switch (use)
158     {
159     case GDK_AXIS_X:
160     case GDK_AXIS_Y:
161       device->axes[index].min = 0.;
162       device->axes[index].max = 0.;
163       break;
164     case GDK_AXIS_XTILT:
165     case GDK_AXIS_YTILT:
166       device->axes[index].min = -1.;
167       device->axes[index].max = 1;
168       break;
169     default:
170       device->axes[index].min = 0.;
171       device->axes[index].max = 1;
172       break;
173     }
174 }
175
176 gboolean
177 gdk_device_get_history  (GdkDevice         *device,
178                          GdkWindow         *window,
179                          guint32            start,
180                          guint32            stop,
181                          GdkTimeCoord    ***events,
182                          gint              *n_events)
183 {
184   g_return_val_if_fail (window != NULL, FALSE);
185   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
186   g_return_val_if_fail (events != NULL, FALSE);
187   g_return_val_if_fail (n_events != NULL, FALSE);
188
189   if (n_events)
190     *n_events = 0;
191   if (events)
192     *events = NULL;
193
194   if (GDK_WINDOW_DESTROYED (window))
195     return FALSE;
196     
197   if (GDK_IS_CORE (device))
198     return FALSE;
199   else
200     return _gdk_device_get_history (device, window, start, stop, events, n_events);
201 }
202
203 GdkTimeCoord ** 
204 _gdk_device_allocate_history (GdkDevice *device,
205                               gint       n_events)
206 {
207   GdkTimeCoord **result = g_new (GdkTimeCoord *, n_events);
208   gint i;
209
210   for (i=0; i<n_events; i++)
211     result[i] = g_malloc (sizeof (GdkTimeCoord) -
212                           sizeof (double) * (GDK_MAX_TIMECOORD_AXES - device->num_axes));
213
214   return result;
215 }
216
217 void 
218 gdk_device_free_history (GdkTimeCoord **events,
219                          gint           n_events)
220 {
221   gint i;
222   
223   for (i=0; i<n_events; i++)
224     g_free (events[i]);
225
226   g_free (events);
227 }
228
229 GdkInputWindow *
230 _gdk_input_window_find(GdkWindow *window)
231 {
232   GList *tmp_list;
233
234   for (tmp_list=_gdk_input_windows; tmp_list; tmp_list=tmp_list->next)
235     if (((GdkInputWindow *)(tmp_list->data))->window == window)
236       return (GdkInputWindow *)(tmp_list->data);
237
238   return NULL;      /* Not found */
239 }
240
241 /* FIXME: this routine currently needs to be called between creation
242    and the corresponding configure event (because it doesn't get the
243    root_relative_geometry).  This should work with
244    gtk_window_set_extension_events, but will likely fail in other
245    cases */
246
247 void
248 gdk_input_set_extension_events (GdkWindow *window, gint mask,
249                                 GdkExtensionMode mode)
250 {
251   GdkWindowObject *window_private;
252   GList *tmp_list;
253   GdkInputWindow *iw;
254
255   g_return_if_fail (window != NULL);
256   g_return_if_fail (GDK_IS_WINDOW (window));
257
258   window_private = (GdkWindowObject*) window;
259   if (GDK_WINDOW_DESTROYED (window))
260     return;
261
262   if (mode == GDK_EXTENSION_EVENTS_NONE)
263     mask = 0;
264
265   if (mask != 0)
266     {
267       iw = g_new(GdkInputWindow,1);
268
269       iw->window = window;
270       iw->mode = mode;
271
272       iw->obscuring = NULL;
273       iw->num_obscuring = 0;
274       iw->grabbed = FALSE;
275
276       _gdk_input_windows = g_list_append(_gdk_input_windows,iw);
277       window_private->extension_events = mask;
278
279       /* Add enter window events to the event mask */
280       if (g_list_length (_gdk_input_devices) > 1)
281         gdk_window_set_events (window,
282                                gdk_window_get_events (window) | 
283                                GDK_ENTER_NOTIFY_MASK);
284     }
285   else
286     {
287       iw = _gdk_input_window_find (window);
288       if (iw)
289         {
290           _gdk_input_windows = g_list_remove(_gdk_input_windows,iw);
291           g_free(iw);
292         }
293
294       window_private->extension_events = 0;
295     }
296
297   for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
298     {
299       GdkDevicePrivate *gdkdev = tmp_list->data;
300
301       if (!GDK_IS_CORE (gdkdev))
302         {
303           if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
304               && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
305             _gdk_input_enable_window (window,gdkdev);
306           else
307             _gdk_input_disable_window (window,gdkdev);
308         }
309     }
310 }
311
312 void
313 _gdk_input_window_destroy (GdkWindow *window)
314 {
315   GdkInputWindow *input_window;
316
317   input_window = _gdk_input_window_find (window);
318   g_return_if_fail (input_window != NULL);
319
320   _gdk_input_windows = g_list_remove (_gdk_input_windows,input_window);
321   g_free(input_window);
322 }
323
324 void
325 _gdk_input_exit (void)
326 {
327   GList *tmp_list;
328   GdkDevicePrivate *gdkdev;
329
330   for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
331     {
332       gdkdev = (GdkDevicePrivate *)(tmp_list->data);
333       if (!GDK_IS_CORE (gdkdev))
334         {
335           gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
336
337           g_free(gdkdev->info.name);
338           g_free(gdkdev->axes);
339           g_free(gdkdev->info.axes);
340           g_free(gdkdev->info.keys);
341           g_free(gdkdev);
342         }
343     }
344
345   g_list_free(_gdk_input_devices);
346
347   for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
348     g_free(tmp_list->data);
349
350   g_list_free(_gdk_input_windows);
351 }
352
353 gboolean
354 gdk_device_get_axis (GdkDevice  *device,
355                      gdouble    *axes,
356                      GdkAxisUse  use,
357                      gdouble    *value)
358 {
359   gint i;
360   
361   g_return_val_if_fail (device != NULL, FALSE);
362
363   if (axes == NULL)
364     return FALSE;
365   
366   for (i=0; i<device->num_axes; i++)
367     if (device->axes[i].use == use)
368       {
369         if (value)
370           *value = axes[i];
371         return TRUE;
372       }
373   
374   return FALSE;
375 }
376
377 gboolean
378 gdk_device_set_mode (GdkDevice   *device,
379                      GdkInputMode mode)
380 {
381   GList *tmp_list;
382   GdkDevicePrivate *gdkdev;
383   GdkInputMode old_mode;
384   GdkInputWindow *input_window;
385
386   if (GDK_IS_CORE (device))
387     return FALSE;
388
389   gdkdev = (GdkDevicePrivate *)device;
390
391   if (device->mode == mode)
392     return TRUE;
393
394   old_mode = device->mode;
395   device->mode = mode;
396
397   if (mode == GDK_MODE_WINDOW)
398     {
399       device->has_cursor = FALSE;
400       for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
401         {
402           input_window = (GdkInputWindow *)tmp_list->data;
403           if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
404             _gdk_input_enable_window (input_window->window, gdkdev);
405           else
406             if (old_mode != GDK_MODE_DISABLED)
407               _gdk_input_disable_window (input_window->window, gdkdev);
408         }
409     }
410   else if (mode == GDK_MODE_SCREEN)
411     {
412       device->has_cursor = TRUE;
413       for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
414         _gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window,
415                                   gdkdev);
416     }
417   else  /* mode == GDK_MODE_DISABLED */
418     {
419       for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
420         {
421           input_window = (GdkInputWindow *)tmp_list->data;
422           if (old_mode != GDK_MODE_WINDOW ||
423               input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
424             _gdk_input_disable_window (input_window->window, gdkdev);
425         }
426     }
427
428   return TRUE;
429 }