diff --git a/include/waybox/output.h b/include/waybox/output.h index 13f28cd..b11bcfd 100644 --- a/include/waybox/output.h +++ b/include/waybox/output.h @@ -48,8 +48,8 @@ struct wb_view { struct wl_listener request_move; struct wl_listener request_resize; - struct wlr_box current_position; - struct wlr_box previous_position; + struct wlr_box geometry; + struct wlr_box previous_geometry; }; void output_frame_notify(struct wl_listener* listener, void *data); diff --git a/waybox/config.c b/waybox/config.c index 192ca7e..10452e7 100644 --- a/waybox/config.c +++ b/waybox/config.c @@ -31,7 +31,7 @@ static xmlChar *get_attribute(xmlNode *node, char *attr_name) { xmlAttr *attr = node->properties; while (attr && strcmp((char *) attr->name, attr_name) != 0) attr = attr->next; - return attr->children->content; + return attr ? attr->children->content : (xmlChar *) ""; } static void get_action(xmlNode *new_node, struct wb_key_binding *key_bind) { diff --git a/waybox/cursor.c b/waybox/cursor.c index a08431a..4a1fff6 100644 --- a/waybox/cursor.c +++ b/waybox/cursor.c @@ -11,10 +11,10 @@ static void process_cursor_move(struct wb_server *server) { /* Move the grabbed view to the new position. */ struct wb_view *view = server->grabbed_view; if (view->scene_tree->node.type == WLR_SCENE_NODE_TREE) { - view->current_position.x = server->cursor->cursor->x - server->grab_x; - view->current_position.y = server->cursor->cursor->y - server->grab_y; + view->geometry.x = server->cursor->cursor->x - server->grab_x; + view->geometry.y = server->cursor->cursor->y - server->grab_y; wlr_scene_node_set_position(&view->scene_tree->node, - view->current_position.x, view->current_position.y); + view->geometry.x, view->geometry.y); } } @@ -52,10 +52,10 @@ static void process_cursor_resize(struct wb_server *server) { struct wlr_box geo_box; wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box); - view->current_position.x = new_left - geo_box.x; - view->current_position.y = new_top - geo_box.y; + view->geometry.x = new_left - geo_box.x; + view->geometry.y = new_top - geo_box.y; wlr_scene_node_set_position(&view->scene_tree->node, - view->current_position.x, view->current_position.y); + view->geometry.x, view->geometry.y); int new_width = new_right - new_left; int new_height = new_bottom - new_top; diff --git a/waybox/seat.c b/waybox/seat.c index 0eaceb2..03c3d0e 100644 --- a/waybox/seat.c +++ b/waybox/seat.c @@ -106,18 +106,18 @@ static bool handle_keybinding(struct wb_server *server, xkb_keysym_t sym, uint32 if (view->scene_tree->node.enabled) { struct wlr_box geo_box; wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box); - int decoration_height = MAX(geo_box.y - view->current_position.y, TITLEBAR_HEIGHT); + int decoration_height = MAX(geo_box.y - view->geometry.y, TITLEBAR_HEIGHT); - view->previous_position = view->current_position; + view->previous_geometry = view->geometry; wlr_xdg_toplevel_set_size(view->xdg_toplevel, - view->current_position.width, decoration_height); + view->geometry.width, decoration_height); } } if (key_binding->action & ACTION_UNSHADE) { struct wb_view *view = wl_container_of(server->views.next, view, link); if (view->scene_tree->node.enabled) { wlr_xdg_toplevel_set_size(view->xdg_toplevel, - view->previous_position.width, view->previous_position.height); + view->previous_geometry.width, view->previous_geometry.height); } } if (key_binding->action & ACTION_RECONFIGURE) { diff --git a/waybox/xdg_shell.c b/waybox/xdg_shell.c index 5e7e969..1cf6402 100644 --- a/waybox/xdg_shell.c +++ b/waybox/xdg_shell.c @@ -76,8 +76,8 @@ struct wlr_output *get_active_output(struct wb_view *view) { double closest_x, closest_y; struct wlr_output *output = NULL; wlr_output_layout_closest_point(view->server->output_layout, output, - view->current_position.x + view->current_position.width / 2, - view->current_position.y + view->current_position.height / 2, + view->geometry.x + view->geometry.width / 2, + view->geometry.y + view->geometry.height / 2, &closest_x, &closest_y); return wlr_output_layout_output_at(view->server->output_layout, closest_x, closest_y); } @@ -101,30 +101,30 @@ static void xdg_toplevel_map(struct wl_listener *listener, void *data) { wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box); if (config) { - view->current_position.height = MIN(geo_box.height, + view->geometry.height = MIN(geo_box.height, usable_area.height - config->margins.top - config->margins.bottom); - view->current_position.width = MIN(geo_box.width, + view->geometry.width = MIN(geo_box.width, usable_area.width - config->margins.left - config->margins.right); - view->current_position.x = config->margins.left; - view->current_position.y = config->margins.top; + view->geometry.x = config->margins.left; + view->geometry.y = config->margins.top; } else { - view->current_position.height = MIN(geo_box.height, usable_area.height); - view->current_position.width = MIN(geo_box.width, usable_area.width); - view->current_position.x = 0; - view->current_position.y = 0; + view->geometry.height = MIN(geo_box.height, usable_area.height); + view->geometry.width = MIN(geo_box.width, usable_area.width); + view->geometry.x = 0; + view->geometry.y = 0; } /* A view no larger than a title bar shouldn't be sized or focused */ - if (view->current_position.height > TITLEBAR_HEIGHT && - view->current_position.height > TITLEBAR_HEIGHT * + if (view->geometry.height > TITLEBAR_HEIGHT && + view->geometry.height > TITLEBAR_HEIGHT * (usable_area.width / usable_area.height)) { wlr_xdg_toplevel_set_size(view->xdg_toplevel, - view->current_position.width, view->current_position.height); + view->geometry.width, view->geometry.height); focus_view(view, view->xdg_toplevel->base->surface); } wlr_scene_node_set_position(&view->scene_tree->node, - view->current_position.x, view->current_position.y); + view->geometry.x, view->geometry.y); } static void xdg_toplevel_unmap(struct wl_listener *listener, void *data) { @@ -187,33 +187,33 @@ static void xdg_toplevel_request_maximize(struct wl_listener *listener, void *da bool is_maximized = view->xdg_toplevel->current.maximized; if (!is_maximized) { struct wb_config *config = view->server->config; - view->previous_position = view->current_position; + view->previous_geometry = view->geometry; if (config) { - view->current_position.x = config->margins.left; - view->current_position.y = config->margins.top; + view->geometry.x = config->margins.left; + view->geometry.y = config->margins.top; usable_area.height -= config->margins.top + config->margins.bottom; usable_area.width -= config->margins.left + config->margins.right; } else { - view->current_position.x = 0; - view->current_position.y = 0; + view->geometry.x = 0; + view->geometry.y = 0; } } else { - usable_area = view->previous_position; - view->current_position.x = view->previous_position.x; - view->current_position.y = view->previous_position.y; + usable_area = view->previous_geometry; + view->geometry.x = view->previous_geometry.x; + view->geometry.y = view->previous_geometry.y; } wlr_xdg_toplevel_set_size(view->xdg_toplevel, usable_area.width, usable_area.height); wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, !is_maximized); wlr_scene_node_set_position(&view->scene_tree->node, - view->current_position.x, view->current_position.y); + view->geometry.x, view->geometry.y); } static void xdg_toplevel_request_minimize(struct wl_listener *listener, void *data) { struct wb_view *view = wl_container_of(listener, view, request_minimize); bool minimize_requested = view->xdg_toplevel->requested.minimized; if (minimize_requested) { - view->previous_position = view->current_position; - view->current_position.y = -view->current_position.height; + view->previous_geometry = view->geometry; + view->geometry.y = -view->geometry.height; struct wb_view *next_view = wl_container_of(view->link.next, next_view, link); if (wl_list_length(&view->link) > 1) @@ -221,11 +221,11 @@ static void xdg_toplevel_request_minimize(struct wl_listener *listener, void *da else focus_view(view, view->xdg_toplevel->base->surface); } else { - view->current_position = view->previous_position; + view->geometry = view->previous_geometry; } wlr_scene_node_set_position(&view->scene_tree->node, - view->current_position.x, view->current_position.y); + view->geometry.x, view->geometry.y); } static void begin_interactive(struct wb_view *view, @@ -244,22 +244,22 @@ static void begin_interactive(struct wb_view *view, server->cursor->cursor_mode = mode; if (mode == WB_CURSOR_MOVE) { - server->grab_x = server->cursor->cursor->x - view->current_position.x; - server->grab_y = server->cursor->cursor->y - view->current_position.y; + server->grab_x = server->cursor->cursor->x - view->geometry.x; + server->grab_y = server->cursor->cursor->y - view->geometry.y; } else if (mode == WB_CURSOR_RESIZE) { struct wlr_box geo_box; wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box); - double border_x = (view->current_position.x + geo_box.x) + + double border_x = (view->geometry.x + geo_box.x) + ((edges & WLR_EDGE_RIGHT) ? geo_box.width : 0); - double border_y = (view->current_position.y + geo_box.y) + + double border_y = (view->geometry.y + geo_box.y) + ((edges & WLR_EDGE_BOTTOM) ? geo_box.height : 0); server->grab_x = server->cursor->cursor->x - border_x; server->grab_y = server->cursor->cursor->y - border_y; server->grab_geo_box = geo_box; - server->grab_geo_box.x += view->current_position.x; - server->grab_geo_box.y += view->current_position.y; + server->grab_geo_box.x += view->geometry.x; + server->grab_geo_box.y += view->geometry.y; server->resize_edges = edges; } @@ -290,8 +290,8 @@ static void handle_new_popup(struct wl_listener *listener, void *data) { struct wlr_output *wlr_output = wlr_output_layout_output_at( view->server->output_layout, - view->current_position.x + popup->current.geometry.x, - view->current_position.y + popup->current.geometry.y); + view->geometry.x + popup->current.geometry.x, + view->geometry.y + popup->current.geometry.y); if (!wlr_output) return; struct wb_output *output = wlr_output->data; @@ -299,8 +299,8 @@ static void handle_new_popup(struct wl_listener *listener, void *data) { int top_margin = (view->server->config) ? view->server->config->margins.top : 0; struct wlr_box output_toplevel_box = { - .x = output->geometry.x - view->current_position.x, - .y = output->geometry.y - view->current_position.y, + .x = output->geometry.x - view->geometry.x, + .y = output->geometry.y - view->geometry.y, .width = output->geometry.width, .height = output->geometry.height - top_margin, };