Codebase list wlroots / 87a7afb
idle-inhibit: second feedback pass Markus Ongyerth 6 years ago
4 changed file(s) with 82 addition(s) and 56 deletion(s). Raw diff Collapse all Expand all
3030 struct wl_egl_window *egl_window;
3131 struct wlr_egl_surface *egl_surface;
3232
33 static void draw(void);
33 static void draw(void) {
34 eglMakeCurrent(egl.display, egl_surface, egl_surface, egl.context);
35
36 float color[] = {1.0, 1.0, 0.0, 1.0};
37 if (idle_inhibitor) {
38 color[0] = 0.0;
39 }
40
41 glViewport(0, 0, width, height);
42 glClearColor(color[0], color[1], color[2], 1.0);
43 glClear(GL_COLOR_BUFFER_BIT);
44
45 eglSwapBuffers(egl.display, egl_surface);
46 }
3447
3548 static void pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
3649 uint32_t time, uint32_t button, uint32_t state_w) {
5164 draw();
5265 }
5366
54 /* Function that just does nothing.
55 * When it is noop(void) (like draw) the compiler complains about type
56 * mismatches in the listener struct.
57 * Without any arguments, it can be implicitly casted
58 */
59 static void noop() {}
67 static void pointer_handle_enter(void *data, struct wl_pointer *wl_pointer,
68 uint32_t serial, struct wl_surface *surface,
69 wl_fixed_t surface_x, wl_fixed_t surface_y) {
70 /* NOOP: ignore event */
71 }
72
73 static void pointer_handle_leave(void *data, struct wl_pointer *wl_pointer,
74 uint32_t serial, struct wl_surface *surface) {
75 /* NOOP: ignore event */
76 }
77
78 static void pointer_handle_motion(void *data, struct wl_pointer *wl_pointer,
79 uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) {
80 /* NOOP: ignore event */
81 }
82
83 static void pointer_handle_axis(void *data, struct wl_pointer *wl_pointer,
84 uint32_t time, uint32_t axis, wl_fixed_t value) {
85 /* NOOP: ignore event */
86 }
87
88 static void pointer_handle_frame(void *data, struct wl_pointer *wl_pointer) {
89 /* NOOP: ignore event */
90 }
91
92 static void pointer_handle_axis_source(void *data,
93 struct wl_pointer *wl_pointer, uint32_t axis_source) {
94 /* NOOP: ignore event */
95 }
96
97 static void pointer_handle_axis_stop(void *data,
98 struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis) {
99 /* NOOP: ignore event */
100 }
101
102 static void pointer_handle_axis_discrete(void *data,
103 struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete) {
104 /* NOOP: ignore event */
105 }
60106
61107 static const struct wl_pointer_listener pointer_listener = {
62 .enter = noop,
63 .leave = noop,
64 .motion = noop,
108 .enter = pointer_handle_enter,
109 .leave = pointer_handle_leave,
110 .motion = pointer_handle_motion,
65111 .button = pointer_handle_button,
66 .axis = noop,
67 .frame = noop,
68 .axis_source = noop,
69 .axis_stop = noop,
70 .axis_discrete = noop,
71 };
72
73 static void draw(void) {
74 eglMakeCurrent(egl.display, egl_surface, egl_surface, egl.context);
75
76 float color[] = {1.0, 1.0, 0.0, 1.0};
77 if (idle_inhibitor) {
78 color[0] = 0.0;
79 }
80
81 glViewport(0, 0, width, height);
82 glClearColor(color[0], color[1], color[2], 1.0);
83 glClear(GL_COLOR_BUFFER_BIT);
84
85 eglSwapBuffers(egl.display, egl_surface);
86 }
112 .axis = pointer_handle_axis,
113 .frame = pointer_handle_frame,
114 .axis_source = pointer_handle_axis_source,
115 .axis_stop = pointer_handle_axis_stop,
116 .axis_discrete = pointer_handle_axis_discrete,
117 };
87118
88119 static void xdg_surface_handle_configure(void *data,
89120 struct xdg_surface *xdg_surface, uint32_t serial) {
117148 static void handle_global(void *data, struct wl_registry *registry,
118149 uint32_t name, const char *interface, uint32_t version) {
119150 if (strcmp(interface, "wl_compositor") == 0) {
120 compositor = wl_registry_bind(registry, name, &wl_compositor_interface,
121 1);
151 compositor = wl_registry_bind(registry, name,
152 &wl_compositor_interface, 1);
122153 } else if (strcmp(interface, xdg_wm_base_interface.name) == 0) {
123154 wm_base = wl_registry_bind(registry, name, &xdg_wm_base_interface, 1);
124155 } else if (strcmp(interface, zwp_idle_inhibit_manager_v1_interface.name) == 0) {
131162
132163 static void handle_global_remove(void *data, struct wl_registry *registry,
133164 uint32_t name) {
134 // TODO
165 // who cares
135166 }
136167
137168 static const struct wl_registry_listener registry_listener = {
193224 draw();
194225
195226 while (wl_display_dispatch(display) != -1) {
196 // No-op
227 /** Do Nothing */
197228 }
198229
199230 return EXIT_SUCCESS;
1414 } events;
1515 };
1616
17 struct wlr_idle_inhibit_inhibitor_v1 {
17 struct wlr_idle_inhibitor_v1 {
1818 struct wlr_surface *surface;
1919 struct wl_resource *resource;
2020 struct wl_listener surface_destroy;
3434 [wl_protocol_dir, 'unstable/xdg-shell/xdg-shell-unstable-v6.xml'],
3535 [wl_protocol_dir, 'stable/xdg-shell/xdg-shell.xml'],
3636 [wl_protocol_dir, 'unstable/idle-inhibit/idle-inhibit-unstable-v1.xml'],
37 'gamma-control.xml',
38 'gtk-primary-selection.xml',
3937 'idle.xml',
4038 'screenshooter.xml',
4139 ]
1818 return wl_resource_get_user_data(resource);
1919 }
2020
21 struct wlr_idle_inhibit_inhibitor_v1 *
22 wlr_idle_inhibit_inhibitor_v1_from_resource(struct wl_resource *resource) {
21 struct wlr_idle_inhibitor_v1 *
22 wlr_idle_inhibitor_v1_from_resource(struct wl_resource *resource) {
2323 assert(wl_resource_instance_of(resource, &zwp_idle_inhibitor_v1_interface,
2424 &idle_inhibitor_impl));
2525 return wl_resource_get_user_data(resource);
2626 }
2727
28 static void idle_inhibit_inhibitor_destroy(struct wl_resource *resource) {
29 struct wlr_idle_inhibit_inhibitor_v1 *inhibitor =
30 wlr_idle_inhibit_inhibitor_v1_from_resource(resource);
31 assert(inhibitor);
28 static void idle_inhibitor_destroy(struct wl_resource *resource) {
29 struct wlr_idle_inhibitor_v1 *inhibitor =
30 wlr_idle_inhibitor_v1_from_resource(resource);
3231
3332 wlr_signal_emit_safe(&inhibitor->events.destroy, inhibitor->surface);
3433
3736 free(inhibitor);
3837 }
3938
40 static void idle_inhibit_inhibitor_handle_surface_destroy(
39 static void idle_inhibitor_handle_surface_destroy(
4140 struct wl_listener *listener, void *data) {
42 struct wlr_idle_inhibit_inhibitor_v1 *inhibitor =
41 struct wlr_idle_inhibitor_v1 *inhibitor =
4342 wl_container_of(listener, inhibitor, surface_destroy);
4443
4544 wl_resource_destroy(inhibitor->resource);
4645 }
4746
48 static void idle_inhibit_inhibitor_v1_handle_destroy(struct wl_client *client,
47 static void idle_inhibitor_v1_handle_destroy(struct wl_client *client,
4948 struct wl_resource *manager_resource) {
5049 wl_resource_destroy(manager_resource);
5150 }
5251
5352 static struct zwp_idle_inhibitor_v1_interface idle_inhibitor_impl = {
54 .destroy = idle_inhibit_inhibitor_v1_handle_destroy,
53 .destroy = idle_inhibitor_v1_handle_destroy,
5554 };
5655
5756 static void wlr_create_inhibitor(struct wl_client *client,
6059 struct wlr_surface *surface = wlr_surface_from_resource(surface_resource);
6160 struct wlr_idle_inhibit_manager_v1 *manager =
6261 wlr_idle_inhibit_manager_v1_from_resource(resource);
63 assert(surface && manager);
6462
65 struct wlr_idle_inhibit_inhibitor_v1 *inhibitor =
66 calloc(1, sizeof(struct wlr_idle_inhibit_inhibitor_v1));
63 struct wlr_idle_inhibitor_v1 *inhibitor =
64 calloc(1, sizeof(struct wlr_idle_inhibitor_v1));
6765 if (!inhibitor) {
6866 wl_client_post_no_memory(client);
6967 return;
8179 inhibitor->surface = surface;
8280 wl_signal_init(&inhibitor->events.destroy);
8381
84 inhibitor->surface_destroy.notify = idle_inhibit_inhibitor_handle_surface_destroy;
82 inhibitor->surface_destroy.notify = idle_inhibitor_handle_surface_destroy;
8583 wl_signal_add(&surface->events.destroy, &inhibitor->surface_destroy);
8684
8785
8886 wl_resource_set_implementation(wl_resource, &idle_inhibitor_impl,
89 inhibitor, idle_inhibit_inhibitor_destroy);
87 inhibitor, idle_inhibitor_destroy);
9088
9189 wl_list_insert(&manager->inhibitors, &inhibitor->link);
9290 wlr_signal_emit_safe(&manager->events.new_inhibitor, inhibitor);
117115 static void idle_inhibit_bind(struct wl_client *wl_client, void *data,
118116 uint32_t version, uint32_t id) {
119117 struct wlr_idle_inhibit_manager_v1 *idle_inhibit = data;
120 assert(wl_client && idle_inhibit);
121118
122119 struct wl_resource *wl_resource = wl_resource_create(wl_client,
123120 &zwp_idle_inhibit_manager_v1_interface, version, id);
141138
142139 wl_list_remove(&idle_inhibit->display_destroy.link);
143140
144 struct wlr_idle_inhibit_inhibitor_v1 *inhibitor;
145 struct wlr_idle_inhibit_inhibitor_v1 *tmp;
141 struct wlr_idle_inhibitor_v1 *inhibitor;
142 struct wlr_idle_inhibitor_v1 *tmp;
146143 wl_list_for_each_safe(inhibitor, tmp, &idle_inhibit->inhibitors, link) {
147144 wl_resource_destroy(inhibitor->resource);
148145 }