从 Linux 任务栏隐藏窗口

问题描述 投票:0回答:2

如何在 Linux 上使用 Python 实现相同的行为(隐藏任务栏上的

python.exe
)? (我的目标主要是Raspbian(LXDE)和Gnome)

类似于 thisthis,但是我不想使用

wx
pygame
作为窗口提供程序,因为我已经使用了一个(
sdl2
),因此它可能需要精确地进行某种调用就像
win32gui
一样。

显然我还没有尝试过任何东西,因为我不知道从哪里开始,所以即使是一些想法也可能有帮助。

python linux sdl-2 taskbar xorg
2个回答
2
投票

Xorg 就是这样。如果您没有,请继续进一步搜索。

基本上,你可以调用这个命令:

xprop -name <unique window name> -f _NET_WM_STATE 32a \
-set _NET_WM_STATE _NET_WM_STATE_SKIP_TASKBAR

xprop -id <window id> -f _NET_WM_STATE 32a \
-set _NET_WM_STATE _NET_WM_STATE_SKIP_TASKBAR

从任务栏中删除某些内容,窗口管理器应该尊重这一点。

Ubuntu 的 Unity 很特别,因此如果您有多个窗口堆叠在单个任务栏图标上,它要么忽略该命令,要么已经使用该命令,将图标堆叠到侧面带有小箭头的单个图标中。

我还没有找到隐藏它的方法。请随时联系我。


0
投票

有一个使用 xlib 隐藏它的解决方案(此代码是用 C 编写的,但您可以使用

python-xlib
找到与 python 等效的代码):

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

int x11_hide_icon(Display *dpy, Window xid)
{

    Atom wmStateSkipTaskbar = XInternAtom( dpy, "_NET_WM_STATE_SKIP_TASKBAR", 1 );
    if( wmStateSkipTaskbar != None ) {
        printf( "_NET_WM_STATE_ABOVE has atom of %ld\n", (long)wmStateSkipTaskbar );
    } else {
        printf( "ERROR: cannot find atom for _NET_WM_STATE_ABOVE !\n" );
        return False;
    }

    Atom wmNetWmState = XInternAtom( dpy, "_NET_WM_STATE", 1 );
    if( wmNetWmState != None ) {
        printf( "_NET_WM_STATE has atom of %ld\n", (long)wmNetWmState );
    } else {
        printf( "ERROR: cannot find atom for _NET_WM_STATE !\n" );
        return False;
    }

    if( wmStateSkipTaskbar != None )
    {
        XClientMessageEvent xclient;
        memset( &xclient, 0, sizeof (xclient) );

        xclient.type = ClientMessage;
        xclient.window = xid;
        xclient.message_type = wmNetWmState;
        xclient.format = 32;
        xclient.data.l[0] = _NET_WM_STATE_ADD;
        xclient.data.l[1] = wmStateSkipTaskbar; // this propery is to hide window with xid
        xclient.data.l[2] = 0;
        xclient.data.l[3] = 0;
        xclient.data.l[4] = 0;

        Window root_window = XRootWindow(dpy, 0);

        XSendEvent( dpy,
                    root_window, // <-- DefaultRootWindow( dpy )
                    False,
                    SubstructureRedirectMask | SubstructureNotifyMask,
                    (XEvent *)&xclient );

        XFlush(dpy);

        return true;
    }

    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.