diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 496d0d18..7ad6f029 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -46,6 +46,7 @@ struct desktop { struct panel { struct window *window; + struct window *menu; }; struct panel_item { @@ -66,6 +67,21 @@ sigchild_handler(int s) fprintf(stderr, "child %d exited\n", pid); } +static void +show_menu(struct panel *panel, struct input *input) +{ + int32_t x, y, width = 200, height = 200; + struct display *display; + + input_get_position(input, &x, &y); + display = window_get_display(panel->window); + panel->menu = window_create_transient(display, panel->window, + x - 10, y - 10, width, height); + + window_draw(panel->menu); + window_flush(panel->menu); +} + static void panel_activate_item(struct panel *panel, struct panel_item *item) { @@ -164,6 +180,11 @@ panel_button_handler(struct window *window, window_schedule_redraw(panel->window); if (state == 0) panel_activate_item(panel, pi); + } else if (button == BTN_RIGHT) { + if (state) + show_menu(panel, input); + else + window_destroy(panel->menu); } } diff --git a/clients/window.c b/clients/window.c index 3bb4cb7b..57e27b84 100644 --- a/clients/window.c +++ b/clients/window.c @@ -862,6 +862,12 @@ window_resize_cairo_window_surface(struct window *window) } #endif +struct display * +window_get_display(struct window *window) +{ + return window->display; +} + void window_create_surface(struct window *window) { diff --git a/clients/window.h b/clients/window.h index 6a4ce9f2..290c6b91 100644 --- a/clients/window.h +++ b/clients/window.h @@ -179,6 +179,8 @@ window_for_each_item(struct window *window, item_func_t func, void *data); struct item * window_get_focus_item(struct window *window); +struct display * +window_get_display(struct window *window); void window_move(struct window *window, struct input *input, uint32_t time);