ダブル、トリプルクリックイベントの検出

概要

ダブル、トリプルクリックイベントを検出する。

検出自体はGtk::Window::on_button_press_event()に渡されるGdkEventButton構造体の typeメンバーを見れば良いが、on_button_press_event()(及びon_button_release_event() )が 呼び出される順番に注意する必要がある。例えばトリプルクリックする場合は次の順番で GdkEventButton::typeに値が入って呼び出される。よってトリプルクリックする場合でも必ず シングル、ダブルクリックしたことが検知されるので注意する必要がある。

(1) GDK_BUTTON_PRESS

(2) GDK_BUTTON_RELEASE

(3) GDK_BUTTON_PRESS

(4) GDK_2BUTTON_PRESS

(5) GDK_BUTTON_RELEASE

(6) GDK_BUTTON_PRESS

(7) GDK_3BUTTON_PRESS

(8) GDK_BUTTON_RELEASE

ソース

mclick2

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

class MainWin : public Gtk::Window
{
public:
    MainWin();

protected:
    virtual bool on_button_press_event( GdkEventButton* event );
    virtual bool on_button_release_event( GdkEventButton* event );
};

MainWin::MainWin()
{
    // OFFになってるイベントを追加
    add_events( Gdk::BUTTON_PRESS_MASK );
    add_events( Gdk::BUTTON_RELEASE_MASK );
}

// マウスクリック
bool MainWin::on_button_press_event( GdkEventButton* event )
{
    switch( event->type ){

        case GDK_BUTTON_PRESS:  std::cout << "シングルクリック\n"; break;

        case GDK_2BUTTON_PRESS:  std::cout << "ダブルクリック\n"; break;

        case GDK_3BUTTON_PRESS:  std::cout << "トリプルクリック\n"; break;
    }

    return true;
}


// マウスリリース
bool MainWin::on_button_release_event( GdkEventButton* event )
{
    switch( event->type ){

        case GDK_BUTTON_RELEASE:  std::cout << "リリース\n"; break;
    }

    return true;
}



int main( int argc, char *argv[] )
{
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}


コンパイル

必要なコンパイルオプションは pkg-config を使って取得する。

g++ mclick2.cpp -o mclick2 `pkg-config gtkmm-2.4 --cflags --libs`

結果

トリプルクリックをすると次のように表示される

シングルクリック
リリース
シングルクリック
ダブルクリック
リリース
シングルクリック
トリプルクリック
リリース