AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1160319
Accepted
DK Bose
DK Bose
Asked: 2019-07-23 20:22:02 +0800 CST2019-07-23 20:22:02 +0800 CST 2019-07-23 20:22:02 +0800 CST

设置终端窗口的标题:wmctrl 与 xdotool

  • 772

编辑:我不是在寻找其他方法或更好的方法来更改窗口的标题或向终端中的选项卡添加标题。建议的副本 中的答案无论如何都无法解决当标题由wmctrl设置时为什么xdotool search … 不拾取窗口标题的具体问题,如上所述。


操作系统:Ubuntu 18.04

当我打开一个gnome-terminal窗口时,标题是dkb@dkb:~

我可以改变它使用

wmctrl -r :ACTIVE: -N "NewName"

但是xdotool search …,没有“看到”这个标题:

dkb@dkb:~$ xdotool search --name NewName
dkb@dkb:~$ 

我只是返回提示,而不是提供相应的窗口标识符。

另一方面,我可以使用xdotool本身来设置标题,然后xdotool search …提供窗口标识符:

dkb@dkb:~$ xdotool getactivewindow set_window --name NewName
dkb@dkb:~$ xdotool search --name NewName
39845894
dkb@dkb:~$ 

换句话说,如果标题由xdotool设置,xdotool search则可以正常工作:

从man xdotool

search [options] 模式 搜索带有正则表达式模式的标题、名称或类的窗口。输出是 X 窗口标识符的行分隔列表。

因此,虽然这没什么大不了的,但我想知道xdotool没有“看到” wmctrl 设置的窗口标题的原因是什么。

command-line xdotool wmctrl
  • 1 1 个回答
  • 2384 Views

