~attente/gnome-control-center/lp1218322

« back to all changes in this revision

Viewing changes to debian/patches/input-sources-text-entry.patch

  • Committer: William Hua
  • Date: 2013-10-21 21:11:43 UTC
  • Revision ID: william.hua@canonical.com-20131021211143-7af9ct15iwku4fxc
Allow double-modifiers.

Show diffs side-by-side

added added

removed removed

Lines of Context:
665
665
 static void
666
666
--- /dev/null
667
667
+++ b/panels/region/gtkentryaccel.c
668
 
@@ -0,0 +1,525 @@
 
668
@@ -0,0 +1,653 @@
669
669
+#include "gtkentryaccel.h"
670
670
+#include <glib/gi18n.h>
671
671
+
690
690
+
691
691
+  GdkDevice *keyboard;
692
692
+  GdkDevice *pointer;
 
693
+
 
694
+  gboolean left_shift : 1;
 
695
+  gboolean right_shift : 1;
 
696
+  gboolean left_control : 1;
 
697
+  gboolean right_control : 1;
 
698
+  gboolean left_alt : 1;
 
699
+  gboolean right_alt : 1;
 
700
+  gboolean left_super : 1;
 
701
+  gboolean right_super : 1;
693
702
+};
694
703
+
695
704
+G_DEFINE_TYPE (GtkEntryAccel, gtk_entry_accel, GTK_TYPE_ENTRY);
733
742
+}
734
743
+
735
744
+static void
 
745
+gtk_entry_accel_reset_modifier_states (GtkEntryAccel *entry)
 
746
+{
 
747
+  g_return_if_fail (GTK_IS_ENTRY_ACCEL (entry));
 
748
+
 
749
+  entry->priv->left_shift = FALSE;
 
750
+  entry->priv->right_shift = FALSE;
 
751
+  entry->priv->left_control = FALSE;
 
752
+  entry->priv->right_control = FALSE;
 
753
+  entry->priv->left_alt = FALSE;
 
754
+  entry->priv->right_alt = FALSE;
 
755
+  entry->priv->left_super = FALSE;
 
756
+  entry->priv->right_super = FALSE;
 
757
+}
 
758
+
 
759
+static gboolean
 
760
+gtk_entry_accel_get_modifier_state (GtkEntryAccel *entry,
 
761
+                                    guint          key)
 
762
+{
 
763
+  g_return_val_if_fail (GTK_IS_ENTRY_ACCEL (entry), FALSE);
 
764
+
 
765
+  switch (key)
 
766
+    {
 
767
+    case GDK_KEY_Shift_L:
 
768
+      return entry->priv->left_shift;
 
769
+    case GDK_KEY_Shift_R:
 
770
+      return entry->priv->right_shift;
 
771
+    case GDK_KEY_Control_L:
 
772
+      return entry->priv->left_control;
 
773
+    case GDK_KEY_Control_R:
 
774
+      return entry->priv->right_control;
 
775
+    case GDK_KEY_Meta_L:
 
776
+    case GDK_KEY_Alt_L:
 
777
+      return entry->priv->left_alt;
 
778
+    case GDK_KEY_Meta_R:
 
779
+    case GDK_KEY_Alt_R:
 
780
+      return entry->priv->right_alt;
 
781
+    case GDK_KEY_Super_L:
 
782
+      return entry->priv->left_super;
 
783
+    case GDK_KEY_Super_R:
 
784
+      return entry->priv->right_super;
 
785
+    }
 
786
+
 
787
+  return FALSE;
 
788
+}
 
789
+
 
790
+static void
 
791
+gtk_entry_accel_set_modifier_state (GtkEntryAccel *entry,
 
792
+                                    guint          key,
 
793
+                                    gboolean       state)
 
794
+{
 
795
+  g_return_if_fail (GTK_IS_ENTRY_ACCEL (entry));
 
796
+
 
797
+  switch (key)
 
798
+    {
 
799
+    case GDK_KEY_Shift_L:
 
800
+      entry->priv->left_shift = state;
 
801
+      break;
 
802
+    case GDK_KEY_Shift_R:
 
803
+      entry->priv->right_shift = state;
 
804
+      break;
 
805
+    case GDK_KEY_Control_L:
 
806
+      entry->priv->left_control = state;
 
807
+      break;
 
808
+    case GDK_KEY_Control_R:
 
809
+      entry->priv->right_control = state;
 
810
+      break;
 
811
+    case GDK_KEY_Meta_L:
 
812
+    case GDK_KEY_Alt_L:
 
813
+      entry->priv->left_alt = state;
 
814
+      break;
 
815
+    case GDK_KEY_Meta_R:
 
816
+    case GDK_KEY_Alt_R:
 
817
+      entry->priv->right_alt = state;
 
818
+      break;
 
819
+    case GDK_KEY_Super_L:
 
820
+      entry->priv->left_super = state;
 
821
+      break;
 
822
+    case GDK_KEY_Super_R:
 
823
+      entry->priv->right_super = state;
 
824
+      break;
 
825
+    }
 
826
+}
 
