Автор Гілка: Пошук активного вікна в Linux  (Прочитано 3960 раз)

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Мої вітання усім.
Скажіть, чи можливо написати для лінукса наступне із використанням бібліотек Qt, Gtk, Xlib чи іншої:
Програма висить в пам'яті робить пошук активного вікна іншої програми знайшовши змінює назву вікна, або знайшовши в ньому (вікні) поле вводу заносить туди певний текст? А також чи можливо в Xlib організувати реакцію програми  на комбінації WIN+D, WIN+k і так далі. Буду дуже вдячний за відповіді.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Пошук активного вікна в Linux
« Відповідей #1 : 2007-07-19 11:37:39 »
Можливо.

Відсутній Абрамчук Вадим

  • Кореспондент
  • ***
  • дописів: 225
  • Карма: +0/-0
  • Графоман LOU третього (четвертого?) пришестя
Re: Пошук активного вікна в Linux
« Відповідей #2 : 2007-07-19 13:39:24 »
Це Вам тре з WM-aми колупатись.
Debian GNU/Linux lenny/sid
MontaVista Linux (Motorola ROKR Z6). Міняю на A1200.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Пошук активного вікна в Linux
« Відповідей #3 : 2007-07-19 14:27:47 »
Цитата
Це Вам тре з WM-aми колупатись.
Можете вказати якісь посилання на цю тему.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Абрамчук Вадим

  • Кореспондент
  • ***
  • дописів: 225
  • Карма: +0/-0
  • Графоман LOU третього (четвертого?) пришестя
Re: Пошук активного вікна в Linux
« Відповідей #4 : 2007-07-19 14:42:43 »
Цитата
Це Вам тре з WM-aми колупатись.
Можете вказати якісь посилання на цю тему.
/usr/share/doc
man
info
google
Debian GNU/Linux lenny/sid
MontaVista Linux (Motorola ROKR Z6). Міняю на A1200.

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Пошук активного вікна в Linux
« Відповідей #5 : 2007-07-19 14:58:01 »
Fedora 35 (x86-64)

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Пошук активного вікна в Linux
« Відповідей #6 : 2007-07-19 22:56:24 »
Дякую за посилання, але хотілось би написати таке щоб працювало не лише в КДЕ. І щоб могло заносити текст у будь-яке вікно. Я так зрозумів що це можливо зробити лише використовуючи бібліотеку xlib, але докладної інформації по тих властивостях і атомах, які за це іфдповідають,  знайти, нажаль, неможу. :(
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Пошук активного вікна в Linux
« Відповідей #7 : 2007-07-19 23:22:26 »
воно буде працювати і не в КДЕ, потрібно лише:
1) щоб була бібліотека kdelibs
2) менеджер вікон підтримував протокол NET (www.freedesktop.org/standards/wm-spec)
Fedora 35 (x86-64)

Відсутній vadim

  • Новачок
  • *
  • дописів: 2
  • Карма: +0/-0
Re: Пошук активного вікна в Linux
« Відповідей #8 : 2007-07-24 01:40:13 »
Подивіться на http://www.sweb.cz/tripie/utils/wmctrl.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Пошук активного вікна в Linux
« Відповідей #9 : 2007-08-01 17:45:42 »
Усім дякую за відповіді :). Але проблеми повінстю вирішити не вдалось :(. Перехоплення клавіш зробив, однак послати якийсь текст вікну від кде не можу (мабуть потрібно використовувати функцію qt_display у функції XSendEvent це мені не підходить бо програма повинна залежати лише від xlib i gtk) текст посилається вікнам будь-якого менеджера вікон крім КДЕ. Може хтось знає в чому проблема, якщо потрібно викладу код.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Пошук активного вікна в Linux
« Відповідей #10 : 2007-08-09 15:06:03 »
Ось дві функції:
//функція отримання активного вікна
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 вікна програм, які написані із використання бібліотек КДЕ не реагують. Хоча був помітив цікаву річ коли запускаю свою програму в емуляторі консолі від КДЕ відіслані символи в консолі відображаються, якщо вікно консолі мало фокус, однак якщо забрати в нього фокус а потім знову повернути то послані моєю програмою символи уже ігноруються консоллю. Може уже хтось стикався із подібною проблемою і підкаже щось. На одному форумі знайшов таку інформацію: що мовляв працювати «полюцьки» із менеджером КДЕ неможливо, бо він, наприклад, лише на один клік мишею на заголовку вікна генерує безліч подій із яких корисна лише остання. Хотілось би знати чи справді добитись взаємодії із менеджером КДЕ неможливо?
Чи потрібні Україні програмісти, які не знають англійської мови?