xdg-shell: Add show_window_menu request

This commit is contained in:
Jasper St. Pierre 2014-03-13 11:04:53 -04:00 committed by Kristian Høgsberg
parent de8bd50d35
commit 81ff075bf4
3 changed files with 39 additions and 49 deletions

View file

@ -2228,61 +2228,19 @@ frame_get_pointer_image_for_location(struct window_frame *frame,
}
}
static void
frame_menu_func(void *data, struct input *input, int index)
{
struct window *window = data;
struct display *display;
switch (index) {
case 0: /* close */
window_close(window);
break;
case 1: /* move to workspace above */
display = window->display;
if (display->workspace > 0)
workspace_manager_move_surface(
display->workspace_manager,
window->main_surface->surface,
display->workspace - 1);
break;
case 2: /* move to workspace below */
display = window->display;
if (display->workspace < display->workspace_count - 1)
workspace_manager_move_surface(
display->workspace_manager,
window->main_surface->surface,
display->workspace + 1);
break;
case 3: /* fullscreen */
/* we don't have a way to get out of fullscreen for now */
if (window->fullscreen_handler)
window->fullscreen_handler(window, window->user_data);
break;
}
}
void
window_show_frame_menu(struct window *window,
struct input *input, uint32_t time)
{
int32_t x, y;
int count;
static const char *entries[] = {
"Close",
"Move to workspace above", "Move to workspace below",
"Fullscreen"
};
if (window->fullscreen_handler)
count = ARRAY_LENGTH(entries);
else
count = ARRAY_LENGTH(entries) - 1;
input_get_position(input, &x, &y);
window_show_menu(window->display, input, time, window,
x - 10, y - 10, frame_menu_func, entries, count);
if (window->xdg_surface) {
input_get_position(input, &x, &y);
xdg_surface_show_window_menu(window->xdg_surface,
input_get_seat(input),
window->display->serial,
x - 10, y - 10);
}
}
static int

View file

@ -3416,6 +3416,17 @@ xdg_surface_set_app_id(struct wl_client *client,
shsurf->class = strdup(app_id);
}
static void
xdg_surface_show_window_menu(struct wl_client *client,
struct wl_resource *surface_resource,
struct wl_resource *seat_resource,
uint32_t serial,
int32_t x,
int32_t y)
{
/* TODO */
}
static void
xdg_surface_set_title(struct wl_client *client,
struct wl_resource *resource, const char *title)
@ -3528,6 +3539,7 @@ static const struct xdg_surface_interface xdg_surface_implementation = {
xdg_surface_set_margin,
xdg_surface_set_title,
xdg_surface_set_app_id,
xdg_surface_show_window_menu,
xdg_surface_move,
xdg_surface_resize,
xdg_surface_ack_configure,

View file

@ -198,6 +198,26 @@
<arg name="app_id" type="string"/>
</request>
<request name="show_window_menu">
<description summary="show the window menu">
Clients implementing client-side decorations might want to show
a context menu when right-clicking on the decorations, giving the
user a menu that they can use to maximize or minimize the window.
This request asks the compositor to pop up such a window menu at
the given position, relative to the parent surface. There are
no guarantees as to what the window menu contains.
Your surface must have focus on the seat passed in to pop up the
window menu.
</description>
<arg name="seat" type="object" interface="wl_seat" summary="the seat to pop the window up on"/>
<arg name="serial" type="uint" summary="serial of the event to pop up the window for"/>
<arg name="x" type="int" summary="the x position to pop up the window menu at"/>
<arg name="y" type="int" summary="the y position to pop up the window menu at"/>
</request>
<request name="move">
<description summary="start an interactive move">
Start a pointer-driven move of the surface.