Fix segfault, add wl_shell view

This commit is contained in:
emersion 2017-09-27 14:48:53 +02:00
parent ed9a43c213
commit acf58e04de
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
4 changed files with 24 additions and 8 deletions

View file

@ -6,8 +6,8 @@
#include <wlr/types/wlr_xdg_shell_v6.h> #include <wlr/types/wlr_xdg_shell_v6.h>
struct roots_wl_shell_surface { struct roots_wl_shell_surface {
struct roots_view *view;
// TODO // TODO
void *_placeholder;
}; };
struct roots_xdg_surface_v6 { struct roots_xdg_surface_v6 {
@ -34,7 +34,7 @@ struct roots_view {
// TODO: Something for roots-enforced width/height // TODO: Something for roots-enforced width/height
enum roots_view_type type; enum roots_view_type type;
union { union {
struct wlr_shell_surface *wl_shell_surface; struct wlr_wl_shell_surface *wl_shell_surface;
struct wlr_xdg_surface_v6 *xdg_surface_v6; struct wlr_xdg_surface_v6 *xdg_surface_v6;
}; };
union { union {

View file

@ -10,6 +10,6 @@ executable(
'output.c', 'output.c',
'pointer.c', 'pointer.c',
'xdg_shell_v6.c', 'xdg_shell_v6.c',
'wl_shell.c' 'wl_shell.c',
], dependencies: wlroots ], dependencies: wlroots
) )

View file

@ -16,5 +16,21 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
struct wlr_wl_shell_surface *surface = data; struct wlr_wl_shell_surface *surface = data;
wlr_log(L_DEBUG, "new wl_shell surface"); wlr_log(L_DEBUG, "new wl_shell surface");
wlr_wl_shell_surface_ping(surface); //wlr_wl_shell_surface_ping(surface);
struct roots_wl_shell_surface *roots_surface =
calloc(1, sizeof(struct roots_wl_shell_surface));
// TODO: all of the trimmings
struct roots_view *view = calloc(1, sizeof(struct roots_view));
view->type = ROOTS_WL_SHELL_VIEW;
view->x = view->y = 200;
view->wl_shell_surface = surface;
view->roots_wl_shell_surface = roots_surface;
//view->wlr_surface = surface->surface;
//view->get_input_bounds = get_input_bounds;
//view->activate = activate;
view->desktop = desktop;
roots_surface->view = view;
wl_list_insert(&desktop->views, &view->link);
} }

View file

@ -116,8 +116,6 @@ static void wl_shell_get_shell_surface(struct wl_client *client,
wlr_log(L_DEBUG, "New wl_shell %p (res %p)", state, shell_surface_resource); wlr_log(L_DEBUG, "New wl_shell %p (res %p)", state, shell_surface_resource);
wl_resource_set_implementation(shell_surface_resource, wl_resource_set_implementation(shell_surface_resource,
&shell_surface_interface, state, destroy_shell_surface); &shell_surface_interface, state, destroy_shell_surface);
wl_list_insert(&wlr_wl_shell->surfaces, &state->link);
wl_signal_emit(&wlr_wl_shell->events.new_surface, state);
wl_signal_init(&state->events.ping_timeout); wl_signal_init(&state->events.ping_timeout);
@ -128,6 +126,9 @@ static void wl_shell_get_shell_surface(struct wl_client *client,
if (state->ping_timer == NULL) { if (state->ping_timer == NULL) {
wl_client_post_no_memory(client); wl_client_post_no_memory(client);
} }
wl_list_insert(&wlr_wl_shell->surfaces, &state->link);
wl_signal_emit(&wlr_wl_shell->events.new_surface, state);
} }
static struct wl_shell_interface wl_shell_impl = { static struct wl_shell_interface wl_shell_impl = {
@ -199,6 +200,5 @@ void wlr_wl_shell_surface_ping(struct wlr_wl_shell_surface *surface) {
wl_display_next_serial(wl_client_get_display(surface->client)); wl_display_next_serial(wl_client_get_display(surface->client));
wl_event_source_timer_update(surface->ping_timer, wl_event_source_timer_update(surface->ping_timer,
surface->shell->ping_timeout); surface->shell->ping_timeout);
wl_shell_surface_send_ping(surface->surface, wl_shell_surface_send_ping(surface->surface, surface->ping_serial);
surface->ping_serial);
} }