feat(themes; beautiful): add partial support for GTK+3 themes (#2129)
This commit is contained in:
parent
25adaae594
commit
4bd5b1940d
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
-- <table class='widget_list' border=1>
|
||||
-- <tr style='font-weight: bold;'> <th align='center'>Result key</th> <th align='center'>StyleContext key</th> <th align='center'>StyleContext fallback #1</th> <th align='center'>StyleContext fallback #2</th> <th align='center'>GTK Widget fallback</th> </tr>
|
||||
-- <tr> <td>`font_size`</td> <td></td> <td></td> <td></td> <td>Label font-size</td> </tr>
|
||||
-- <tr> <td>`font_family`</td> <td></td> <td></td> <td></td> <td>Label font-family</td> </tr>
|
||||
-- <tr> <td>`bg_color`</td> <td>`theme_bg_color`</td> <td></td> <td></td> <td>Window bg</td> </tr>
|
||||
-- <tr> <td>`fg_color`</td> <td>`theme_fg_color`</td> <td></td> <td></td> <td>Window fg</td> </tr>
|
||||
-- <tr> <td>`base_color`</td> <td>`theme_base_color`</td> <td></td> <td></td> <td>Entry bg</td> </tr>
|
||||
-- <tr> <td>`text_color`</td> <td>`theme_text_color`</td> <td></td> <td></td> <td>Entry fg</td> </tr>
|
||||
-- <tr> <td>`button_bg_color`</td> <td>`theme_button_bg_color`</td> <td>`theme_bg_color`</td> <td></td> <td>Button bg</td> </tr>
|
||||
-- <tr> <td>`button_fg_color`</td> <td>`theme_button_fg_color`</td> <td>`theme_fg_color`</td> <td></td> <td>Button fg</td> </tr>
|
||||
-- <tr> <td>`button_border_color`</td> <td></td> <td></td> <td></td> <td>Button border-color</td> </tr>
|
||||
-- <tr> <td>`button_border_radius`</td> <td></td> <td></td> <td></td> <td>Button border-radius</td> </tr>
|
||||
-- <tr> <td>`button_border_width`</td> <td></td> <td></td> <td></td> <td>Button border-top-width</td> </tr>
|
||||
-- <tr> <td>`selected_bg_color`</td> <td>`theme_selected_bg_color`</td> <td></td> <td></td> <td>ToggleButton bg</td> </tr>
|
||||
-- <tr> <td>`selected_fg_color`</td> <td>`theme_selected_fg_color`</td> <td></td> <td></td> <td>ToggleButton fg</td> </tr>
|
||||
-- <tr> <td>`menubar_bg_color`</td> <td>`menubar_bg_color`</td> <td>`theme_bg_color`</td> <td></td> <td>HeaderBar bg</td> </tr>
|
||||
-- <tr> <td>`menubar_fg_color`</td> <td>`menubar_fg_color`</td> <td>`theme_fg_color`</td> <td></td> <td>HeaderBar fg</td> </tr>
|
||||
-- <tr> <td>`header_button_bg_color`</td> <td>`header_button_bg_color`</td> <td>`menubar_bg_color`</td> <td>`theme_bg_color`</td> <td>HeaderBar > Button bg</td> </tr>
|
||||
-- <tr> <td>`header_button_fg_color`</td> <td>`header_button_fg_color`</td> <td>`menubar_fg_color`</td> <td>`theme_fg_color`</td> <td>HeaderBar > Button fg</td> </tr>
|
||||
-- <tr> <td>`header_button_border_color`</td> <td></td> <td></td> <td></td> <td>HeaderBar > Button border-color</td> </tr>
|
||||
-- <tr> <td>`error_color`</td> <td>`error_color`</td> <td>`error_bg_color`</td> <td></td> <td>destructive Button bg</td> </tr>
|
||||
-- <tr> <td>`error_bg_color`</td> <td>`error_bg_color`</td> <td>`error_color`</td> <td></td> <td>destructive Button bg</td> </tr>
|
||||
-- <tr> <td>`error_fg_color`</td> <td>`error_fg_color`</td> <td>`theme_selected_fg_color`</td> <td></td> <td>destructive Button fg</td> </tr>
|
||||
-- <tr> <td>`warning_color`</td> <td>`warning_color`</td> <td>`warning_bg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`warning_bg_color`</td> <td>`warning_bg_color`</td> <td>`warning_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`warning_fg_color`</td> <td>`warning_fg_color`</td> <td>`theme_selected_fg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`success_color`</td> <td>`success_color`</td> <td>`success_bg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`success_bg_color`</td> <td>`success_bg_color`</td> <td>`success_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`success_fg_color`</td> <td>`success_fg_color`</td> <td>`theme_selected_fg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`tooltip_bg_color`</td> <td>`theme_tooltip_bg_color`</td> <td>`theme_bg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`tooltip_fg_color`</td> <td>`theme_tooltip_fg_color`</td> <td>`theme_fg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`osd_bg_color`</td> <td>`osd_bg`</td> <td>`theme_tooltip_bg_color`</td> <td>`theme_bg_color`</td> <td></td> </tr>
|
||||
-- <tr> <td>`osd_fg_color`</td> <td>`osd_fg`</td> <td>`theme_tooltip_fg_color`</td> <td>`theme_fg_color`</td> <td></td> </tr>
|
||||
-- <tr> <td>`osd_border_color`</td> <td>`osd_borders_color`</td> <td>`osd_fg_color`</td> <td></td> <td></td> </tr>
|
||||
-- <tr> <td>`wm_bg_color`</td> <td>`wm_bg`</td> <td>`menubar_bg_color`</td> <td>`theme_bg_color`</td> <td>HeaderBar bg</td> </tr>
|
||||
-- <tr> <td>`wm_border_focused_color`</td> <td>`wm_border_focused`</td> <td>`theme_selected_bg_color`</td> <td></td> <td>ToggleButton bg</td> </tr>
|
||||
-- <tr> <td>`wm_border_unfocused_color`</td> <td>`wm_border_unfocused`</td> <td>`wm_border`</td> <td>`menubar_bg_color`</td> <!--<td>`theme_bg_color`</td>--> <td>HeaderBar bg</td> </tr>
|
||||
-- <tr> <td>`wm_title_focused_color`</td> <td>`wm_title_focused`</td> <td>`wm_title`</td> <td>`theme_selected_fg_color`</td> <td>ToggleButton fg</td> </tr>
|
||||
-- <tr> <td>`wm_title_unfocused_color`</td> <td>`wm_title_unfocused`</td> <td>`wm_unfocused_title`</td> <td>`menubar_fg_color`</td> <!--<td>`theme_fg_color`</td>--> <td>HeaderBar fg</td> </tr>
|
||||
-- <tr> <td>`wm_icons_focused_color`</td> <td>`wm_icons_focused`</td> <td>`wm_title_focused`</td> <td>`theme_selected_fg_color`</td> <td>ToggleButton fg</td> </tr>
|
||||
-- <tr> <td>`wm_icons_unfocused_color`</td> <td>`wm_icons_unfocused`</td> <td>`wm_title_unfocused`</td> <td>`menubar_fg_color`</td> <!--<td>`theme_fg_color`</td>--> <td>HeaderBar fg</td> </tr>
|
||||
-- </table>
|
||||
--
|
||||
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
|
|
@ -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 = {}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue