xpropで現在の仮想デスクトップ (ワークスペース) を変更する
調べるのに意外に時間がかかった上、絶対に忘れるのでメモ。
xprop -root -f _NET_CURRENT_DESKTOP 32c -set _NET_CURRENT_DESKTOP [0から始まるワークスペース番号]
仕様はfreedesktop.orgのこちら。
追記: 一応上記で目的は果たせたのだけど、おかしな動作をする (試したかた、すみません)。_NET_CURRENT_DESKTOP プロパティはウィンドウマネージャが設定するもので、ページングを行うアプリケーションは、仕様にあるように _NET_CURRENT_DESKTOP を client message として root ウィンドウに送信する必要があるようだ。
// 参考: libwnck #include <stdlib.h> #include <string.h> #include <X11/Xlib.h> int main(int argc, char **argv) { Display *dpy; if (argc <= 1) { return -1; } dpy = XOpenDisplay(getenv("DISPLAY")); // XXX: テキトウ { XEvent ev; ev.xclient.type = ClientMessage; ev.xclient.serial = 0; ev.xclient.send_event = True; ev.xclient.display = dpy; ev.xclient.window = XDefaultRootWindow(dpy); ev.xclient.message_type = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", True); ev.xclient.format = 32; ev.xclient.data.l[0] = strtol(argv[1], NULL, 10); ev.xclient.data.l[1] = 0; ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent(dpy, ev.xclient.window, False, SubstructureRedirectMask | SubstructureNotifyMask, &ev); } XCloseDisplay(dpy); return 0; }
上記のプログラムを xpager.c として保存して
cc -o xpager -lX11 xpager.c
以下のように実行する
% xpager [アクティブにするワークスペース番号]
ちなみにこのプログラムは Xinerama には対応していないと思う。