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

Reply via email to