C言語でX11のウィンドウ名を設定する

dwmの右上のステータスバーはルートウィンドウのウィンドウ名がそのまま表示されているので、シェルスクリプトからxsetrootコマンドで設定したりして時計とか好きなものを表示できます。便利で良いよね。

でもシェルスクリプトだと何となくヘビーな感じがするし、もっといろいろ表示してみたいし・・・というわけでC言語からのウィンドウ名の設定に挑戦。

書いてみたコードがこんな感じ。

#include <stdio.h>
#include <X11/Xlib.h>

int main()
{
    Display *dpy = XOpenDisplay(NULL);  // その名の通りディスプレイを開く。NULLの代わりに文字列で":10"とかやってディスプレイ番号なんかも設定出来るっぽい。
    if(dpy == NULL)
    {
        fprintf(stderr, "failed open display\n");
        return -1;
    }

    //int screen = DefaultScreen(dpy);  // デフォルトのスクリーンを開く。:10.0で言う0の部分の事・・・なのか? よく分からない。
    //Window root = RootWindow(dpy, screen);  // ルートウィンドウ(つまりウィンドウマネージャ)を取得。

    Window root = DefaultRootWindow(dpy);  // 上の二行は実はこれにまとめられる。


    char *buf;

    XFetchName(dpy, root, &buf);  // ウィンドウ名を取得する。0以外が返れば成功。
    printf("old: %s\n", buf);
    XFree(buf);  // ウィンドウ名用に確保されたメモリを解放してやる。

    XStoreName(dpy, root, "hello, world");  // ウィンドウ名を設定。これも0以外が返れば成功。

    XFetchName(dpy, root, &buf);
    printf("new: %s\n", buf);
    XFree(buf);


    XCloseDisplay(dpy);
}

結構簡単で良いね。XFreeを忘れずに。 コンパイルする時は-lX11みたいなオプションが必要になるので気をつけて。