如何在SFML中使窗口始终位于顶部?

时间:2017-11-29 18:35:42

标签: c++ ubuntu sfml

我正在尝试使用SFML创建一个程序窗口始终位于顶部。如何使用SFML实现这一目标?我四处搜索但无济于事。

"程序"在屏幕中间是一个小红点,可以模仿十字准线,我需要它在一切之上,因为真正的游戏将在后台(游戏没有十字准线,只有瞄准)。

我只有其他想法,就是使用SFML的方法getSystemHandle(),这将为我提供特定于操作系统的窗口句柄。我正在使用Ubuntu 16.04与Gnome和X,我不太确定在获得句柄后如何编写该功能。

1 个答案:

答案 0 :(得分:1)

当前版本的SFML无法实现,但由于到目前为止您只需要X,您可以使用snippet from this old/rejected pull request自行实现。

void WindowImplX11::setTopmost(bool topmost)
{
    static Atom wmStateAbove = XInternAtom(m_display, "_NET_WM_STATE_ABOVE", 1);
    static Atom wmNetWmState = XInternAtom(m_display, "_NET_WM_STATE", 1);

    if (wmStateAbove)
    {
        XClientMessageEvent emsg;
        memset(&emsg, 0, sizeof(emsg));
        emsg.type = ClientMessage;
        emsg.window = m_window;
        emsg.message_type = wmNetWmState;
        emsg.format = 32;
        emsg.data.l[0] = topmost;
        emsg.data.l[1] = wmStateAbove;
        XSendEvent(m_display, RootWindow(m_display, m_screen), false, SubstructureRedirectMask | SubstructureNotifyMask, (XEvent*)&emsg);
    }
}

您必须自行检索m_displaym_window等,并/或将拉取请求重新实施到您的源版本中。