Ось дві функції:
//функція отримання активного вікна
Window get_active_window (Display *disp)
{
Atom type;
int format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *data;
int result;
Window win=None;
gint err;
Atom net_active_window;
type = None;
net_active_window= XInternAtom(disp, "_NET_ACTIVE_WINDOW", False);
gdk_error_trap_push();
result = XGetWindowProperty (disp, DefaultRootWindow(disp),
net_active_window,
0, 0x7fffffff, False,XA_WINDOW, &type, &format, &nitems,
&bytes_after, &data);
err=gdk_error_trap_pop();
if (err!=0 || result != Success)
{
printf("err!=0 || result != Success\n");
return None;
}
if (type != XA_WINDOW) {
printf("type != XA_WINDOW\n");
XFree (data);
return None;
}
if (data) {
printf("data\n");
win= *((Window *) data);
XFree (data);
}
return win;
}
//функція посилання активному вікну коду натиснутої клавіші
int send_key_to_win (Window wind, KeyCode keycode, int keycode_modifiers)
{
int err = 0;
XKeyEvent kevent;
if (!wind)
{
printf("Not window\n");
return -1;
}
kevent.display = gdk_x11_get_default_xdisplay();
kevent.window = wind;
kevent.root = gdk_x11_get_default_root_xwindow();
kevent.subwindow = None;
kevent.time = CurrentTime;
kevent.x = 1;
kevent.y = 1;
kevent.x_root = 1;
kevent.y_root = 1;
kevent.same_screen = TRUE;
kevent.type = KeyPress;
kevent.keycode = keycode;
kevent.state = keycode_modifiers;
err=XSendEvent(gdk_x11_get_default_xdisplay(),wind, TRUE, KeyPressMask, (XEvent *)&kevent);
XSync(gdk_x11_get_default_xdisplay(), True);
return err;
}
Проблема в тому що ці функції працюють правильно лише із програмами GTK та іншими окрім програм KDE вікна програм, які написані із використання бібліотек КДЕ не реагують. Хоча був помітив цікаву річ коли запускаю свою програму в емуляторі консолі від КДЕ відіслані символи в консолі відображаються, якщо вікно консолі мало фокус, однак якщо забрати в нього фокус а потім знову повернути то послані моєю програмою символи уже ігноруються консоллю. Може уже хтось стикався із подібною проблемою і підкаже щось. На одному форумі знайшов таку інформацію: що мовляв працювати «полюцьки» із менеджером КДЕ неможливо, бо він, наприклад, лише на один клік мишею на заголовку вікна генерує безліч подій із яких корисна лише остання. Хотілось би знати чи справді добитись взаємодії із менеджером КДЕ неможливо?