827
+
 
828
+static void
736
829
+gtk_entry_accel_update_text (GtkEntryAccel *entry)
737
830
+{
738
831
+  if (entry->priv->keyboard == NULL || entry->priv->pointer == NULL)
801
894
+      g_clear_object (&entry->priv->pointer);
802
895
+    }
803
896
+
 
897
+  gtk_entry_accel_reset_modifier_states (entry);
804
898
+  gtk_entry_accel_update_text (entry);
805
899
+}
806
900
+
1008
1102
+  guint mask = event->state & GTK_ENTRY_ACCEL_MODIFIER_MASK;
1009
1103
+  gboolean grabbed = entry->priv->keyboard != NULL && entry->priv->pointer != NULL;
1010
1104
+
 
1105
+  gtk_entry_accel_set_modifier_state (entry, key, TRUE);
 
1106
+
1011
1107
+  return ((grabbed ? mask : (mask & ~GDK_SHIFT_MASK)) != 0 ||
1012
1108
+          (key != GDK_KEY_Tab &&
1013
1109
+           key != GDK_KEY_KP_Tab &&
1047
1143
+  return 0;
1048
1144
+}
1049
1145
+
 
1146
+static guint
 
1147
+gtk_entry_accel_get_mirrored_key (guint key)
 
1148
+{
 
1149
+  switch (key)
 
1150
+    {
 
1151
+    case GDK_KEY_Shift_L:
 
1152
+      return GDK_KEY_Shift_R;
 
1153
+    case GDK_KEY_Shift_R:
 
1154
+      return GDK_KEY_Shift_L;
 
1155
+    case GDK_KEY_Control_L:
 
1156
+      return GDK_KEY_Control_R;
 
1157
+    case GDK_KEY_Control_R:
 
1158
+      return GDK_KEY_Control_L;
 
1159
+    case GDK_KEY_Meta_L:
 
1160
+      return GDK_KEY_Meta_R;
 
1161
+    case GDK_KEY_Meta_R:
 
1162
+      return GDK_KEY_Meta_L;
 
1163
+    case GDK_KEY_Alt_L:
 
1164
+      return GDK_KEY_Alt_R;
 
1165
+    case GDK_KEY_Alt_R:
 
1166
+      return GDK_KEY_Alt_L;
 
1167
+    case GDK_KEY_Super_L:
 
1168
+      return GDK_KEY_Super_R;
 
1169
+    case GDK_KEY_Super_R:
 
1170
+      return GDK_KEY_Super_L;
 
1171
+    case GDK_KEY_Hyper_L:
 
1172
+      return GDK_KEY_Hyper_R;
 
1173
+    }
 
1174
+
 
1175
+  return 0;
 
1176
+}
 
1177
+
1050
1178
+static gboolean
1051
1179
+gtk_entry_accel_key_release_event (GtkWidget   *widget,
1052
1180
+                                   GdkEventKey *event)
1056
1184
+  guint code = event->hardware_keycode;
1057
1185
+  guint mask = event->state & GTK_ENTRY_ACCEL_MODIFIER_MASK;
1058
1186
+
1059
 
+  switch (key)
1060
 
+    {
1061
 
+    case GDK_KEY_Meta_L:
1062
 
+      key = GDK_KEY_Alt_L;
1063
 
+      break;
1064
 
+
1065
 
+    case GDK_KEY_Meta_R:
1066
 
+      key = GDK_KEY_Alt_R;
1067
 
+      break;
1068
 
+    }
1069
 
+
1070
 
+  if (event->is_modifier)
1071
 
+    mask &= ~gtk_entry_accel_get_mask_for_key (key);
1072
 
+
1073
1187
+  if (entry->priv->keyboard != NULL && entry->priv->pointer != NULL)
1074
1188
+    {
 
1189
+      switch (key)
 
1190
+        {
 
1191
+        case GDK_KEY_Meta_L:
 
1192
+          key = GDK_KEY_Alt_L;
 
1193
+          break;
 
1194
+
 
1195
+        case GDK_KEY_Meta_R:
 
1196
+          key = GDK_KEY_Alt_R;
 
1197
+          break;
 
1198
+        }
 
1199
+
 
1200
+      if (event->is_modifier && !gtk_entry_accel_get_modifier_state (entry, gtk_entry_accel_get_mirrored_key (key)))
 
1201
+        mask &= ~gtk_entry_accel_get_mask_for_key (key);
 
1202
+
1075
1203
+      gtk_entry_accel_ungrab_input (entry, (GdkEvent *) event);
1076
1204
+
1077
1205
+      switch (gtk_entry_accel_key_pressed (entry, &key, &code, &mask))