Complete switch to gdk_seat_* API
[terminatorX.git] / src / tX_mouse.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2020  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  
18     File: tX_mouse.h
19  
20     Description: Header to tX_mouse.cc
21 */    
22
23 #ifndef _h_tx_mouse 
24 #define _h_tx_mouse
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include <tX_types.h>
31 #include <unistd.h>
32 #include <glib.h>
33 #include <gdk/gdk.h>
34 #include <gdk/gdkkeysyms.h>
35 #include <gtk/gtk.h>
36 #include <stdint.h>
37
38 #define KEY_Alt_L 1
39 #define KEY_Alt_R 2
40 #define KEY_BackSpace 3
41 #define KEY_Control_L 4
42 #define KEY_Control_R 5
43 #define KEY_Escape 6
44 #define KEY_f 7
45 #define KEY_F1 8
46 #define KEY_F10 9
47 #define KEY_F11 10
48 #define KEY_F12 11
49 #define KEY_F2 12
50 #define KEY_F3 13
51 #define KEY_F4 14
52 #define KEY_F5 15
53 #define KEY_F6 16
54 #define KEY_F7 17
55 #define KEY_F8 18
56 #define KEY_F9 19
57 #define KEY_m  20
58 #define KEY_Return 21
59 #define KEY_s 22
60 #define KEY_space 23
61 #define KEY_Tab 24
62 #define KEY_w 25
63 #define MAX_KEY 26
64
65 typedef struct __attribute__((__packed__)) {
66         uint8_t buttons;
67         int8_t x_motion;
68         int8_t y_motion;
69 } tx_input_event;
70
71 class tx_mouse
72 {
73         bool warp_override;
74         GdkEventMask savedEventMask;
75
76         gboolean enable_auto_mnemonics;
77         gboolean enable_compression;
78         guint last_button_press;
79         guint last_button_release;
80
81         GdkDisplay* display;
82         GdkDevice* pointer;
83         GdkSeat *seat;
84         GdkScreen* screen;
85         GdkWindow* window;
86         GdkCursor* cursor;
87         gdouble x_abs;
88         gdouble y_abs;
89         gint x_restore;
90         gint y_restore;
91
92         float warp;
93         
94         int grabbed;
95         bool key_pressed[MAX_KEY];
96         
97         enum  {
98                 FALLBACK,
99                 LINUX_INPUT
100         } grab_mode;
101         
102         GIOChannel *linux_input_channel;
103         guint linux_input_watch;
104
105         bool press_key(int keycode) {
106                 if (!key_pressed[keycode]) {
107                         key_pressed[keycode] = true;
108                         return true;
109                 }
110                 return false;
111         }
112
113         bool release_key(int keycode) {
114                 if (key_pressed[keycode]) {
115                         key_pressed[keycode] = false;
116                         return true;
117                 }
118                 return false;
119         }
120
121         public:
122         int set_xinput();
123         void reset_xinput();
124         bool is_grabbed() { return grabbed != 0; }
125                 
126         int grab();
127         int grab_linux_input();
128                 
129         int check_event();
130         void ungrab();
131         void ungrab_linux_input();
132         tx_mouse();
133         GError *open_channel();
134         void close_channel();
135
136         void motion_notify(GtkWidget *widget, GdkEventMotion *eventMotion);
137         void button_press(GtkWidget *widget, GdkEventButton *eventButton);
138         void button_release(GtkWidget *widget, GdkEventButton *eventButton);
139         void key_press(GtkWidget *widget, GdkEventKey *eventKey);
140         void key_release(GtkWidget *widget, GdkEventKey *eventKey);
141         void linux_input(tx_input_event *event);
142
143         static gboolean motion_notify_wrap(GtkWidget *widget, GdkEventMotion *eventMotion, void *data);
144         static gboolean button_press_wrap(GtkWidget *widget, GdkEventButton *eventButton, void *data);
145         static gboolean button_release_wrap(GtkWidget *widget, GdkEventButton *eventButton, void *data);
146         static gboolean key_press_wrap(GtkWidget *widget, GdkEventKey *eventKey, void *data);
147         static gboolean key_release_wrap(GtkWidget *widget, GdkEventKey *eventKey, void *data);
148         static gboolean linux_input_wrap(GIOChannel *source, GIOCondition condition, gpointer data);
149 };
150
151
152 #endif