在KDE中,我怎样才能自动判断一个Konsoleterminal在哪个“桌面”?

我有多个“桌面”,可以在我的KDE Linux环境中进行不同的任务切换。 我如何自动确定我的Konsole(kde控制台)窗口显示在哪个桌面?

编辑:我在企业环境中使用KDE 3.4

这是编程相关的。 我需要以编程方式(aka automagically)确定用户在哪个桌面上,然后从python脚本与该桌面中的X窗口进行交互。

我是否应该绕过所有的微软IDE问题,因为不能编程? 如何Win32“编程”的问题? 我应该尝试closures这些吗?

Solutions Collecting From Web of "在KDE中,我怎样才能自动判断一个Konsoleterminal在哪个“桌面”?"

使用kde桌面通讯协议dcop,您可以轻松获得当前的桌面执行

dcop kwin KWinInterface currentDesktop 

命令。 如果您正在使用新的kde 4.x,则不再使用dcop,并且可以将该命令转换为DBUS调用。 使用python apis发送/获取dbous消息应该非常简单。

对不起,我英文不好,埃米利奥

其实EWMH _NET_CURRENT_DESKTOP给你哪个是X的当前桌面,而不是相对于应用程序。 这里有一个C代码片段来获取应用程序的_WM_DESKTOP 。 如果从KDE Konsole运行,它会为您提供桌面,即使它不是活动桌面或不在焦点。

 #include <X11/Xlib.h> #include <X11/Shell.h> ... Atom net_wm_desktop = 0; long desktop; Status ret; /* see if we've got a desktop atom */ Atom net_wm_desktop = XInternAtom( display, "_NET_WM_DESKTOP", False); if( net_wm_desktop == None ) { return; } /* find out what desktop we're currently on */ if ( XGetWindowProperty(display, window, net_wm_desktop, 0, 1, False, XA_CARDINAL, (Atom *) &type_ret, &fmt_ret, &nitems_ret, &bytes_after_ret, (unsigned char**)&data) != Success || data == NULL ) { fprintf(stderr, "XGetWindowProperty() failed"); if ( data == NULL ) { fprintf(stderr, "No data returned from XGetWindowProperty()" ); } return; } desktop = *data; XFree(data); 

desktop应该是Konsole当前所在的虚拟桌面的索引。这与多头显示器的头部是不一样的。 如果你想确定哪一个头,你需要使用XineramaQueryScreens (Xinerama扩展,不知道是否有XRandR等价物,不适用于nVidia的TwinView。

下面是我写的一些代码的摘录,给出ax和y,计算屏幕边界(sx,sy,sw与屏幕宽度和sh屏幕高度)。 你可以很容易地适应它只是返回哪个“屏幕”或头X和Y上。 (屏幕在X11中有特殊的含义)。

 #include <X11/Xh> #include <X11/extensions/Xinerama.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> Bool xy2bounds(Display* d,int x, int y, int* sx, int* sy, int* sw, int* sh) { *sx = *sy = *sw = *sh = -1; /* Set to invalid, for error condition */ XineramaScreenInfo *XinInfo; int xin_screens = -1; int i; int x_origin, y_origin, width, height; Bool found = False; if ( d == NULL ) return False; if ( (x < 0) || (y < 0) ) return False; if ( True == XineramaIsActive(d) ) { XinInfo = XineramaQueryScreens( d, &xin_screens ); if ( (NULL == XinInfo) || (0 == xin_screens) ) { return False; } } else { /* Xinerama is not active, so return usual width/height values */ *sx = 0; *sy = 0; *sw = DisplayWidth( d, XDefaultScreen(d) ); *sh = DisplayHeight( d, XDefaultScreen(d) ); return True; } for ( i = 0; i < xin_screens; i++ ) { x_origin = XinInfo[i].x_org; y_origin = XinInfo[i].y_org; width = XinInfo[i].width; height = XinInfo[i].height; printf("Screens: (%d) %dx%d - %dx%d\n", i, x_origin, y_origin, width, height ); if ( (x >= x_origin) && (y >= y_origin) ) { if ( (x <= x_origin+width) && (y <= y_origin+height) ) { printf("Found Screen[%d] %dx%d - %dx%d\n", i, x_origin, y_origin, width, height ); *sx = x_origin; *sy = y_origin; *sw = width; *sh = height; found = True; break; } } } assert( found == True ); return found; } 

KDE窗口管理器,以及GNOME和遵循Freedesktop标准的所有WM支持扩展窗口管理器提示 (EWMH)。

这些提示允许开发人员以编程方式访问几个窗口管理器功能,如最大化,最小化,设置窗口标题,虚拟桌面等

我从来没有使用KDE,但Gnome提供了这样的功能,所以我认为KDE也有。

使用纯Xlib函数也可以访问这些提示的子集。 这个子集是ICCCM提示。 如果内存为我服务,则正确的虚拟桌面访问权限仅限于EWMH。

更新: 找到它! ( _NET_CURRENT_DESKTOP

参考接受的答案…. dcop现在已经过时; 而不是dcop你可能想使用dbus(qdbus是dbus的命令行工具)。

 qdbus org.kde.kwin /KWin currentDesktop 

一个新的答案,因为大部分答案在这里得到当前的桌面,而不是终端所在的(如果用户在脚本运行时更改桌面,将会中断)。

xprop -id $WINDOWID | sed -rn -e 's/_NET_WM_DESKTOP\(CARDINAL\) = ([^)]+)/\1/pg'

我在更换桌面的过程中循环测试了它,它工作正常(测试脚本如下,运行后必须手动检查输出)。

 while true do xprop -id $WINDOWID | sed -rn -e 's/_NET_WM_DESKTOP\(CARDINAL\) = ([^)]+)/\1/pg' sleep 1 done 

感谢其他的答案和评论,让我在那里一半。