gtk_grab_add() не производит ощутимого результата.

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

gtk_grab_add() не производит ощутимого результата.

Сообщение nick87720z »

В ходе улучшения ladish, системы управления аудио-сеансами (http://ladish.org) решил добавить возможность присоединения приложений по окну (разумеется, путем определения его PID).
Когда действие выполняется, мышь должна захватываться, и дальше - как в xwininfo / xkill (или даже при создании скриншота области экрана).

Вот кусок кода из обработчика (разумеется, в цикле gtk_main):

Код: Выделить всё

GtkWidget * grab_win;          /* Ссылка на окно, полученная из gtkbuilder */
gtk_widget_show( grab_win );
gtk_grab_add( grab_win );


Никаких ошибок, но чего-то явно не хватает. Мышь остается не захваченной. Нужна помощь - примеров с захватом клавы/мыши я не нашел.
Чтобы тупо не терять времени, решид пока поизвращяться с запуском xwininfo и считыванием его вывода.
Надеюсь на поддержку.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: gtk_grab_add() не производит ощутимого результата.

Сообщение /dev/random »

Используйте gdk_pointer_grab.
gtk_grab_add перехватывает мышь только у окон того же приложения.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: gtk_grab_add() не производит ощутимого результата.

Сообщение nick87720z »

Спасибо за наводку. Вообще-то я так пробовал раньше, но не догадался взять указатель на GdkWindow как свойство.
Теперь вроде работает, но вылетает с кодом 1 и ошибкой:

The program 'gladish' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadValue (integer parameter out of range for operation)'.
(Details: serial 4481 error_code 2 request_code 26 minor_code 0)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)

Вот кусок моего кода:

Код: Выделить всё

GtkWidget * main_win = get_gtk_builder_widget("main_win");
gdk_pointer_grab( main_win->window,
                    TRUE,
                    GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
                    NULL,
                    NULL,
                    GDK_CURRENT_TIME
                  );
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: gtk_grab_add() не производит ощутимого результата.

Сообщение /dev/random »

nick87720z писал(а):
28.09.2010 20:22

Код: Выделить всё

GtkWidget * main_win = get_gtk_builder_widget("main_win");
gdk_pointer_grab( main_win->window,
                    TRUE,
                    GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
                    NULL,
                    NULL,
                    GDK_CURRENT_TIME
                  );

*_KEY_* - это клавиатура. Мышь - *_BUTTON_*.
Спасибо сказали: