Wayland: handle mouse input
This commit is contained in:
		
							parent
							
								
									ed560eab4e
								
							
						
					
					
						commit
						32119a1df7
					
				| @ -9,7 +9,7 @@ | ||||
| #include <stdbool.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <X11/Xlib.h> | ||||
| #include <wayland-client.h> | ||||
| 
 | ||||
| #include "dbus.h" | ||||
| #include "draw.h" | ||||
| @ -86,6 +86,7 @@ static gboolean run(void *data) | ||||
|         if (active) { | ||||
|                 gint64 now = time_monotonic_now(); | ||||
|                 gint64 sleep = queues_get_next_datachange(now); | ||||
|                 sleep = 100000; // Make sure wayland input is handled in time FIXME
 | ||||
|                 gint64 timeout_at = now + sleep; | ||||
| 
 | ||||
|                 LOG_D("Dunst: sleeping for %li ms", sleep/1000); | ||||
|  | ||||
| @ -324,7 +324,7 @@ void queues_notification_close_id(int id, enum reason reason) | ||||
|                 default: | ||||
|                         reason_string="unknown"; | ||||
|         } | ||||
|                  | ||||
| 
 | ||||
|         LOG_D("Queues: Closing notification for reason: %s", reason_string); | ||||
| 
 | ||||
|         GQueue *allqueues[] = { displayed, waiting }; | ||||
|  | ||||
							
								
								
									
										125
									
								
								src/wayland/wl.c
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								src/wayland/wl.c
									
									
									
									
									
								
							| @ -12,6 +12,7 @@ | ||||
| #include <sys/mman.h> | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
| #include <linux/input-event-codes.h> | ||||
| 
 | ||||
| #include "protocols/xdg-output-unstable-v1-client-header.h" | ||||
| #include "protocols/xdg-output-unstable-v1.h" | ||||
| @ -23,6 +24,7 @@ | ||||
| 
 | ||||
| #include "../log.h" | ||||
| #include "../settings.h" | ||||
| #include "../queues.h" | ||||
| 
 | ||||
