Fix various bugs
@@ -220,6 +220,9 @@ static struct tinywl_view *desktop_view_at(
}
static void focus_view(struct tinywl_view *view, struct wlr_surface *surface) {
+ if (view == NULL) {
+ return;
+ }
struct tinywl_server *server = view->server;
struct wlr_seat *seat = server->seat;
struct wlr_surface *prev_surface = seat->keyboard_state.focused_surface;
@@ -286,15 +289,13 @@ static void process_cursor_motion(struct tinywl_server *server, uint32_t time) {
double sx, sy;
struct wlr_seat *seat = server->seat;
- struct wlr_surface *surface;
+ struct wlr_surface *surface = NULL;
struct tinywl_view *view = desktop_view_at(server,
server->cursor->x, server->cursor->y, &surface, &sx, &sy);
if (!view) {
wlr_xcursor_manager_set_cursor_image(
server->cursor_mgr, "left_ptr", server->cursor);
- return;
}
-
if (surface) {
bool focus_changed = seat->pointer_state.focused_surface != surface;
wlr_seat_pointer_notify_enter(seat, surface, sx, sy);
@@ -308,7 +309,7 @@ static void process_cursor_motion(struct tinywl_server *server, uint32_t time) {
static void server_cursor_motion(struct wl_listener *listener, void *data) {
struct tinywl_server *server =
- wl_container_of(listener, server, cursor_motion_absolute);
+ wl_container_of(listener, server, cursor_motion);
struct wlr_event_pointer_motion *event = data;
wlr_cursor_move(server->cursor, event->device,
event->delta_x, event->delta_y);
@@ -400,7 +401,9 @@ static void output_frame(struct wl_listener *listener, void *data) {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
- wlr_output_make_current(output->wlr_output, NULL);
+ if (!wlr_output_make_current(output->wlr_output, NULL)) {
+ return;
+ }
int width, height;
wlr_output_effective_resolution(output->wlr_output, &width, &height);
wlr_renderer_begin(renderer, width, height);
@@ -423,8 +426,8 @@ static void output_frame(struct wl_listener *listener, void *data) {
render_surface, &rdata);
}
- wlr_output_swap_buffers(output->wlr_output, NULL, NULL);
wlr_renderer_end(renderer);
+ wlr_output_swap_buffers(output->wlr_output, NULL, NULL);
}
static void server_new_output(struct wl_listener *listener, void *data) {
@@ -432,6 +435,12 @@ static void server_new_output(struct wl_listener *listener, void *data) {
wl_container_of(listener, server, new_output);
struct wlr_output *wlr_output = data;
+ if (!wl_list_empty(&wlr_output->modes)) {
+ struct wlr_output_mode *mode =
+ wl_container_of(wlr_output->modes.prev, mode, link);
+ wlr_output_set_mode(wlr_output, mode);
+ }
+
struct tinywl_output *output =
calloc(1, sizeof(struct tinywl_output));
output->wlr_output = wlr_output;
@@ -529,6 +538,7 @@ static void server_new_xdg_surface(struct wl_listener *listener, void *data) {
}
int main(int argc, char *argv[]) {
+ wlr_log_init(WLR_DEBUG, NULL);
char *startup_cmd = NULL;
int c;
