2012-03-22 3 views
2

Мне нужно обработать события (MouseDown, MouseUp, MouseMove, KeyDown, KeyUp) в дочернем окне X11. Родитель этого дочернего окна X11 - GtkWidget, поэтому я не могу создать основной цикл ...Как получить события в окне X11 child?

Как это сделать?

Спасибо!

ответ

1

XGrabPointer, XGrabKeyboard

Если вы хотите, чтобы захватить события из Gtk виджета, вы можете использовать g_signal_connect().

g_signal_connect(G_OBJECT(mChild), "button_press_event", 
        G_CALLBACK(BPHandler), NULL); 
    g_signal_connect(G_OBJECT(mChild), "key_press_event", 
        G_CALLBACK(KPHandler), NULL); 
+0

Спасибо, но я не могу найти пример без основной петли x11 ... И эти функции не принимают указатель на функцию ... – Alexander

+0

Посмотрел на g_signal_connect? – perreal

+0

Нет, GtkWidget - это только родительское окно, но мое x11-окно является дочерним для этого родителя ... – Alexander

1

Ну, вам нужен какой-то насос для событий, и, будучи дочерним окном на общем соединении с дисплеем X, он привязан к основному циклу события. Технически вы можете запустить второй поток с собственным подключением отображения и циклом событий. К сожалению, Xlib не очень потокобезопасен, особенно в этом отношении. Вы можете сделать это с помощью Xcb.

Другим подходом было бы подвергнуть ребенка под стражу отдельного процесса и использовать XEmbed.

+0

Спасибо! Возможно, второй способ (Xcb) может быть полезен. – Alexander

+0

Как использовать события Xcb без основного цикла? – Alexander

+0

@Alexander: Вам нужен цикл событий. Вот почему я предложил использовать дополнительный поток и отдельное соединение с дисплеем. Это невозможно сделать без какого-либо цикла. Или вы используете XEmbed, который, вероятно, был бы самым надежным методом. – datenwolf