summaryrefslogtreecommitdiff
path: root/libcaribou/keyboard-model.vala
diff options
context:
space:
mode:
authorEitan Isaacson <eitan@monotonous.org>2011-07-06 14:44:39 -0500
committerEitan Isaacson <eitan@monotonous.org>2011-07-18 10:07:40 -0700
commit148a3d8a064a211a8ef0e332cbf21e8612106787 (patch)
tree531c43caa1924efe01d8e5691b719328b20c10e0 /libcaribou/keyboard-model.vala
parent0e2226cb0c0b7434a57f1357489af11e365beb13 (diff)
downloadcaribou-148a3d8a064a211a8ef0e332cbf21e8612106787.tar.gz
Add Ctrl/Alt functionality
Based on a patch by Nohemi Fernandez <nf68@cornell.edu>.
Diffstat (limited to 'libcaribou/keyboard-model.vala')
-rw-r--r--libcaribou/keyboard-model.vala31
1 files changed, 27 insertions, 4 deletions
diff --git a/libcaribou/keyboard-model.vala b/libcaribou/keyboard-model.vala
index 0b7bea0..ef31235 100644
--- a/libcaribou/keyboard-model.vala
+++ b/libcaribou/keyboard-model.vala
@@ -8,6 +8,7 @@ namespace Caribou {
private XAdapter xadapter;
private Gee.HashMap<string, GroupModel> groups;
private KeyModel last_activated_key;
+ private Gee.HashSet<KeyModel> active_mod_keys;
construct {
uint grpid;
@@ -29,6 +30,8 @@ namespace Caribou {
grpid = xadapter.get_current_group (out group, out variant);
on_group_changed (grpid, group, variant);
+
+ active_mod_keys = new Gee.HashSet<KeyModel> ();
}
private void populate_group (string group, string variant) {
@@ -36,17 +39,37 @@ namespace Caribou {
group, variant);
if (grp != null) {
groups.set (GroupModel.create_group_name (group, variant), grp);
- grp.key_activated.connect (on_key_activated);
+ grp.key_clicked.connect (on_key_clicked);
+ grp.key_pressed.connect (on_key_pressed);
+ grp.key_released.connect (on_key_released);
}
}
- private void on_key_activated (KeyModel key) {
+ private void on_key_clicked (KeyModel key) {
if (key.name == "Caribou_Repeat")
last_activated_key.activate ();
else
last_activated_key = key;
- key_activated (key);
+ key_clicked (key);
+ }
+
+ private void on_key_pressed (KeyModel key) {
+ if (key.is_modifier && key.modifier_state == ModifierState.LATCHED) {
+ active_mod_keys.add(key);
+ }
+ }
+
+ private void on_key_released (KeyModel key) {
+ if (!key.is_modifier) {
+ KeyModel[] modifiers = (KeyModel[]) active_mod_keys.to_array ();
+ foreach (KeyModel modifier in modifiers) {
+ if (modifier.modifier_state == ModifierState.LATCHED) {
+ modifier.modifier_state = ModifierState.NONE;
+ modifier.release ();
+ }
+ }
+ }
}
public string[] get_groups () {
@@ -70,4 +93,4 @@ namespace Caribou {
return (IKeyboardObject[]) groups.values.to_array ();
}
}
-} \ No newline at end of file
+}