From 4bd5b1940dbfb7d8275cc8a55b870b5fde55ebfc Mon Sep 17 00:00:00 2001 From: Yauhen Kirylau Date: Tue, 26 Jun 2018 16:43:20 +0200 Subject: [PATCH] feat(themes; beautiful): add partial support for GTK+3 themes (#2129) --- docs/01-readme.md | 1 + docs/ldoc.css | 4 - lib/beautiful/gtk.lua | 293 ++++++++++++++++++++++++++++++++++ lib/beautiful/init.lua | 2 + tests/run.sh | 4 +- themes/gtk/theme.lua | 350 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 649 insertions(+), 5 deletions(-) create mode 100644 lib/beautiful/gtk.lua create mode 100644 themes/gtk/theme.lua diff --git a/docs/01-readme.md b/docs/01-readme.md index 404b2ecd..219ddfa3 100644 --- a/docs/01-readme.md +++ b/docs/01-readme.md @@ -77,6 +77,7 @@ Additionally, the following optional dependencies exist: - libexecinfo on systems where libc does not provide `backtrace_symbols()` to generate slightly better backtraces on crashes - `Xephyr` or `Xvfb` for running integration tests +- [GTK+ >= 3.10](https://www.gtk.org/) for `./themes/gtk/` ## Running Awesome diff --git a/docs/ldoc.css b/docs/ldoc.css index 2e129920..6cea44f1 100644 --- a/docs/ldoc.css +++ b/docs/ldoc.css @@ -191,10 +191,6 @@ table th, table td { padding: 2px; } -#content p, #content table, #content ol, #content ul, #content dl { - max-width: 900px; -} - #about { padding: 15px; padding-left: 16em; diff --git a/lib/beautiful/gtk.lua b/lib/beautiful/gtk.lua new file mode 100644 index 00000000..df71b1a3 --- /dev/null +++ b/lib/beautiful/gtk.lua @@ -0,0 +1,293 @@ +--------------------------------------------------------------------------- +--- Querying current GTK+ 3 theme via GtkStyleContext. +-- +-- @author Yauheni Kirylau <yawghen@gmail.com> +-- @copyright 2016-2017 Yauheni Kirylau +-- @module beautiful.gtk +--------------------------------------------------------------------------- +local get_dpi = require("beautiful.xresources").get_dpi +local gears_debug = require("gears.debug") +local gears_math = require("gears.math") +local join = require("gears.table").join +local unpack = unpack or table.unpack -- luacheck: globals unpack (compatibility with Lua 5.1) + + +local gtk = { + cached_theme_variables = nil +} + + +local function convert_gtk_channel_to_hex(channel_value) + return string.format("%02x", gears_math.round(channel_value * 255)) +end + +local function convert_gtk_color_to_hex(gtk_color) + return "#" .. + convert_gtk_channel_to_hex(gtk_color.red) .. + convert_gtk_channel_to_hex(gtk_color.green) .. + convert_gtk_channel_to_hex(gtk_color.blue) .. + convert_gtk_channel_to_hex(gtk_color.alpha) +end + +local function lookup_gtk_color_to_hex(_style_context, color_name) + local gtk_color = _style_context:lookup_color(color_name) + if not gtk_color then + return nil + end + return convert_gtk_color_to_hex(gtk_color) +end + +local function get_gtk_property(_style_context, property_name) + local state = _style_context:get_state() + local property = _style_context:get_property(property_name, state) + if not property then + return nil + end + return property.value +end + +local function get_gtk_color_property_to_hex(_style_context, property_name) + return convert_gtk_color_to_hex( + get_gtk_property(_style_context, property_name) + ) +end + +local function read_gtk_color_properties_from_widget(gtk_widget, properties) + local _style_context = gtk_widget:get_style_context() + local result = {} + for result_key, style_context_property in pairs(properties) do + result[result_key] = get_gtk_color_property_to_hex( + _style_context, style_context_property + ) + end + return result +end + + +-- luacheck: max comment line length 300 + +--- Get GTK+3 theme variables from GtkStyleContext +-- @treturn table Key-value table with the following structure: +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +-- +--
Result key StyleContext key StyleContext fallback #1 StyleContext fallback #2 GTK Widget fallback
`font_size` Label font-size
`font_family` Label font-family
`bg_color` `theme_bg_color` Window bg
`fg_color` `theme_fg_color` Window fg
`base_color` `theme_base_color` Entry bg
`text_color` `theme_text_color` Entry fg
`button_bg_color` `theme_button_bg_color` `theme_bg_color` Button bg
`button_fg_color` `theme_button_fg_color` `theme_fg_color` Button fg
`button_border_color` Button border-color
`button_border_radius` Button border-radius
`button_border_width` Button border-top-width
`selected_bg_color` `theme_selected_bg_color` ToggleButton bg
`selected_fg_color` `theme_selected_fg_color` ToggleButton fg
`menubar_bg_color` `menubar_bg_color` `theme_bg_color` HeaderBar bg
`menubar_fg_color` `menubar_fg_color` `theme_fg_color` HeaderBar fg
`header_button_bg_color` `header_button_bg_color` `menubar_bg_color` `theme_bg_color` HeaderBar > Button bg
`header_button_fg_color` `header_button_fg_color` `menubar_fg_color` `theme_fg_color` HeaderBar > Button fg
`header_button_border_color` HeaderBar > Button border-color
`error_color` `error_color` `error_bg_color` destructive Button bg
`error_bg_color` `error_bg_color` `error_color` destructive Button bg
`error_fg_color` `error_fg_color` `theme_selected_fg_color` destructive Button fg
`warning_color` `warning_color` `warning_bg_color`
`warning_bg_color` `warning_bg_color` `warning_color`
`warning_fg_color` `warning_fg_color` `theme_selected_fg_color`
`success_color` `success_color` `success_bg_color`
`success_bg_color` `success_bg_color` `success_color`
`success_fg_color` `success_fg_color` `theme_selected_fg_color`
`tooltip_bg_color` `theme_tooltip_bg_color` `theme_bg_color`
`tooltip_fg_color` `theme_tooltip_fg_color` `theme_fg_color`
`osd_bg_color` `osd_bg` `theme_tooltip_bg_color` `theme_bg_color`
`osd_fg_color` `osd_fg` `theme_tooltip_fg_color` `theme_fg_color`
`osd_border_color` `osd_borders_color` `osd_fg_color`
`wm_bg_color` `wm_bg` `menubar_bg_color` `theme_bg_color` HeaderBar bg
`wm_border_focused_color` `wm_border_focused` `theme_selected_bg_color` ToggleButton bg
`wm_border_unfocused_color` `wm_border_unfocused` `wm_border` `menubar_bg_color` HeaderBar bg
`wm_title_focused_color` `wm_title_focused` `wm_title` `theme_selected_fg_color` ToggleButton fg
`wm_title_unfocused_color` `wm_title_unfocused` `wm_unfocused_title` `menubar_fg_color` HeaderBar fg
`wm_icons_focused_color` `wm_icons_focused` `wm_title_focused` `theme_selected_fg_color` ToggleButton fg
`wm_icons_unfocused_color` `wm_icons_unfocused` `wm_title_unfocused` `menubar_fg_color` HeaderBar fg
+-- +function gtk.get_theme_variables() + if gtk.cached_theme_variables then + return gtk.cached_theme_variables + end + + local result = {} + local _gtk_status, Gtk = pcall(function() + return require('lgi').Gtk + end) + if not _gtk_status or not Gtk then + gears_debug.print_warning( + "Can't load GTK+3 introspection. ".. + "Seems like GTK+3 is not installed or `lua-lgi` was built with an incompatible GTK+3 version." + ) + return nil + end + local _window_status, window = pcall(function() + return Gtk.Window.new(Gtk.WindowType.TOPLEVEL) + end) + if not _window_status or not window then + gears_debug.print_warning( + "Can't create GTK+3 window. ".. + "Seems like GTK+3 theme is not set correctly or `lua-lgi` was built with an incompatible GTK+3 version." + ) + return nil + end + local style_context = window:get_style_context() + + result = join(result, read_gtk_color_properties_from_widget( + window, { + bg_color="background-color", + fg_color="color", + } + )) + local label = Gtk.Label() + local label_style_context = label:get_style_context() + local gdk_scale = tonumber(os.getenv("GDK_SCALE") or 1.0) + local xrdb_scale = get_dpi() / 96 + local pt_to_px_ratio = 1+1/3 + result["font_size"] = get_gtk_property( + label_style_context, "font-size" + ) * gdk_scale / xrdb_scale / pt_to_px_ratio + result["font_family"] = get_gtk_property( + label_style_context, "font-family" + )[1] + + result = join(result, read_gtk_color_properties_from_widget( + Gtk.Entry(), { + base_color="background-color", + text_color="color", + } + )) + result = join(result, read_gtk_color_properties_from_widget( + Gtk.ToggleButton(), { + selected_bg_color="background-color", + selected_fg_color="color", + } + )) + local button = Gtk.Button() + result = join(result, read_gtk_color_properties_from_widget( + button, { + button_bg_color="background-color", + button_fg_color="color", + button_border_color="border-color", + } + )) + local button_style_context = button:get_style_context() + for result_key, style_context_property in pairs({ + button_border_radius="border-radius", + button_border_width="border-top-width", + }) do + local state = style_context:get_state() + local property = button_style_context:get_property(style_context_property, state) + result[result_key] = property.value + property:unset() + end + + local headerbar = Gtk.HeaderBar() + window:set_titlebar(headerbar) + result = join(result, read_gtk_color_properties_from_widget( + headerbar, { + menubar_bg_color="background-color", + } + )) + + if result.menubar_bg_color and result.menubar_bg_color ~= "#00000000" then + headerbar:add(label) + result = join(result, read_gtk_color_properties_from_widget( + label, { + menubar_fg_color="color", + } + )) + end + + headerbar:add(button) + result = join(result, read_gtk_color_properties_from_widget( + button, { + header_button_bg_color="background-color", + header_button_border_color="border-color", + } + )) + if result.header_button_bg_color and result.header_button_bg_color ~= "#00000000" then + result = join(result, read_gtk_color_properties_from_widget( + button, { + header_button_fg_color="color", + } + )) + end + + local error_button = Gtk.Button() + error_button:get_style_context():add_class("destructive-action") + result = join(result, read_gtk_color_properties_from_widget( + error_button, { + error_bg_color="background-color", + error_fg_color="color", + } + )) + + for _, color_data in ipairs({ + {"bg_color", "theme_bg_color"}, + {"fg_color", "theme_fg_color"}, + {"base_color", "theme_base_color"}, + {"text_color", "theme_text_color"}, + {"selected_bg_color", "theme_selected_bg_color"}, + {"selected_fg_color", "theme_selected_fg_color"}, + -- + {"tooltip_bg_color", "theme_tooltip_bg_color", "bg_color"}, + {"tooltip_fg_color", "theme_tooltip_fg_color", "fg_color"}, + {"osd_bg_color", "osd_bg", "tooltip_bg_color"}, + {"osd_fg_color", "osd_fg", "tooltip_fg_color"}, + {"osd_border_color", "osd_borders_color", "osd_fg_color"}, + {"menubar_bg_color", "menubar_bg_color", "bg_color"}, + {"menubar_fg_color", "menubar_fg_color", "fg_color"}, + -- + {"button_bg_color", "button_bg_color", "bg_color"}, + {"button_fg_color", "button_fg_color", "fg_color"}, + {"header_button_bg_color", "header_button_bg_color", "menubar_bg_color"}, + {"header_button_fg_color", "header_button_fg_color", "menubar_fg_color"}, + -- + {"wm_bg_color", "wm_bg", "menubar_bg_color"}, + {"wm_border_focused_color", "wm_border_focused", "selected_bg_color"}, + {"wm_border_unfocused_color", "wm_border_unfocused", "wm_border", "menubar_bg_color"}, + {"wm_title_focused_color", "wm_title_focused", "wm_title", "selected_fg_color"}, + {"wm_title_unfocused_color", "wm_title_unfocused", "wm_unfocused_title", "menubar_fg_color"}, + {"wm_icons_focused_color", "wm_icons_focused", "wm_title_focused_color", "selected_fg_color"}, + {"wm_icons_unfocused_color", "wm_icons_unfocused", "wm_title_unfocused_color", "menubar_fg_color"}, + -- + {"error_color", "error_color"}, + {"error_bg_color", "error_bg_color", "error_color"}, + {"error_fg_color", "error_fg_color", "selected_fg_color"}, + {"error_color", "error_color", "error_bg_color"}, + {"warning_color", "warning_color"}, + {"warning_bg_color", "warning_bg_color", "warning_color"}, + {"warning_fg_color", "warning_fg_color", "selected_fg_color"}, + {"warning_color", "warning_color", "warning_bg_color"}, + {"success_color", "success_color"}, + {"success_bg_color", "success_bg_color", "success_color"}, + {"success_fg_color", "success_fg_color", "selected_fg_color"}, + {"success_color", "success_color", "success_bg_color"}, + }) do + local result_key, style_context_key, fallback_key, fallback_key2 = unpack(color_data) + result[result_key] = lookup_gtk_color_to_hex(style_context, style_context_key) or ( + result[result_key] ~= "#00000000" and + result[result_key] or + result[fallback_key] or + result[fallback_key2] or + result[result_key] -- <-- here is for case if it was meant to be a fully transparent color on purpose + ) + if not result[result_key] then + gears_debug.print_warning("Can't read color '" .. style_context_key .. "' from GTK+3 theme.") + end + end + + window:destroy() + gtk.cached_theme_variables = result + return result +end + + +return gtk diff --git a/lib/beautiful/init.lua b/lib/beautiful/init.lua index 0cc38087..bdc43f33 100644 --- a/lib/beautiful/init.lua +++ b/lib/beautiful/init.lua @@ -22,10 +22,12 @@ local protected_call = require("gears.protected_call") local xresources = require("beautiful.xresources") local theme_assets = require("beautiful.theme_assets") +local gtk = require("beautiful.gtk") local beautiful = { xresources = xresources, theme_assets = theme_assets, + gtk = gtk, mt = {} } diff --git a/tests/run.sh b/tests/run.sh index f89b5a72..008bbecc 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -245,9 +245,11 @@ for f in $tests; do pattern+='|^.{19} W: awesome:.*' fi error="$(grep --color -o --binary-files=text -E "$pattern" "$awesome_log" || true)" + # Filter out false positive errors: + error="$(echo "$error" | grep -vE ".{19} W: awesome: (Can't read color .* from GTK)" || true)" if [[ $fail_on_warning ]]; then # Filter out ignored warnings. - error="$(echo "$error" | grep -vE ".{19} W: awesome: (a_glib_poll|Cannot reliably detect EOF|beautiful: can't get colorscheme from xrdb)" || true)" + error="$(echo "$error" | grep -vE ".{19} W: awesome: (a_glib_poll|Cannot reliably detect EOF|beautiful: can't get colorscheme from xrdb|Can't read color .* from GTK+3 theme)" || true)" fi if [[ -n "$error" ]]; then color_red diff --git a/themes/gtk/theme.lua b/themes/gtk/theme.lua new file mode 100644 index 00000000..ca31be8f --- /dev/null +++ b/themes/gtk/theme.lua @@ -0,0 +1,350 @@ +---------------------------------------------- +-- Awesome theme which follows GTK+ 3 theme -- +-- by Yauhen Kirylau -- +---------------------------------------------- + +local theme_assets = require("beautiful.theme_assets") +local dpi = require("beautiful.xresources").apply_dpi +local gfs = require("gears.filesystem") +local themes_path = gfs.get_themes_dir() +local gears_shape = require("gears.shape") +local wibox = require("wibox") +local awful_widget_clienticon = require("awful.widget.clienticon") +local gtk = require("beautiful.gtk") + + +-- Helper functions for modifying hex colors: +-- +local hex_color_match = "[a-fA-F0-9][a-fA-F0-9]" +local function darker(color_value, darker_n) + local result = "#" + local channel_counter = 1 + for s in color_value:gmatch(hex_color_match) do + local bg_numeric_value = tonumber("0x"..s) + if channel_counter <= 3 then + bg_numeric_value = bg_numeric_value - darker_n + end + if bg_numeric_value < 0 then bg_numeric_value = 0 end + if bg_numeric_value > 255 then bg_numeric_value = 255 end + result = result .. string.format("%02x", bg_numeric_value) + channel_counter = channel_counter + 1 + end + return result +end +local function is_dark(color_value) + local bg_numeric_value = 0; + local channel_counter = 1 + for s in color_value:gmatch(hex_color_match) do + bg_numeric_value = bg_numeric_value + tonumber("0x"..s); + if channel_counter == 3 then + break + end + channel_counter = channel_counter + 1 + end + local is_dark_bg = (bg_numeric_value < 383) + return is_dark_bg +end +local function mix(color1, color2, ratio) + ratio = ratio or 0.5 + local result = "#" + local channels1 = color1:gmatch(hex_color_match) + local channels2 = color2:gmatch(hex_color_match) + for _ = 1,3 do + local bg_numeric_value = math.ceil( + tonumber("0x"..channels1())*ratio + + tonumber("0x"..channels2())*(1-ratio) + ) + if bg_numeric_value < 0 then bg_numeric_value = 0 end + if bg_numeric_value > 255 then bg_numeric_value = 255 end + result = result .. string.format("%02x", bg_numeric_value) + end + return result +end +local function reduce_contrast(color, ratio) + ratio = ratio or 50 + return darker(color, is_dark(color) and -ratio or ratio) +end + +local function choose_contrast_color(reference, candidate1, candidate2) -- luacheck: no unused + if is_dark(reference) then + if not is_dark(candidate1) then + return candidate1 + else + return candidate2 + end + else + if is_dark(candidate1) then + return candidate1 + else + return candidate2 + end + end +end + + +-- inherit xresources theme: +local theme = dofile(themes_path.."xresources/theme.lua") +-- load and prepare for use gtk theme: +theme.gtk = gtk.get_theme_variables() +if not theme.gtk then + local gears_debug = require("gears.debug") + gears_debug.print_warning("Can't load GTK+3 theme. Using 'xresources' theme as a fallback.") + return theme +end +theme.gtk.button_border_radius = dpi(theme.gtk.button_border_radius or 0) +theme.gtk.button_border_width = dpi(theme.gtk.button_border_width or 1) +theme.gtk.bold_font = theme.gtk.font_family .. ' Bold ' .. theme.gtk.font_size +theme.gtk.menubar_border_color = mix( + theme.gtk.menubar_bg_color, + theme.gtk.menubar_fg_color, + 0.7 +) + + +theme.font = theme.gtk.font_family .. ' ' .. theme.gtk.font_size + +theme.bg_normal = theme.gtk.bg_color +theme.fg_normal = theme.gtk.fg_color + +theme.wibar_bg = theme.gtk.menubar_bg_color +theme.wibar_fg = theme.gtk.menubar_fg_color + +theme.bg_focus = theme.gtk.selected_bg_color +theme.fg_focus = theme.gtk.selected_fg_color + +theme.bg_urgent = theme.gtk.error_bg_color +theme.fg_urgent = theme.gtk.error_fg_color + +theme.bg_minimize = mix(theme.wibar_fg, theme.wibar_bg, 0.3) +theme.fg_minimize = mix(theme.wibar_fg, theme.wibar_bg, 0.9) + +theme.bg_systray = theme.wibar_bg + +theme.border_normal = theme.gtk.wm_border_unfocused_color +theme.border_focus = theme.gtk.wm_border_focused_color +theme.border_marked = theme.gtk.success_color + +theme.border_width = dpi(theme.gtk.button_border_width or 1) +theme.border_radius = theme.gtk.button_border_radius + +theme.useless_gap = dpi(3) + +local rounded_rect_shape = function(cr,w,h) + gears_shape.rounded_rect( + cr, w, h, theme.border_radius + ) +end + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- taglist_[bg|fg|shape|shape_border_color|shape_border_width]_[focus|urgent|occupied|empty|volatile] +-- tasklist_[bg|fg|shape|shape_border_color|shape_border_width]_[focus|urgent|minimized] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] + +theme.tasklist_fg_normal = theme.wibar_fg +theme.tasklist_bg_normal = theme.wibar_bg +theme.tasklist_fg_focus = theme.tasklist_fg_normal +theme.tasklist_bg_focus = theme.tasklist_bg_normal + +theme.tasklist_font_focus = theme.gtk.bold_font + +theme.tasklist_shape_minimized = rounded_rect_shape +theme.tasklist_shape_border_color_minimized = mix( + theme.bg_minimize, + theme.fg_minimize, + 0.85 +) +theme.tasklist_shape_border_width_minimized = theme.gtk.button_border_width + +theme.tasklist_spacing = theme.gtk.button_border_width + +--[[ Advanced taglist and tasklist styling: {{{ + +--- In order to get taglist and tasklist to follow GTK theme you need to +-- modify your rc.lua in the following way: + +diff --git a/rc.lua b/rc.lua +index 231a2f68c..533a859d2 100644 +--- a/rc.lua ++++ b/rc.lua +@@ -217,24 +217,12 @@ awful.screen.connect_for_each_screen(function(s) + filter = awful.widget.taglist.filter.all, + buttons = taglist_buttons + } ++ -- and apply shape to it ++ if beautiful.taglist_shape_container then ++ local background_shape_wrapper = wibox.container.background(s.mytaglist) ++ background_shape_wrapper._do_taglist_update_now = s.mytaglist._do_taglist_update_now ++ background_shape_wrapper._do_taglist_update = s.mytaglist._do_taglist_update ++ background_shape_wrapper.shape = beautiful.taglist_shape_container ++ background_shape_wrapper.shape_clip = beautiful.taglist_shape_clip_container ++ background_shape_wrapper.shape_border_width = beautiful.taglist_shape_border_width_container ++ background_shape_wrapper.shape_border_color = beautiful.taglist_shape_border_color_container ++ s.mytaglist = background_shape_wrapper ++ end + + -- Create a tasklist widget + s.mytasklist = awful.widget.tasklist { + screen = s, + filter = awful.widget.tasklist.filter.currenttags, ++ buttons = tasklist_buttons, ++ widget_template = beautiful.tasklist_widget_template +- buttons = tasklist_buttons + } + +--]] +theme.tasklist_widget_template = { + { + { + { + { + id = 'clienticon', + widget = awful_widget_clienticon, + }, + margins = dpi(4), + widget = wibox.container.margin, + }, + { + id = 'text_role', + widget = wibox.widget.textbox, + }, + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(2), + right = dpi(4), + widget = wibox.container.margin + }, + id = 'background_role', + widget = wibox.container.background, + create_callback = function(self, c) + self:get_children_by_id('clienticon')[1].client = c + end, +} + +theme.taglist_shape_container = rounded_rect_shape +theme.taglist_shape_clip_container = true +theme.taglist_shape_border_width_container = theme.gtk.button_border_width * 2 +theme.taglist_shape_border_color_container = theme.gtk.header_button_border_color +-- }}} + +theme.taglist_bg_occupied = theme.gtk.header_button_bg_color +theme.taglist_fg_occupied = theme.gtk.header_button_fg_color + +theme.taglist_bg_empty = mix( + theme.gtk.menubar_bg_color, + theme.gtk.header_button_bg_color, + 0.3 +) +theme.taglist_fg_empty = mix( + theme.gtk.menubar_bg_color, + theme.gtk.header_button_fg_color +) + +theme.titlebar_font_normal = theme.gtk.bold_font +theme.titlebar_bg_normal = theme.gtk.wm_border_unfocused_color +theme.titlebar_fg_normal = theme.gtk.wm_title_unfocused_color +--theme.titlebar_fg_normal = choose_contrast_color( + --theme.titlebar_bg_normal, + --theme.gtk.menubar_fg_color, + --theme.gtk.menubar_bg_color +--) + +theme.titlebar_font_focus = theme.gtk.bold_font +theme.titlebar_bg_focus = theme.gtk.wm_border_focused_color +theme.titlebar_fg_focus = theme.gtk.wm_title_focused_color +--theme.titlebar_fg_focus = choose_contrast_color( + --theme.titlebar_bg_focus, + --theme.gtk.menubar_fg_color, + --theme.gtk.menubar_bg_color +--) + +theme.tooltip_fg = theme.gtk.tooltip_fg_color +theme.tooltip_bg = theme.gtk.tooltip_bg_color + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] + +theme.menu_border_width = theme.gtk.button_border_width +theme.menu_border_color = theme.gtk.menubar_border_color +theme.menu_bg_normal = theme.gtk.menubar_bg_color +theme.menu_fg_normal = theme.gtk.menubar_fg_color + +-- @TODO: get from gtk menu height +theme.menu_height = dpi(24) +theme.menu_width = dpi(150) +theme.menu_submenu_icon = nil +theme.menu_submenu = "▸ " + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + + +-- Recolor Layout icons: +theme = theme_assets.recolor_layout(theme, theme.wibar_fg) + +-- Recolor titlebar icons: +-- +theme = theme_assets.recolor_titlebar( + theme, theme.titlebar_fg_normal, "normal" +) +theme = theme_assets.recolor_titlebar( + theme, reduce_contrast(theme.titlebar_fg_normal, 50), "normal", "hover" +) +theme = theme_assets.recolor_titlebar( + theme, theme.gtk.error_bg_color, "normal", "press" +) +theme = theme_assets.recolor_titlebar( + theme, theme.titlebar_fg_focus, "focus" +) +theme = theme_assets.recolor_titlebar( + theme, reduce_contrast(theme.titlebar_fg_focus, 50), "focus", "hover" +) +theme = theme_assets.recolor_titlebar( + theme, theme.gtk.error_bg_color, "focus", "press" +) + +-- Define the icon theme for application icons. If not set then the icons +-- from /usr/share/icons and /usr/share/icons/hicolor will be used. +theme.icon_theme = nil + +-- Generate Awesome icon: +theme.awesome_icon = theme_assets.awesome_icon( + theme.menu_height, mix(theme.bg_focus, theme.fg_normal), theme.wibar_bg +) + +-- Generate taglist squares: +--local taglist_square_size = dpi(4) +--theme.taglist_squares_sel = theme_assets.taglist_squares_sel( + --taglist_square_size, theme.gtk.header_button_border_color +--) +--theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel( + --taglist_square_size, theme.gtk.header_button_border_color +--) +-- Or disable them: +theme.taglist_squares_sel = nil +theme.taglist_squares_unsel = nil + +-- Generate wallpaper: +local wallpaper_bg = theme.gtk.base_color +local wallpaper_fg = theme.gtk.bg_color +local wallpaper_alt_fg = theme.gtk.selected_bg_color +if not is_dark(theme.bg_normal) then + wallpaper_bg, wallpaper_fg = wallpaper_fg, wallpaper_bg +end +wallpaper_bg = reduce_contrast(wallpaper_bg, 50) +wallpaper_fg = reduce_contrast(wallpaper_fg, 30) +wallpaper_fg = mix(wallpaper_fg, wallpaper_bg, 0.4) +wallpaper_alt_fg = mix(wallpaper_alt_fg, wallpaper_fg, 0.4) +theme.wallpaper = function(s) + return theme_assets.wallpaper(wallpaper_bg, wallpaper_fg, wallpaper_alt_fg, s) +end + +return theme + +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80:foldmethod=marker