diff --git a/include/menu/menu.h b/include/menu/menu.h
index f69e902a..a4d236d6 100644
--- a/include/menu/menu.h
+++ b/include/menu/menu.h
@@ -20,8 +20,6 @@ enum menuitem_type {
struct menuitem {
struct wl_list actions;
- char *execute;
- char *id; /* needed for pipemenus */
char *text;
char *icon_name;
const char *arrow;
@@ -33,7 +31,6 @@ struct menuitem {
struct wlr_scene_tree *tree;
struct wlr_scene_tree *normal_tree;
struct wlr_scene_tree *selected_tree;
- struct menu_pipe_context *pipe_ctx;
struct view *client_list_view; /* used by internal client-list */
struct wl_list link; /* menu.menuitems */
};
@@ -43,6 +40,7 @@ struct menu {
char *id;
char *label;
char *icon_name;
+ char *execute;
struct menu *parent;
struct menu_pipe_context *pipe_ctx;
@@ -57,7 +55,7 @@ struct menu {
struct menuitem *item;
} selection;
struct wlr_scene_tree *scene_tree;
- bool is_pipemenu;
+ bool is_pipemenu_child;
bool align_left;
bool has_icons;
diff --git a/src/menu/menu.c b/src/menu/menu.c
index f2de6609..fecb0f3f 100644
--- a/src/menu/menu.c
+++ b/src/menu/menu.c
@@ -49,9 +49,8 @@ static bool waiting_for_pipe_menu;
static struct menuitem *selected_item;
struct menu_pipe_context {
- struct server *server;
- struct menuitem *item;
- struct menu *top_level_menu;
+ struct wlr_box anchor_rect;
+ struct menu *pipemenu;
struct buf buf;
struct wl_event_source *event_read;
struct wl_event_source *event_timeout;
@@ -88,8 +87,7 @@ menu_create(struct server *server, const char *id, const char *label)
menu->label = xstrdup(label ? label : id);
menu->parent = current_menu;
menu->server = server;
- menu->is_pipemenu = waiting_for_pipe_menu;
- menu->size.width = server->theme->menu_min_width;
+ menu->is_pipemenu_child = waiting_for_pipe_menu;
return menu;
}
@@ -481,16 +479,11 @@ fill_item(char *nodename, char *content)
static void
item_destroy(struct menuitem *item)
{
- if (item->pipe_ctx) {
- item->pipe_ctx->item = NULL;
- }
wl_list_remove(&item->link);
action_list_free(&item->actions);
if (item->tree) {
wlr_scene_node_destroy(&item->tree->node);
}
- free(item->execute);
- free(item->id);
free(item->text);
free(item->icon_name);
free(item);
@@ -636,32 +629,6 @@ static bool parse_buf(struct server *server, struct buf *buf);
static int handle_pipemenu_readable(int fd, uint32_t mask, void *_ctx);
static int handle_pipemenu_timeout(void *_ctx);
-static void
-parse_root_pipemenu(struct menu *top_level_menu, const char *execute)
-{
- int pipe_fd = 0;
- pid_t pid = spawn_piped(execute, &pipe_fd);
- if (pid <= 0) {
- wlr_log(WLR_ERROR, "Failed to spawn pipe menu process %s", execute);
- return;
- }
-
- struct menu_pipe_context *ctx = znew(*ctx);
- ctx->server = top_level_menu->server;
- ctx->top_level_menu = top_level_menu;
- ctx->pid = pid;
- ctx->pipe_fd = pipe_fd;
- ctx->buf = BUF_INIT;
- top_level_menu->pipe_ctx = ctx;
-
- ctx->event_read = wl_event_loop_add_fd(ctx->server->wl_event_loop,
- pipe_fd, WL_EVENT_READABLE, handle_pipemenu_readable, ctx);
-
- ctx->event_timeout = wl_event_loop_add_timer(ctx->server->wl_event_loop,
- handle_pipemenu_timeout, ctx);
- wl_event_source_timer_update(ctx->event_timeout, PIPEMENU_TIMEOUT_IN_MS);
-}
-
/*
*