Re-load configuration and theme files.
*<action name="ShowMenu"><menu>*
- Show menu. Valid menu name is "root-menu".
+ Show menu. Valid menu names are "root-menu" and "client-menu".
*<action name="ToggleDecorations">*
Toggle decorations of focused window.
Define a mouse binding. Supported context-names include:
- TitleBar: The area where the title of the window is shown.
- Title: The title of the window itself.
+ - WindowMenu: The button on the left.
- Iconify: The button that looks like an underline.
- Maximize: The button that looks like a box.
- Close: The button that looks like an X.
<?xml version="1.0" encoding="UTF-8"?>
<openbox_menu>
-
+<menu id="client-menu" label="ClientMenu">
+ <item label="Minimize">
+ <action name="Iconify" />
+ </item>
+ <item label="Maximize">
+ <action name="ToggleMaximize" />
+ </item>
+ <item label="Fullscreen">
+ <action name="ToggleFullscreen" />
+ </item>
+ <item label="Decorations">
+ <action name="ToggleDecorations" />
+ </item>
+ <item label="Close">
+ <action name="Close" />
+ </item>
+</menu>
<menu id="root-menu" label="">
<item label="Web browser">
<action name="Execute"><command>firefox</command></action>
<keybind key="W-Down">
<action name="SnapToEdge"><direction>down</direction></action>
</keybind>
+ <keybind key="A-Space">
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </keybind>
<keybind key="XF86_AudioLowerVolume">
<action name="Execute"><command>amixer sset Master 5%-</command></action>
</keybind>
<mousebind button="Left" action="Drag">
<action name="Move"/>
</mousebind>
+ <mousebind button="Right" action="Click">
+ <action name="Focus" />
+ <action name="Raise" />
+ <action name="ShowMenu">
+ <menu>client-menu</menu>
+ </action>
+ </mousebind>
<mousebind button="Left" action="DoubleClick">
<action name="Focus"/>
<action name="Raise"/>
struct theme *theme;
struct menu *rootmenu;
+ struct menu *windowmenu;
};
struct output {
};
void menu_init_rootmenu(struct server *server);
+void menu_init_windowmenu(struct server *server);
void menu_finish(void);
/* menu_move - move to position (x, y) */
}
static void
-show_menu(struct server *server, const char *menu)
+show_menu(struct server *server, struct view *view, const char *menu_name)
{
- if (!menu) {
+ struct menu *menu = NULL;
+ bool force_menu_top_left = false;
+
+ if (!menu_name) {
+ return;
+ }
+
+ if (!strcasecmp(menu_name, "root-menu")) {
+ menu = server->rootmenu;
+ server->windowmenu->visible = false;
+ } else if (!strcasecmp(menu_name, "client-menu") && view) {
+ menu = server->windowmenu;
+ server->rootmenu->visible = false;
+ } else {
return;
}
- if (!strcasecmp(menu, "root-menu")) {
- server->input_mode = LAB_INPUT_STATE_MENU;
- menu_move(server->rootmenu, server->seat.cursor->x,
- server->seat.cursor->y);
+
+ menu->visible = true;
+ server->input_mode = LAB_INPUT_STATE_MENU;
+
+ int x, y;
+ if (force_menu_top_left) {
+ x = view->x;
+ y = view->y;
+ } else {
+ x = server->seat.cursor->x;
+ y = server->seat.cursor->y;
}
+ menu_move(menu, x, y);
damage_all_outputs(server);
}
spawn_async_no_shell("killall -SIGHUP labwc");
break;
case ACTION_TYPE_SHOW_MENU:
- show_menu(server, action->arg);
+ show_menu(server, view, action->arg);
break;
case ACTION_TYPE_TOGGLE_MAXIMIZE:
if (view) {
{ "W-Right", "SnapToEdge", "right" },
{ "W-Up", "SnapToEdge", "up" },
{ "W-Down", "SnapToEdge", "down" },
+ { "A-Space", "ShowMenu", "client-menu"},
{ "XF86_AudioLowerVolume", "Execute", "amixer sset Master 5%-" },
{ "XF86_AudioRaiseVolume", "Execute", "amixer sset Master 5%+" },
{ "XF86_AudioMute", "Execute", "amixer sset Master toggle" },
{ "Titlebar", "Left", "Press", "Raise", NULL},
{ "TitleBar", "Left", "Drag", "Move", NULL },
{ "TitleBar", "Left", "DoubleClick", "ToggleMaximize", NULL },
+ { "TitleBar", "Right", "Click", "Focus", NULL},
+ { "TitleBar", "Right", "Click", "Raise", NULL},
+ { "TitleBar", "Right", "Click", "ShowMenu", "client-menu"},
{ "Close", "Left", "Click", "Close", NULL },
{ "Iconify", "Left", "Click", "Iconify", NULL},
{ "Maximize", "Left", "Click", "ToggleMaximize", NULL},
process_cursor_resize(server, time);
return;
} else if (server->input_mode == LAB_INPUT_STATE_MENU) {
- menu_set_selected(server->rootmenu,
+ struct menu *menu = NULL;
+ if (server->rootmenu->visible) {
+ menu = server->rootmenu;
+ } else if (server->windowmenu->visible) {
+ menu = server->windowmenu;
+ } else {
+ return;
+ }
+ menu_set_selected(menu,
server->seat.cursor->x, server->seat.cursor->y);
damage_all_outputs(server);
return;
}
if (server->input_mode == LAB_INPUT_STATE_MENU) {
- menu_action_selected(server, server->rootmenu);
+ if (server->rootmenu->visible) {
+ menu_action_selected(server, server->rootmenu);
+ } else if (server->windowmenu->visible) {
+ menu_action_selected(server, server->windowmenu);
+ }
server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
cursor_rebase(&server->seat, event->time_msec);
return;
server.theme = &theme;
menu_init_rootmenu(&server);
+ menu_init_windowmenu(&server);
session_autostart_init();
if (startup_cmd) {
/* Default menu if no menu.xml found */
if (!server->rootmenu) {
+ current_menu = NULL;
server->rootmenu = menu_create(server, "root-menu", "");
}
if (wl_list_empty(&server->rootmenu->menuitems)) {
menu_configure(server->rootmenu, 100, 100);
}
+void
+menu_init_windowmenu(struct server *server)
+{
+ server->windowmenu = get_menu_by_id("client-menu");
+
+ /* Default menu if no menu.xml found */
+ if (!server->windowmenu) {
+ current_menu = NULL;
+ server->windowmenu = menu_create(server, "client-menu", "");
+ }
+ if (wl_list_empty(&server->windowmenu->menuitems)) {
+ current_item = item_create(server->windowmenu, "Minimize");
+ fill_item("name.action", "Iconify");
+ current_item = item_create(server->windowmenu, "Maximize");
+ fill_item("name.action", "ToggleMaximize");
+ current_item = item_create(server->windowmenu, "Fullscreen");
+ fill_item("name.action", "ToggleFullscreen");
+ current_item = item_create(server->windowmenu, "Decorations");
+ fill_item("name.action", "ToggleDecorations");
+ current_item = item_create(server->windowmenu, "Close");
+ fill_item("name.action", "Close");
+ }
+
+ server->windowmenu->visible = true;
+ menu_configure(server->windowmenu, 100, 100);
+}
+
void
menu_finish(void)
{
{
menu_finish();
menu_init_rootmenu(server);
+ menu_init_windowmenu(server);
}
if (output->server->input_mode == LAB_INPUT_STATE_MENU) {
render_menu(output, damage, server->rootmenu);
+ render_menu(output, damage, server->windowmenu);
}
renderer_end: