/**************************************************************************** KHotKeys Copyright (C) 1999-2002 Lubos Lunak <l.lunak@kde.org> Distributed under the terms of the GNU General Public License version 2. ****************************************************************************/ #ifndef _GESTURES_H_ #define _GESTURES_H_ #include <tqwidget.h> #include <tqtimer.h> #include <X11/Xlib.h> #include <fixx11h.h> #include "windows.h" namespace KHotKeys { class Gesture; KDE_EXPORT extern Gesture* gesture_handler; class KDE_EXPORT Stroke { public: // maximum number of numbers in stroke enum { MAX_SEQUENCE = 25 }; // largest number of points allowed to be sampled enum { MAX_POINTS = 5000 }; // default percentage of sample points in a bin from all points to be valid enum { MIN_BIN_POINTS_PERCENTAGE = 5 }; // default threshold of size of smaller axis needed for it to define its own bin size enum { SCALE_RATIO = 4 }; // default number of sample points required to have a valid stroke enum { MIN_POINTS = 10 }; Stroke(); ~Stroke(); bool record( int x, int y ); char* translate( int min_bin_points_percentage_P = MIN_BIN_POINTS_PERCENTAGE, int scale_ratio_P = SCALE_RATIO, int min_points_P = MIN_POINTS ); // CHECKME returns ret_val ( see below ) void reset(); protected: int bin( int x, int y ); // metrics for input stroke int min_x, min_y; int max_x, max_y; int point_count; int delta_x, delta_y; int bound_x_1, bound_x_2; int bound_y_1, bound_y_2; struct point { int x; int y; }; point* points; char ret_val[ MAX_SEQUENCE ]; }; class KDE_EXPORT Gesture : public TQWidget // not TQObject because of x11EventFilter() { Q_OBJECT public: Gesture( bool enabled_P, TQObject* parent_P ); virtual ~Gesture(); void enable( bool enable_P ); void set_mouse_button( unsigned int button_P ); void set_timeout( int time_P ); void set_exclude( Windowdef_list* windows_P ); void register_handler( TQObject* receiver_P, const char* slot_P ); void unregister_handler( TQObject* receiver_P, const char* slot_P ); protected: virtual bool x11Event( XEvent* ev_P ); private slots: void stroke_timeout(); void active_window_changed( WId window_P ); signals: void handle_gesture( const TQString &gesture, WId window ); private: void update_grab(); void grab_mouse( bool grab_P ); void mouse_replay( bool release_P ); bool _enabled; Stroke stroke; int start_x, start_y; TQTimer nostroke_timer; bool recording; unsigned int button; int timeout; WId gesture_window; Windowdef_list* exclude; TQMap< TQObject*, bool > handlers; // bool is just a dummy }; // Gesture class must be TQWidget derived because of x11Event() // but it should be TQObject owned -> use a TQObject proxy that will delete it class DeleteObject : public TQObject { Q_OBJECT public: DeleteObject( TQWidget* widget_P, TQObject* parent_P ) : TQObject( parent_P ), widget( widget_P ) {} virtual ~DeleteObject() { delete widget; } private: TQWidget* widget; }; //*************************************************************************** // Inline //*************************************************************************** } // namespace KHotKeys #endif