Files
gitops 1d3252aabd Give rofi a theme, in four layers
`rofi -show drun` came up unstyled. Three separate reasons, all of them
invisible: `import-theme` wrote ~/.config/rofi/theme.rasi, but rofi only ever
auto-loads config.rasi and nothing imported theme.rasi; theme.rasi holds a
HyDE palette and nothing else, no widget geometry at all; and no layout was
shipped anywhere for it to colour.

The layering mirrors what config/waybar already does, for the same reason --
a theme supplies colours, and the layout has to survive being handed a theme
that defines only some of them:

  1. palette.rasi   defaults, under the exact names HyDE themes use
  2. theme.rasi     the installed theme's rofi.theme, written by cosmic-conf
  3. rules.rasi     geometry and layout, with no colour literals at all
  4. local.rasi     per-machine paths: sidebar wallpaper, icon theme

Later imports win, so a theme recolours the launcher without rules.rasi
knowing a theme exists, and a machine points at its own wallpaper without
either of them knowing the path. Unlike waybar there is no bridge step: a HyDE
rofi.theme defines the names rules.rasi already references.

1 and 3 are shared and go under /usr/share/hyprcosmic/rofi. 2 and 4 must be
per-user, and config.rasi with them: it imports those two relatively, and rofi
resolves a relative @import against the importing file's directory.

rules.rasi is HyDE's style_1 with three deliberate departures, documented in
its header. HyDE computes the border width, radius and font in rofilaunch.sh
before invoking rofi; there is no launcher script here -- the keybinding runs
`rofi -show drun` bare -- so those are baked in. The sidebar image moves to
local.rasi because HyDE's ~/.cache/hyde/wall.thmb does not exist outside HyDE.
And dummywall gets `background-color: @main-bg` rather than transparent, so a
machine with no wallpaper set shows a panel instead of a hole.

The display-* labels are Nerd Font glyphs copied byte-for-byte out of
style_1.rasi. They are Private Use Area codepoints and do not survive being
retyped; verified as U+F303, U+F120, U+F07B, U+F2D0, each followed by a thin
space, and confirmed present in JetBrainsMono Nerd Font via
`fc-list :charset=`.

Verified with `rofi -dump-theme` and `-dump-config`: both exit 0 with empty
stderr, and the merged dump shows the Tokyo Night theme's main-bg beating the
palette default.
2026-08-10 11:47:43 +07:00

174 lines
5.7 KiB
Plaintext

/* Geometry and layout for the HyprCosmic launcher.
*
* Adapted from HyDE's style_1 ("Background image with a sidebar list"), which
* is the layout its rofilaunch.sh uses by default. Two deliberate differences:
*
* - HyDE injects the border radii, border width and font at the command line,
* as three -theme-str arguments computed from Hyprland's own gaps and
* border settings. We have no launcher script -- the keybinding in
* cosmic.conf runs plain `rofi -show drun` -- so those values are written
* out here, at the defaults rofilaunch.sh would have produced.
* - The sidebar image lives in local.rasi rather than here, because the
* wallpaper path is per-user. HyDE points at ~/.cache/hyde/wall.thmb, a
* thumbnail its wallpaper scripts generate; we do not run those, so
* pointing there would render an empty panel on every machine.
*
* No colour literals: every colour is a name from palette.rasi, which a theme
* may have re-pointed. That separation is what lets `cosmic-conf import-theme`
* recolour the launcher without touching a line of layout.
*/
/* Pango takes a comma-separated family list, so the Nerd Font is a preference
* rather than a requirement -- the glyphs in config.rasi's mode labels need it,
* but everything else still renders without it. */
* {
font: "JetBrainsMono Nerd Font, Noto Sans Mono 10";
}
// Main //
window {
height: 33em;
width: 63em;
transparency: "real";
fullscreen: false;
enabled: true;
cursor: "default";
spacing: 0em;
padding: 0em;
border: 2px;
border-radius: 30px;
border-color: @main-br;
background-color: @main-bg;
}
mainbox {
enabled: true;
spacing: 0em;
padding: 0em;
orientation: horizontal;
children: [ "dummywall" , "listbox" ];
background-color: transparent;
}
/* The sidebar. Solid colour here so that a machine with no wallpaper override
* gets a panel in the theme's own background, not a hole. local.rasi paints an
* image over the top when there is one. */
dummywall {
spacing: 0em;
padding: 0em;
width: 37em;
expand: false;
orientation: horizontal;
children: [ "mode-switcher" , "inputbar" ];
background-color: @main-bg;
}
// Modes //
mode-switcher {
orientation: vertical;
enabled: true;
width: 3.8em;
padding: 9.2em 0.5em 9.2em 0.5em;
spacing: 1.2em;
background-color: transparent;
}
button {
cursor: pointer;
border-radius: 2em;
background-color: @main-bg;
text-color: @main-fg;
}
button selected {
background-color: @main-fg;
text-color: @main-bg;
}
// Inputs //
/* The entry is hidden: typing filters the list without a visible prompt, which
* is what gives style_1 its uncluttered look. inputbar still has to exist for
* keystrokes to reach the filter. */
inputbar {
enabled: true;
children: [ "entry" ];
background-color: transparent;
}
entry {
enabled: false;
}
// Lists //
listbox {
spacing: 0em;
padding: 2em;
children: [ "dummy" , "listview" , "dummy" ];
background-color: transparent;
}
listview {
enabled: true;
spacing: 0em;
padding: 0em;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
expand: false;
fixed-height: true;
fixed-columns: true;
cursor: "default";
background-color: transparent;
text-color: @main-fg;
}
dummy {
background-color: transparent;
}
// Elements //
element {
enabled: true;
spacing: 0.8em;
padding: 0.4em 0.4em 0.4em 1.5em;
border-radius: 20px;
cursor: pointer;
background-color: transparent;
text-color: @main-fg;
}
element selected.normal {
background-color: @select-bg;
text-color: @select-fg;
}
element-icon {
size: 2.8em;
cursor: inherit;
background-color: transparent;
text-color: inherit;
}
element-text {
vertical-align: 0.5;
horizontal-align: 0.0;
cursor: inherit;
background-color: transparent;
text-color: inherit;
}
// Error message //
error-message {
text-color: @main-fg;
background-color: @main-bg;
text-transform: capitalize;
children: [ "textbox" ];
}
textbox {
text-color: inherit;
background-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.5;
}