]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add window menu
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Tue, 25 Jan 2022 23:07:10 +0000 (00:07 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Wed, 26 Jan 2022 06:17:41 +0000 (06:17 +0000)
12 files changed:
docs/labwc-actions.5.scd
docs/labwc-config.5.scd
docs/menu.xml
docs/rc.xml.all
include/labwc.h
include/menu/menu.h
src/action.c
src/config/rcxml.c
src/cursor.c
src/main.c
src/menu/menu.c
src/output.c

index 2a43c73be1d097bb84a5b9b65f899f4e9e89ee39..a47f93e71823ce2327eb8f9900dc953b5620291b 100644 (file)
@@ -50,7 +50,7 @@ Actions are used in keyboard bindings.
        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.
index 8f352ac3329386d592d7c77f5883c3959861a6d5..739ee4b49f0968f3ed59c62e0e215b4a7f439f9b 100644 (file)
@@ -120,6 +120,7 @@ Configuration must be wrapped in a <labwc_config> root-node.
        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.
index 07dc1be14b444211be3d9b222625c9800c079017..45c4ba9808703b8d99cbfc1657f8af92dce7cec9 100644 (file)
@@ -1,7 +1,23 @@
 <?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>
index f3e29eeabfa3d6cf3351052f71579c075af092fa..399f11ed557c67c146bb30669ad1ec99a5682bfc 100644 (file)
@@ -97,6 +97,9 @@
     <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"/>
index d0f50ae0cafc9e18484b0fa4d9dc35485660e8e4..3b46d9419cb5fb1ef6f42a4c579f3cc6e17c90a6 100644 (file)
@@ -165,6 +165,7 @@ struct server {
 
        struct theme *theme;
        struct menu *rootmenu;
+       struct menu *windowmenu;
 };
 
 struct output {
index 627b9b63a678ef1be103f83f55353abae6a4a6d7..9cdc8c6f4cd87341dda547601df6fe871a28791b 100644 (file)
@@ -31,6 +31,7 @@ struct menu {
 };
 
 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) */
index 88f578c5ba8eada61044f227a680d56b05876a2d..ad3e8dabc34679bb6e4875fb03021387f8b14bfa 100644 (file)
@@ -87,16 +87,37 @@ void action_list_free(struct wl_list *action_list) {
 }
 
 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);
 }
 
@@ -166,7 +187,7 @@ action(struct view *activator, struct server *server, struct wl_list *actions, u
                        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) {
index 588f8cdb79a71c4f5b599e5fa43b5939b04462e1..a541970f2aff770cf221c5520a7f0be0fb247720 100644 (file)
@@ -504,6 +504,7 @@ static struct {
        { "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" },
@@ -553,6 +554,9 @@ static struct {
        { "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},
index f88f3a41153e98657f7972b9dbef394f42230ecd..a7b72810bd5c5bc2ea2ef5600899e4970b102083 100644 (file)
@@ -183,7 +183,15 @@ process_cursor_motion(struct server *server, uint32_t time)
                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;
@@ -615,7 +623,11 @@ cursor_button(struct wl_listener *listener, void *data)
        }
 
        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;
index ced17f768979130b04f2220368c283844d3a4fd2..4e419e5e4e8325ee39c48daefc474d11547811e4 100644 (file)
@@ -72,6 +72,7 @@ main(int argc, char *argv[])
        server.theme = &theme;
 
        menu_init_rootmenu(&server);
+       menu_init_windowmenu(&server);
 
        session_autostart_init();
        if (startup_cmd) {
index 21ea2a3367504c49a2442dde823970a9a1dc2e21..48b18336a73164edbfb5e318badbb02cf450ae3a 100644 (file)
@@ -313,6 +313,7 @@ menu_init_rootmenu(struct server *server)
 
        /* 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)) {
@@ -326,6 +327,33 @@ menu_init_rootmenu(struct server *server)
        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)
 {
@@ -437,4 +465,5 @@ menu_reconfigure(struct server *server, struct menu *menu)
 {
        menu_finish();
        menu_init_rootmenu(server);
+       menu_init_windowmenu(server);
 }
index bccfb12c6c208e5192f011d68aaf817e92dfbdd0..6295c1800b598d1663921338cceaaee70d5a530f 100644 (file)
@@ -832,6 +832,7 @@ output_render(struct output *output, pixman_region32_t *damage)
 
        if (output->server->input_mode == LAB_INPUT_STATE_MENU) {
                render_menu(output, damage, server->rootmenu);
+               render_menu(output, damage, server->windowmenu);
        }
 
 renderer_end: