1 #include <hikari/dnd_mode.h>
2 
3 #include <time.h>
4 
5 #include <wlr/types/wlr_cursor.h>
6 #include <wlr/types/wlr_seat.h>
7 
8 #include <hikari/binding.h>
9 #include <hikari/configuration.h>
10 #include <hikari/keyboard.h>
11 #include <hikari/renderer.h>
12 #include <hikari/server.h>
13 #include <hikari/view.h>
14 
15 static void
cancel(void)16 cancel(void)
17 {
18   wlr_seat_pointer_clear_focus(hikari_server.seat);
19 }
20 
21 static void
key_handler(struct hikari_keyboard * keyboard,struct wlr_event_keyboard_key * event)22 key_handler(
23     struct hikari_keyboard *keyboard, struct wlr_event_keyboard_key *event)
24 {
25   if (event->state == WLR_KEY_RELEASED) {
26     hikari_server_enter_normal_mode(NULL);
27   }
28 }
29 
30 static void
modifiers_handler(struct hikari_keyboard * keyboard)31 modifiers_handler(struct hikari_keyboard *keyboard)
32 {}
33 
34 static void
cursor_move(uint32_t time_msec)35 cursor_move(uint32_t time_msec)
36 {
37   double x = hikari_server.cursor.wlr_cursor->x;
38   double y = hikari_server.cursor.wlr_cursor->y;
39 
40   struct wlr_surface *surface;
41   struct hikari_workspace *workspace;
42   double sx, sy;
43   struct hikari_node *node =
44       hikari_server_node_at(x, y, &surface, &workspace, &sx, &sy);
45 
46   struct wlr_seat *seat = hikari_server.seat;
47 
48   if (node != NULL) {
49     wlr_seat_pointer_notify_enter(seat, surface, sx, sy);
50     wlr_seat_pointer_notify_motion(seat, time_msec, sx, sy);
51   } else {
52     wlr_seat_pointer_clear_focus(seat);
53   }
54 }
55 
56 static void
button_handler(struct hikari_cursor * cursor,struct wlr_event_pointer_button * event)57 button_handler(
58     struct hikari_cursor *cursor, struct wlr_event_pointer_button *event)
59 {
60   wlr_seat_pointer_notify_button(
61       hikari_server.seat, event->time_msec, event->button, event->state);
62 
63   if (event->state == WLR_BUTTON_RELEASED) {
64     hikari_server_enter_normal_mode(NULL);
65   }
66 }
67 
68 void
hikari_dnd_mode_init(struct hikari_dnd_mode * dnd_mode)69 hikari_dnd_mode_init(struct hikari_dnd_mode *dnd_mode)
70 {
71   dnd_mode->mode.key_handler = key_handler;
72   dnd_mode->mode.button_handler = button_handler;
73   dnd_mode->mode.modifiers_handler = modifiers_handler;
74   dnd_mode->mode.render = hikari_renderer_dnd_mode;
75   dnd_mode->mode.cancel = cancel;
76   dnd_mode->mode.cursor_move = cursor_move;
77 }
78 
79 void
hikari_dnd_mode_enter(void)80 hikari_dnd_mode_enter(void)
81 {
82   hikari_server.mode = (struct hikari_mode *)&hikari_server.dnd_mode;
83   cursor_move(0);
84 }
85