38020


はじめてご質問させていただきます。  
私は現在Rasbian上で動作するソフトウェアの開発を行っており、その中で背景が透明なウィンドウをXlibで実装する必要が出てきました。  
ネット上のドキュメントやXlibのリファレンスなどをもとに、現在以下のようなコードとなっています。

[code]

    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    
    int main(int argc, char* argv[]) { 
    
    Display* display = XOpenDisplay(NULL);
    XVisualInfo vinfo; 
    XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo);
    
    XSetWindowAttributes attr; 
    attr.colormap = XCreateColormap(display, DefaultRootWindow(display), 
                                    vinfo.visual, AllocNone); 
    attr.border_pixel = 0; 
    attr.background_pixel = 0x00ffffff;
    
    Window win = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 300, 200, 0, vinfo.depth, InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr); 
    XSelectInput(display, win, StructureNotifyMask); 
    GC gc = XCreateGC(display, win, 0, 0);
    
    Atom wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", 0); 
    XSetWMProtocols(display, win, &wm_delete_window, 1);
    
    XMapWindow(display, win);
    
    int keep_running = 1; XEvent event;
    
    while (keep_running) {
        XNextEvent(display, &event);
    
        switch(event.type) {
            case ClientMessage:
                if (event.xclient.message_type == XInternAtom(display, 
                    "WM_PROTOCOLS", 1) && 
                    (Atom)event.xclient.data.l[0] == XInternAtom(display, 
                    "WM_DELETE_WINDOW", 1))
                    keep_running = 0;
                break;
    
            default:
                break;
        } }
    
    XDestroyWindow(display, win); 
    XCloseDisplay(display); 
    return 0; 
    } 
    
[/code]

`attr.background_pixel`の`AARRGGBB`部分の書き換えによってウィンドウ背景の色と透明度を指定していると認識しているのですが、これらの値を変化させても背景色の変化は反映されますが、透明度の変化は反映されません。  
何か必要な設定を忘れているのか、あるいは根本的に認識が間違っているでしょうか？  
ご協力お願いいたします。

* * *

質問内容は無事解決いたしました。  
回答に対して返信することがこの場において適切であるか判断できなかったため、  
結果について以下に追記します。

composite manager は xcompmgr が実行されていました。  
composite manager と window managerの設定を確認した後、インストールし直したところ上記のコードのままで透過が反映されました。


CC BY-SA 3.0
2017-09-18T02:44:39.190
38008
2017-09-20T03:41:38.277
2017-09-20T03:41:38.277
25443
25443
question
linux c x11
Xlibを用いた透過ウィンドウの作成


  * composite manager は動いていますか?

X サーバは alpha の処理をしませんので、alpha の処理が必要なら composite manager が必要です。  
composite manager は window manager に組み込まれている場合もありますが、そうでない window manager
を使っている場合は composite manager (xcompmgr など) を別途実行しておく必要があります。

  * window manager にもよるようです。

こちらで試したところ、twm だと不透明でしたが、fvwm だと半透明になりました。  
私もよく理解していないのですが、window manager によって結果が違うようです。

また、window manager が存在しない場合、または override_redirect が True
の場合も半透明になりました。作成しているアプリケーションによっては検討の価値があるかもしれません。

私の環境:

  * ハードウェア: 普通のノートPC
  * Xwayland 内 virtualbox 内の普通の X server 1.19.3
  * twm 1.0.9
  * fvwm 2.6.7
  * xcompmgr 1.1.7


CC BY-SA 3.0
2017-09-18T15:06:51.983
38020
2017-09-18T15:06:51.983
5288
38008
answer