aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-03-30 11:42:59 -0400
committerLibravatar GitHub <noreply@github.com>2018-03-30 11:42:59 -0400
commitb6b674fd7621dc09182bcc4b0bd6d214365a5b89 (patch)
tree372613ed38a31f9a5fdc7f2cde176a64f329a041
parentMerge pull request #1658 from swaywm/delete-empty-ws (diff)
parentFix segfault on xwayland unmanaged view unmap (diff)
downloadsway-b6b674fd7621dc09182bcc4b0bd6d214365a5b89.tar.gz
sway-b6b674fd7621dc09182bcc4b0bd6d214365a5b89.tar.zst
sway-b6b674fd7621dc09182bcc4b0bd6d214365a5b89.zip
Merge pull request #1657 from emersion/render-fixes
Misc minor fixes
-rw-r--r--include/sway/server.h1
-rw-r--r--sway/desktop/output.c25
-rw-r--r--sway/desktop/xwayland.c36
-rw-r--r--sway/server.c18
4 files changed, 34 insertions, 46 deletions
diff --git a/include/sway/server.h b/include/sway/server.h
index 25eb64fe..db81932f 100644
--- a/include/sway/server.h
+++ b/include/sway/server.h
@@ -18,7 +18,6 @@ struct sway_server {
18 const char *socket; 18 const char *socket;
19 19
20 struct wlr_backend *backend; 20 struct wlr_backend *backend;
21 struct wlr_renderer *renderer;
22 21
23 struct wlr_compositor *compositor; 22 struct wlr_compositor *compositor;
24 struct wlr_data_device_manager *data_device_manager; 23 struct wlr_data_device_manager *data_device_manager;
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 87eb80fe..f3416c03 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -41,6 +41,9 @@ static void rotate_child_position(double *sx, double *sy, double sw, double sh,
41static void render_surface(struct wlr_surface *surface, 41static void render_surface(struct wlr_surface *surface,
42 struct wlr_output *wlr_output, struct timespec *when, 42 struct wlr_output *wlr_output, struct timespec *when,
43 double lx, double ly, float rotation) { 43 double lx, double ly, float rotation) {
44 struct wlr_renderer *renderer =
45 wlr_backend_get_renderer(wlr_output->backend);
46
44 if (!wlr_surface_has_buffer(surface)) { 47 if (!wlr_surface_has_buffer(surface)) {
45 return; 48 return;
46 } 49 }
@@ -65,8 +68,8 @@ static void render_surface(struct wlr_surface *surface,
65 float matrix[9]; 68 float matrix[9];
66 wlr_matrix_project_box(matrix, &render_box, surface->current->transform, 69 wlr_matrix_project_box(matrix, &render_box, surface->current->transform,
67 0, wlr_output->transform_matrix); 70 0, wlr_output->transform_matrix);
68 wlr_render_texture_with_matrix(server.renderer, surface->texture, 71 wlr_render_texture_with_matrix(renderer, surface->texture, matrix,
69 matrix, 1.0f); // TODO: configurable alpha 72 1.0f); // TODO: configurable alpha
70 73
71 wlr_surface_send_frame_done(surface, when); 74 wlr_surface_send_frame_done(surface, when);
72 } 75 }
@@ -192,15 +195,14 @@ static void render_layer(struct sway_output *output,
192 } 195 }
193} 196}
194 197
195static void output_frame_notify(struct wl_listener *listener, void *data) { 198static void handle_output_frame(struct wl_listener *listener, void *data) {
196 struct sway_output *soutput = wl_container_of(listener, soutput, frame); 199 struct sway_output *soutput = wl_container_of(listener, soutput, frame);
197 struct wlr_output *wlr_output = data; 200 struct wlr_output *wlr_output = data;
198 struct sway_server *server = soutput->server; 201 struct wlr_renderer *renderer =
199 struct wlr_renderer *renderer = wlr_backend_get_renderer(wlr_output->backend); 202 wlr_backend_get_renderer(wlr_output->backend);
200 203
201 int buffer_age = -1; 204 wlr_output_make_current(wlr_output, NULL);
202 wlr_output_make_current(wlr_output, &buffer_age); 205 wlr_renderer_begin(renderer, wlr_output->width, wlr_output->height);
203 wlr_renderer_begin(server->renderer, wlr_output->width, wlr_output->height);
204 206
205 float clear_color[] = {0.25f, 0.25f, 0.25f, 1.0f}; 207 float clear_color[] = {0.25f, 0.25f, 0.25f, 1.0f};
206 wlr_renderer_clear(renderer, clear_color); 208 wlr_renderer_clear(renderer, clear_color);
@@ -218,7 +220,8 @@ static void output_frame_notify(struct wl_listener *listener, void *data) {
218 &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); 220 &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]);
219 221
220 struct sway_seat *seat = input_manager_current_seat(input_manager); 222 struct sway_seat *seat = input_manager_current_seat(input_manager);
221 struct sway_container *focus = sway_seat_get_focus_inactive(seat, soutput->swayc); 223 struct sway_container *focus =
224 sway_seat_get_focus_inactive(seat, soutput->swayc);
222 struct sway_container *workspace = (focus->type == C_WORKSPACE ? 225 struct sway_container *workspace = (focus->type == C_WORKSPACE ?
223 focus : 226 focus :
224 container_parent(focus, C_WORKSPACE)); 227 container_parent(focus, C_WORKSPACE));
@@ -248,7 +251,7 @@ static void output_frame_notify(struct wl_listener *listener, void *data) {
248 render_layer(soutput, output_box, &now, 251 render_layer(soutput, output_box, &now,
249 &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); 252 &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]);
250 253
251 wlr_renderer_end(server->renderer); 254 wlr_renderer_end(renderer);
252 wlr_output_swap_buffers(wlr_output, &now, NULL); 255 wlr_output_swap_buffers(wlr_output, &now, NULL);
253 soutput->last_frame = now; 256 soutput->last_frame = now;
254} 257}
@@ -306,7 +309,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
306 sway_input_manager_configure_xcursor(input_manager); 309 sway_input_manager_configure_xcursor(input_manager);
307 310
308 wl_signal_add(&wlr_output->events.frame, &output->frame); 311 wl_signal_add(&wlr_output->events.frame, &output->frame);
309 output->frame.notify = output_frame_notify; 312 output->frame.notify = handle_output_frame;
310 wl_signal_add(&wlr_output->events.destroy, &output->destroy); 313 wl_signal_add(&wlr_output->events.destroy, &output->destroy);
311 output->destroy.notify = handle_output_destroy; 314 output->destroy.notify = handle_output_destroy;
312 wl_signal_add(&wlr_output->events.mode, &output->mode); 315 wl_signal_add(&wlr_output->events.mode, &output->mode);
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index 38ee4656..d608c8b6 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -104,14 +104,11 @@ static void handle_commit(struct wl_listener *listener, void *data) {
104static void handle_destroy(struct wl_listener *listener, void *data) { 104static void handle_destroy(struct wl_listener *listener, void *data) {
105 struct sway_xwayland_surface *sway_surface = 105 struct sway_xwayland_surface *sway_surface =
106 wl_container_of(listener, sway_surface, destroy); 106 wl_container_of(listener, sway_surface, destroy);
107 struct wlr_xwayland_surface *xsurface = data; 107
108 wl_list_remove(&sway_surface->commit.link); 108 wl_list_remove(&sway_surface->commit.link);
109 wl_list_remove(&sway_surface->destroy.link); 109 wl_list_remove(&sway_surface->destroy.link);
110 wl_list_remove(&sway_surface->request_configure.link); 110 wl_list_remove(&sway_surface->request_configure.link);
111 if (xsurface->override_redirect && xsurface->mapped) { 111 wl_list_remove(&sway_surface->view->unmanaged_view_link);
112 wl_list_remove(&sway_surface->view->unmanaged_view_link);
113 wl_list_init(&sway_surface->view->unmanaged_view_link);
114 }
115 112
116 struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); 113 struct sway_container *parent = container_view_destroy(sway_surface->view->swayc);
117 if (parent) { 114 if (parent) {
@@ -125,11 +122,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
125static void handle_unmap_notify(struct wl_listener *listener, void *data) { 122static void handle_unmap_notify(struct wl_listener *listener, void *data) {
126 struct sway_xwayland_surface *sway_surface = 123 struct sway_xwayland_surface *sway_surface =
127 wl_container_of(listener, sway_surface, unmap_notify); 124 wl_container_of(listener, sway_surface, unmap_notify);
128 struct wlr_xwayland_surface *xsurface = data; 125
129 if (xsurface->override_redirect && xsurface->mapped) { 126 wl_list_remove(&sway_surface->view->unmanaged_view_link);
130 wl_list_remove(&sway_surface->view->unmanaged_view_link); 127 wl_list_init(&sway_surface->view->unmanaged_view_link);
131 wl_list_init(&sway_surface->view->unmanaged_view_link);
132 }
133 128
134 // take it out of the tree 129 // take it out of the tree
135 struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); 130 struct sway_container *parent = container_view_destroy(sway_surface->view->swayc);
@@ -150,7 +145,9 @@ static void handle_map_notify(struct wl_listener *listener, void *data) {
150 sway_surface->view->surface = xsurface->surface; 145 sway_surface->view->surface = xsurface->surface;
151 146
152 // put it back into the tree 147 // put it back into the tree
153 if (xsurface->override_redirect) { 148 if (wlr_xwayland_surface_is_unmanaged(xsurface) ||
149 xsurface->override_redirect) {
150 wl_list_remove(&sway_surface->view->unmanaged_view_link);
154 wl_list_insert(&root_container.sway_root->unmanaged_views, 151 wl_list_insert(&root_container.sway_root->unmanaged_views,
155 &sway_surface->view->unmanaged_view_link); 152 &sway_surface->view->unmanaged_view_link);
156 } else { 153 } else {
@@ -209,6 +206,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
209 sway_view->surface = xsurface->surface; 206 sway_view->surface = xsurface->surface;
210 sway_surface->view = sway_view; 207 sway_surface->view = sway_view;
211 208
209 wl_list_init(&sway_view->unmanaged_view_link);
210
212 // TODO: 211 // TODO:
213 // - Look up pid and open on appropriate workspace 212 // - Look up pid and open on appropriate workspace
214 // - Set new view to maximized so it behaves nicely 213 // - Set new view to maximized so it behaves nicely
@@ -230,18 +229,5 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
230 wl_signal_add(&xsurface->events.map_notify, &sway_surface->map_notify); 229 wl_signal_add(&xsurface->events.map_notify, &sway_surface->map_notify);
231 sway_surface->map_notify.notify = handle_map_notify; 230 sway_surface->map_notify.notify = handle_map_notify;
232 231
233 if (wlr_xwayland_surface_is_unmanaged(xsurface)) { 232 handle_map_notify(&sway_surface->map_notify, xsurface);
234 // these don't get a container in the tree
235 wl_list_insert(&root_container.sway_root->unmanaged_views,
236 &sway_view->unmanaged_view_link);
237 return;
238 }
239
240 struct sway_seat *seat = input_manager_current_seat(input_manager);
241 struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
242 struct sway_container *cont = container_view_create(focus, sway_view);
243 sway_view->swayc = cont;
244
245 arrange_windows(cont->parent, -1, -1);
246 sway_input_manager_set_focus(input_manager, cont);
247} 233}
diff --git a/sway/server.c b/sway/server.c
index 3fba019d..728e624e 100644
--- a/sway/server.c
+++ b/sway/server.c
@@ -1,19 +1,19 @@
1#define _POSIX_C_SOURCE 200112L 1#define _POSIX_C_SOURCE 200112L
2#include <stdlib.h> 2#include <assert.h>
3#include <stdbool.h> 3#include <stdbool.h>
4#include <stdlib.h>
4#include <wayland-server.h> 5#include <wayland-server.h>
5#include <wlr/backend.h> 6#include <wlr/backend.h>
6#include <wlr/backend/session.h> 7#include <wlr/backend/session.h>
7#include <wlr/render/wlr_renderer.h> 8#include <wlr/render/wlr_renderer.h>
8#include <wlr/render/gles2.h>
9#include <wlr/types/wlr_compositor.h> 9#include <wlr/types/wlr_compositor.h>
10#include <wlr/types/wlr_gamma_control.h>
10#include <wlr/types/wlr_layer_shell.h> 11#include <wlr/types/wlr_layer_shell.h>
11#include <wlr/types/wlr_screenshooter.h> 12#include <wlr/types/wlr_screenshooter.h>
12#include <wlr/types/wlr_gamma_control.h>
13#include <wlr/types/wlr_wl_shell.h> 13#include <wlr/types/wlr_wl_shell.h>
14#include <wlr/util/log.h>
14// TODO WLR: make Xwayland optional 15// TODO WLR: make Xwayland optional
15#include <wlr/xwayland.h> 16#include <wlr/xwayland.h>
16#include <wlr/util/log.h>
17#include "sway/commands.h" 17#include "sway/commands.h"
18#include "sway/config.h" 18#include "sway/config.h"
19#include "sway/server.h" 19#include "sway/server.h"
@@ -42,11 +42,12 @@ bool server_init(struct sway_server *server) {
42 server->wl_event_loop = wl_display_get_event_loop(server->wl_display); 42 server->wl_event_loop = wl_display_get_event_loop(server->wl_display);
43 server->backend = wlr_backend_autocreate(server->wl_display); 43 server->backend = wlr_backend_autocreate(server->wl_display);
44 44
45 server->renderer = wlr_gles2_renderer_create(server->backend); 45 struct wlr_renderer *renderer = wlr_backend_get_renderer(server->backend);
46 assert(renderer);
47
46 wl_display_init_shm(server->wl_display); 48 wl_display_init_shm(server->wl_display);
47 49
48 server->compositor = wlr_compositor_create( 50 server->compositor = wlr_compositor_create(server->wl_display, renderer);
49 server->wl_display, server->renderer);
50 server->data_device_manager = 51 server->data_device_manager =
51 wlr_data_device_manager_create(server->wl_display); 52 wlr_data_device_manager_create(server->wl_display);
52 53
@@ -95,8 +96,7 @@ bool server_init(struct sway_server *server) {
95} 96}
96 97
97void server_fini(struct sway_server *server) { 98void server_fini(struct sway_server *server) {
98 // TODO WLR: tear down more stuff 99 // TODO
99 wlr_backend_destroy(server->backend);
100} 100}
101 101
102void server_run(struct sway_server *server) { 102void server_run(struct sway_server *server) {