編集:私はウィンドウのタイトルを変更したり、ターミナルのタブにタイトルを追加したりする他の方法やより良い方法を探していません。 提案された重複の回答は、どのような方法でも行わないでくださいxdotool search …
上記のようにwmctrlによってタイトルが設定されている場合、はウィンドウのタイトルを取得しません。
OS: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] patternタイトル、名前、または正規表現パターンのクラスを持つウィンドウを検索します。出力は、Xウィンドウ識別子の行区切りリストです。
それほど大したことではありませんが、xdotoolがwmctrlによって設定されたウィンドウタイトルを「認識」しない理由は何ですか。
少なくとも_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の拡張です( link 、 link )
_NET_WM_NAME
_NET_WM_NAME、UTF8_STRING
クライアントはこれをUTF-8エンコーディングでウィンドウのタイトルに設定する必要があります(SHOULD)。設定されている場合、ウィンドウマネージャーはこれをWM_NAMEよりも優先して使用する必要があります。
したがって、x11アプリケーションは_WM_NAME
_よりもこのプロパティを優先する必要があります。これらの両方のプロパティを表示してみましょう。 here から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_NAME
_と_WN_NAME
_の両方を設定しますが、_WM_NAME
_とwmctrl
による検索のみが__NET_WM_NAME
_のみを設定します。