clients: Allow creating a "detached" menu
This will be used by the xdg_surface.show_menu_window implementation.
This commit is contained in:
committed by
Kristian Høgsberg
parent
ca85dc6b92
commit
de8bd50d35
+50
-14
@@ -4583,31 +4583,28 @@ static const struct xdg_popup_listener xdg_popup_listener = {
|
|||||||
handle_popup_popup_done,
|
handle_popup_popup_done,
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
static struct menu *
|
||||||
window_show_menu(struct display *display,
|
create_menu(struct display *display,
|
||||||
struct input *input, uint32_t time, struct window *parent,
|
struct input *input, uint32_t time,
|
||||||
int32_t x, int32_t y,
|
menu_func_t func, const char **entries, int count,
|
||||||
menu_func_t func, const char **entries, int count)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct window *window;
|
struct window *window;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
int32_t ix, iy;
|
|
||||||
|
|
||||||
menu = malloc(sizeof *menu);
|
menu = malloc(sizeof *menu);
|
||||||
if (!menu)
|
if (!menu)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
window = window_create_internal(parent->display, 0);
|
window = window_create_internal(display, 0);
|
||||||
if (!window) {
|
if (!window) {
|
||||||
free(menu);
|
free(menu);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
menu->window = window;
|
menu->window = window;
|
||||||
menu->user_data = parent;
|
menu->user_data = user_data;
|
||||||
menu->widget = window_add_widget(menu->window, menu);
|
menu->widget = window_add_widget(menu->window, menu);
|
||||||
window_set_buffer_scale (menu->window, window_get_buffer_scale (parent));
|
|
||||||
window_set_buffer_transform (menu->window, window_get_buffer_transform (parent));
|
|
||||||
menu->frame = frame_create(window->display->theme, 0, 0,
|
menu->frame = frame_create(window->display->theme, 0, 0,
|
||||||
FRAME_BUTTON_NONE, NULL);
|
FRAME_BUTTON_NONE, NULL);
|
||||||
fail_on_null(menu->frame);
|
fail_on_null(menu->frame);
|
||||||
@@ -4618,8 +4615,6 @@ window_show_menu(struct display *display,
|
|||||||
menu->time = time;
|
menu->time = time;
|
||||||
menu->func = func;
|
menu->func = func;
|
||||||
menu->input = input;
|
menu->input = input;
|
||||||
window->x = x;
|
|
||||||
window->y = y;
|
|
||||||
|
|
||||||
input_ungrab(input);
|
input_ungrab(input);
|
||||||
|
|
||||||
@@ -4636,6 +4631,47 @@ window_show_menu(struct display *display,
|
|||||||
window_schedule_resize(window, frame_width(menu->frame),
|
window_schedule_resize(window, frame_width(menu->frame),
|
||||||
frame_height(menu->frame));
|
frame_height(menu->frame));
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct window *
|
||||||
|
window_create_menu(struct display *display,
|
||||||
|
struct input *input, uint32_t time,
|
||||||
|
menu_func_t func, const char **entries, int count,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
struct menu *menu;
|
||||||
|
menu = create_menu(display, input, time, func, entries, count, user_data);
|
||||||
|
|
||||||
|
if (menu == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return menu->window;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
window_show_menu(struct display *display,
|
||||||
|
struct input *input, uint32_t time, struct window *parent,
|
||||||
|
int32_t x, int32_t y,
|
||||||
|
menu_func_t func, const char **entries, int count)
|
||||||
|
{
|
||||||
|
struct menu *menu;
|
||||||
|
struct window *window;
|
||||||
|
int32_t ix, iy;
|
||||||
|
|
||||||
|
menu = create_menu(display, input, time, func, entries, count, parent);
|
||||||
|
|
||||||
|
if (menu == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window = menu->window;
|
||||||
|
|
||||||
|
window_set_buffer_scale (menu->window, window_get_buffer_scale (parent));
|
||||||
|
window_set_buffer_transform (menu->window, window_get_buffer_transform (parent));
|
||||||
|
|
||||||
|
window->x = x;
|
||||||
|
window->y = y;
|
||||||
|
|
||||||
frame_interior(menu->frame, &ix, &iy, NULL, NULL);
|
frame_interior(menu->frame, &ix, &iy, NULL, NULL);
|
||||||
|
|
||||||
window->xdg_popup = xdg_shell_get_xdg_popup(display->xdg_shell,
|
window->xdg_popup = xdg_shell_get_xdg_popup(display->xdg_shell,
|
||||||
|
|||||||
@@ -286,6 +286,11 @@ window_has_focus(struct window *window);
|
|||||||
|
|
||||||
typedef void (*menu_func_t)(void *data, struct input *input, int index);
|
typedef void (*menu_func_t)(void *data, struct input *input, int index);
|
||||||
|
|
||||||
|
struct window *
|
||||||
|
window_create_menu(struct display *display,
|
||||||
|
struct input *input, uint32_t time,
|
||||||
|
menu_func_t func, const char **entries, int count,
|
||||||
|
void *user_data);
|
||||||
void
|
void
|
||||||
window_show_menu(struct display *display,
|
window_show_menu(struct display *display,
|
||||||
struct input *input, uint32_t time, struct window *parent,
|
struct input *input, uint32_t time, struct window *parent,
|
||||||
|
|||||||
Reference in New Issue
Block a user