Code

add experimental modifier remapping
authormental <mental@users.sourceforge.net>
Wed, 29 Aug 2007 03:24:44 +0000 (03:24 +0000)
committermental <mental@users.sourceforge.net>
Wed, 29 Aug 2007 03:24:44 +0000 (03:24 +0000)
src/inkscape-private.h
src/inkscape.cpp
src/main.cpp
src/preferences-skeleton.h

index e6e6a44ea66c9430f88d6271d08fe6291f587e89..93fd9c8afb7a881fa54834987848a485a811ce4d 100644 (file)
@@ -29,6 +29,9 @@ GType inkscape_get_type (void);
 void inkscape_ref (void);
 void inkscape_unref (void);
 
+guint inkscape_mapalt();
+void inkscape_mapalt(guint);
+
 /*
  * These are meant solely for desktop, document etc. implementations
  */
index c167be493c0900a05a12b9560472da180c80b6a8..7e46efce6eb672e94fc91a195ff82bc2e9a5dc47 100644 (file)
@@ -117,6 +117,7 @@ struct Inkscape::Application {
     gboolean dialogs_toggle;
     gboolean use_gui;         // may want to consider a virtual function
                               // for overriding things like the warning dlg's
+    guint mapalt;
 };
 
 struct Inkscape::ApplicationClass {
@@ -302,8 +303,9 @@ inkscape_init (SPObject * object)
     inkscape->desktops = NULL;
 
     inkscape->dialogs_toggle = TRUE;
-}
 
+    inkscape->mapalt=GDK_MOD1_MASK;    
+}
 
 static void
 inkscape_dispose (GObject *object)
@@ -348,6 +350,22 @@ inkscape_unref (void)
         g_object_unref (G_OBJECT (inkscape));
 }
 
+/* returns the mask of the keyboard modifier to map to Alt, zero if no mapping */
+/* Needs to be a guint because gdktypes.h does not define a 'no-modifier' value */
+guint
+inkscape_mapalt() {
+    return inkscape->mapalt;
+}
+
+/* Sets the keyboard modifer to map to Alt. Zero switches off mapping, as does '1', which is the default */
+void inkscape_mapalt(guint maskvalue)
+{
+    if(maskvalue<2 || maskvalue> 5 ){  /* MOD5 is the highest defined in gdktypes.h */
+        inkscape->mapalt=0;
+    }else{
+        inkscape->mapalt=(GDK_MOD1_MASK << (maskvalue-1));
+    }
+}
 
 static void
 inkscape_activate_desktop_private (Inkscape::Application *inkscape, SPDesktop *desktop)
@@ -594,6 +612,12 @@ inkscape_application_init (const gchar *argv0, gboolean use_gui)
                Inkscape::UI::Dialogs::DebugDialog::getInstance()->captureLogMessages();
     }
 
+    /* Check for global remapping of Alt key */
+    if(use_gui)
+    {
+        inkscape_mapalt(guint(prefs_get_int_attribute("options.mapalt","value",0)));
+    }
+
     /* Initialize the extensions */
     Inkscape::Extension::init();
 
index 87913a80144e11ea01b536195afd8608b822bc44..cc359793a518983bdec6b68639fe8777cce17d10 100644 (file)
@@ -620,6 +620,34 @@ int sp_common_main( int argc, char const **argv, GSList **flDest )
     return 0;
 }
 
+static void
+snooper(GdkEvent *event, gpointer data) { 
+    if(inkscape_mapalt())  /* returns the map of the keyboard modifier to map to Alt, zero if no mapping */
+    {
+        GdkModifierType mapping=(GdkModifierType)inkscape_mapalt();
+        switch (event->type) {
+            case GDK_MOTION_NOTIFY:
+                if(event->motion.state & mapping) {
+                    event->motion.state|=GDK_MOD1_MASK;
+                }
+                break;       
+            case GDK_BUTTON_PRESS:
+                if(event->button.state & mapping) {
+                    event->button.state|=GDK_MOD1_MASK;
+                }
+                break;       
+             case GDK_KEY_PRESS:
+                 if(event->key.state & mapping) {
+                     event->key.state|=GDK_MOD1_MASK;
+                 }
+                 break;                
+        default:
+            break;
+        }
+    }
+    gtk_main_do_event (event);
+}
+
 int
 sp_main_gui(int argc, char const **argv)
 {
@@ -631,6 +659,8 @@ sp_main_gui(int argc, char const **argv)
 
     inkscape_gtk_stock_init();
 
+    gdk_event_handler_set((GdkEventFunc)snooper, NULL, NULL);
+
     Inkscape::Debug::log_display_config();
 
     /* Set default icon */
index eb83a2b95c570a6046456d8fd67b07ff0ac687e4..457fa692631ff73d074c156bd059120262ef0f3f 100644 (file)
@@ -175,6 +175,7 @@ static char const preferences_skeleton[] =
 "  </group>\n"
 "\n"
 "  <group id=\"options\">\n"
+"    <group id=\"mapalt\" value=\"1\" />"
 "    <group id=\"useextinput\" value=\"1\" />"
 "    <group id=\"nudgedistance\" value=\"2\"/>\n"
 "    <group id=\"rotationsnapsperpi\" value=\"12\"/>\n"