From 268cb29a6bd9f351b598cfa748cd688fe1674748 Mon Sep 17 00:00:00 2001 From: Rene Date: Mon, 15 Aug 2022 15:18:51 +0200 Subject: [PATCH] add new context_menu and rework dock, programs can now be added to the dock my right clicking any program in the application launcher an choosing Add to Dock --- awesome/src/assets/cache/rules.txt | 2 +- .../src/assets/icons/context_menu/delete.svg | 1 + .../src/assets/icons/context_menu/desktop.svg | 1 + .../src/assets/icons/context_menu/entry.svg | 1 + .../src/assets/icons/context_menu/launch.svg | 1 + awesome/src/assets/icons/context_menu/pin.svg | 1 + .../src/assets/icons/context_menu/unpin.svg | 1 + awesome/src/config/dock.json | 1 + awesome/src/core/rules.lua | 5 +- awesome/src/core/signals.lua | 61 +++- awesome/src/lib/lgi-async-extra | 1 + .../application_launcher/application.lua | 100 +++++- .../src/modules/application_launcher/init.lua | 3 + .../application_launcher/searchbar.lua | 1 - awesome/src/modules/context_menu.lua | 112 ++++++ awesome/src/modules/crylia_bar/dock.lua | 323 ++++++++++++------ awesome/src/modules/crylia_bar/init.lua | 2 +- .../window_switcher/window_elements.lua | 1 + awesome/src/scripts/start_as_admin.sh | 5 + awesome/src/theme/theme_config.lua | 23 ++ awesome/src/theme/user_config.lua | 26 -- awesome/src/tools/auto_starter.lua | 2 +- 22 files changed, 507 insertions(+), 167 deletions(-) create mode 100644 awesome/src/assets/icons/context_menu/delete.svg create mode 100644 awesome/src/assets/icons/context_menu/desktop.svg create mode 100644 awesome/src/assets/icons/context_menu/entry.svg create mode 100644 awesome/src/assets/icons/context_menu/launch.svg create mode 100644 awesome/src/assets/icons/context_menu/pin.svg create mode 100644 awesome/src/assets/icons/context_menu/unpin.svg create mode 100644 awesome/src/config/dock.json create mode 160000 awesome/src/lib/lgi-async-extra create mode 100644 awesome/src/modules/context_menu.lua create mode 100755 awesome/src/scripts/start_as_admin.sh diff --git a/awesome/src/assets/cache/rules.txt b/awesome/src/assets/cache/rules.txt index d1f8483..2d47ca5 100644 --- a/awesome/src/assets/cache/rules.txt +++ b/awesome/src/assets/cache/rules.txt @@ -1 +1 @@ -Lutris;Steam;Io.elementary.appcenter;Repoman;Com.github.donadigo.eddy;Sysmontask;join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=Gnome-calculator;Virt-manager;Gwe;whatsdesk;Totem;steam_app_431960;Viewer,;Viewer,;Nvidia-settings;openrgb;Minecraft;Pavucontrol;jamesdsp; \ No newline at end of file +Lutris;Io.elementary.appcenter;Repoman;Com.github.donadigo.eddy;Sysmontask;join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=Gnome-calculator;Virt-manager;Gwe;whatsdesk;Totem;steam_app_431960;Viewer,;Viewer,;Nvidia-settings;openrgb;Minecraft;Pavucontrol;jamesdsp; \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/delete.svg b/awesome/src/assets/icons/context_menu/delete.svg new file mode 100644 index 0000000..21c80c2 --- /dev/null +++ b/awesome/src/assets/icons/context_menu/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/desktop.svg b/awesome/src/assets/icons/context_menu/desktop.svg new file mode 100644 index 0000000..4f3aa1e --- /dev/null +++ b/awesome/src/assets/icons/context_menu/desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/entry.svg b/awesome/src/assets/icons/context_menu/entry.svg new file mode 100644 index 0000000..bf1fdae --- /dev/null +++ b/awesome/src/assets/icons/context_menu/entry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/launch.svg b/awesome/src/assets/icons/context_menu/launch.svg new file mode 100644 index 0000000..bfcfa70 --- /dev/null +++ b/awesome/src/assets/icons/context_menu/launch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/pin.svg b/awesome/src/assets/icons/context_menu/pin.svg new file mode 100644 index 0000000..01524e0 --- /dev/null +++ b/awesome/src/assets/icons/context_menu/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/context_menu/unpin.svg b/awesome/src/assets/icons/context_menu/unpin.svg new file mode 100644 index 0000000..a75c0ec --- /dev/null +++ b/awesome/src/assets/icons/context_menu/unpin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/config/dock.json b/awesome/src/config/dock.json new file mode 100644 index 0000000..d53c8c4 --- /dev/null +++ b/awesome/src/config/dock.json @@ -0,0 +1 @@ +[{"actions":["New"],"categories":"System;TerminalEmulator;","comment":"A fast, cross-platform, OpenGL terminal emulator","desktop_file":"/usr/share/applications/com.alacritty.Alacritty.desktop","exec":"alacritty","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/com.alacritty.Alacritty.svg","keywords":"","name":"Alacritty","terminal":""},{"actions":["new-window","new-private-window"],"categories":"Network;WebBrowser;","comment":"Access the Internet","desktop_file":"/var/lib/flatpak/exports/share/applications/com.brave.Browser.desktop","exec":"/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=brave --file-forwarding com.brave.Browser @@u %U @@","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/com.brave.Browser.svg","keywords":"","name":"Brave","terminal":""},{"actions":["new-empty-window"],"categories":"TextEditor;Development;IDE;","comment":"Code Editing. Redefined.","desktop_file":"/usr/share/applications/code.desktop","exec":"/usr/share/code/code --unity-launch %F","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/com.visualstudio.code.svg","keywords":"vscode;","name":"Visual Studio Code","terminal":""},{"actions":[],"categories":"Audio;Music;Player;AudioVideo;","comment":"","desktop_file":"/usr/local/share/applications/spotify.desktop","exec":"spotify %U","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/spotify-client.svg","keywords":"","name":"Spotify","terminal":""},{"actions":[],"categories":"Network;InstantMessaging;","comment":"All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone.","desktop_file":"/usr/share/applications/discord.desktop","exec":"/usr/share/discord/Discord","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/discord.svg","keywords":"","name":"Discord","terminal":""},{"actions":["Store","Community","Library","Servers","Screenshots","News","Settings","BigPicture","Friends"],"categories":"Network;FileTransfer;Game;","comment":"Application for managing and playing games on Steam","desktop_file":"/usr/share/applications/steam.desktop","exec":"/usr/games/steam %U","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/steam.svg","keywords":"Games","name":"Steam","terminal":""},{"actions":["Remove"],"categories":"Graphics;","comment":"Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great.","desktop_file":"/home/crylia/.local/share/applications/appimagekit_5de59b772d786d6e98102a035c80e40c-Ultimaker_Cura.desktop","exec":"/home/crylia/Applications/Ultimaker-Cura-5.0.0-linux_07ecc3f54905e865167d2bcd7cfe459c.AppImage %F","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/appimagekit-cura-icon.svg","keywords":"3D;Printing;","name":"Ultimaker Cura (5.0.0)","terminal":""},{"actions":[],"categories":"Game;","comment":"video game preservation platform","desktop_file":"/usr/share/applications/net.lutris.Lutris.desktop","exec":"lutris %U","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/lutris.svg","keywords":"gaming;wine;emulator;","name":"Lutris","terminal":""},{"actions":[],"categories":"Graphics;Science;Engineering","comment":"Feature based Parametric Modeler","desktop_file":"/usr/share/applications/freecad.desktop","exec":"/usr/bin/freecad --single-instance %F","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/freecad.svg","keywords":"","name":"FreeCAD","terminal":""},{"actions":[],"categories":"Graphics;3DGraphics;","comment":"3D modeling, animation, rendering and post-production","desktop_file":"/usr/share/applications/blender.desktop","exec":"blender %f","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/blender.svg","keywords":"3d;cg;modeling;animation;painting;sculpting;texturing;video editing;video tracking;rendering;render engine;cycles;game engine;python;","name":"Blender","terminal":""},{"actions":[],"categories":"Game;","comment":"Play this game on Steam","desktop_file":"/home/crylia/.local/share/applications/The Witcher 3 Wild Hunt.desktop","exec":"steam steam://rungameid/292030","icon":"/usr/share/icons/Papirus-Dark/64x64/categories/steam_icon_292030.svg","keywords":"","name":"The Witcher 3: Wild Hunt","terminal":""},{"actions":[],"categories":"Game;","comment":"Play this game on Steam","desktop_file":"/home/crylia/.local/share/applications/Hearts of Iron IV.desktop","exec":"steam steam://rungameid/394360","icon":"/home/crylia/.local/share/icons/hicolor/64x64/apps/steam_icon_394360.png","keywords":"","name":"Hearts of Iron IV","terminal":""}] \ No newline at end of file diff --git a/awesome/src/core/rules.lua b/awesome/src/core/rules.lua index 34ecdb3..393786a 100644 --- a/awesome/src/core/rules.lua +++ b/awesome/src/core/rules.lua @@ -36,7 +36,10 @@ awful.rules.rules = { role = { "AlarmWindow", "ConfigManager", - "pop-up" + "pop-up", + "dialog", + "modal", + "utility" } }, properties = { diff --git a/awesome/src/core/signals.lua b/awesome/src/core/signals.lua index dd0fcdb..f668716 100644 --- a/awesome/src/core/signals.lua +++ b/awesome/src/core/signals.lua @@ -34,6 +34,9 @@ client.connect_signal( if c.class == "Brave-browser" then c.floating = false end + if c.transient_for then + c.floating = true + end end ) @@ -75,15 +78,20 @@ client.connect_signal( "request::activate", "mouse_enter", { - raise = false + raise = true } ) end ) --- Takes a wibox.container.background and connects four signals to it ----@param widget wibox.container.background -function Hover_signal(widget, bg_override) +---@param widget wibox.container.background a background widget +---@param bg_override string | nil overrides the default bg hover color +---@param fg_override string | nil overrides the default fg hover color +---@param border_override string | nil overrides the default border hover color +---@param icon_override string | nil the old icon color +---@param icon_override_hover string | nil the hover effect color +function Hover_signal(widget, bg_override, fg_override, border_override, icon_override, icon_override_hover) local old_wibox, old_cursor, old_bg, old_fg, old_border local r, g, b @@ -91,6 +99,11 @@ function Hover_signal(widget, bg_override) widget.bg = widget.bg or "" widget.fg = widget.fg or "" widget.border_color = widget.border_color or "" + local icon = nil + if icon_override and icon_override_hover then + icon = widget:get_children_by_id("icon")[1].icon + widget.icon = widget:get_children_by_id("icon")[1] + end local mouse_enter = function() _, r, g, b, _ = widget.bg:get_rgba() @@ -100,12 +113,15 @@ function Hover_signal(widget, bg_override) end _, r, g, b, _ = widget.fg:get_rgba() old_fg = RGB_to_hex(r, g, b) - if old_fg then - widget.fg = old_fg .. "dd" + if fg_override or old_fg then + widget.fg = fg_override or old_fg .. "dd" end old_border = widget.border_color - if old_border then - widget.border_color = old_border .. "dd" + if border_override or old_border then + widget.border_color = border_override or old_border .. "dd" + end + if icon and widget.icon and icon_override and icon_override_hover then + widget.icon.image = gears.color.recolor_image(icon, icon_override_hover) end local w = mouse.current_wibox if w then @@ -114,23 +130,35 @@ function Hover_signal(widget, bg_override) end end - local button_press = function() + --[[ local button_press = function() if old_bg or bg_override then + if bg_override then + bg_override = bg_override .. "bb" + end widget.bg = bg_override or old_bg .. "bb" end - if old_fg then - widget.fg = old_fg .. "bb" + if fg_override or old_fg then + if fg_override then + fg_override = fg_override .. "bb" + end + widget.fg = fg_override or old_fg .. "bb" end end local button_release = function() if old_bg or bg_override then + if bg_override then + bg_override = bg_override .. "dd" + end widget.bg = bg_override or old_bg .. "dd" end - if old_fg then - widget.fg = old_fg .. "dd" + if fg_override or old_fg then + if fg_override then + fg_override = fg_override .. "dd" + end + widget.fg = fg_override or old_fg .. "dd" end - end + end ]] local mouse_leave = function() if old_bg then @@ -146,10 +174,13 @@ function Hover_signal(widget, bg_override) old_wibox.cursor = old_cursor old_wibox = nil end + if widget.icon and icon_override and icon_override_hover then + widget.icon.image = gears.color.recolor_image(icon, icon_override) + end end widget:connect_signal("mouse::enter", mouse_enter) - widget:connect_signal("button::press", button_press) - widget:connect_signal("button::release", button_release) + --widget:connect_signal("button::press", button_press) + --widget:connect_signal("button::release", button_release) widget:connect_signal("mouse::leave", mouse_leave) end diff --git a/awesome/src/lib/lgi-async-extra b/awesome/src/lib/lgi-async-extra new file mode 160000 index 0000000..45281ce --- /dev/null +++ b/awesome/src/lib/lgi-async-extra @@ -0,0 +1 @@ +Subproject commit 45281ceaf42140f131861ca6d1717912f94f0bfd diff --git a/awesome/src/modules/application_launcher/application.lua b/awesome/src/modules/application_launcher/application.lua index 39aa876..3fd5926 100644 --- a/awesome/src/modules/application_launcher/application.lua +++ b/awesome/src/modules/application_launcher/application.lua @@ -9,6 +9,12 @@ local dpi = require("beautiful").xresources.apply_dpi local gears = require("gears") local wibox = require("wibox") +local json = require("src.lib.json-lua.json-lua") + +local cm = require("src.modules.context_menu") + +local icondir = awful.util.getdir("config") .. "src/assets/icons/context_menu/" + return function() local application_grid = wibox.widget { @@ -34,7 +40,6 @@ return function() ---@return table widgets Unsorted widget table local function get_applications_from_file() local list = {} - --for _, file in ipairs(desktop_files) do local app_info = Gio.AppInfo local apps = app_info.get_all() for _, app in ipairs(apps) do @@ -83,8 +88,9 @@ return function() comment = Gio.DesktopAppInfo.get_string(desktop_app_info, "Comment") or "", exec = Gio.DesktopAppInfo.get_string(desktop_app_info, "Exec"), keywords = Gio.DesktopAppInfo.get_string(desktop_app_info, "Keywords") or "", - categories = Gio.DesktopAppInfo.get_string(desktop_app_info, "Cathegory") or "", + categories = Gio.DesktopAppInfo.get_categories(desktop_app_info) or "", terminal = Gio.DesktopAppInfo.get_string(desktop_app_info, "Terminal") == "true", + actions = Gio.DesktopAppInfo.list_actions(desktop_app_info), border_color = Theme_config.application_launcher.application.border_color, border_width = Theme_config.application_launcher.application.border_width, bg = Theme_config.application_launcher.application.bg, @@ -95,18 +101,84 @@ return function() widget = wibox.container.background } + local context_menu = cm({ + entries = { + { + name = "Execute as sudo", + icon = gears.color.recolor_image(icondir .. "launch.svg", Theme_config.context_menu.icon_color), + callback = function() + awesome.emit_signal("application_launcher::show") + awful.spawn("/home/crylia/.config/awesome/src/scripts/start_as_admin.sh " .. app_widget.exec) + end + }, + { + name = "Pin to dock", + icon = gears.color.recolor_image(icondir .. "pin.svg", Theme_config.context_menu.icon_color), + callback = function() + local handler = io.open("/home/crylia/.config/awesome/src/config/dock.json", "r") + if not handler then + return + end + local dock_table = json:decode(handler:read("a")) or {} + handler:close() + + ---@diagnostic disable-next-line: param-type-mismatch + table.insert(dock_table, { + name = app_widget.name or "", + icon = Get_gicon_path(app_info.get_icon(app)) or "", + comment = app_widget.comment or "", + exec = app_widget.exec or "", + keywords = app_widget.keywords or "", + categories = app_widget.categories or "", + terminal = app_widget.terminal or "", + actions = app_widget.actions or "", + desktop_file = Gio.DesktopAppInfo.get_filename(desktop_app_info) or "" + }) + local dock_encoded = json:encode(dock_table) + handler = io.open("/home/crylia/.config/awesome/src/config/dock.json", "w") + if not handler then + return + end + handler:write(dock_encoded) + handler:close() + awesome.emit_signal("dock::changed") + end + }, + { + name = "Add to desktop", + icon = gears.color.recolor_image(icondir .. "desktop.svg", Theme_config.context_menu.icon_color), + callback = function() + awesome.emit_signal("application_launcher::show") + --!TODO: Add to desktop + end + } + } + }) + -- Execute command on left click and hide launcher app_widget:buttons( gears.table.join( - awful.button( - {}, - 1, - nil, - function() - awful.spawn.with_shell(app_widget.exec) + awful.button({ + modifiers = {}, + button = 1, + on_release = function() + Gio.AppInfo.launch_uris_async(app) awesome.emit_signal("application_launcher::show") end - ) + }), + awful.button({ + modifiers = {}, + button = 3, + on_release = function() + if not context_menu then + return + end + -- add offset so mouse is above widget, this is so the mouse::leave event triggers always + context_menu.x = mouse.coords().x - 10 + context_menu.y = mouse.coords().y - 10 + context_menu.visible = not context_menu.visible + end + }) ) ) Hover_signal(app_widget) @@ -220,15 +292,7 @@ return function() awesome.emit_signal("searchbar::stop") local selected_widget = application_grid:get_widgets_at(curser.y, curser.x)[1] - if selected_widget.terminal then - awful.spawn(User_config.terminal .. - " -e " .. - selected_widget.exec:gsub("%%F", ""):gsub("%%u", ""):gsub("%%U", ""):gsub("%%f", ""):gsub("%%i", ""):gsub("%%c" - , ""):gsub("%%k", "")) - else - awful.spawn.with_shell(selected_widget.exec:gsub("%%F", ""):gsub("%%u", ""):gsub("%%U", ""):gsub("%%f", ""):gsub("%%i" - , ""):gsub("%%c", ""):gsub("%%k", "")) - end + Gio.AppInfo.launch_uris_async(Gio.AppInfo.create_from_commandline(selected_widget.exec, nil, 0)) end ) diff --git a/awesome/src/modules/application_launcher/init.lua b/awesome/src/modules/application_launcher/init.lua index 5160b39..a64bb0f 100644 --- a/awesome/src/modules/application_launcher/init.lua +++ b/awesome/src/modules/application_launcher/init.lua @@ -62,6 +62,9 @@ return function(s) function() if mouse.screen == s then application_container.visible = not application_container.visible + if application_container.visible == false then + awesome.emit_signal("searchbar::stop") + end end if application_container.visible then awesome.emit_signal("searchbar::start") diff --git a/awesome/src/modules/application_launcher/searchbar.lua b/awesome/src/modules/application_launcher/searchbar.lua index 110b64b..5bec50b 100644 --- a/awesome/src/modules/application_launcher/searchbar.lua +++ b/awesome/src/modules/application_launcher/searchbar.lua @@ -243,7 +243,6 @@ return function() searchbar.s_background.fg = Theme_config.application_launcher.searchbar.fg search_text:set_markup(promt_text_with_cursor("", 1)) end - end ) diff --git a/awesome/src/modules/context_menu.lua b/awesome/src/modules/context_menu.lua new file mode 100644 index 0000000..eaf8e75 --- /dev/null +++ b/awesome/src/modules/context_menu.lua @@ -0,0 +1,112 @@ +--------------------------------------- +-- This is the brightness_osd module -- +--------------------------------------- + +-- Awesome Libs +local awful = require("awful") +local dpi = require("beautiful").xresources.apply_dpi +local gears = require("gears") +local wibox = require("wibox") + +return function(args) + if not args then + return + end + + local function get_entries() + + local menu_entries = { layout = wibox.layout.fixed.vertical, spacing = dpi(10) } + + if args.entries then + for _, entry in ipairs(args.entries) do + local menu_entry = wibox.widget { + { + { + { + { -- Icon + widget = wibox.widget.imagebox, + image = gears.color.recolor_image(entry.icon, Theme_config.context_menu.entry.icon_color), + valign = "center", + halign = "center", + resize = true, + icon = entry.icon, + id = "icon" + }, + widget = wibox.container.constraint, + stragety = "exact", + width = dpi(24), + height = dpi(24), + id = "const" + }, + { -- Text + widget = wibox.widget.textbox, + text = entry.name, + id = "name" + }, + id = "lay", + spacing = dpi(5), + layout = wibox.layout.fixed.horizontal + }, + margins = dpi(10), + widget = wibox.container.margin, + id = "mar" + }, + bg = Theme_config.context_menu.entry.bg, + fg = Theme_config.context_menu.entry.fg, + shape = Theme_config.context_menu.entry.shape, + border_width = Theme_config.context_menu.entry.border_width, + border_color = Theme_config.context_menu.entry.border_color, + widget = wibox.container.background, + id = "menu_entry" + } + + menu_entry:buttons(gears.table.join( + awful.button({ + modifiers = {}, + button = 1, + on_release = function() + awesome.emit_signal("context_menu::hide") + entry.callback() + end + }) + )) + + Hover_signal(menu_entry, nil, Theme_config.context_menu.entry.hover_fg, + Theme_config.context_menu.entry.hover_border, Theme_config.context_menu.entry.icon_color, + Theme_config.context_menu.entry.icon_color_hover) + table.insert(menu_entries, menu_entry) + end + end + return menu_entries + end + + local menu = awful.popup { + widget = { + get_entries(), + margins = dpi(10), + widget = wibox.container.margin + }, + bg = Theme_config.context_menu.bg, + fg = Theme_config.context_menu.fg, + border_width = Theme_config.context_menu.border_width, + border_color = Theme_config.context_menu.border_color, + shape = Theme_config.context_menu.shape, + x = mouse.coords().x, + y = mouse.coords().y, + visible = false, + ontop = true, + placement = awful.placement.no_offscreen, + } + + menu:connect_signal("mouse::leave", function() + awesome.emit_signal("context_menu::hide") + end) + + awesome.connect_signal( + "context_menu::hide", + function() + menu.visible = false + end + ) + return menu +end diff --git a/awesome/src/modules/crylia_bar/dock.lua b/awesome/src/modules/crylia_bar/dock.lua index 7242b0d..8971db8 100644 --- a/awesome/src/modules/crylia_bar/dock.lua +++ b/awesome/src/modules/crylia_bar/dock.lua @@ -3,30 +3,29 @@ -------------------------------------------------------------------------------------------------------------- -- Awesome Libs local awful = require("awful") +local async = require("async") local dpi = require("beautiful").xresources.apply_dpi local Gio = require("lgi").Gio local gears = require("gears") local wibox = require("wibox") -return function(screen, programs) +local json = require("src.lib.json-lua.json-lua") + +local icondir = awful.util.getdir("config") .. "src/assets/icons/context_menu/" + +local cm = require("src.modules.context_menu") + +return function(screen) + + local cm_open = false + + local dock_element_ammount = 0 ---Creates a new program widget for the dock - ---@param program string | nil The name of the .desktop file + ---@param program string | function The name of the .desktop file ---@param size number The size of the widget ---@return widox.widget | nil The widget or nil if the program is not found local function create_dock_element(program, size) - if not program then - return - end - - local desktop_app_info = Gio.DesktopAppInfo.new_from_filename(program) - if not desktop_app_info then - return - end - local gicon = Gio.Icon.new_for_string(Gio.DesktopAppInfo.get_string(desktop_app_info, "Icon")) - if not gicon then - return - end local dock_element = wibox.widget { { @@ -35,7 +34,7 @@ return function(screen, programs) { resize = true, widget = wibox.widget.imagebox, - image = Get_gicon_path(gicon) or "", + image = program.icon or "", valign = "center", halign = "center", id = "icon", @@ -64,36 +63,153 @@ return function(screen, programs) widget = wibox.container.margin } - for _, c in ipairs(client.get()) do - if string.lower(c.class):match(Get_gicon_path(gicon) or "") and c == client.focus then - dock_element.background.bg = Theme_config.dock.element_focused_bg - end - end - Hover_signal(dock_element.background, Theme_config.dock.element_focused_bg .. "dd") - dock_element:connect_signal( - "button::press", - function(_, _, _, button) - if button == 1 then - awful.spawn(Gio.DesktopAppInfo.get_string(desktop_app_info, "Exec"):gsub("%%F", ""):gsub("%%u", ""):gsub("%%U" - , ""):gsub("%%f", ""):gsub("%%i", ""):gsub("%%c" - , ""):gsub("%%k", "")) + local DAI = Gio.DesktopAppInfo.new_from_filename(program.desktop_file) + + local action_entries = {} + for _, action in ipairs(program.actions) do + table.insert(action_entries, { + name = Gio.DesktopAppInfo.get_action_name(DAI, action) or "", + icon = action.icon or icondir .. "entry.svg", + callback = function() + Gio.DesktopAppInfo.launch_action(DAI, action) end + }) + end + + table.insert(action_entries, { + name = "Remove from Dock", + icon = icondir .. "entry.svg", + callback = function() + local data = io.open("/home/crylia/.config/awesome/src/config/dock.json", "r") + if not data then + return + end + local dock = json:decode(data:read("a")) + data:close() + for i, v in ipairs(dock) do + if v.desktop_file == program.desktop_file then + if type(dock) == "table" then + table.remove(dock, i) + end + break + end + end + data = io.open("/home/crylia/.config/awesome/src/config/dock.json", "w") + if not data then + return + end + data:write(json:encode(dock)) + data:close() + awesome.emit_signal("dock::changed") + end + }) + + local context_menu = cm({ + entries = action_entries + }) + + dock_element:buttons(gears.table.join( + awful.button({ + modifiers = {}, + button = 1, + on_release = function() + Gio.AppInfo.launch_uris_async(Gio.AppInfo.create_from_commandline(program.exec, nil, 0)) + end + }), + awful.button({ + modifiers = {}, + button = 3, + on_release = function() + if not context_menu then + return + end + -- add offset so mouse is above widget, this is so the mouse::leave event triggers always + context_menu.x = mouse.coords().x - 10 + context_menu.y = mouse.coords().y + 10 - context_menu.height + context_menu.visible = not context_menu.visible + cm_open = context_menu.visible + end + }) + )) + + awesome.connect_signal( + "context_menu::hide", + function() + cm_open = false + awesome.emit_signal("dock::check_for_dock_hide") end ) awful.tooltip { objects = { dock_element }, - text = Gio.DesktopAppInfo.get_string(desktop_app_info, "Name"), + text = program.name, mode = "outside", preferred_alignments = "middle", margins = dpi(10) } + dock_element_ammount = dock_element_ammount + 1 return dock_element end + --- Indicators under the elements to indicate various open states + local function create_incicator_widget() + local container = { layout = wibox.layout.flex.horizontal } + + local data = io.open("/home/crylia/.config/awesome/src/config/dock.json", "r") + + if not data then + return + end + + local prog = json:decode(data:read("a")) + for _, pr in ipairs(prog) do + local indicators = { layout = wibox.layout.flex.horizontal, spacing = dpi(5) } + local col = Theme_config.dock.indicator_bg + for _, c in ipairs(client.get()) do + local icon_name = pr.icon + if icon_name:match(string.lower(c.class or c.name)) or c.class:match(string.lower(icon_name)) or + c.name:match(string.lower(icon_name)) then + if c == client.focus then + col = Theme_config.dock.indicator_focused_bg + elseif c.urgent then + col = Theme_config.dock.indicator_urgent_bg + elseif c.maximized then + col = Theme_config.dock.indicator_maximized_bg + elseif c.minimized then + col = Theme_config.dock.indicator_minimized_bg + elseif c.fullscreen then + col = Theme_config.dock.indicator_fullscreen_bg + else + col = Theme_config.dock.indicator_bg + end + table.insert(indicators, wibox.widget { + widget = wibox.container.background, + shape = gears.shape.rounded_rect, + forced_height = dpi(3), + bg = col, + forced_width = dpi(5), + }) + end + end + table.insert(container, wibox.widget { + indicators, + forced_height = dpi(5), + forced_width = dpi(User_config.dock_icon_size), + left = dpi(5), + right = dpi(5), + widget = wibox.container.margin, + }) + end + return wibox.widget { + container, + bottom = dpi(5), + widget = wibox.container.margin, + } + end + --- The container bar where the elements/program widgets sit in local dock = awful.popup { widget = wibox.container.background, @@ -122,27 +238,37 @@ return function(screen, programs) placement = function(c) awful.placement.bottom(c) end, } + --- List of all elements/program widgets + local dock_elements = { layout = wibox.layout.fixed.horizontal } + --- This function creates a list with all dock elements/program widgets - ---@param pr table A list of .desktop files - ---@return table string list of widgets - local function get_dock_elements(pr) - local dock_elements = { layout = wibox.layout.fixed.horizontal } + ---@return table|nil string list of widgets + local function get_dock_elements() + dock_element_ammount = 0 + dock_elements = { layout = wibox.layout.fixed.horizontal } - for i, p in ipairs(pr) do - dock_elements[i] = create_dock_element(Get_desktop_values(p), User_config.dock_icon_size) + local data = io.open("/home/crylia/.config/awesome/src/config/dock.json", "r") + if not data then + return end - - return dock_elements + local dock_data = json:decode(data:read("a")) + for _, program in ipairs(dock_data) do + table.insert(dock_elements, create_dock_element(program, User_config.dock_icon_size)) + end + dock:setup { + dock_elements, + create_incicator_widget(), + layout = wibox.layout.fixed.vertical + } end - --- List of all elements/program widgets - local dock_elements = get_dock_elements(programs) + get_dock_elements() --- Function to get an empty list with the same ammount as dock_element - local function get_fake_elements(amount) + local function get_fake_elements() local fake_elements = { layout = wibox.layout.fixed.horizontal } - for i = 0, amount, 1 do + for i = 0, dock_element_ammount, 1 do fake_elements[i] = wibox.widget { bg = '00000000', forced_width = User_config.dock_icon_size + dpi(20), @@ -154,64 +280,8 @@ return function(screen, programs) return fake_elements end - --- Indicators under the elements to indicate various open states - local function create_incicator_widget(prog) - local container = { layout = wibox.layout.flex.horizontal } - local clients = client.get() - for index, pr in ipairs(prog) do - local desktop_app_info = Gio.DesktopAppInfo.new_from_filename(Get_desktop_values(pr)) - if desktop_app_info then - local gicon = Gio.Icon.new_for_string(Gio.DesktopAppInfo.get_string(desktop_app_info, "Icon")) - if gicon then - local indicators = { layout = wibox.layout.flex.horizontal, spacing = dpi(5) } - local col = Theme_config.dock.indicator_bg - for i, c in ipairs(clients) do - local icon_name = Get_gicon_path(gicon) or "" - if icon_name:match(string.lower(c.class or c.name)) or c.class:match(string.lower(icon_name)) or - c.name:match(string.lower(icon_name)) then - if c == client.focus then - col = Theme_config.dock.indicator_focused_bg - elseif c.urgent then - col = Theme_config.dock.indicator_urgent_bg - elseif c.maximized then - col = Theme_config.dock.indicator_maximized_bg - elseif c.minimized then - col = Theme_config.dock.indicator_minimized_bg - elseif c.fullscreen then - col = Theme_config.dock.indicator_fullscreen_bg - else - col = Theme_config.dock.indicator_bg - end - indicators[i] = wibox.widget { - widget = wibox.container.background, - shape = gears.shape.rounded_rect, - forced_height = dpi(3), - bg = col, - forced_width = dpi(5), - } - end - end - container[index] = wibox.widget { - indicators, - forced_height = dpi(5), - forced_width = dpi(User_config.dock_icon_size), - left = dpi(5), - right = dpi(5), - widget = wibox.container.margin, - } - end - end - end - - return wibox.widget { - container, - bottom = dpi(5), - widget = wibox.container.margin, - } - end - fakedock:setup { - get_fake_elements(#programs), + get_fake_elements(), type = 'dock', layout = wibox.layout.fixed.vertical } @@ -302,7 +372,12 @@ return function(screen, programs) check_for_dock_hide(screen) dock:setup { dock_elements, - create_incicator_widget(programs), + create_incicator_widget(), + layout = wibox.layout.fixed.vertical + } + fakedock:setup { + get_fake_elements(), + type = 'dock', layout = wibox.layout.fixed.vertical } end @@ -314,7 +389,12 @@ return function(screen, programs) check_for_dock_hide(screen) dock:setup { dock_elements, - create_incicator_widget(programs), + create_incicator_widget(), + layout = wibox.layout.fixed.vertical + } + fakedock:setup { + get_fake_elements(), + type = 'dock', layout = wibox.layout.fixed.vertical } end @@ -326,7 +406,12 @@ return function(screen, programs) check_for_dock_hide(screen) dock:setup { dock_elements, - create_incicator_widget(programs), + create_incicator_widget(), + layout = wibox.layout.fixed.vertical + } + fakedock:setup { + get_fake_elements(), + type = 'dock', layout = wibox.layout.fixed.vertical } end @@ -338,9 +423,38 @@ return function(screen, programs) check_for_dock_hide(screen) dock:setup { dock_elements, - create_incicator_widget(programs), + create_incicator_widget(), layout = wibox.layout.fixed.vertical } + fakedock:setup { + get_fake_elements(), + type = 'dock', + layout = wibox.layout.fixed.vertical + } + end + ) + + awesome.connect_signal( + "dock::changed", + function() + get_dock_elements() + dock:setup { + dock_elements, + create_incicator_widget(), + layout = wibox.layout.fixed.vertical + } + fakedock:setup { + get_fake_elements(), + type = 'dock', + layout = wibox.layout.fixed.vertical + } + end + ) + + awesome.connect_signal( + "dock::check_for_dock_hide", + function() + dock_intelligent_hide:again() end ) @@ -354,13 +468,16 @@ return function(screen, programs) dock:connect_signal( "mouse::leave", function() + if cm_open then + return + end check_for_dock_hide(screen) dock_intelligent_hide:again() end ) dock:setup { dock_elements, - create_incicator_widget(programs), + create_incicator_widget(), layout = wibox.layout.fixed.vertical } end diff --git a/awesome/src/modules/crylia_bar/init.lua b/awesome/src/modules/crylia_bar/init.lua index 02ecade..73d2c92 100644 --- a/awesome/src/modules/crylia_bar/init.lua +++ b/awesome/src/modules/crylia_bar/init.lua @@ -67,5 +67,5 @@ return function(s) end end end - require("src.modules.crylia_bar.dock")(s, User_config.dock_programs) + require("src.modules.crylia_bar.dock")(s) end diff --git a/awesome/src/modules/window_switcher/window_elements.lua b/awesome/src/modules/window_switcher/window_elements.lua index 7f9c1d5..082bc15 100644 --- a/awesome/src/modules/window_switcher/window_elements.lua +++ b/awesome/src/modules/window_switcher/window_elements.lua @@ -48,6 +48,7 @@ return function() id = "icon", --!ADD FALLBACK ICON!-- image = Get_icon(client.class, client.name) or client.icon, + --image = gears.surface(client.content), valign = "center", halign = "center", widget = wibox.widget.imagebox diff --git a/awesome/src/scripts/start_as_admin.sh b/awesome/src/scripts/start_as_admin.sh new file mode 100755 index 0000000..61b72fc --- /dev/null +++ b/awesome/src/scripts/start_as_admin.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +PROGRAM=$1 + +pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY $PROGRAM diff --git a/awesome/src/theme/theme_config.lua b/awesome/src/theme/theme_config.lua index 55cc9c2..73810c6 100644 --- a/awesome/src/theme/theme_config.lua +++ b/awesome/src/theme/theme_config.lua @@ -468,6 +468,29 @@ Theme_config.application_launcher = { end, } } + +Theme_config.context_menu = { + bg = color["Grey900"], + border_color = color["Grey800"], + border_width = dpi(4), + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, dpi(8)) + end, + fg = color["Grey100"], + entry = { + bg = color["Grey900"], + fg = color["Grey100"], + border_color = color["Grey800"], + border_width = dpi(2), + hover_fg = color["Teal200"], + hover_border = color["Teal200"], + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, dpi(4)) + end, + icon_color = color["Grey100"], + icon_color_hover = color["Teal200"] + } +} --#endregion --[[ diff --git a/awesome/src/theme/user_config.lua b/awesome/src/theme/user_config.lua index 612c1f6..4e89697 100644 --- a/awesome/src/theme/user_config.lua +++ b/awesome/src/theme/user_config.lua @@ -70,32 +70,6 @@ User_config = { ]] -- dock_icon_size = dpi(64), - --[[ - Add your programs to the dock. You need to provide the name of the .desktop file - You can find those in the /usr/share/applications or $HOME/.local/share/applications directory. - Some .desktop files are more hidden, for more information look at: $XDG_DATA_DIRS/applications - Example: - "com.alacritty.Alacritty.desktop", - "com.spotify.Client.desktop", - "firefox.desktop", - ]] -- - dock_programs = { - "com.alacritty.Alacritty.desktop", - "com.brave.Browser.desktop", - "steam.desktop", - "discord.desktop", - "spotify.desktop", - "code.desktop", - "arduino-arduinoide.desktop", - "us.zoom.Zoom.desktop", - "thunderbird.desktop", - "appimagekit_5de59b772d786d6e98102a035c80e40c-Ultimaker_Cura.desktop", - "blender.desktop", - "freecad.desktop", - "The Witcher 3 Wild Hunt.desktop", - "Microsoft Flight Simulator.desktop" - }, - --[[ This is the program that will be started when clicking on the battery widget If you don't want any just leave it as nil diff --git a/awesome/src/tools/auto_starter.lua b/awesome/src/tools/auto_starter.lua index dd13865..b4a884c 100644 --- a/awesome/src/tools/auto_starter.lua +++ b/awesome/src/tools/auto_starter.lua @@ -2,6 +2,6 @@ local awful = require("awful") return function(table) for _, t in ipairs(table) do - awful.spawn(t); + --awful.spawn(t); end end