Skip to content

Commit

Permalink
Updates toplevel menu item state depending on window state.
Browse files Browse the repository at this point in the history
  • Loading branch information
phkaeser committed Feb 14, 2025
1 parent 10b530f commit 3e1e503
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
45 changes: 45 additions & 0 deletions src/tl_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ struct _wlmaker_tl_menu_t {
/** Pointer to the window's @ref wlmtk_menu_t. */
wlmtk_menu_t *menu_ptr;

/** Listener for @ref wlmtk_window_events_t::state_changed. */
struct wl_listener window_state_changed_listener;

/** Action item for 'Maximize'. */
wlmaker_action_item_t *maximize_ai_ptr;
/** Action item for 'Unmaximize'. */
Expand All @@ -47,6 +50,10 @@ struct _wlmaker_tl_menu_t {
wlmaker_action_item_t *close_ai_ptr;
};

static void _wlmaker_tl_menu_handle_window_state_changed(
struct wl_listener *listener_ptr,
void *data_ptr);

/* == Data ================================================================= */

/** Menu items for the XDG toplevel's window menu. */
Expand Down Expand Up @@ -132,6 +139,15 @@ wlmaker_tl_menu_t *wlmaker_tl_menu_create(
wlmaker_action_item_menu_item(ai_ptr));
}

// Connect state listener and initialize state.
wlmtk_util_connect_listener_signal(
&wlmtk_window_events(window_ptr)->state_changed,
&tl_menu_ptr->window_state_changed_listener,
_wlmaker_tl_menu_handle_window_state_changed);
_wlmaker_tl_menu_handle_window_state_changed(
&tl_menu_ptr->window_state_changed_listener,
window_ptr);

return tl_menu_ptr;
}

Expand All @@ -143,4 +159,33 @@ void wlmaker_tl_menu_destroy(wlmaker_tl_menu_t *tl_menu_ptr)

/* == Local (static) methods =============================================== */

/* ------------------------------------------------------------------------- */
/** Handles state changes: Updates the menu items accordingly. */
void _wlmaker_tl_menu_handle_window_state_changed(
struct wl_listener *listener_ptr,
void *data_ptr)
{
wlmaker_tl_menu_t *tl_menu_ptr = BS_CONTAINER_OF(
listener_ptr, wlmaker_tl_menu_t, window_state_changed_listener);
wlmtk_window_t *window_ptr = data_ptr;

wlmtk_menu_item_set_enabled(
wlmaker_action_item_menu_item(tl_menu_ptr->shade_ai_ptr),
!wlmtk_window_is_shaded(window_ptr));
wlmtk_menu_item_set_enabled(
wlmaker_action_item_menu_item(tl_menu_ptr->unshade_ai_ptr),
wlmtk_window_is_shaded(window_ptr));

wlmtk_menu_item_set_enabled(
wlmaker_action_item_menu_item(tl_menu_ptr->fullscreen_ai_ptr),
!wlmtk_window_is_fullscreen(window_ptr));

wlmtk_menu_item_set_enabled(
wlmaker_action_item_menu_item(tl_menu_ptr->maximize_ai_ptr),
!wlmtk_window_is_maximized(window_ptr));
wlmtk_menu_item_set_enabled(
wlmaker_action_item_menu_item(tl_menu_ptr->unmaximize_ai_ptr),
wlmtk_window_is_maximized(window_ptr));
}

/* == End of tl_menu.c ===================================================== */
2 changes: 2 additions & 0 deletions src/toolkit/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ typedef struct {
* - @ref wlmtk_window_is_maximized
* - @ref wlmtk_window_is_fullscreen
* - @ref wlmtk_window_is_shaded
*
* data_ptr points to the window state (@ref wlmtk_window_t).
*/
struct wl_signal state_changed;
} wlmtk_window_events_t;
Expand Down

0 comments on commit 3e1e503

Please sign in to comment.