mirror of
https://github.com/labwc/labwc.git
synced 2026-02-24 01:40:15 -05:00
view/ssd: Refactor and fix visual indication for active windows
Partially fixes #494. Co-Authored-by: Consolatis
This commit is contained in:
parent
127a9c7be4
commit
b7c4ba825a
5 changed files with 37 additions and 53 deletions
|
|
@ -188,7 +188,7 @@ struct server {
|
||||||
uint32_t resize_edges;
|
uint32_t resize_edges;
|
||||||
|
|
||||||
/* SSD state */
|
/* SSD state */
|
||||||
struct view *ssd_focused_view;
|
struct view *focused_view;
|
||||||
struct ssd_hover_state ssd_hover_state;
|
struct ssd_hover_state ssd_hover_state;
|
||||||
|
|
||||||
/* Tree for all non-layer xdg/xwayland-shell surfaces */
|
/* Tree for all non-layer xdg/xwayland-shell surfaces */
|
||||||
|
|
@ -408,7 +408,7 @@ struct xwayland_unmanaged *xwayland_unmanaged_create(struct server *server,
|
||||||
void unmanaged_handle_map(struct wl_listener *listener, void *data);
|
void unmanaged_handle_map(struct wl_listener *listener, void *data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void view_set_activated(struct view *view, bool activated);
|
void view_set_activated(struct view *view);
|
||||||
void view_close(struct view *view);
|
void view_close(struct view *view);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ struct ssd_hover_state {
|
||||||
|
|
||||||
/* Public SSD API */
|
/* Public SSD API */
|
||||||
void ssd_create(struct view *view);
|
void ssd_create(struct view *view);
|
||||||
void ssd_set_active(struct view *view);
|
void ssd_set_active(struct view *view, bool active);
|
||||||
void ssd_update_title(struct view *view);
|
void ssd_update_title(struct view *view);
|
||||||
void ssd_update_geometry(struct view *view);
|
void ssd_update_geometry(struct view *view);
|
||||||
void ssd_reload(struct view *view);
|
void ssd_reload(struct view *view);
|
||||||
|
|
|
||||||
|
|
@ -87,18 +87,6 @@ desktop_move_to_back(struct view *view)
|
||||||
wl_list_insert_tail(&view->server->views, &view->link);
|
wl_list_insert_tail(&view->server->views, &view->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
deactivate_all_views(struct server *server)
|
|
||||||
{
|
|
||||||
struct view *view;
|
|
||||||
wl_list_for_each (view, &server->views, link) {
|
|
||||||
if (!view->mapped) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
view_set_activated(view, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
desktop_arrange_all_views(struct server *server)
|
desktop_arrange_all_views(struct server *server)
|
||||||
{
|
{
|
||||||
|
|
@ -151,8 +139,7 @@ desktop_focus_and_activate_view(struct seat *seat, struct view *view)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
deactivate_all_views(view->server);
|
view_set_activated(view);
|
||||||
view_set_activated(view, true);
|
|
||||||
seat_focus_surface(seat, view->surface);
|
seat_focus_surface(seat, view->surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -140,21 +140,15 @@ ssd_resize_edges(enum ssd_part_type type)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_ssd_set_active(struct ssd *ssd, bool active)
|
|
||||||
{
|
|
||||||
wlr_scene_node_set_enabled(&ssd->border.active.tree->node, active);
|
|
||||||
wlr_scene_node_set_enabled(&ssd->titlebar.active.tree->node, active);
|
|
||||||
wlr_scene_node_set_enabled(&ssd->border.inactive.tree->node, !active);
|
|
||||||
wlr_scene_node_set_enabled(&ssd->titlebar.inactive.tree->node, !active);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ssd_create(struct view *view)
|
ssd_create(struct view *view)
|
||||||
{
|
{
|
||||||
|
bool is_active = view->server->focused_view == view;
|
||||||
|
|
||||||
if (view->ssd.tree) {
|
if (view->ssd.tree) {
|
||||||
/* SSD was hidden. Just enable it */
|
/* SSD was hidden. Just enable it */
|
||||||
wlr_scene_node_set_enabled(&view->ssd.tree->node, true);
|
wlr_scene_node_set_enabled(&view->ssd.tree->node, true);
|
||||||
|
ssd_set_active(view, is_active);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,6 +158,7 @@ ssd_create(struct view *view)
|
||||||
ssd_border_create(view);
|
ssd_border_create(view);
|
||||||
ssd_titlebar_create(view);
|
ssd_titlebar_create(view);
|
||||||
view->margin = ssd_thickness(view);
|
view->margin = ssd_thickness(view);
|
||||||
|
ssd_set_active(view, is_active);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -211,14 +206,8 @@ void ssd_reload(struct view *view)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool view_was_active = view->server->ssd_focused_view == view;
|
|
||||||
ssd_destroy(view);
|
ssd_destroy(view);
|
||||||
ssd_create(view);
|
ssd_create(view);
|
||||||
if (view_was_active) {
|
|
||||||
view->server->ssd_focused_view = view;
|
|
||||||
} else {
|
|
||||||
_ssd_set_active(&view->ssd, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -228,11 +217,6 @@ ssd_destroy(struct view *view)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe reset focused view */
|
|
||||||
if (view->server->ssd_focused_view == view) {
|
|
||||||
view->server->ssd_focused_view = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Maybe reset hover view */
|
/* Maybe reset hover view */
|
||||||
struct ssd_hover_state *hover_state;
|
struct ssd_hover_state *hover_state;
|
||||||
hover_state = &view->server->ssd_hover_state;
|
hover_state = &view->server->ssd_hover_state;
|
||||||
|
|
@ -283,19 +267,13 @@ ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ssd_set_active(struct view *view)
|
ssd_set_active(struct view *view, bool active)
|
||||||
{
|
{
|
||||||
if (!view->ssd.tree) {
|
if (!view->ssd.tree) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
wlr_scene_node_set_enabled(&view->ssd.border.active.tree->node, active);
|
||||||
struct view *last = view->server->ssd_focused_view;
|
wlr_scene_node_set_enabled(&view->ssd.titlebar.active.tree->node, active);
|
||||||
if (last == view) {
|
wlr_scene_node_set_enabled(&view->ssd.border.inactive.tree->node, !active);
|
||||||
return;
|
wlr_scene_node_set_enabled(&view->ssd.titlebar.inactive.tree->node, !active);
|
||||||
}
|
|
||||||
if (last && last->ssd.tree) {
|
|
||||||
_ssd_set_active(&last->ssd, false);
|
|
||||||
}
|
|
||||||
_ssd_set_active(&view->ssd, true);
|
|
||||||
view->server->ssd_focused_view = view;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
src/view.c
29
src/view.c
|
|
@ -95,11 +95,11 @@ view_get_edge_snap_box(struct view *view, struct output *output,
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
view_set_activated(struct view *view, bool activated)
|
_view_set_activated(struct view *view, bool activated)
|
||||||
{
|
{
|
||||||
if (view->ssd.enabled) {
|
if (view->ssd.tree) {
|
||||||
ssd_set_active(view);
|
ssd_set_active(view, activated);
|
||||||
}
|
}
|
||||||
if (view->impl->set_activated) {
|
if (view->impl->set_activated) {
|
||||||
view->impl->set_activated(view, activated);
|
view->impl->set_activated(view, activated);
|
||||||
|
|
@ -110,6 +110,22 @@ view_set_activated(struct view *view, bool activated)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
view_set_activated(struct view *view)
|
||||||
|
{
|
||||||
|
assert(view);
|
||||||
|
|
||||||
|
struct view *last = view->server->focused_view;
|
||||||
|
if (last == view) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (last) {
|
||||||
|
_view_set_activated(last, false);
|
||||||
|
}
|
||||||
|
_view_set_activated(view, true);
|
||||||
|
view->server->focused_view = view;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
view_close(struct view *view)
|
view_close(struct view *view)
|
||||||
{
|
{
|
||||||
|
|
@ -200,7 +216,6 @@ view_minimize(struct view *view, bool minimized)
|
||||||
if (minimized) {
|
if (minimized) {
|
||||||
view->impl->unmap(view);
|
view->impl->unmap(view);
|
||||||
desktop_move_to_back(view);
|
desktop_move_to_back(view);
|
||||||
view_set_activated(view, false);
|
|
||||||
} else {
|
} else {
|
||||||
view->impl->map(view);
|
view->impl->map(view);
|
||||||
}
|
}
|
||||||
|
|
@ -789,6 +804,10 @@ view_destroy(struct view *view)
|
||||||
server->seat.pressed.surface = NULL;
|
server->seat.pressed.surface = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (server->focused_view == view) {
|
||||||
|
server->focused_view = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (server->cycle_view == view) {
|
if (server->cycle_view == view) {
|
||||||
/*
|
/*
|
||||||
* If we are the current OSD selected view, cycle
|
* If we are the current OSD selected view, cycle
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue