多点触控GTK3示例

gre*_*ghz 9 multi-touch gtk3

据我所知,从版本3.4开始,GTK +增加了多点触控支持.我不清楚的是这是否仅适用于手机/平板电脑等触摸屏,还是适用于Apple风格的触控板(Ubuntu/Unity和OS X在触控板上使用多点触控手势的方式).

我也很难找到如何实现手势以及如何跟踪多点触控事件的示例.

有没有关于如何使用GTK(或类似Clutter之类的东西)实现多点触控的好例子?

pan*_*oku 1

我也找不到例子,所以这是我的知识:

鼠标事件(介绍):

GDK_BUTTON_PRESS当使用鼠标时,Gdk 传播事件GDK_BUTTON_RELEASE(以及其他一些事件)。这会被转换为按钮按下事件GtkWidget等信号,然后转换为更高级别的信号,如单击(如果适用)。将回调连接到信号允许访问GdkEventButton 结构。但是,使用“但是”可以让您无需跟踪是单击(按下并释放)还是仅释放(例如在动态滚动期间)。GtkButtonbutton-press-eventclicked

触摸事件:

触摸的工作方式略有不同。有4个触摸事件

GDK_TOUCH_BEGIN
一个新的触摸事件序列刚刚开始。该事件类型是在 3.4 中添加的。

GDK_TOUCH_UPDATE
触摸事件序列已更新。该事件类型是在 3.4 中添加的。

GDK_TOUCH_END
触摸事件序列已完成。该事件类型是在 3.4 中添加的。

GDK_TOUCH_CANCEL
触摸事件序列已被取消。该事件类型是在 3.4 中添加的。

GdkEventTouch结构使用GdkEventSequence来区分手指。在我看来,它只是一个值(无法在源中找到定义),但我在这里可能是错误的。GtkWidget具有类似于等 的触摸事件button-press-event信号,也被转换为诸如 之类的事件clicked

示例代码(使用 gtkmm 但核心方面是相同的):

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

int main()
{
    auto app = Gtk::Application::create();
    Gtk::Window window;
    window.set_default_size(1024, 768);
    app->signal_startup().connect([&]
    {
        app->add_window(window);
    });

    window.show();

    //code works for me without adding events mask but let's be thorough
    window.add_events(Gdk::TOUCH_MASK);
    window.signal_touch_event().connect([&](GdkEventTouch* event)->bool
    {
        std::cout<<"TOUCH EVENT: ";
        switch(event->type)
        {
        case GDK_TOUCH_BEGIN:
            std::cout<<"begin ";
            break;
        case GDK_TOUCH_UPDATE:
            std::cout<<"update ";
            break;
        case GDK_TOUCH_END:
            std::cout<<"end ";
            break;
        case GDK_TOUCH_CANCEL:
            std::cout<<"cancel ";
            break;
        default:
            std::cout<<"something else ";
        }
        std::cout<<event->sequence<<" "
                 <<gdk_event_get_event_sequence((GdkEvent*)event)<<" "
                 <<std::endl;
        return GDK_EVENT_PROPAGATE;
    });
    window.signal_event().connect([&](GdkEvent* event)->bool
    {
        std::cout<<"EVENT: "<<event->type<<std::endl;
        return GDK_EVENT_PROPAGATE;
    });

    app->run();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

触摸板事件:

还有触摸板和板事件结构,但似乎没有对这些级别进行明确的处理Gtk它必须在事件信号的回调中完成,检查GdkEventType并将其转换为适当的结构。