source: synfigstudio/trunk/fuentes/src/gui/devicetracker.cpp @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 6.4 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file devicetracker.cpp
3**      \brief Template File
4**
5**      $Id$
6**
7**      \legal
8**      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9**  Copyright (c) 2009 Gerco Ballintijn
10**
11**      This package is free software; you can redistribute it and/or
12**      modify it under the terms of the GNU General Public License as
13**      published by the Free Software Foundation; either version 2 of
14**      the License, or (at your option) any later version.
15**
16**      This package is distributed in the hope that it will be useful,
17**      but WITHOUT ANY WARRANTY; without even the implied warranty of
18**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19**      General Public License for more details.
20**      \endlegal
21*/
22/* ========================================================================= */
23
24// FIXME: The code here doesn't use the GTKmm layer but uses GTK+ directly
25// since the GTKmm wrapper for Gdk::Device is incomplete. When the wrapper
26// gets fixed, this code should be updated accoordingly.
27
28/* === H E A D E R S ======================================================= */
29
30#ifdef USING_PCH
31#       include "pch.h"
32#else
33#ifdef HAVE_CONFIG_H
34#       include <config.h>
35#endif
36
37#include "devicetracker.h"
38#include <gdk/gdk.h>
39#include <gtk/gtk.h>
40#include <synfigapp/main.h>
41
42#include "general.h"
43
44#endif
45
46/* === U S I N G =========================================================== */
47
48using namespace std;
49using namespace etl;
50using namespace synfig;
51using namespace synfigapp;
52using namespace studio;
53
54/* === M A C R O S ========================================================= */
55
56/* === G L O B A L S ======================================================= */
57
58/* === P R O C E D U R E S ================================================= */
59
60/* === M E T H O D S ======================================================= */
61
62DeviceTracker::DeviceTracker()
63{
64        GdkDeviceType device_types[] =
65        {
66                GDK_DEVICE_TYPE_MASTER,
67                GDK_DEVICE_TYPE_SLAVE,
68                GDK_DEVICE_TYPE_FLOATING
69        };
70
71        for(int i = 0; i < (int)(sizeof(device_types)/sizeof(device_types[0])); ++i)
72        {
73                GList *device_list = gdk_device_manager_list_devices(
74                        gdk_display_get_device_manager(
75                                gdk_display_manager_get_default_display(
76                                        gdk_display_manager_get() )),
77                        device_types[i] );
78
79                for(GList *iter=device_list; iter; iter=g_list_next(iter))
80                {
81                        GdkDevice* device=reinterpret_cast<GdkDevice*>(iter->data);
82
83                        synfigapp::InputDevice::Handle input_device;
84                        input_device=synfigapp::Main::add_input_device(
85                                gdk_device_get_name(device),
86                                synfigapp::InputDevice::Type(gdk_device_get_source(device)) );
87                        //Disable all extended devices by default. This tries to fix several
88                        // bugs reported in track and forums
89                        if(     input_device->get_type()==synfigapp::InputDevice::TYPE_MOUSE  ||
90                                input_device->get_type()==synfigapp::InputDevice::TYPE_PEN    ||
91                                input_device->get_type()==synfigapp::InputDevice::TYPE_ERASER ||
92                                input_device->get_type()==synfigapp::InputDevice::TYPE_CURSOR  )
93                        {
94                                input_device->set_mode(synfigapp::InputDevice::MODE_DISABLED);
95                                //synfigapp::Main::select_input_device(input_device);
96                        }
97                }
98
99                g_list_free(device_list);
100        }
101
102        // Once all devices are disabled be sure that the core pointer is the
103        // one selected. The user should decide later whether enable and save the
104        // rest of input devices found.
105        synfigapp::Main::select_input_device(
106                gdk_device_get_name(
107                        gdk_device_manager_get_client_pointer(
108                                gdk_display_get_device_manager(
109                                        gdk_display_manager_get_default_display(
110                                                gdk_display_manager_get() )))));
111}
112
113DeviceTracker::~DeviceTracker()
114{
115}
116
117void
118DeviceTracker::save_preferences()
119{
120        GdkDeviceType device_types[] =
121        {
122                GDK_DEVICE_TYPE_MASTER,
123                GDK_DEVICE_TYPE_SLAVE,
124                GDK_DEVICE_TYPE_FLOATING
125        };
126
127        for(int i = 0; i < (int)(sizeof(device_types)/sizeof(device_types[0])); ++i)
128        {
129                GList *device_list = gdk_device_manager_list_devices(
130                        gdk_display_get_device_manager(
131                                gdk_display_manager_get_default_display(
132                                        gdk_display_manager_get() )),
133                        device_types[i] );
134
135                for(GList *itr=device_list; itr; itr=g_list_next(itr))
136                {
137                        GdkDevice * gdk_device = reinterpret_cast<GdkDevice*>(itr->data);
138
139                        InputDevice::Handle synfig_device =
140                                synfigapp::Main::find_input_device(
141                                        gdk_device_get_name(gdk_device) );
142                        if (!synfig_device)
143                                continue;
144
145                        synfig_device->set_mode(InputDevice::Mode(gdk_device_get_mode(gdk_device)));
146                        int n_axes = gdk_device_get_n_axes(gdk_device);
147                        if (n_axes > 0) {
148                                vector<synfigapp::InputDevice::AxisUse> axes(n_axes);
149                                for(int j = 0; j < n_axes; ++j)
150                                        axes[j] = InputDevice::AxisUse(gdk_device_get_axis_use(gdk_device, j));
151                                synfig_device->set_axes(axes);
152                        }
153
154                        int n_keys = gdk_device_get_n_keys(gdk_device);
155                        if (n_keys > 0) {
156                                vector<synfigapp::InputDevice::DeviceKey> keys(n_keys);
157                                for(int j = 0; j < n_keys; ++j) {
158                                        guint gdk_keyval = 0;
159                                        GdkModifierType gdk_modifiers = GdkModifierType();
160                                        gdk_device_get_key(gdk_device, j, &gdk_keyval, &gdk_modifiers);
161                                        keys[i].keyval = gdk_keyval;
162                                        keys[i].modifiers = gdk_modifiers;
163                                }
164                                synfig_device->set_keys(keys);
165                        }
166                }
167
168                g_list_free(device_list);
169        }
170}
171
172void
173DeviceTracker::load_preferences()
174{
175        GdkDeviceType device_types[] =
176        {
177                GDK_DEVICE_TYPE_MASTER,
178                GDK_DEVICE_TYPE_SLAVE,
179                GDK_DEVICE_TYPE_FLOATING
180        };
181
182        for(int i = 0; i < (int)(sizeof(device_types)/sizeof(device_types[0])); ++i)
183        {
184                GList *device_list = gdk_device_manager_list_devices(
185                        gdk_display_get_device_manager(
186                                gdk_display_manager_get_default_display(
187                                        gdk_display_manager_get() )),
188                        device_types[i] );
189
190                for(GList *itr=device_list; itr; itr=g_list_next(itr))
191                {
192                        GdkDevice * gdk_device = reinterpret_cast<GdkDevice*>(itr->data);
193
194                        InputDevice::Handle synfig_device =
195                                synfigapp::Main::find_input_device(
196                                        gdk_device_get_name(gdk_device) );
197                        if (!synfig_device)
198                                continue;
199
200                        gdk_device_set_mode(gdk_device, GdkInputMode(synfig_device->get_mode()));
201
202                        const std::vector<synfigapp::InputDevice::AxisUse> axes = synfig_device->get_axes();
203                        for (int axis = 0; axis < (int) axes.size(); axis++)
204                                gdk_device_set_axis_use(gdk_device, axis, GdkAxisUse(axes[axis]));
205
206                        const std::vector<synfigapp::InputDevice::DeviceKey> keys = synfig_device->get_keys();
207                        for (int key = 0; key < (int) keys.size(); key++)
208                                gdk_device_set_key(gdk_device, key, keys[key].keyval,
209                                                GdkModifierType(keys[key].modifiers));
210                }
211
212                g_list_free(device_list);
213        }
214}
Note: See TracBrowser for help on using the repository browser.