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 には対応していないと思う。