With set_event_compression, most recent motion event is held in waiting



I have a simple drawing area, and I have configured
set_event_compression(false). I am printing out motion and button
events, and I see while I move the mouse the motion events come out,
but then when I stop and press the mouse button, I get one more motion
event and then the button press event.

Now I can do this because I'm using a trackball, so it is easy to press
a button without incurring any further actual mouse motion.

When I comment out the line to set_event_compression, I do not see this
behavior. So instead when I press the mouse button, I just get a button
press, and the coordinates of that button press match exactly to the
last motion event.

I wonder if someone can either confirm it is a bug, or I really hope
that it is a problem I'm doing. I am using GTKMM 3.24.6.

Here is a simple example which I compiled with:
g++ -o drawtest $(pkg-config --cflags --libs gtkmm-3.0) drawtest.cpp

#include <gtkmm.h>
#include <iostream>

class drawingArea : public Gtk::DrawingArea
{
    public:
        drawingArea(GtkDrawingArea* cObject, const
Glib::RefPtr<Gtk::Builder>& builder) : Gtk::DrawingArea(cObject),
eventNum(0)  { };
        void on_realize(void) override;
        int eventNum;

        bool on_button_press_event(GdkEventButton* event);
        bool on_button_release_event(GdkEventButton* event);
        bool on_motion_notify_event(GdkEventMotion* event);
};

void drawingArea::on_realize(void)
{
    Gtk::DrawingArea::on_realize();
    get_window()->set_event_compression(false);
}

bool drawingArea::on_button_press_event(GdkEventButton* event)
{
    std::cout << eventNum++ << " button pressed " << event->x << ":" <<
event->y << std::endl;
    return true;
}

bool drawingArea::on_button_release_event(GdkEventButton* event)
{
    std::cout << eventNum++ << " button released " << event->x << ":"
<< event->y << std::endl;
    return true;
}

bool drawingArea::on_motion_notify_event(GdkEventMotion* event)
{
    std::cout << eventNum++ << " motion " << event->x << ":" <<
        event->y << std::endl;
    return true;
}

int main (int argc, char **argv)
{
    auto app = Gtk::Application::create(argc, argv, "org.drawarea");

    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
    builder->add_from_file("drawarea.glade");

    Gtk::Window* mainWindow = nullptr;
    builder->get_widget("Window", mainWindow);

    drawingArea* drawArea = nullptr;
    builder->get_widget_derived("drawing", drawArea);
    drawArea->add_events(Gdk::POINTER_MOTION_MASK |
Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);

    app->run(*mainWindow);
    delete mainWindow;
}

Attachment: signature.asc
Description: OpenPGP digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]