Class GlobalHotKeys::KeyBinder
In: globalhotkeys.c
Parent: Object
KeyBinder globalhotkeys.c Modifier GlobalHotKeys dot/m_0_0.png

rghk provides a simple way to set global hotkeys.

Example:

  kb=GlobalHotKeys::KeyBinder.new
  kb.bind(Gdk::Keyval::GDK_a,  GlobalHotKeys::Modifier::CONTROL_MASK){puts 'Binded'}
  kb.unbind

It probably a good idea to require ‘gtk2’ before ‘rghk’. The librairy rghk was not tested without ruby/gtk2.

Methods

bind   unbind   unbind_all  

Public Class methods

Unset a all global hotkeys.

[Source]

/*
 * Unset a all global hotkeys.
*/
VALUE
kb_unbind_all(VALUE self)
{
        rb_iterate(rb_each, rb_iv_get(cKeyBinder, "stock"), kb_unbind, Qnil);
        return Qnil;
}

Public Instance methods

key: a key value. Gdk::Keyval constants can be used.

modifier: a GlobalHotKeys::Modifier.

Set a global hotkey. block will be called when the key and the modifier are hitted.

[Source]

/*
 * call-seq: bind(key, modifier) {block}
 * 
 * key: a key value. Gdk::Keyval constants can be used.
 * 
 * modifier: a GlobalHotKeys::Modifier.
 * 
 * Set a global hotkey.
 * block will be called when the key and the modifier are hitted.
*/
VALUE
kb_bind(VALUE self, VALUE key, VALUE modifier)
{
        GdkWindow *rootwin;
        Display *xdisplay;
        uint keycode;
        /*     uint ignored[]={0, RGHK_LOCK_MASK, RGHK_NUM_LOCK_MASK, RGHK_SCROLL_LOCK,
                RGHK_LOCK_MASK|RGHK_NUM_LOCK_MASK, RGHK_LOCK_MASK|RGHK_SCROLL_LOCK, RGHK_NUM_LOCK_MASK|RGHK_SCROLL_LOCK,
                RGHK_LOCK_MASK|RGHK_NUM_LOCK_MASK|RGHK_SCROLL_LOCK};*/
        uint ignored[]={0, RGHK_LOCK_MASK, RGHK_NUM_LOCK_MASK, RGHK_LOCK_MASK|RGHK_NUM_LOCK_MASK};
        uint mod;

        if (rb_funcall(rb_iv_get(cKeyBinder, "stock"), rb_intern("include?"), 1, self)==Qtrue)
                rb_raise(rb_eException, "KeyBinder allready binded.");

        rb_iv_set(self, "@key", key);
        rb_iv_set(self, "@mod", modifier);
        rb_iv_set(self, "block", rb_block_proc());
        rb_ary_push(rb_iv_get(cKeyBinder, "stock"), self);

        rootwin=gdk_get_default_root_window();//stock this window in variable once for all?
        xdisplay=GDK_WINDOW_XDISPLAY(rootwin);

        keycode=XKeysymToKeycode(xdisplay, FIX2UINT(key));
        if (keycode==0)
                rb_raise(rb_eException, "Invalid key value.");

        if NIL_P(modifier)
                mod=0;
        else
                mod=FIX2UINT(modifier);

        int i;
        for (i=0; i<4 ; i++)
        {
                XGrabKey(xdisplay, keycode, mod|ignored[i],  GDK_WINDOW_XWINDOW(rootwin), False,
                        GrabModeAsync, GrabModeAsync);
        }
//XGrabKey(xdisplay, keycode, AnyModifier, GDK_WINDOW_XWINDOW(rootwin), False, GrabModeAsync, GrabModeAsync);
        return Qtrue;
}

Unset a global hotkey.

[Source]

/*
 * Unset a global hotkey.
*/
VALUE
kb_unbind(VALUE self)
{
        VALUE del, ret;
        GdkWindow *rootwin;
        Display *xdisplay;
        uint keycode, mod;
        uint ignored[]={0, RGHK_LOCK_MASK, RGHK_NUM_LOCK_MASK, RGHK_LOCK_MASK|RGHK_NUM_LOCK_MASK};

        del=rb_funcall(rb_iv_get(cKeyBinder, "stock"), rb_intern("delete"), 1, self);
        if NIL_P(del)
                return Qfalse;
        
        rootwin=gdk_get_default_root_window();
        xdisplay=GDK_WINDOW_XDISPLAY(rootwin);
        keycode=XKeysymToKeycode(xdisplay, FIX2UINT(rb_iv_get(self, "@key")));
        mod=FIX2UINT(rb_iv_get(self, "@mod"));

        int i;
        for (i=0; i<4 ; i++)
                XUngrabKey(xdisplay, keycode, mod|ignored[i], GDK_WINDOW_XWINDOW (rootwin));
        return Qtrue;
}

[Validate]