| struct window_wl { | ||||
|         struct wl_surface *surface; | ||||
| @ -45,6 +47,7 @@ struct wl_ctx { | ||||
|         struct wl_shm *shm; | ||||
|         struct zwlr_layer_shell_v1 *layer_shell; | ||||
|         struct zxdg_output_manager_v1 *xdg_output_manager; | ||||
|         struct wl_seat *seat; | ||||
| 
 | ||||
|         struct wl_list outputs; | ||||
| 
 | ||||
| @ -56,6 +59,11 @@ struct wl_ctx { | ||||
|         bool configured; | ||||
|         bool dirty; | ||||
| 
 | ||||
| 	struct { | ||||
| 		struct wl_pointer *wl_pointer; | ||||
| 		int32_t x, y; | ||||
| 	} pointer; | ||||
| 
 | ||||
|         struct dimensions cur_dim; | ||||
| 
 | ||||
|         int32_t width, height; | ||||
| @ -112,8 +120,9 @@ static void output_handle_geometry(void *data, struct wl_output *wl_output, | ||||
|                 int32_t x, int32_t y, int32_t phy_width, int32_t phy_height, | ||||
|                 int32_t subpixel, const char *make, const char *model, | ||||
|                 int32_t transform) { | ||||
|         //struct wl_output *output = data;
 | ||||
|         //output->subpixel = subpixel;
 | ||||
|         //TODO
 | ||||
|         /* struct wl_output *output = data; */ | ||||
|         /* output->subpixel = subpixel; */ | ||||
| } | ||||
| 
 | ||||
| static void output_handle_scale(void *data, struct wl_output *wl_output, | ||||
| @ -162,6 +171,102 @@ static void destroy_output(struct wl_output *output) { | ||||
|         free(output); | ||||
| } | ||||
| 
 | ||||
| static void pointer_handle_motion(void *data, struct wl_pointer *wl_pointer, | ||||
|                 uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) { | ||||
|         LOG_I("Pointer handle motion"); | ||||
|         ctx.pointer.x = wl_fixed_to_int(surface_x); | ||||
|         ctx.pointer.y = wl_fixed_to_int(surface_y); | ||||
| } | ||||
| 
 | ||||
| static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, | ||||
|                 uint32_t serial, uint32_t time, uint32_t button, | ||||
|                 uint32_t button_state) { | ||||
| 
 | ||||
|         if (button_state == 0){ | ||||
|                 // make sure it doesn't react twice
 | ||||
|                 return; | ||||
|         } | ||||
| 
 | ||||
|         LOG_I("Pointer handle button %i: %i", button, button_state); | ||||
|         enum mouse_action *acts; | ||||
| 
 | ||||
|         switch (button) { | ||||
|                 case BTN_LEFT: | ||||
|                         acts = settings.mouse_left_click; | ||||
|                         break; | ||||
|                 case BTN_MIDDLE: | ||||
|                         acts = settings.mouse_middle_click; | ||||
|                         break; | ||||
|                 case BTN_RIGHT: | ||||
|                         acts = settings.mouse_right_click; | ||||
|                         break; | ||||
|                 default: | ||||
|                         LOG_W("Unsupported mouse button: '%d'", button); | ||||
|                         return; | ||||
|         } | ||||
| 
 | ||||
|         // TODO Extract this code into seperate function
 | ||||
|         for (int i = 0; acts[i]; i++) { | ||||
|                 enum mouse_action act = acts[i]; | ||||
|                 if (act == MOUSE_CLOSE_ALL) { | ||||
|                         queues_history_push_all(); | ||||
|                         return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (act == MOUSE_DO_ACTION || act == MOUSE_CLOSE_CURRENT) { | ||||
|                         int y = settings.separator_height; | ||||
|                         struct notification *n = NULL; | ||||
|                         int first = true; | ||||
|                         for (const GList *iter = queues_get_displayed(); iter; | ||||
|                              iter = iter->next) { | ||||
|                                 n = iter->data; | ||||
|                                 if (ctx.pointer.y > y && ctx.pointer.y < y + n->displayed_height) | ||||
|                                         break; | ||||
| 
 | ||||
|                                 y += n->displayed_height + settings.separator_height; | ||||
|                                 if (first) | ||||
|                                         y += settings.frame_width; | ||||
|                         } | ||||
| 
 | ||||
|                         if (n) { | ||||
|                                 if (act == MOUSE_CLOSE_CURRENT) | ||||
|                                         queues_notification_close(n, REASON_USER); | ||||
|                                 else | ||||
|                                         notification_do_action(n); | ||||
|                         } | ||||
|                 } | ||||
|         } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| static const struct wl_pointer_listener pointer_listener = { | ||||
|         .enter = noop, | ||||
|         .leave = noop, | ||||
|         .motion = pointer_handle_motion, | ||||
|         .button = pointer_handle_button, | ||||
|         .axis = noop, | ||||
| }; | ||||
| 
 | ||||
| static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat, | ||||
|                 uint32_t capabilities) { | ||||
| 
 | ||||
|         if (ctx.pointer.wl_pointer != NULL) { | ||||
|                 wl_pointer_release(ctx.pointer.wl_pointer); | ||||
|                 ctx.pointer.wl_pointer = NULL; | ||||
|         } | ||||
|         if (capabilities & WL_SEAT_CAPABILITY_POINTER) { | ||||
|                 ctx.pointer.wl_pointer = wl_seat_get_pointer(wl_seat); | ||||
|                 wl_pointer_add_listener(ctx.pointer.wl_pointer, | ||||
|                         &pointer_listener, ctx.seat); | ||||
|                 LOG_I("Adding pointer"); | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| static const struct wl_seat_listener seat_listener = { | ||||
|         .capabilities = seat_handle_capabilities, | ||||
|         .name = noop, | ||||
| }; | ||||
| 
 | ||||
| // FIXME: Snipped touch handling
 | ||||
| 
 | ||||
| static void surface_handle_enter(void *data, struct wl_surface *surface, | ||||
| @ -241,9 +346,8 @@ static void handle_global(void *data, struct wl_registry *registry, | ||||
|                 ctx.layer_shell = wl_registry_bind(registry, name, | ||||
|                         &zwlr_layer_shell_v1_interface, 1); | ||||
|         } else if (strcmp(interface, wl_seat_interface.name) == 0) { | ||||
|                 struct wl_seat *seat = | ||||
|                         wl_registry_bind(registry, name, &wl_seat_interface, 3); | ||||
|                 //create_seat(seat);
 | ||||
|                 ctx.seat = wl_registry_bind(registry, name, &wl_seat_interface, 3); | ||||
|                 wl_seat_add_listener(ctx.seat, &seat_listener, ctx.seat); | ||||
|         } else if (strcmp(interface, wl_output_interface.name) == 0) { | ||||
|                 struct wl_output *output = | ||||
|                         wl_registry_bind(registry, name, &wl_output_interface, 3); | ||||
| @ -331,10 +435,7 @@ void finish_wayland() { | ||||
|                 destroy_output(output); | ||||
|         } | ||||
| 
 | ||||
|         //struct mako_seat *seat, *seat_tmp;
 | ||||
|         //wl_list_for_each_safe(seat, seat_tmp, &ctx.seats, link) {
 | ||||
|         //        destroy_seat(seat);
 | ||||
|         //}
 | ||||
|         free(ctx.seat); | ||||
| 
 | ||||
|         if (ctx.xdg_output_manager != NULL) { | ||||
|                 zxdg_output_manager_v1_destroy(ctx.xdg_output_manager); | ||||
| @ -346,8 +447,6 @@ void finish_wayland() { | ||||
|         wl_display_disconnect(ctx.display); | ||||
| } | ||||
| 
 | ||||
| // FIXME: Snip
 | ||||
| 
 | ||||
| static struct wl_output *get_configured_output() { | ||||
|         struct wl_output *output; | ||||
|         // FIXME
 | ||||
| @ -446,7 +545,7 @@ static void send_frame() { | ||||
|                 else{ | ||||
|                         anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; | ||||
|                 } | ||||
|                  | ||||
| 
 | ||||
|                 // Put the window at the right position
 | ||||
|                 zwlr_layer_surface_v1_set_anchor(ctx.layer_surface, | ||||
|                         anchor); | ||||
| @ -552,7 +651,7 @@ void wl_win_show(window win) { | ||||
| } | ||||
| 
 | ||||
| void wl_win_hide(window win) { | ||||
|         LOG_W("Hiding window"); | ||||
|         LOG_I("Hiding window"); | ||||
|         ctx.cur_dim.h = 0; | ||||
|         set_dirty(); | ||||
|         wl_display_roundtrip(ctx.display); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 fwsmit
						fwsmit