diff options
| author | Alex Valavanis <valavanisalex@gmail.com> | 2015-02-14 11:22:04 +0000 |
|---|---|---|
| committer | Alex Valavanis <valavanisalex@gmail.com> | 2015-02-14 11:22:04 +0000 |
| commit | b3078759626de4242cfedd856364477672bf1cee (patch) | |
| tree | 324751d2a5fb5f551e74e2d10f78035b030186e9 /src/device-manager.cpp | |
| parent | Fix for Bug #137168 (Update Columns in inkscape default palette). (diff) | |
| download | inkscape-b3078759626de4242cfedd856364477672bf1cee.tar.gz inkscape-b3078759626de4242cfedd856364477672bf1cee.zip | |
device-manager: Migrate to Gtkmm
(bzr r13921)
Diffstat (limited to 'src/device-manager.cpp')
| -rw-r--r-- | src/device-manager.cpp | 193 |
1 files changed, 102 insertions, 91 deletions
diff --git a/src/device-manager.cpp b/src/device-manager.cpp index 610173d3d..eb7265e80 100644 --- a/src/device-manager.cpp +++ b/src/device-manager.cpp @@ -12,21 +12,29 @@ #include <set> #include "preferences.h" -#include <gtk/gtk.h> +#include <gdkmm/display.h> +#include <gtkmm/accelkey.h> + +#if WITH_GTKMM_3_0 +# include <gdkmm/devicemanager.h> +#endif + #include <glibmm/regex.h> +#include <gtk/gtk.h> + #define noDEBUG_VERBOSE 1 // This is a copy of the private fields of the GdkDevice object, used in order // to create a list of "fake" devices. struct GdkDeviceFake { - gchar *name; - GdkInputSource source; - GdkInputMode mode; - gboolean has_cursor; - gint num_axes; - gint num_keys; + Glib::ustring name; + Gdk::InputSource source; + Gdk::InputMode mode; + bool has_cursor; + int num_axes; + int num_keys; }; @@ -34,15 +42,19 @@ static void createFakeList(); GdkDeviceFake fakeout[5]; static GList* fakeList = 0; -static bool isValidDevice(GdkDevice *device) +static bool isValidDevice(Glib::RefPtr<Gdk::Device> device) { bool valid = true; for (size_t i = 0; (i < G_N_ELEMENTS(fakeout)) && valid; i++) { - gboolean name_matches = (g_strcmp0 (gdk_device_get_name (device), fakeout[i].name) == 0); - gboolean source_matches = (gdk_device_get_source (device) == fakeout[i].source); - gboolean mode_matches = (gdk_device_get_mode (device) == fakeout[i].mode); - gboolean num_axes_matches = (gdk_device_get_n_axes (device) == fakeout[i].num_axes); - gboolean num_keys_matches = (gdk_device_get_n_keys (device) == fakeout[i].num_keys); + const bool name_matches = (device->get_name() == fakeout[i].name); + const bool source_matches = (device->get_source() == fakeout[i].source); + const bool mode_matches = (device->get_mode() == fakeout[i].mode); + const bool num_axes_matches = (device->get_n_axes() == fakeout[i].num_axes); +#if WITH_GTKMM_3_0 + const bool num_keys_matches = (device->get_n_keys() == fakeout[i].num_keys); +#else + const bool num_keys_matches = (gdk_device_get_n_keys(device->gobj()) == fakeout[i].num_keys); +#endif if (name_matches && source_matches && mode_matches && num_axes_matches && num_keys_matches) @@ -157,19 +169,22 @@ InputDevice::~InputDevice() {} class InputDeviceImpl : public InputDevice { public: - InputDeviceImpl(GdkDevice* device, std::set<Glib::ustring> &knownIDs); + InputDeviceImpl(Glib::RefPtr<Gdk::Device> device, std::set<Glib::ustring> &knownIDs); virtual ~InputDeviceImpl() {} virtual Glib::ustring getId() const {return id;} virtual Glib::ustring getName() const {return name;} virtual Gdk::InputSource getSource() const {return source;} - virtual Gdk::InputMode getMode() const {return static_cast<Gdk::InputMode>(gdk_device_get_mode (device));} - virtual gint getNumAxes() const {return gdk_device_get_n_axes (device);} - virtual bool hasCursor() const {return gdk_device_get_has_cursor (device);} + virtual Gdk::InputMode getMode() const {return (device->get_mode());} + virtual gint getNumAxes() const {return device->get_n_axes();} + virtual bool hasCursor() const {return device->get_has_cursor();} + +#if WITH_GTKMM_3_0 + virtual int getNumKeys() const {return device->get_n_keys();} +#else + virtual int getNumKeys() const {return gdk_device_get_n_keys(device->gobj());} +#endif - virtual gint getNumKeys() const { - return gdk_device_get_n_keys (device); - } virtual Glib::ustring getLink() const {return link;} virtual void setLink( Glib::ustring const& link ) {this->link = link;} virtual gint getLiveAxes() const {return liveAxes;} @@ -178,7 +193,7 @@ public: virtual void setLiveButtons(gint buttons) {liveButtons = buttons;} // internal methods not on public superclass: - virtual GdkDevice *getDevice() { return device; } + virtual Glib::RefPtr<Gdk::Device> getDevice() {return device;} private: InputDeviceImpl(InputDeviceImpl const &); // no copy @@ -186,7 +201,7 @@ private: static Glib::ustring createId(Glib::ustring const &id, Gdk::InputSource source, std::set<Glib::ustring> &knownIDs); - GdkDevice* device; + Glib::RefPtr<Gdk::Device> device; Glib::ustring id; Glib::ustring name; Gdk::InputSource source; @@ -213,12 +228,12 @@ private: Glib::ustring const& target; }; -InputDeviceImpl::InputDeviceImpl(GdkDevice* device, std::set<Glib::ustring> &knownIDs) +InputDeviceImpl::InputDeviceImpl(Glib::RefPtr<Gdk::Device> device, std::set<Glib::ustring> &knownIDs) : InputDevice(), device(device), id(), - name(gdk_device_get_name (device) ? gdk_device_get_name (device) : ""), - source(static_cast<Gdk::InputSource>(gdk_device_get_source (device))), + name(!device->get_name().empty() ? device->get_name() : ""), + source(device->get_source()), link(), liveAxes(0), liveButtons(0) @@ -312,12 +327,13 @@ DeviceManagerImpl::DeviceManagerImpl() : DeviceManager(), devices() { -#if GTK_CHECK_VERSION(3,0,0) - GdkDisplay *display = gdk_display_get_default(); - GdkDeviceManager *dm = gdk_display_get_device_manager(display); - GList* devList = gdk_device_manager_list_devices(dm, GDK_DEVICE_TYPE_SLAVE); + Glib::RefPtr<Gdk::Display> display = Gdk::Display::get_default(); + +#if WITH_GTKMM_3_0 + Glib::RefPtr<Gdk::DeviceManager> dm = display->get_device_manager(); + std::vector< Glib::RefPtr<Gdk::Device> > devList = dm->list_devices(Gdk::DEVICE_TYPE_SLAVE); #else - GList* devList = gdk_devices_list(); + std::vector< Glib::RefPtr<Gdk::Device> > devList = display->list_devices(); #endif if ( !fakeList ) { @@ -327,13 +343,10 @@ DeviceManagerImpl::DeviceManagerImpl() : std::set<Glib::ustring> knownIDs; - for ( GList* curr = devList; curr; curr = g_list_next(curr) ) { - GdkDevice* dev = reinterpret_cast<GdkDevice*>(curr->data); - if (dev) { - -#if GTK_CHECK_VERSION(3,0,0) + for ( std::vector< Glib::RefPtr<Gdk::Device> >::iterator dev = devList.begin(); dev != devList.end(); ++dev ) { +#if WITH_GTKMM_3_0 // GTK+ 3 has added keyboards to the list of supported devices. - if(gdk_device_get_source(dev) != GDK_SOURCE_KEYBOARD) { + if((*dev)->get_source() != Gdk::SOURCE_KEYBOARD) { #endif #if DEBUG_VERBOSE @@ -341,20 +354,14 @@ DeviceManagerImpl::DeviceManagerImpl() : dev->has_cursor?"Yes":"no", dev->num_axes, dev->num_keys); #endif - InputDeviceImpl* device = new InputDeviceImpl(dev, knownIDs); + InputDeviceImpl* device = new InputDeviceImpl(*dev, knownIDs); device->reference(); devices.push_back(Glib::RefPtr<InputDeviceImpl>(device)); -#if GTK_CHECK_VERSION(3,0,0) +#if WITH_GTKMM_3_0 } #endif - - } } - -#if GTK_CHECK_VERSION(3,0,0) - g_list_free(devList); -#endif } void DeviceManagerImpl::loadConfig() @@ -420,8 +427,8 @@ void DeviceManagerImpl::saveConfig() if (i > 0) { tmp += ";"; } - GdkDevice *device = (*it)->getDevice(); - tmp += getAxisToString()[static_cast<Gdk::AxisUse>(gdk_device_get_axis_use (device, i))]; + Glib::RefPtr<Gdk::Device> device = (*it)->getDevice(); + tmp += getAxisToString()[device->get_axis_use(i)]; } prefs->setString( path + "/axes", tmp ); @@ -430,11 +437,12 @@ void DeviceManagerImpl::saveConfig() if (i > 0) { tmp += ";"; } - GdkDevice *device = (*it)->getDevice(); + Glib::RefPtr<Gdk::Device> device = (*it)->getDevice(); guint keyval; - GdkModifierType modifiers; - gdk_device_get_key (device, i, &keyval, &modifiers); - tmp += gtk_accelerator_name(keyval, modifiers); + Gdk::ModifierType modifiers; + device->get_key(i, keyval, modifiers); + Gtk::AccelKey accelkey(keyval, modifiers); + tmp += accelkey.get_abbrev(); } prefs->setString( path + "/keys", tmp ); } @@ -454,8 +462,9 @@ void DeviceManagerImpl::setMode( Glib::ustring const & id, Gdk::InputMode mode ) { std::list<Glib::RefPtr<InputDeviceImpl> >::iterator it = std::find_if(devices.begin(), devices.end(), IdMatcher(id)); if ( it != devices.end() ) { - if (isValidDevice((*it)->getDevice()) && ((*it)->getMode() != mode) ) { - bool success = gdk_device_set_mode((*it)->getDevice(), static_cast<GdkInputMode>(mode)); + Glib::RefPtr<Gdk::Device> device = (*it)->getDevice(); + if (isValidDevice(device) && ((*it)->getMode() != mode) ) { + bool success = device->set_mode(mode); if (success) { signalDeviceChangedPriv.emit(*it); } else { @@ -471,10 +480,10 @@ void DeviceManagerImpl::setAxisUse( Glib::ustring const & id, guint index, Gdk:: if ( it != devices.end() ) { if (isValidDevice((*it)->getDevice())) { if (static_cast<gint>(index) <= (*it)->getNumAxes()) { - GdkDevice *device = (*it)->getDevice(); + Glib::RefPtr<Gdk::Device> device = (*it)->getDevice(); - if (gdk_device_get_axis_use (device, index) != static_cast<GdkAxisUse>(use)) { - gdk_device_set_axis_use(device, index, static_cast<GdkAxisUse>(use)); + if (device->get_axis_use(index) != use) { + device->set_axis_use(index, use); signalDeviceChangedPriv.emit(*it); } } else { @@ -492,7 +501,8 @@ void DeviceManagerImpl::setKey( Glib::ustring const & id, guint index, guint key std::list<Glib::RefPtr<InputDeviceImpl> >::iterator it = std::find_if(devices.begin(), devices.end(), IdMatcher(id)); if ( it != devices.end() ) { if (isValidDevice((*it)->getDevice())) { - gdk_device_set_key((*it)->getDevice(), index, keyval, static_cast<GdkModifierType>(mods)); + Glib::RefPtr<Gdk::Device> device = (*it)->getDevice(); + device->set_key(index, keyval, mods); signalDeviceChangedPriv.emit(*it); } } @@ -630,76 +640,77 @@ DeviceManager& DeviceManager::getManager() { static void createFakeList() { if ( !fakeList ) { fakeout[0].name = g_strdup("pad"); - fakeout[0].source = GDK_SOURCE_PEN; - fakeout[0].mode = GDK_MODE_SCREEN; + fakeout[0].source = Gdk::SOURCE_PEN; + fakeout[0].mode = Gdk::MODE_SCREEN; fakeout[0].has_cursor = TRUE; fakeout[0].num_axes = 6; fakeout[0].num_keys = 8; fakeout[1].name = g_strdup("eraser"); - fakeout[1].source = GDK_SOURCE_ERASER; - fakeout[1].mode = GDK_MODE_SCREEN; + fakeout[1].source = Gdk::SOURCE_ERASER; + fakeout[1].mode = Gdk::MODE_SCREEN; fakeout[1].has_cursor = TRUE; fakeout[1].num_axes = 6; fakeout[1].num_keys = 7; fakeout[2].name = g_strdup("cursor"); - fakeout[2].source = GDK_SOURCE_CURSOR; - fakeout[2].mode = GDK_MODE_SCREEN; + fakeout[2].source = Gdk::SOURCE_CURSOR; + fakeout[2].mode = Gdk::MODE_SCREEN; fakeout[2].has_cursor = TRUE; fakeout[2].num_axes = 6; fakeout[2].num_keys = 7; fakeout[3].name = g_strdup("stylus"); - fakeout[3].source = GDK_SOURCE_PEN; - fakeout[3].mode = GDK_MODE_SCREEN; + fakeout[3].source = Gdk::SOURCE_PEN; + fakeout[3].mode = Gdk::MODE_SCREEN; fakeout[3].has_cursor = TRUE; fakeout[3].num_axes = 6; fakeout[3].num_keys = 7; // try to find the first *real* core pointer -#if GTK_CHECK_VERSION(3,0,0) - GdkDisplay *display = gdk_display_get_default(); - GdkDeviceManager *dm = gdk_display_get_device_manager(display); - GList* devList = gdk_device_manager_list_devices(dm, GDK_DEVICE_TYPE_SLAVE); + Glib::RefPtr<Gdk::Display> display = Gdk::Display::get_default(); +#if WITH_GTKMM_3_0 + Glib::RefPtr<Gdk::DeviceManager> dm = display->get_device_manager(); + std::vector< Glib::RefPtr<Gdk::Device> > devList = dm->list_devices(Gdk::DEVICE_TYPE_SLAVE); #else - GList* devList = gdk_devices_list(); + std::vector< Glib::RefPtr<Gdk::Device> > devList = display->list_devices(); #endif + // Set iterator to point at beginning of device list + std::vector< Glib::RefPtr<Gdk::Device> >::iterator dev = devList.begin(); + // Skip past any items in the device list that are not mice - while ( devList && devList->data && (gdk_device_get_source ((GdkDevice*)devList->data) != GDK_SOURCE_MOUSE)) { - devList = g_list_next(devList); + while (dev != devList.end() && (*dev)->get_source() != Gdk::SOURCE_MOUSE) { + ++dev; } - if ( devList && devList->data ) { - GdkDevice *device = (GdkDevice*)devList->data; - fakeout[4].name = g_strdup(gdk_device_get_name (device)); - fakeout[4].source = gdk_device_get_source (device); - fakeout[4].mode = gdk_device_get_mode (device); - fakeout[4].has_cursor = gdk_device_get_has_cursor (device); - fakeout[4].num_axes = gdk_device_get_n_axes (device); - fakeout[4].num_keys = gdk_device_get_n_keys (device); + if (dev != devList.end()) { + Glib::RefPtr<Gdk::Device> device = *dev; + fakeout[4].name = device->get_name(); + fakeout[4].source = device->get_source(); + fakeout[4].mode = device->get_mode(); + fakeout[4].has_cursor = device->get_has_cursor(); + fakeout[4].num_axes = device->get_n_axes(); +#if WITH_GTKMM_3_0 + fakeout[4].num_keys = device->get_n_keys(); +#else + fakeout[4].num_keys = gdk_device_get_n_keys(device->gobj()); +#endif } else { - fakeout[4].name = g_strdup("Core Pointer"); - fakeout[4].source = GDK_SOURCE_MOUSE; - fakeout[4].mode = GDK_MODE_SCREEN; - fakeout[4].has_cursor = TRUE; - fakeout[4].num_axes = 2; - fakeout[4].num_keys = 0; + fakeout[4].name = "Core Pointer"; + fakeout[4].source = Gdk::SOURCE_MOUSE; + fakeout[4].mode = Gdk::MODE_SCREEN; + fakeout[4].has_cursor = true; + fakeout[4].num_axes = 2; + fakeout[4].num_keys = 0; } for ( guint pos = 0; pos < G_N_ELEMENTS(fakeout); pos++) { fakeList = g_list_append(fakeList, &(fakeout[pos])); } - -#if GTK_CHECK_VERSION(3,0,0) - g_list_free(devList); -#endif } - } - /* Local Variables: mode:c++ |
