diff options
Diffstat (limited to 'src/utilities')
-rw-r--r-- | src/utilities/bindingManager.vala | 84 | ||||
-rw-r--r-- | src/utilities/color.vala | 21 | ||||
-rw-r--r-- | src/utilities/config.vala | 2 | ||||
-rw-r--r-- | src/utilities/key.vala | 12 | ||||
-rw-r--r-- | src/utilities/trigger.vala | 2 |
5 files changed, 88 insertions, 33 deletions
diff --git a/src/utilities/bindingManager.vala b/src/utilities/bindingManager.vala index e90fa74..6ca73cf 100644 --- a/src/utilities/bindingManager.vala +++ b/src/utilities/bindingManager.vala @@ -99,18 +99,22 @@ public class BindingManager : GLib.Object { public void bind(Trigger trigger, string id) { if (trigger.key_code != 0) { - X.Display display = Gdk.X11.get_default_xdisplay(); + unowned X.Display display = Gdk.X11.get_default_xdisplay(); X.ID xid = Gdk.X11.get_default_root_xwindow(); Gdk.error_trap_push(); + // if bound to super key we need to grab MOD4 instead + // (for whatever reason...) + var modifiers = prepare_modifiers(trigger.modifiers); + foreach(uint lock_modifier in lock_modifiers) { if (trigger.with_mouse) { - display.grab_button(trigger.key_code, trigger.modifiers|lock_modifier, xid, false, + display.grab_button(trigger.key_code, modifiers|lock_modifier, xid, false, X.EventMask.ButtonPressMask | X.EventMask.ButtonReleaseMask, X.GrabMode.Async, X.GrabMode.Async, xid, 0); } else { - display.grab_key(trigger.key_code, trigger.modifiers|lock_modifier, + display.grab_key(trigger.key_code, modifiers|lock_modifier, xid, false, X.GrabMode.Async, X.GrabMode.Async); } } @@ -142,17 +146,22 @@ public class BindingManager : GLib.Object { } } - X.Display display = Gdk.X11.get_default_xdisplay(); + unowned X.Display display = Gdk.X11.get_default_xdisplay(); X.ID xid = Gdk.X11.get_default_root_xwindow(); Gee.List<Keybinding> remove_bindings = new Gee.ArrayList<Keybinding>(); foreach(var binding in bindings) { if(id == binding.id) { + + // if bound to super key we need to ungrab MOD4 instead + // (for whatever reason...) + var modifiers = prepare_modifiers(binding.trigger.modifiers); + foreach(uint lock_modifier in lock_modifiers) { if (binding.trigger.with_mouse) { - display.ungrab_button(binding.trigger.key_code, binding.trigger.modifiers|lock_modifier, xid); + display.ungrab_button(binding.trigger.key_code, modifiers|lock_modifier, xid); } else { - display.ungrab_key(binding.trigger.key_code, binding.trigger.modifiers|lock_modifier, xid); + display.ungrab_key(binding.trigger.key_code, modifiers|lock_modifier, xid); } } remove_bindings.add(binding); @@ -282,6 +291,21 @@ public class BindingManager : GLib.Object { } ///////////////////////////////////////////////////////////////////// + /// If SUPER_MASK is set in the input, it will be replaced with + /// MOD4_MASK. For some reason this is required to listen for key + /// presses of the super button.... + ///////////////////////////////////////////////////////////////////// + + private Gdk.ModifierType prepare_modifiers(Gdk.ModifierType mods) { + if ((mods & Gdk.ModifierType.SUPER_MASK) > 0) { + mods |= Gdk.ModifierType.MOD4_MASK; + mods = mods & ~ Gdk.ModifierType.SUPER_MASK; + } + + return mods & ~lock_modifiers[7]; + } + + ///////////////////////////////////////////////////////////////////// /// Event filter method needed to fetch X.Events. ///////////////////////////////////////////////////////////////////// @@ -296,9 +320,14 @@ public class BindingManager : GLib.Object { if(xevent->type == X.EventType.KeyPress) { foreach(var binding in bindings) { + // remove NumLock, CapsLock and ScrollLock from key state - uint event_mods = xevent.xkey.state & ~ (lock_modifiers[7]); - if(xevent->xkey.keycode == binding.trigger.key_code && event_mods == binding.trigger.modifiers) { + var event_mods = prepare_modifiers((Gdk.ModifierType)xevent.xkey.state); + var bound_mods = prepare_modifiers(binding.trigger.modifiers); + + if(xevent->xkey.keycode == binding.trigger.key_code && + event_mods == bound_mods) { + if (binding.trigger.delayed) { this.activate_delayed(binding, *xevent); } else { @@ -309,9 +338,14 @@ public class BindingManager : GLib.Object { } else if(xevent->type == X.EventType.ButtonPress) { foreach(var binding in bindings) { + // remove NumLock, CapsLock and ScrollLock from key state - uint event_mods = xevent.xbutton.state & ~ (lock_modifiers[7]); - if(xevent->xbutton.button == binding.trigger.key_code && event_mods == binding.trigger.modifiers) { + var event_mods = prepare_modifiers((Gdk.ModifierType)xevent.xbutton.state); + var bound_mods = prepare_modifiers(binding.trigger.modifiers); + + if(xevent->xbutton.button == binding.trigger.key_code && + event_mods == bound_mods) { + if (binding.trigger.delayed) { this.activate_delayed(binding, *xevent); } else { @@ -343,27 +377,27 @@ public class BindingManager : GLib.Object { // if the trigger is released and an event is currently waiting // simulate that the trigger has been pressed without any inter- // ference of Gnome-Pie - X.Display display = Gdk.X11.get_default_xdisplay(); + unowned X.Display display = Gdk.X11.get_default_xdisplay(); - // unbind the trigger, else we'll capture that event again ;) - unbind(delayed_binding.id); + // unbind the trigger, else we'll capture that event again ;) + unbind(delayed_binding.id); - if (this.delayed_binding.trigger.with_mouse) { - // simulate mouse click - X.Test.fake_button_event(display, this.delayed_event.xbutton.button, true, 0); - display.flush(); + if (this.delayed_binding.trigger.with_mouse) { + // simulate mouse click + XTest.fake_button_event(display, this.delayed_event.xbutton.button, true, 0); + display.flush(); - X.Test.fake_button_event(display, this.delayed_event.xbutton.button, false, 0); + XTest.fake_button_event(display, this.delayed_event.xbutton.button, false, 0); display.flush(); - } else { - // simulate key press - X.Test.fake_key_event(display, this.delayed_event.xkey.keycode, true, 0); - display.flush(); + } else { + // simulate key press + XTest.fake_key_event(display, this.delayed_event.xkey.keycode, true, 0); + display.flush(); - X.Test.fake_key_event(display, this.delayed_event.xkey.keycode, false, 0); - display.flush(); - } + XTest.fake_key_event(display, this.delayed_event.xkey.keycode, false, 0); + display.flush(); + } // bind it again bind(delayed_binding.trigger, delayed_binding.id); diff --git a/src/utilities/color.vala b/src/utilities/color.vala index 6bb9d06..a681e02 100644 --- a/src/utilities/color.vala +++ b/src/utilities/color.vala @@ -77,6 +77,19 @@ public class Color: GLib.Object { } ///////////////////////////////////////////////////////////////////// + /// Creates a color from a given widget style + ///////////////////////////////////////////////////////////////////// + + public Color.from_widget_style(Gtk.Widget widget, string style_name) { + var ctx = widget.get_style_context(); + Gdk.RGBA color; + if (!ctx.lookup_color(style_name, out color)) { + warning("Failed to get style color for widget style \"" + style_name + "\"!"); + } + Color.from_gdk(color); + } + + ///////////////////////////////////////////////////////////////////// /// Creates a color, parsed from a string, such as #22EE33 ///////////////////////////////////////////////////////////////////// @@ -129,6 +142,14 @@ public class Color: GLib.Object { } ///////////////////////////////////////////////////////////////////// + /// Returns this color as its hex representation. + ///////////////////////////////////////////////////////////////////// + + public string to_hex_string() { + return "#%02X%02X%02X".printf((int)(_r*255), (int)(_g*255), (int)(_b*255)); + } + + ///////////////////////////////////////////////////////////////////// /// The reddish part of the color. ///////////////////////////////////////////////////////////////////// diff --git a/src/utilities/config.vala b/src/utilities/config.vala index abb8b23..dd31885 100644 --- a/src/utilities/config.vala +++ b/src/utilities/config.vala @@ -192,7 +192,7 @@ public class Config : GLib.Object { if (themes.size > 0) { if (current == "") { - current = "Unity"; + current = "Adwaita"; warning("No theme specified! Using default..."); } foreach (var t in themes) { diff --git a/src/utilities/key.vala b/src/utilities/key.vala index 7cf425f..486744d 100644 --- a/src/utilities/key.vala +++ b/src/utilities/key.vala @@ -118,8 +118,8 @@ public class Key : GLib.Object { display.flush(); // press and release the actual key - X.Test.fake_key_event(display, this.key_code, true, 0); - X.Test.fake_key_event(display, this.key_code, false, 0); + XTest.fake_key_event(display, this.key_code, true, 0); + XTest.fake_key_event(display, this.key_code, false, 0); // release the pressed modifiers and re-press the keys hold down by the user press_modifiers(this.modifiers, false); @@ -145,16 +145,16 @@ public class Key : GLib.Object { private void press_modifiers(Gdk.ModifierType modifiers, bool down) { if ((modifiers & Gdk.ModifierType.CONTROL_MASK) > 0) - X.Test.fake_key_event(display, ctrl_code, down, 0); + XTest.fake_key_event(display, ctrl_code, down, 0); if ((modifiers & Gdk.ModifierType.SHIFT_MASK) > 0) - X.Test.fake_key_event(display, shift_code, down, 0); + XTest.fake_key_event(display, shift_code, down, 0); if ((modifiers & Gdk.ModifierType.MOD1_MASK) > 0) - X.Test.fake_key_event(display, alt_code, down, 0); + XTest.fake_key_event(display, alt_code, down, 0); if ((modifiers & Gdk.ModifierType.SUPER_MASK) > 0) - X.Test.fake_key_event(display, super_code, down, 0); + XTest.fake_key_event(display, super_code, down, 0); } } diff --git a/src/utilities/trigger.vala b/src/utilities/trigger.vala index fbd74f8..5373b41 100644 --- a/src/utilities/trigger.vala +++ b/src/utilities/trigger.vala @@ -251,7 +251,7 @@ public class Trigger : GLib.Object { msg += " | " + _("Half pie"); } if (msg != "") - this.label_with_specials += (" <small><span weight='light'>[ " + msg + " ]</span></small>"); + this.label_with_specials += (" [ " + msg + " ]"); } else { this.set_unbound(); |