6

現在、フルスクリーンの Xlib OpenGL ウィンドウから Alt-Tab キーを有効にしようとしていますが、いくつか問題があります。試してみましたがXUnmapWindow(..)、どの種類が機能するかはわかりませんが、解像度がリセットされず (手動で行う必要がある場合を除きますか?)、Xlib ウィンドウが最小化されたウィンドウとして表示されません (つまり、alt-tab でウィンドウに戻ることができません。アプリがまだバックグラウンドで実行されているように見えますが)。

次に試みたのは、ウィンドウをフルスクリーンからウィンドウ モードに変更することでした (つまり、ウィンドウ モードでウィンドウを再作成します)。

イベントを聞いていてFocusOut、alt-tab を押すと が呼び出されるようですが、アプリを適切に最小化する方法がわかりません。イベントが呼び出されたときにコードで何もしないと、アプリは何もしません (つまり、ウィンドウを最小化できません)。FocusInFocusOutFocusOut

どんな助けでも大歓迎です!

編集: 残念ながら、X Windows でフルスクリーン ウィンドウを適切に最小化することができませんでした。そこで、この問題を回避するためにdestroy()、ウィンドウをフルスクリーンにしてからcreate()、新しいウィンドウをウィンドウ モードにすることにしました。うまくいくようです。

4

2 に答える 2

6

XUnmapWindow()ウィンドウをディスプレイから完全に削除します。ウィンドウの最小化はEMWHICCCM状態を介して行われるため、ウィンドウマネージャーは、ウィンドウが何らかの形でまだ存在していることを認識します。そして、あなたがすでに仮定したように、あなたは画面解像度をリセットする責任があります。ところで、これはWindowsでもまったく同じです。

編集:

Xlibでのウィンドウの最小化は、で実行されXIconifyWindowます。これにより、適切なICCCMプロパティが設定され、ウィンドウのマップが解除されます。WMと適切に対話するには、両方を実行する必要があります。ただし、X11はポリシーではなくメソッドのみを定義するため、フルスクリーンウィンドウのマッピングを解除するときは、前述のように画面解像度をリセットする必要もあります。

補足:解像度はまったく変更しないことをお勧めしますが、可能な場合は、ターゲットサイズのフレームバッファオブジェクトにレンダリングし、最終結果を完全なネイティブ画面サイズにマップします。これをネイティブ解像度のテキスト/HUDオーバーレイ(これはゲームなど用だと思います)と組み合わせると、知覚される品質が大幅に向上し、解像度の切り替えが節約されます。これをデスクトップのスクリーンショットを撮り、コンテンツに徐々にフェードインすることと組み合わせることができます。

参考のために編集2XIconifyWindowこれは単なるヘルパー/便利な機能であり、そのソースコードは

/*
 * This function instructs the window manager to change this window from
 * NormalState to IconicState.
 */
Status XIconifyWindow(Display *dpy, Window w, int screen)
{
    XClientMessageEvent ev;
    Atom prop;

    prop = XInternAtom(dpy, "WM_CHANGE_STATE", False);
    if(prop == None)
    return False;

    ev.type = ClientMessage;
    ev.window = w;
    ev.message_type = prop;
    ev.format = 32;
    ev.data.l[0] = IconicState;
    return XSendEvent(dpy, RootWindow(dpy, screen), False,
            SubstructureRedirectMask|SubstructureNotifyMask,
            (XEvent *)&ev);
}
于 2011-06-17T06:34:05.457 に答える
1

あなたはこのようにそれを試みることができます:

XEvent xev;
Atom wm_state     =  XInternAtom(dpy, "_NET_WM_STATE", False);
Atom wm_hide_win  =  XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False);

memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
xev.xclient.window = win;
xev.xclient.message_type = wm_state;
xev.xclient.format = 32;
xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
xev.xclient.data.l[1] = wm_hide_win;

XSendEvent(dpy, DefaultRootWindow(dpy), False, SubstructureNotifyMask, &xev);

編集

gnome API にアクセスできる場合は、wnck_window_minimize()を使用するか、その関数のソースを調べることができます。

于 2011-06-17T11:54:01.683 に答える