]> Pileus Git - ~andy/gtk/blob - gdk/quartz/gdkdevicemanager-core-quartz.c
gdk: prevent NULL pointer access when debugging is enabled
[~andy/gtk] / gdk / quartz / gdkdevicemanager-core-quartz.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org>
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, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "config.h"
19
20 #include <gdk/gdktypes.h>
21 #include <gdk/gdkdevicemanager.h>
22 #include <gdk/gdkdeviceprivate.h>
23 #include <gdk/gdkdevicemanagerprivate.h>
24 #include "gdkdevicemanager-core-quartz.h"
25 #include "gdkquartzdevice-core.h"
26 #include "gdkkeysyms.h"
27
28
29 #define HAS_FOCUS(toplevel)                           \
30   ((toplevel)->has_focus || (toplevel)->has_pointer_focus)
31
32 static void    gdk_quartz_device_manager_core_finalize    (GObject *object);
33 static void    gdk_quartz_device_manager_core_constructed (GObject *object);
34
35 static GList * gdk_quartz_device_manager_core_list_devices (GdkDeviceManager *device_manager,
36                                                             GdkDeviceType     type);
37 static GdkDevice * gdk_quartz_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager);
38
39
40 G_DEFINE_TYPE (GdkQuartzDeviceManagerCore, gdk_quartz_device_manager_core, GDK_TYPE_DEVICE_MANAGER)
41
42 static void
43 gdk_quartz_device_manager_core_class_init (GdkQuartzDeviceManagerCoreClass *klass)
44 {
45   GdkDeviceManagerClass *device_manager_class = GDK_DEVICE_MANAGER_CLASS (klass);
46   GObjectClass *object_class = G_OBJECT_CLASS (klass);
47
48   object_class->finalize = gdk_quartz_device_manager_core_finalize;
49   object_class->constructed = gdk_quartz_device_manager_core_constructed;
50   device_manager_class->list_devices = gdk_quartz_device_manager_core_list_devices;
51   device_manager_class->get_client_pointer = gdk_quartz_device_manager_core_get_client_pointer;
52 }
53
54 static GdkDevice *
55 create_core_pointer (GdkDeviceManager *device_manager,
56                      GdkDisplay       *display)
57 {
58   return g_object_new (GDK_TYPE_QUARTZ_DEVICE_CORE,
59                        "name", "Core Pointer",
60                        "type", GDK_DEVICE_TYPE_MASTER,
61                        "input-source", GDK_SOURCE_MOUSE,
62                        "input-mode", GDK_MODE_SCREEN,
63                        "has-cursor", TRUE,
64                        "display", display,
65                        "device-manager", device_manager,
66                        NULL);
67 }
68
69 static GdkDevice *
70 create_core_keyboard (GdkDeviceManager *device_manager,
71                       GdkDisplay       *display)
72 {
73   return g_object_new (GDK_TYPE_QUARTZ_DEVICE_CORE,
74                        "name", "Core Keyboard",
75                        "type", GDK_DEVICE_TYPE_MASTER,
76                        "input-source", GDK_SOURCE_KEYBOARD,
77                        "input-mode", GDK_MODE_SCREEN,
78                        "has-cursor", FALSE,
79                        "display", display,
80                        "device-manager", device_manager,
81                        NULL);
82 }
83
84 static void
85 gdk_quartz_device_manager_core_init (GdkQuartzDeviceManagerCore *device_manager)
86 {
87 }
88
89 static void
90 gdk_quartz_device_manager_core_finalize (GObject *object)
91 {
92   GdkQuartzDeviceManagerCore *quartz_device_manager_core;
93
94   quartz_device_manager_core = GDK_QUARTZ_DEVICE_MANAGER_CORE (object);
95
96   g_object_unref (quartz_device_manager_core->core_pointer);
97   g_object_unref (quartz_device_manager_core->core_keyboard);
98
99   G_OBJECT_CLASS (gdk_quartz_device_manager_core_parent_class)->finalize (object);
100 }
101
102 static void
103 gdk_quartz_device_manager_core_constructed (GObject *object)
104 {
105   GdkQuartzDeviceManagerCore *device_manager;
106   GdkDisplay *display;
107
108   device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (object);
109   display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (object));
110   device_manager->core_pointer = create_core_pointer (GDK_DEVICE_MANAGER (device_manager), display);
111   device_manager->core_keyboard = create_core_keyboard (GDK_DEVICE_MANAGER (device_manager), display);
112
113   _gdk_device_set_associated_device (device_manager->core_pointer, device_manager->core_keyboard);
114   _gdk_device_set_associated_device (device_manager->core_keyboard, device_manager->core_pointer);
115 }
116
117 static GList *
118 gdk_quartz_device_manager_core_list_devices (GdkDeviceManager *device_manager,
119                                              GdkDeviceType     type)
120 {
121   GdkQuartzDeviceManagerCore *quartz_device_manager_core;
122   GList *devices = NULL;
123
124   if (type == GDK_DEVICE_TYPE_MASTER)
125     {
126       quartz_device_manager_core = (GdkQuartzDeviceManagerCore *) device_manager;
127       devices = g_list_prepend (devices, quartz_device_manager_core->core_keyboard);
128       devices = g_list_prepend (devices, quartz_device_manager_core->core_pointer);
129     }
130
131   return devices;
132 }
133
134 static GdkDevice *
135 gdk_quartz_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager)
136 {
137   GdkQuartzDeviceManagerCore *quartz_device_manager_core;
138
139   quartz_device_manager_core = (GdkQuartzDeviceManagerCore *) device_manager;
140   return quartz_device_manager_core->core_pointer;
141 }