Eigentlich EWMH_NET_CURRENT_DESKTOP
geben Sie die den aktuellen Desktop für X ist, nicht in Bezug auf die Anwendung. Hier ist ein C-Ausschnitt, um die _WM_DESKTOP
einer Anwendung zu erhalten. Wenn es von der betreffenden KDE-Konsole ausgeführt wird, zeigt es Ihnen, auf welchem Desktop es sich befindet, selbst wenn es sich nicht um den aktiven Desktop oder nicht um den Fokus handelt.
#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);
und desktop
sollte der Index des virtuellen Desktop kann die Konsole ist zur Zeit in. Das ist nicht das gleiche, die Spitze einer mehrköpfigen Display. Wenn Sie bestimmen möchten, welcher Kopf, müssen Sie XineramaQueryScreens
(Xinerama Erweiterung, nicht sicher, ob es ein XRandR entspricht oder nicht. Funktioniert nicht für nVidia TwinView.
Hier ist ein Auszug aus einem Code ich schrieb, dass gegeben ax und y, berechnen Sie die Bildschirmgrenzen (sx, sy und sw mit Bildschirmbreite und sh für Bildschirmhöhe) Sie können es einfach anpassen, um einfach zurückzukehren, welcher "Bildschirm" oder Kopf x und y sind. (Bildschirm hat eine spezielle in X11 Bedeutung.)
#include <X11/X.h>
#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;
}
Warum versuchen Sie, dies zu bestimmen? Was wirst du mit dem Ergebnis machen, wenn du es gefunden hast? Ohne es zu wissen, lautet die beste Antwort: "Klicken Sie auf die Konsole-Schaltfläche in Ihrer Taskleiste und sehen Sie, auf welchen Desktop sie wechselt." – davr
mindestens einige Infos sind erforderlich. kde4, kde3? Welche Version der Konsole? –
Ich muss den Desktop im Code ermitteln, nicht indem ich einen Benutzer auffordere, mir zu sagen, auf welchem Desktop er sich befindet. –