annotate src/yawc.c @ 0:f0372d3356b4 default tip

initial import
author Yasuri <linuxoverwindows@charliesmp.net>
date Sun, 30 Aug 2026 12:47:10 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
1 #include <signal.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
2 #include <stdio.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
3 #include <stdlib.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
4 #include <string.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
5 #include <unistd.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
6 #include "nein_cursor.h"
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
7 #include <swc.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
8 #include <wayland-server.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
9 #include <wayland-util.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
10 #include <xkbcommon/xkbcommon-keysyms.h>
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
11
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
12 #include "config.h"
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
13 #include "types.h"
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
14 #include "util.h"
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
15 #include "yawc.h"
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
16
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
17 static void focus(struct client* c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
18 static void apply_decor(struct client* c, bool active);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
19 static struct client* first_client(struct screen* s);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
20 static bool is_ws_client(const struct client* c, const struct screen* s);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
21 static void on_screen_destroy(void* data);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
22 static void on_win_destroy(void* data);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
23 static void on_win_entered(void* data);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
24 static void on_win_metadata_changed(void* data);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
25 static void run_autostart(void);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
26 static void setup(void);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
27 static void setup_binds(void);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
28 static void setup_cursor(void);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
29 static void sync_window_visibility(void);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
30
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
31 struct wm wm;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
32 const struct swc_manager manager = {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
33 .new_screen = new_screen, .new_window = new_window, .new_device = new_device,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
34 };
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
35 struct swc_window_handler window_handler = {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
36 .destroy = on_win_destroy,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
37 .title_changed = on_win_metadata_changed,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
38 .app_id_changed = on_win_metadata_changed,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
39 .entered = on_win_entered,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
40 };
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
41 struct swc_screen_handler screen_handler = {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
42 .destroy = on_screen_destroy,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
43 };
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
44
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
45 static void focus(struct client* c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
46 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
47 if (wm.sel_client) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
48 swc_window_set_border(
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
49 wm.sel_client->win,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
50 cfg.border_col_normal, cfg.border_width,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
51 cfg.border_col_normal_outer, cfg.border_width_outer
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
52 );
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
53 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
54
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
55 if (c) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
56 swc_window_set_border(
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
57 c->win,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
58 cfg.border_col_active, cfg.border_width,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
59 cfg.border_col_active_outer, cfg.border_width_outer
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
60 );
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
61 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
62
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
63 swc_window_focus(c ? c->win : NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
64 wm.sel_client = c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
65 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
66
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
67 static void apply_decor(struct client* c, bool active)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
68 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
69 (void)active;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
70
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
71 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
72 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
73 swc_window_set_decor(c->win, NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
74 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
75
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
76 static struct client* first_client(struct screen* s)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
77 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
78 struct client* c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
79
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
80 wl_list_for_each(c, &wm.clients, link) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
81 if (is_ws_client(c, s))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
82 return c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
83 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
84
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
85 return NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
86 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
87
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
88 static bool is_ws_client(const struct client* c, const struct screen* s)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
89 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
90 return c && c->ws == wm.ws && (!s || c->scr == s);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
91 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
92
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
93 static void on_screen_destroy(void* data)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
94 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
95 struct screen* s = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
96
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
97 if (!s)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
98 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
99
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
100 wl_list_remove(&s->link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
101
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
102 if (wm.sel_screen == s) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
103 if (wl_list_empty(&wm.screens))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
104 wm.sel_screen = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
105 else
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
106 wm.sel_screen = wl_container_of(wm.screens.next, wm.sel_screen, link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
107 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
108
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
109 free(s);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
110 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
111
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
112 static void on_win_destroy(void* data)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
113 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
114 struct client* c = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
115 struct client* next;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
116
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
117 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
118 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
119
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
120 if (wm.grab.active && wm.grab.c == c) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
121 wm.grab.active = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
122 wm.grab.c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
123 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
124
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
125 if (wm.sel_client == c) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
126 wm.sel_client = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
127 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
128
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
129 wl_list_remove(&c->link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
130 free(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
131
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
132 next = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
133 if (!next)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
134 next = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
135 focus(next);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
136 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
137
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
138 static void on_win_entered(void* data)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
139 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
140 if (wm.grab.active)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
141 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
142
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
143 struct client* c = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
144 if (!is_ws_client(c, NULL))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
145 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
146
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
147 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
148 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
149
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
150 static void on_win_metadata_changed(void* data)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
151 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
152 struct client* c = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
153
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
154 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
155 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
156
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
157 apply_decor(c, c == wm.sel_client);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
158 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
159 static void setup_cursor(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
160 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
161 const struct nein_cursor_meta *arrow = &nein_cursor_metadata[NEIN_CURSOR_WHITEARROW];
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
162
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
163 swc_set_cursor_mode(SWC_CURSOR_MODE_COMPOSITOR);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
164 swc_set_cursor_image(SWC_CURSOR_DEFAULT,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
165 &nein_cursor_data[arrow->offset],
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
166 arrow->width, arrow->height,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
167 arrow->hotspot_x, arrow->hotspot_y);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
168 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
169 static void setup(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
170 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
171 /* display */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
172 wm.dpy = wl_display_create();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
173 if (!wm.dpy)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
174 die(EXIT_FAILURE, "wl_display_create failed");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
175
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
176 /* variables */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
177 wl_list_init(&wm.screens);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
178 wl_list_init(&wm.clients);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
179 wm.sel_client = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
180 wm.sel_screen = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
181 wm.grab.active = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
182 wm.grab.resize = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
183 wm.grab.c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
184 wm.ws = 1;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
185
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
186 /* event loop */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
187 wm.ev_loop = wl_display_get_event_loop(wm.dpy);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
188 if (!swc_initialize(wm.dpy, wm.ev_loop, &manager))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
189 die(EXIT_FAILURE, "swc_initialize failed\n");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
190
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
191 swc_repeat_rate = cfg.repeat_rate;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
192 swc_repeat_delay = cfg.repeat_delay;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
193 setup_cursor();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
194 setup_binds();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
195
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
196 /* display socket */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
197 const char* sock;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
198 sock = wl_display_add_socket_auto(wm.dpy);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
199 if (!sock)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
200 die(EXIT_FAILURE, "wl_display_add_socket_auto failed\n");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
201 setenv("WAYLAND_DISPLAY", sock, 1);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
202 _log(stderr, "WAYLAND_DISPLAY=%s\n", sock);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
203
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
204 run_autostart();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
205
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
206 /* signals */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
207 signal(SIGINT, sig_handler);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
208 signal(SIGTERM, sig_handler);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
209 signal(SIGQUIT, sig_handler);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
210 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
211
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
212 static void run_autostart(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
213 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
214 const char* shell = getenv("SHELL");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
215
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
216 if (!shell || !shell[0])
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
217 shell = "/bin/sh";
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
218
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
219 for (size_t i = 0; i < LENGTH(autostart); i++) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
220 const char* cmd = autostart[i];
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
221 pid_t pid;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
222
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
223 if (!cmd || !cmd[0])
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
224 continue;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
225
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
226 pid = fork();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
227 if (pid < 0) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
228 _log(stderr, "autostart fork failed for: %s\n", cmd);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
229 continue;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
230 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
231
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
232 if (pid == 0) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
233 setsid();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
234 execl(shell, shell, "-c", cmd, (char*)NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
235 _exit(127);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
236 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
237 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
238 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
239
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
240 static void setup_binds(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
241 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
242 for (size_t i = 0; i < LENGTH(binds); i++) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
243 const struct bind* b = &binds[i];
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
244 swc_add_binding(b->type, b->mods, b->ksym, b->fn, (void*)&b->arg);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
245 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
246 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
247
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
248 static void sync_window_visibility(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
249 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
250 struct client* c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
251
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
252 wl_list_for_each(c, &wm.clients, link) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
253 if (c->ws == wm.ws)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
254 swc_window_show(c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
255 else
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
256 swc_window_hide(c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
257 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
258 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
259
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
260 void focus_next(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
261 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
262 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
263 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
264 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
265
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
266 struct client* c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
267
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
268 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
269 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
270
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
271 if (wl_list_empty(&wm.clients))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
272 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
273
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
274 if (!wm.sel_client || !is_ws_client(wm.sel_client, wm.sel_screen)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
275 c = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
276 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
277 c = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
278 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
279 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
280 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
281
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
282 struct wl_list* start = wm.sel_client->link.next;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
283 struct wl_list* it = start;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
284
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
285 do {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
286 if (it == &wm.clients)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
287 it = wm.clients.next;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
288 if (it == &wm.clients)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
289 break;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
290
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
291 c = wl_container_of(it, c, link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
292 if (is_ws_client(c, wm.sel_screen)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
293 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
294 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
295 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
296 it = it->next;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
297 } while (it != start);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
298
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
299 c = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
300 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
301 c = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
302 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
303 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
304
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
305 void focus_prev(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
306 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
307 struct client* c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
308
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
309 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
310 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
311 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
312
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
313 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
314 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
315
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
316 if (wl_list_empty(&wm.clients))
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
317 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
318
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
319 if (!wm.sel_client || !is_ws_client(wm.sel_client, wm.sel_screen)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
320 c = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
321 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
322 c = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
323 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
324 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
325 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
326
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
327 struct wl_list* start = wm.sel_client->link.prev;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
328 struct wl_list* it = start;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
329
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
330 do {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
331 if (it == &wm.clients)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
332 it = wm.clients.prev;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
333 if (it == &wm.clients)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
334 break;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
335
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
336 c = wl_container_of(it, c, link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
337 if (is_ws_client(c, wm.sel_screen)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
338 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
339 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
340 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
341 it = it->prev;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
342 } while (it != start);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
343
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
344 c = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
345 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
346 c = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
347 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
348 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
349
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
350 void kill_sel(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
351 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
352 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
353 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
354 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
355
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
356 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
357 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
358
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
359 if (!wm.sel_client)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
360 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
361
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
362 swc_window_close(wm.sel_client->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
363 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
364
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
365 void fullscreen(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
366 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
367 struct swc_rectangle geom;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
368
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
369 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
370 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
371 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
372
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
373 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
374 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
375
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
376 if (!wm.sel_client)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
377 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
378
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
379 if (wm.sel_client->fullscreen) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
380 wm.sel_client->fullscreen = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
381 swc_window_set_stacked(wm.sel_client->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
382 apply_decor(wm.sel_client, true);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
383
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
384 if (wm.sel_client->w > 0 && wm.sel_client->h > 0) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
385 geom.x = wm.sel_client->x;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
386 geom.y = wm.sel_client->y;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
387 geom.width = wm.sel_client->w;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
388 geom.height = wm.sel_client->h;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
389 swc_window_set_geometry(wm.sel_client->win, &geom);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
390 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
391 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
392 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
393
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
394 if (!wm.sel_client->scr || !wm.sel_client->scr->scr)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
395 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
396
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
397 if (swc_window_get_geometry(wm.sel_client->win, &geom)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
398 wm.sel_client->x = geom.x;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
399 wm.sel_client->y = geom.y;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
400 wm.sel_client->w = geom.width;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
401 wm.sel_client->h = geom.height;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
402 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
403
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
404 wm.sel_client->fullscreen = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
405 apply_decor(wm.sel_client, true);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
406 swc_window_set_fullscreen(wm.sel_client->win, wm.sel_client->scr->scr);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
407 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
408
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
409 void mouse_move(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
410 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
411 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
412 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
413 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
414
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
415 if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
416 if (!wm.sel_client)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
417 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
418
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
419 if (!wm.sel_client->floating) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
420 wm.sel_client->floating = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
421 swc_window_set_stacked(wm.sel_client->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
422 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
423
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
424 wm.grab.active = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
425 wm.grab.resize = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
426 wm.grab.c = wm.sel_client;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
427
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
428 swc_window_begin_move(wm.grab.c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
429 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
430 else {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
431 if (!wm.grab.active || wm.grab.resize || !wm.grab.c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
432 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
433
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
434 swc_window_end_move(wm.grab.c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
435
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
436 wm.grab.active = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
437 wm.grab.c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
438 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
439 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
440
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
441 void mouse_resize(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
442 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
443 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
444 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
445 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
446
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
447 if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
448 if (!wm.sel_client)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
449 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
450
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
451 if (!wm.sel_client->floating) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
452 wm.sel_client->floating = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
453 swc_window_set_stacked(wm.sel_client->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
454 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
455
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
456 wm.grab.active = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
457 wm.grab.resize = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
458 wm.grab.c = wm.sel_client;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
459
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
460 swc_window_begin_resize(
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
461 wm.grab.c->win,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
462 SWC_WINDOW_EDGE_RIGHT | SWC_WINDOW_EDGE_BOTTOM
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
463 );
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
464 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
465 else {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
466 if (!wm.grab.active || !wm.grab.resize || !wm.grab.c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
467 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
468
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
469 swc_window_end_resize(wm.grab.c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
470
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
471 wm.grab.active = false;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
472 wm.grab.c = NULL;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
473 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
474 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
475
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
476 void new_screen(struct swc_screen* scr)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
477 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
478 struct screen* s;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
479
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
480 s = malloc(sizeof(*s));
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
481 if (!s)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
482 die(EXIT_FAILURE, "new screen calloc failed");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
483
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
484 s->scr = scr;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
485
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
486 s->x = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
487 s->y = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
488 s->w = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
489 s->h = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
490
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
491 wl_list_insert(&wm.screens, &s->link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
492
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
493 if (!wm.sel_screen)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
494 wm.sel_screen = s;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
495
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
496 swc_screen_set_handler(scr, &screen_handler, s);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
497
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
498 _log(stderr, "new_screen=%p\n", (void*)scr);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
499 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
500
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
501 void new_window(struct swc_window* win)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
502 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
503 struct client* c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
504
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
505 c = malloc(sizeof(*c));
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
506 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
507 die(EXIT_FAILURE, "malloc client failed");
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
508
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
509 win->motion_throttle_ms = 1000 / cfg.motion_throttle_hz;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
510 win->min_width = 1;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
511 win->min_height = 1;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
512 win->max_width = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
513 win->max_height = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
514
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
515 c->win = win;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
516 c->scr = wm.sel_screen;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
517 c->mapped = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
518 c->floating = true;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
519 c->fullscreen = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
520 c->ws = wm.ws;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
521 c->x = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
522 c->y = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
523 c->w = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
524 c->h = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
525
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
526 wl_list_insert(&wm.clients, &c->link);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
527 swc_window_set_handler(win, &window_handler, c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
528 swc_window_set_stacked(win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
529 apply_decor(c, false);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
530 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
531 /* swc reports cursor coordinates in wl_fixed_t (24.8) units */
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
532 int32_t cx_fixed = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
533 int32_t cy_fixed = 0;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
534
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
535 if (swc_cursor_position(&cx_fixed, &cy_fixed)) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
536 int32_t cx = cx_fixed / 256;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
537 int32_t cy = cy_fixed / 256;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
538
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
539 swc_window_set_position(
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
540 win,
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
541 cx - (int32_t)(cfg.spawn_w / 2),
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
542 cy - (int32_t)(cfg.spawn_h / 2)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
543 );
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
544 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
545 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
546 swc_window_show(win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
547 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
548
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
549 _log(stderr, "new_window=%p\n", (void*)win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
550 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
551
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
552 void new_device(struct libinput_device* dev)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
553 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
554 (void)dev;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
555 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
556
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
557 void quit(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
558 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
559 (void)data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
560 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
561 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
562 (void)state;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
563
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
564 wl_display_terminate(wm.dpy);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
565 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
566
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
567 void spawn(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
568 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
569 union arg* a = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
570 char* const* cmd = (char* const*)a->v;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
571
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
572 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
573 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
574
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
575 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
576 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
577
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
578 if (fork() == 0) {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
579 execvp(cmd[0], cmd);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
580 _exit(127);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
581 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
582 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
583
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
584 void workspace_goto(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
585 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
586 union arg* a = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
587 struct client* c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
588
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
589 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
590 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
591
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
592 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
593 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
594
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
595 if (a->ui < 1 || a->ui > 9 || a->ui == wm.ws)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
596 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
597
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
598 wm.ws = a->ui;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
599 sync_window_visibility();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
600
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
601 c = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
602 if (!c)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
603 c = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
604 focus(c);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
605 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
606
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
607 void workspace_moveto(void* data, uint32_t time, uint32_t value, uint32_t state)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
608 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
609 union arg* a = data;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
610 struct client* c;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
611 struct client* next;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
612
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
613 (void)time;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
614 (void)value;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
615
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
616 if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
617 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
618
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
619 if (!wm.sel_client)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
620 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
621
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
622 if (a->ui < 1 || a->ui > 9)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
623 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
624
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
625 c = wm.sel_client;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
626 if (c->ws == a->ui)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
627 return;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
628
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
629 c->ws = a->ui;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
630 if (c->ws == wm.ws)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
631 swc_window_show(c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
632 else
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
633 swc_window_hide(c->win);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
634
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
635 next = first_client(wm.sel_screen);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
636 if (!next)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
637 next = first_client(NULL);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
638 focus(next);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
639 }
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
640
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
641 int main(void)
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
642 {
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
643 setup();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
644 wl_display_run(wm.dpy);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
645 swc_finalize();
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
646 wl_display_destroy(wm.dpy);
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
647 return EXIT_SUCCESS;
f0372d3356b4 initial import
Yasuri <linuxoverwindows@charliesmp.net>
parents:
diff changeset
648 }