События мыши Gtk.DrawingArea с использованием Vala

Я пытался получать события мыши на моем Gtk.DrawingArea, используя Vala, но безуспешно. В частности, я подклассифицирую Gtk.DrawingArea и в своем конструкторе добавляю события, которые хочу получать:

this.add_events (Gdk.EventMask.ENTER_NOTIFY_MASK |
                 Gdk.EventMask.BUTTON_PRESS_MASK);

Затем в том же конструкторе ниже я регистрирую обработчики сигналов для этих событий:

this.enter_notify_event.connect (
        (page, event) => {
            stdout.printf("mouse entered !!! \n");
            return true;
        }
);

this.button_press_event.connect (
        (page, event) => {
            stdout.printf("mouse click \n");
            return false;
        }
);

Я пробовал и return true, и return false, чтобы проверить, что происходит в обоих случаях. Однако я не вижу сообщений на консоли, когда я перемещаю указатель на Gtk.DrawingArea или когда я нажимаю на него. Я даже задал события для топа Gtk.Window:

this.set_events (this.get_events() |
                 Gdk.EventMask.ENTER_NOTIFY_MASK |
                 Gdk.EventMask.BUTTON_PRESS_MASK);

но события, похоже, не получаются. Что может пойти не так?


person John bracciano    schedule 20.09.2017    source источник


Ответы (1)


Ваш код кажется правильным, хотя это не MVCE. Я бы указал на неверный прототип обработчиков обратного вызова, но, поскольку вы не используете данные о событиях, это не должно быть «проблемой». Прототипы обратного вызова для enter_notify_event и button_press_event предоставляют только событие, поэтому аргумент страницы неверен.

Во всяком случае, я протестировал очень простой и необработанный код, и он сработал. Пожалуйста, подтвердите:

using Gtk;

public class MyWidget : Gtk.DrawingArea {

    public MyWidget () {
        this.set_events (Gdk.EventMask.ENTER_NOTIFY_MASK |
                         Gdk.EventMask.BUTTON_PRESS_MASK);

        this.enter_notify_event.connect ((event) => {
            stdout.printf ("mouse entered !!! \n");
            return false;
        });

        this.button_press_event.connect ((event) => {
            stdout.printf("mouse click \n");
            return false;
        });
    }
}

public void main (string[] args) {
    Gtk.init (ref args);
    var window = new Gtk.Window ();
    window.add (new MyWidget ());
    window.destroy.connect (Gtk.main_quit); 
    window.show_all ();

    Gtk.main ();
}

Скомпилируйте с помощью valac test.vala --pgk gtk+-3.0.

Результат:

результат

Использование Vala 0.30.2 и Gtk+ 3.18 на Fedora 23.

person José Fonte    schedule 20.09.2017