リアルタイムなマウス状態の取得
概要
現在のマウス状態をイベントを使わずに取得する。XQueryKeymap()関数と同様にして、マウスの現在の位置や ボタンの状態はXQueryPointer()関数により取得できる。
ソース
xqpointer.cpp
#include <gtkmm.h>
#include <gdk/gdkx.h>
#include <iostream>
void show_pointer( Glib::RefPtr<Gdk::Window> win )
{
int x_r, y_r;
int x_w, y_w;
Window root;
Window child;
unsigned int buttons;
XQueryPointer( GDK_WINDOW_XDISPLAY( Glib::unwrap( win ) ),
GDK_WINDOW_XWINDOW( Glib::unwrap( win ) ),
&root, &child,
&x_r, &y_r, &x_w, &y_w, &buttons );
std::cout << "x_r = " << x_r << " y_r= " << y_r
<< "x_w = " << x_w << " y_w= " << y_w
<< " button = " << buttons;
if( buttons & Button1Mask ) std::cout << " b1";
if( buttons & Button2Mask ) std::cout << " b2";
if( buttons & Button3Mask ) std::cout << " b3";
if( buttons & ShiftMask ) std::cout << " shift";
if( buttons & ControlMask ) std::cout << " ctrl";
std::cout << std::endl;
}
class MainWin : public Gtk::Window
{
public:
MainWin(){ add_events( Gdk::BUTTON_PRESS_MASK ); }
protected:
virtual bool on_button_press_event( GdkEventButton* ev ){ show_pointer( get_window() ); }
};
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ xqpointer.cpp -o xqpointer `pkg-config gtkmm-2.4 --cflags --libs`