summaryrefslogtreecommitdiffstats
path: root/sway/input_state.c
diff options
context:
space:
mode:
authorLibravatar taiyu <taiyu.len@gmail.com>2015-08-22 18:01:38 -0700
committerLibravatar taiyu <taiyu.len@gmail.com>2015-08-22 18:01:38 -0700
commite139de0857a1ba015fa324dcc662a39eca88761b (patch)
tree1b3406300ed364e2d0449c2e08ab4c39a654ac6c /sway/input_state.c
parentWhoops (diff)
downloadsway-e139de0857a1ba015fa324dcc662a39eca88761b.tar.gz
sway-e139de0857a1ba015fa324dcc662a39eca88761b.tar.zst
sway-e139de0857a1ba015fa324dcc662a39eca88761b.zip
floating/tiling move + floating resize cleaned and fixed
Diffstat (limited to 'sway/input_state.c')
-rw-r--r--sway/input_state.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/sway/input_state.c b/sway/input_state.c
index e2f3c754..3db78167 100644
--- a/sway/input_state.c
+++ b/sway/input_state.c
@@ -50,6 +50,224 @@ void release_key(keycode key) {
50 50
51struct pointer_state pointer_state; 51struct pointer_state pointer_state;
52 52
53// Pointer mode values
54static struct mode_state {
55 // Initial view state
56 struct {
57 double x, y, w, h;
58 swayc_t *ptr;
59 } view;
60 // Initial pointer state
61 struct {
62 int x, y;
63 } coor;
64} initial;
65
66static struct {
67 enum { LEFT=1, RIGHT=0 } lr;
68 enum { TOP=1, BOTTOM=0 } tb;
69} lock;
70
71// Floating set/unset
72
73static void pointer_mode_set_floating(void) {
74 initial.view.x = initial.view.ptr->x;
75 initial.view.y = initial.view.ptr->y;
76 initial.view.w = initial.view.ptr->width;
77 initial.view.h = initial.view.ptr->height;
78 // setup initial cooridinates
79 initial.coor.x = pointer_state.origin.x;
80 initial.coor.y = pointer_state.origin.y;
81}
82
83static void pointer_mode_reset_floating(void) {
84 initial.view.ptr->x = initial.view.x;
85 initial.view.ptr->y = initial.view.y;
86 initial.view.ptr->width = initial.view.w;
87 initial.view.ptr->height = initial.view.h;
88 arrange_windows(initial.view.ptr, -1, -1);
89 pointer_state.mode = 0;
90}
91
92// Mode set left/right click
93
94static void pointer_mode_set_left(void) {
95 swayc_t *view = pointer_state.view;
96 initial.view.ptr = view;
97 if (view->is_floating) {
98 pointer_state.mode = M_DRAGGING | M_FLOATING;
99 pointer_mode_set_floating();
100 } else {
101 pointer_state.mode = M_DRAGGING | M_TILING;
102 }
103}
104
105static void pointer_mode_set_right(void) {
106 swayc_t *view = pointer_state.view;
107 initial.view.ptr = view;
108 // Setup locking information
109 int midway_x = view->x + view->width/2;
110 int midway_y = view->y + view->height/2;
111
112 lock.lr = pointer_state.origin.x > midway_x;
113 lock.tb = pointer_state.origin.y > midway_y;
114
115 if (view->is_floating) {
116 pointer_state.mode = M_RESIZING | M_FLOATING;
117 pointer_mode_set_floating();
118 } else {
119 pointer_state.mode = M_RESIZING | M_TILING;
120 }
121}
122
123// Mode set/update/reset
124
125void pointer_mode_set(uint32_t button, bool condition) {
126 // switch on drag/resize mode
127 switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) {
128 case M_DRAGGING:
129 // end drag mode when left click is unpressed
130 if (!pointer_state.l_held) {
131 pointer_state.mode = 0;
132 }
133 break;
134
135 case M_RESIZING:
136 // end resize mode when right click is unpressed
137 if (!pointer_state.r_held) {
138 pointer_state.mode = 0;
139 }
140 break;
141
142 // No mode case
143 default:
144 // return if failed condition, or no view
145 if (!condition || !pointer_state.view) {
146 break;
147 }
148 // Set mode depending on current button press
149 switch (button) {
150 // Start dragging mode
151 case M_LEFT_CLICK:
152 // if button release dont do anything
153 if (pointer_state.l_held) {
154 pointer_mode_set_left();
155 }
156 break;
157
158 // Start resize mode
159 case M_RIGHT_CLICK:
160 // if button release dont do anyhting
161 if (pointer_state.r_held) {
162 pointer_mode_set_right();
163 }
164 break;
165
166 case M_SCROLL_UP:
167 case M_SCROLL_DOWN:
168 //TODO add scrolling behavior here
169 ;
170 }
171 }
172}
173
174void pointer_mode_update(void) {
175 swayc_t *view = initial.view.ptr;
176 if (view->type != C_VIEW) {
177 pointer_state.mode = 0;
178 return;
179 }
180 int dx = pointer_state.origin.x - initial.coor.x;
181 int dy = pointer_state.origin.y - initial.coor.y;
182 bool changed = false;
183
184 switch (pointer_state.mode) {
185 case M_FLOATING | M_DRAGGING:
186 // Update position
187 if (initial.view.x + dx != view->x) {
188 view->x = initial.view.x + dx;
189 changed = true;
190 }
191 if (initial.view.y + dy != view->y) {
192 view->y = initial.view.y + dy;
193 changed = true;
194 }
195 break;
196
197 case M_FLOATING | M_RESIZING:
198 if (lock.lr) {
199 if (initial.view.w + dx > min_sane_w) {
200 if (initial.view.w + dx != view->width) {
201 view->width = initial.view.w + dx;
202 changed = true;
203 }
204 }
205 } else { //lock.right
206 if (initial.view.w - dx > min_sane_w) {
207 if (initial.view.w - dx != view->width) {
208 view->width = initial.view.w - dx;
209 view->x = initial.view.x + dx;
210 changed = true;
211 }
212 }
213 }
214 if (lock.tb) {
215 if (initial.view.h + dy > min_sane_h) {
216 if (initial.view.y - dy != view->height) {
217 view->height = initial.view.h + dy;
218 changed = true;
219 }
220 }
221 } else { //lock.bottom
222 if (initial.view.h - dy > min_sane_h) {
223 if (initial.view.h - dy != view->height) {
224 view->height = initial.view.h - dy;
225 view->y = initial.view.y + dy;
226 changed = true;
227 }
228 }
229 }
230 break;
231
232 case M_TILING | M_DRAGGING:
233 // swap current view under pointer with dragged view
234 if (pointer_state.view && pointer_state.view != initial.view.ptr) {
235 // Swap them around
236 swap_container(pointer_state.view, initial.view.ptr);
237 update_geometry(pointer_state.view);
238 update_geometry(initial.view.ptr);
239 // Set focus back to initial view
240 set_focused_container(initial.view.ptr);
241 }
242 break;
243
244 case M_TILING | M_RESIZING:
245
246
247
248 default:
249 return;
250 }
251 if (changed) {
252 update_geometry(view);
253 }
254}
255
256void pointer_mode_reset(void) {
257 switch (pointer_state.mode) {
258 case M_FLOATING | M_DRAGGING:
259 case M_FLOATING | M_RESIZING:
260 pointer_mode_reset_floating();
261 break;
262
263 case M_TILING | M_DRAGGING:
264 case M_TILING | M_RESIZING:
265 default:
266 return;
267 }
268}
269
270
53static struct wlc_geometry saved_floating; 271static struct wlc_geometry saved_floating;
54 272
55void start_floating(swayc_t *view) { 273void start_floating(swayc_t *view) {
@@ -72,3 +290,4 @@ void reset_floating(swayc_t *view) {
72 pointer_state.floating = (struct pointer_floating){0, 0}; 290 pointer_state.floating = (struct pointer_floating){0, 0};
73 pointer_state.lock = (struct pointer_lock){0, 0, 0, 0, 0, 0, 0, 0}; 291 pointer_state.lock = (struct pointer_lock){0, 0, 0, 0, 0, 0, 0, 0};
74} 292}
293