diff options
author | taiyu <taiyu.len@gmail.com> | 2015-08-22 18:01:38 -0700 |
---|---|---|
committer | taiyu <taiyu.len@gmail.com> | 2015-08-22 18:01:38 -0700 |
commit | e139de0857a1ba015fa324dcc662a39eca88761b (patch) | |
tree | 1b3406300ed364e2d0449c2e08ab4c39a654ac6c /sway/input_state.c | |
parent | Whoops (diff) | |
download | sway-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.c | 219 |
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 | ||
51 | struct pointer_state pointer_state; | 51 | struct pointer_state pointer_state; |
52 | 52 | ||
53 | // Pointer mode values | ||
54 | static 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 | |||
66 | static struct { | ||
67 | enum { LEFT=1, RIGHT=0 } lr; | ||
68 | enum { TOP=1, BOTTOM=0 } tb; | ||
69 | } lock; | ||
70 | |||
71 | // Floating set/unset | ||
72 | |||
73 | static 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 | |||
83 | static 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 | |||
94 | static 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 | |||
105 | static 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 | |||
125 | void 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 | |||
174 | void 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 | |||
256 | void 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 | |||
53 | static struct wlc_geometry saved_floating; | 271 | static struct wlc_geometry saved_floating; |
54 | 272 | ||
55 | void start_floating(swayc_t *view) { | 273 | void 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 | |||