Add maximize button for list item drop down menu. --- clients/desktop-shell.c | 44 +++++++++++++++++++++++++++++++++++++++----- clients/window.c | 6 ++++++ src/shell.c | 23 +++++++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-)
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 1fa7387..4b2f805 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -70,7 +70,7 @@ struct surface { struct desktop *desktop; uint32_t output_mask; char *title; - int minimized, focused; + int maximized, minimized, focused; /* One window list item per panel of the surface's output_mask */ struct wl_list item_list; @@ -1159,7 +1159,7 @@ static int panel_list_item_enter_handler(struct widget *widget, struct input *input, float x, float y, void *data) { - struct list_item *item = data; + struct list_item *item = data, *t_item; item->x = x; item->y = y; @@ -1167,6 +1167,13 @@ panel_list_item_enter_handler(struct widget *widget, struct input *input, item->focused = 1; widget_schedule_redraw(widget); + wl_list_for_each(t_item, &item->panel->window_list, link) { + if(item == t_item) + continue; + t_item->highlight = 0; + t_item->focused = 0; + } + return CURSOR_LEFT_PTR; } @@ -1201,7 +1208,17 @@ list_item_menu_handle_button(struct list_item *item, int index) surface->minimized = 1; } break; - case 1: /* Close */ + case 1: /* (Un)Maximize */ + if (surface->maximized) { + surface_data_unmaximize(surface->surface_data); + surface->maximized = 0; + } + else { + surface_data_maximize(surface->surface_data); + surface->maximized = 1; + } + break; + case 2: /* Close */ surface_data_close(surface->surface_data); break; default: @@ -1231,7 +1248,7 @@ list_item_menu_func(struct window *window, int index, void *data) } } -#define MENU_ENTRIES 2 +#define MENU_ENTRIES 3 static void list_item_show_menu(struct list_item *item, struct input *input, uint32_t time) @@ -1241,7 +1258,8 @@ list_item_show_menu(struct list_item *item, struct input *input, uint32_t time) static const char *entries[MENU_ENTRIES]; entries[0] = item->surface->minimized ? "Unminimize" : "Minimize"; - entries[1] = "Close"; + entries[1] = item->surface->maximized ? "Unmaximize" : "Maximize"; + entries[2] = "Close"; panel = item->panel; input_get_position(input, &x, &y); @@ -1503,6 +1521,21 @@ surface_data_set_title(void *data, } static void +surface_data_set_maximized_state(void *data, + struct surface_data *surface_data, + int maximized) +{ + struct desktop *desktop; + struct surface *surface = data; + + desktop = surface->desktop; + + surface->maximized = maximized; + + desktop_update_list_items(desktop, surface); +} + +static void surface_data_set_minimized_state(void *data, struct surface_data *surface_data, int minimized) @@ -1568,6 +1601,7 @@ surface_data_destroy_handler(void *data, struct surface_data *surface_data) static const struct surface_data_listener surface_data_listener = { surface_data_set_output_mask, surface_data_set_title, + surface_data_set_maximized_state, surface_data_set_minimized_state, surface_data_set_focused_state, surface_data_destroy_handler diff --git a/clients/window.c b/clients/window.c index 7093a38..d5a1898 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3317,11 +3317,17 @@ handle_popup_done(void *data, struct wl_shell_surface *shell_surface) static void handle_maximize(void *data, struct wl_shell_surface *shell_surface) { + struct window *window = data; + + window_set_maximized(window, 1); } static void handle_unmaximize(void *data, struct wl_shell_surface *shell_surface) { + struct window *window = data; + + window_set_maximized(window, 0); } static void diff --git a/src/shell.c b/src/shell.c index fd1411b..1e2eb52 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1508,6 +1508,7 @@ surface_unminimize(struct shell_surface *shsurf, struct workspace *ws) shell_surface_focus(shsurf); send_surface_data_focused_state(surface); shsurf->minimized = false; + shsurf->type = shsurf->saved_type; wl_shell_surface_send_unminimize(&shsurf->resource); weston_compositor_damage_all(compositor); } @@ -1526,6 +1527,24 @@ shell_surface_unminimize(struct shell_surface *shsurf) } static void +surface_data_maximize_handler(struct wl_client *client, + struct wl_resource *resource) +{ + struct shell_surface *shsurf = resource->data; + + wl_shell_surface_send_maximize(&shsurf->resource); +} + +static void +surface_data_unmaximize_handler(struct wl_client *client, + struct wl_resource *resource) +{ + struct shell_surface *shsurf = resource->data; + + wl_shell_surface_send_unmaximize(&shsurf->resource); +} + +static void surface_data_minimize_handler(struct wl_client *client, struct wl_resource *resource) { @@ -1593,6 +1612,8 @@ surface_data_destroy_handler(struct wl_client *client, static const struct surface_data_interface surface_data_implementation = { + surface_data_maximize_handler, + surface_data_unmaximize_handler, surface_data_minimize_handler, surface_data_unminimize_handler, surface_data_focus_handler, @@ -1791,6 +1812,7 @@ reset_shell_surface_type(struct shell_surface *surface) weston_surface_set_position(surface->surface, surface->saved_x, surface->saved_y); + surface_data_send_maximized(surface->surface_data, 0); break; case SHELL_SURFACE_NONE: case SHELL_SURFACE_TOPLEVEL: @@ -1827,6 +1849,7 @@ set_surface_type(struct shell_surface *shsurf) shsurf->saved_x = surface->geometry.x; shsurf->saved_y = surface->geometry.y; shsurf->saved_position_valid = true; + surface_data_send_maximized(shsurf->surface_data, 1); break; case SHELL_SURFACE_FULLSCREEN: -- 1.7.10.4 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel