やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

X11でWindow作成

 C言語で書いた。

成果物

 こんな窓を作れました。

前回

 簡単に書けるのはいいけど、以下2つの不満あり。

  • 起動だけで2秒以上かかるの遅すぎ
  • 背景色を白でなく黒にしたい

調査

 低レベルAPIを使えば爆速アプリが作れるはず。

 上記によると

 DRMやXという仕組みがあるらしい。これを使って開発してみよう。

今回

 上記をほぼ丸パクリした。感謝。ついでにタイトルを設定した。

ソースコード

x0.c

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

int main() {
    Display *dpy;
    int scr;
    Window win;
    XSetWindowAttributes xswa;
    char *xservname=NULL;
    char *title="MyApp";
    //char *title="非ASCII文字は表示されずなぜかaになる…どうすればいい?";

    if ((dpy=XOpenDisplay(xservname)) == NULL) {
        fprintf(stderr,"can not open %s\n",XDisplayName(xservname));
        exit(-1);
    }
    scr = DefaultScreen(dpy);
    xswa.background_pixel = BlackPixel(dpy,scr);
    xswa.border_pixel = WhitePixel(dpy,scr);
    xswa.event_mask = ExposureMask;
    win = XCreateWindow(dpy,RootWindow(dpy,scr),0,0,320,240,1,
                        CopyFromParent,CopyFromParent,CopyFromParent,
                        CWBackPixel | CWBorderPixel | CWEventMask, &xswa);
    XStoreName(dpy, win, title);
    XMapWindow(dpy,win);
    for (;;) {
        XEvent ev;
        XNextEvent(dpy,&ev);
        switch (ev.type) {
          case Expose:
            XClearWindow(dpy,win);
            break;
          default:
            printf("unknown event %d\n",ev.type);
            break;
        }
    }
}

 APIは以下参照。

make_and_run.sh

#!/usr/bin/env bash
gcc -I/usr/X11R6/include -L/usr/X11R6/lib x0.c -o x0 -lX11
./x0

 これを以下のように実行すると、コンパイルして実行する。

$ ./make_and_run.sh

 Windowが出た! しかも実行した瞬間に! 速い! えらい!

細かい疑問

  • 日本語のタイトルってどうやれば設定できるの?
  • waylandっていうXの置き換えをめざす奴がいるらしいけど、どうなの?

感想

  • 超面倒そう…
    • 今どきXプログラミングなんて書いてたら人生終わるよ…
    • 文字列の扱いが…
    • メモリ確保&解放が…
    • API調査が…
    • 構造・概要の把握が…
  • Xってツイッターじゃないの?
  • 今どきXプログラミングなんて書いてる人いるん? 皆TypeScriptなんじゃない?
  • XのAPI一覧、20世紀のサイト感が漂っている…
  • 懐古厨の記事みたい(もう懐古厨という言葉自体がそれ)
  • 玄人ぶれそう。Xプログラミングって知ってるか?

 パフォーマンスは最高だろうけど、やりたいことを実現するのに何年かかるやら…。

情報源