1 个回答

  • Voted
  1. Best Answer
    Nykakin
    2019-07-24T01:57:17+08:002019-07-24T01:57:17+08:00

    我们可以看到,至少xdotool getactivewindow getwindowname可以按预期工作。

    $ wmctrl -r :ACTIVE: -N "Test1"
    $ xdotool getactivewindow getwindowname
    Test1
    $ xdotool getactivewindow set_window --name Test2
    $ xdotool getactivewindow getwindowname
    Test2
    

    所以让我们更深入。xprop -id <id>我们可以使用命令列出窗口的属性。对于名称由它设置的窗口,wmctrl它给出:

    _NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 1920, 995
    _NET_STARTUP_ID(UTF8_STRING) = "brisk-menu-2514-mariusz-HP-Pavilion-Notebook-mate-terminal-1_TIME1314631"
    WM_WINDOW_ROLE(STRING) = "mate-terminal-window-4442-66103825-1563868224"
    _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
    _NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 79691784, 79691785
    _NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x4c00007
    WM_CLIENT_LEADER(WINDOW): window id # 0x4c00001
    _NET_WM_PID(CARDINAL) = 4442
    WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
    WM_CLIENT_MACHINE(STRING) = "mariusz-HP-Pavilion-Notebook"
    WM_NORMAL_HINTS(WM_SIZE_HINTS):
            program specified minimum size: 345 by 141
            program specified resize increment: 9 by 20
            program specified base size: 16 by 30
            window gravity: NorthWest
    WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
    WM_CLASS(STRING) = "mate-terminal", "Mate-terminal"
    _NET_WM_ICON_NAME(UTF8_STRING) = "Terminal"
    _NET_WM_NAME(UTF8_STRING) = "Test1"
    

    对于名称由它设置的窗口,xdotool它给出:

    _NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 1920, 995
    _NET_STARTUP_ID(UTF8_STRING) = "brisk-menu-2514-mariusz-HP-Pavilion-Notebook-mate-terminal-1_TIME1314631"
    WM_WINDOW_ROLE(STRING) = "mate-terminal-window-4442-66103825-1563868224"
    _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
    _NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 79691784, 79691785
    _NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x4c00007
    WM_CLIENT_LEADER(WINDOW): window id # 0x4c00001
    _NET_WM_PID(CARDINAL) = 4442
    WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
    WM_CLIENT_MACHINE(STRING) = "mariusz-HP-Pavilion-Notebook"
    WM_NORMAL_HINTS(WM_SIZE_HINTS):
            program specified minimum size: 345 by 141
            program specified resize increment: 9 by 20
            program specified base size: 16 by 30
            window gravity: NorthWest
    WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
    WM_CLASS(STRING) = "mate-terminal", "Mate-terminal"
    _NET_WM_ICON_NAME(UTF8_STRING) = "Terminal"
    _NET_WM_NAME(STRING) = "Test2"
    

    我们可以看到,在这两种情况下_NET_WM_NAME都设置正确。是什么_NET_WM_NAME?这是 x11 的扩展(链接,链接)

    _NET_WM_NAME

    _NET_WM_NAME,UTF8_STRING

    客户端应该将此设置为 UTF-8 编码的窗口标题。如果设置,窗口管理器应该优先使用它而不是 WM_NAME。

    所以 x11 应用程序应该更喜欢这个属性而不是WM_NAME. 让我们显示这两个属性。我从这里获取了 C 代码:

    #include <X11/Xlib.h>
    #include <X11/Xatom.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSTR 1000
    
    Display *display;
    unsigned long window;
    unsigned char *prop;
    
    void check_status(int status, unsigned long window)
    {
        if (status == BadWindow) {
            printf("window id # 0x%lx does not exists!", window);
            exit(1);
        }
    
        if (status != Success) {
            printf("XGetWindowProperty failed!");
            exit(2);
        }
    }
    
    unsigned char* get_string_property(char* property_name)
    {
        Atom actual_type, filter_atom;
        int actual_format, status;
        unsigned long nitems, bytes_after;
    
        filter_atom = XInternAtom(display, property_name, True);
        status = XGetWindowProperty(display, window, filter_atom, 0, MAXSTR, False, AnyPropertyType,
                                    &actual_type, &actual_format, &nitems, &bytes_after, &prop);
        check_status(status, window);
        return prop;
    }
    
    unsigned long get_long_property(char* property_name)
    {
        get_string_property(property_name);
        unsigned long long_property = prop[0] + (prop[1]<<8) + (prop[2]<<16) + (prop[3]<<24);
        return long_property;
    }
    
    int main(int argc, char** argv)
    {
        char *display_name = NULL;  // could be the value of $DISPLAY
    
        display = XOpenDisplay(display_name);
        if (display == NULL) {
            fprintf (stderr, "%s:  unable to open display '%s'\n", argv[0], XDisplayName (display_name));
        }
        int screen = XDefaultScreen(display);
        window = RootWindow(display, screen);
    
        window = get_long_property("_NET_ACTIVE_WINDOW");
    
        printf("_NET_WM_PID: %lu\n", get_long_property("_NET_WM_PID"));
        printf("WM_CLASS: %s\n", get_string_property("WM_CLASS"));
        printf("_NET_WM_NAME: %s\n", get_string_property("_NET_WM_NAME"));
        printf("WM_NAME: %s\n", get_string_property("WM_NAME"));
    
        XCloseDisplay(display);
        return 0;
    }
    

    只加了printf("WM_NAME: %s\n", get_string_property("WM_NAME"));一行。跑步:

    $ gcc test.c -o test -lX11
    $ wmctrl -r :ACTIVE: -N "Test1"
    $ ./test 
    _NET_WM_PID: 4442
    WM_CLASS: mate-terminal
    _NET_WM_NAME: Test1
    WM_NAME: (null)
    $ xdotool getactivewindow set_window --name Test2
    $ ./test 
    _NET_WM_PID: 4442
    WM_CLASS: mate-terminal
    _NET_WM_NAME: Test2
    WM_NAME: Test2
    

    所以结论是:xdotool同时设置_NET_WM_NAMEandWN_NAME但只搜索WM_NAMEandwmctrl设置 only _NET_WM_NAME。

    • 8

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve