Еще одно уточнение: вместо GDK_SUBSTRUCTURE_MASK
, как говорит Дон Хэтч, используйте GDK_PROPERTY_CHANGE_MASK
. Более того, именно то свойство, которое вас интересует, это _NET_CURRENT_DESKTOP
. Это 32-битное свойство, значением которого является номер рабочего стола, отсчитываемый от 0.
Вот полный компилируемый и работающий пример, который улавливает момент переключения рабочего стола и сообщает номер текущего рабочего стола после этого. Пример на C, так как я не владею Python, надеюсь, вы сможете перевести.
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
GdkFilterReturn propertyChangeFilter(GdkXEvent* xevent, GdkEvent*e, gpointer data)
{
const XPropertyEvent*const propEvt=(const XPropertyEvent*)xevent;
if(propEvt->type!=PropertyNotify)
return GDK_FILTER_CONTINUE;
if(propEvt->state!=PropertyNewValue)
return GDK_FILTER_CONTINUE;
const Atom NET_CURRENT_DESKTOP=(Atom)data;
if(propEvt->atom!=NET_CURRENT_DESKTOP)
return GDK_FILTER_CONTINUE;
fprintf(stderr, "Desktop change detected\n");
Atom actualType;
int actualFormat;
unsigned long nitems, remainingBytes;
unsigned char* prop;
if(XGetWindowProperty(propEvt->display, propEvt->window, propEvt->atom,
0, 1, False, AnyPropertyType,
&actualType, &actualFormat, &nitems, &remainingBytes,
&prop) != Success)
{
fprintf(stderr, "Failed to get current desktop number\n");
return GDK_FILTER_CONTINUE;
}
if(nitems!=1 || remainingBytes!=0 || actualFormat!=32)
{
XFree(prop);
fprintf(stderr, "Unexpected number of items (%lu) or remaining bytes (%lu)"
" or format (%d)\n", nitems, remainingBytes, actualFormat);
return GDK_FILTER_CONTINUE;
}
guint32 value;
memcpy(&value, prop, sizeof value);
XFree(prop);
fprintf(stderr, "Current desktop: %u\n", value);
return GDK_FILTER_CONTINUE;
}
int main(int argc, char** argv)
{
gtk_init(&argc,&argv);
GdkDisplay*const gdkDisplay=gdk_display_get_default();
Display*const display=gdk_x11_display_get_xdisplay(gdkDisplay);
const Atom atom=XInternAtom(display, "_NET_CURRENT_DESKTOP", True);
GdkWindow*const root=gdk_get_default_root_window();
gdk_window_set_events(root, GDK_PROPERTY_CHANGE_MASK);
gdk_window_add_filter(root, propertyChangeFilter, (gpointer)atom);
gtk_main();
}
person
Ruslan
schedule
12.07.2020