2011-10-19 28 views
3

我使用以下documentation在Vala中編寫一個方法,將按鍵事件(例如<Ctrl> V)發送到具有焦點的應用程序。發送XKeyEvent到gtk3應用程序

下面是代碼:

public void press(string accelerator) 
{ 
    X.KeyEvent key_event; 
    if(create_key_event(accelerator, X.EventType.KeyPress, out key_event)) { 
     X.Event event = (X.Event)key_event; 
     key_event.display.send_event(key_event.window, false, 
      X.EventMask.KeyPressMask, ref event); 
    } 
} 

private bool create_key_event(string accelerator, 
    int event_type, out X.KeyEvent key_event) 
{ 
    // convert accelerator 
    uint keysym; 
    Gdk.ModifierType modifiers; 
    Gtk.accelerator_parse(accelerator, out keysym, out modifiers); 
    unowned X.Display display = Gdk.x11_get_default_xdisplay(); 
    key_event = X.KeyEvent(); 

    int keycode = display.keysym_to_keycode(keysym); 

    if(keycode != 0) { 
     X.Window root_window = Gdk.x11_get_default_root_xwindow(); 

     // get window with focus 
     X.Window focus; 
     int revert_to_return; 
     display.get_input_focus(out focus, out revert_to_return); 

     key_event.display = display; 
     key_event.root = root_window; 
     key_event.window = focus; 
     key_event.subwindow = X.None; 
     key_event.time = X.CURRENT_TIME; 
     key_event.keycode = keycode; 
     key_event.state = modifiers; 
     key_event.type = event_type; 
     key_event.x = 1; 
     key_event.y = 1; 
     key_event.x_root = 1; 
     key_event.y_root = 1; 
     return true; 
    } 

    return false; 
} 

這只是工程上的GTK2程序的罰款。但gtk3應用程序似乎完全忽略了這些事件。 有沒有辦法將這些事件發送到gtk3應用程序呢?

回答

2

我對此做了一些調查。看起來,這樣的事件將通過gtk3應用程序在與XTest擴展一起發送時收到,並且在所述的documentation上也有提及。

這裏是VALA樣本,則需要將其綁定針對xtst.vapi能夠構建它:

public void press(string accelerator) 
{ 
    if(perform_key_event(accelerator, true)) { 
    debug("Successfully pressed key " + accelerator); 
    } 
} 

private bool perform_key_event(string accelerator, bool press) 
{ 
    // convert accelerator 
    uint keysym; 
    Gdk.ModifierType modifiers; 
    Gtk.accelerator_parse(accelerator, out keysym, out modifiers); 
    unowned X.Display display = Gdk.x11_get_default_xdisplay(); 
    int keycode = display.keysym_to_keycode(keysym); 

    if(keycode != 0) { 

     if(Gdk.ModifierType.CONTROL_MASK in modifiers) { 
     int modcode = display.keysym_to_keycode(Gdk.Key.Control_L); 
     XTest.fake_key_event(display, modcode, press, delay); 
     } 
     if(Gdk.ModifierType.SHIFT_MASK in modifiers) { 
     int modcode = display.keysym_to_keycode(Gdk.Key.Shift_L); 
     XTest.fake_key_event(display, modcode, press, delay); 
     } 

     X.Test.fake_key_event(display, keycode, press, 0);     
     return true; 
    } 

    return false; 
} 
相關問題