以编程方式调用Gnome Shell快捷方式

时间:2014-02-13 08:25:56

标签: gnome-3 gnome-shell gjs gnome-shell-extensions

Gnome Shell有很好的快捷方式,但是,我没有办法以编程方式调用它们 假设我想使用GJS脚本启动谷歌浏览器,将其移动到工作区1,并最大化它,然后启动Emacs,将其移动到工作区2,并最大化它。 这可以使用wm.keybindings来完成:move-to-workspace-1,move-to-workspace-2和maximize。但是,如何以编程方式调用它们?

我注意到在GJS中,Meta.prefs_get_keybinding_action('move-to-workspace-1')将返回操作移动到工作空间-1,但我没有找到任何调用该操作的函数。 在https://github.com/GNOME/mutter/blob/master/src/core/keybindings.c中,我找到了一个函数meta_display_accelerator_activate,但我找不到这个函数的GJS绑定。

那么,有没有办法以编程方式调用gnome shell快捷方式?

1 个答案:

答案 0 :(得分:0)

移动应用程序的最佳选择是获取Meta.Window对象,该对象是在启动后创建的。

这将通过获取活动工作空间,启动应用程序,然后从活动工作空间获取应用程序并将其移动来完成。

用于快速实施的示例代码:

const workspace = global.screen.get_active_workspace();
const Gio = imports.gi.Gio;

//CLIname: Name used to open app from a terminal
//wsIndex: Workspace you want it on
function openApp(CLIname, wsIndex) {
    let context = new Gio.AppLaunchContext;
    //use 2 to indicate URI support
    //0 is no flags, 1 for terminal window,
    //No 3, 4 for notification support
    //null because setting a name has no use
    Gio.AppInfo.create_from_commandline(CLIname, null, 2).launch([], context);
    //Unfortunately, there is no way I know to grab a specific window if you don't know the index.
    for(let w of workspace.list_windows()) {
        //check if the window title or window manager class match the CLIname. Haven't found any that don't match either yet.
        if(w.title.toLowerCase().includes(CLIname.toLowerCase() || w.get_wm_class().toLowerCase.includes(CLIname.toLowerCase()) {
            //Found a match? Move it!
            w.change_workspace(global.screen.get_workspace_by_index(wsIndex));
        }
    {
}
/*init(), enable() and disable() aren't relevant here*/

要在最后回答实际的问题方式,可以通过强制GNOME屏幕键盘发出这些键来实现,但是这需要为每个您希望执行的键绑定匹配正确的键和I / O仿真,可以在扩展名中随时更改。