写意画Gtk / set_event_compression(false)不起作用

时间:2018-02-01 07:38:06

标签: events gtk drawing gtk3 gtkmm

我正在使用GTK +(gtkmm)开发图形软件,并希望构建一个免费的手绘功能。

我连接到signal_motion_notify_event上的Gtk::EventBox,并在事件框中将set_event_compression设置为false。我还在包含事件框的窗口上设置了set_event_compression(false),但似乎没有任何效果。该程序运行不流畅,以至于它允许绘制的槽线,而是我得到多个单点或短划线。

我还尝试在额外的Gdk::Window::get_pointer(int,int,Gdk::ModifierType)中使用thread,但这也不起作用(也没有通过线条绘制)。

下面是一些示例代码来说明(我使用Gtk::Image - 类绘制一个pixbuf):

Toolbox.cc

// eb means EventBox
Gtk::EventBox& eb = drawingWin->getEventBox();
eb.signal_motion_notify_event().connect(sigc::mem_fun(image, &Image::motionEvent));

DrawingWindow.cc

DrawingWindow::DrawingWindow(int x, int y) : area(x, y), background("/home/tux/Pictures/Arch_Linux_Wallpaper_by_james66.jpg")
{
    // eb means EventBox
    eb.get_window()->set_event_compression(false);
}

Image.cc

bool Image::motionEvent(_GdkEventMotion* event)
{
    if(event)
    {
        mutex.lock();
        //custom set_pixel function on Gdk::Pixbuf using guint8* Gdk::Pixbuf::get_pixels() const
        this->set_pixel(event->x, event->y, 0x000000ff);
        //updates the Gtk::Image by calling Gtk::Image::set(Glib::RefPtr<Gdk::Pixbuf>)
        this->_udpate();
        mutex.unlock();
    }
}

1 个答案:

答案 0 :(得分:0)

在GIMP(最初为GTK +编写的程序)中,单点之间也存在间隙,如果鼠标移动得太快,则点之间会有直线填充。

在GTK +和gtkmm中有Gdk::EventMask个。这些可以使用Gtk::Widget::set_events(Gdk::EventMask)进行设置。需要确保POINTER_MOTION_MASK已设置(不是POINTER_MOTION_HINT_MASK)。

还需要确保禁用事件压缩。在包含GTK3之前,可以使用Gdk::Window::set_event_compression(false)

完成此操作

在GTK4中,始终打开事件压缩:

  

使用GTK4,需要查看运动事件之间的事件历史记录,以重建合并后的事件历史记录。在gtk4中,事件传递速率固定为由帧时钟(即60hz)运行。 get_motion_history() (函数名称可能已更改)将仅返回在处理该帧期间累积的运动坐标。

以下是两个例子:

  1. gtk3-demo
  2. PyGtk2(需要安装python2pygtk2gtk2才能对此进行测试。
  3. 所有这些例子都缺乏连贯性(线之间存在差距)。

    使用GTK +建立合适的自由手绘图是不可能的!

    还有一个example using Qt5,它是连贯的: Qt5 Scribble