This commit is contained in:
parent
1378072df9
commit
7334ac5f7e
7 changed files with 234 additions and 8 deletions
|
@ -181,6 +181,10 @@ in {
|
||||||
## Brightness control
|
## Brightness control
|
||||||
", XF86MonBrightnessUp , exec, ${runAgsJs "'Brightness.screen += 0.05'"}"
|
", XF86MonBrightnessUp , exec, ${runAgsJs "'Brightness.screen += 0.05'"}"
|
||||||
", XF86MonBrightnessDown, exec, ${runAgsJs "'Brightness.screen -= 0.05'"}"
|
", XF86MonBrightnessDown, exec, ${runAgsJs "'Brightness.screen -= 0.05'"}"
|
||||||
|
|
||||||
|
## Volume control
|
||||||
|
", XF86AudioRaiseVolume , exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ & ${runAgsJs "'popup_osd(\"speaker\")'"} &"
|
||||||
|
", XF86AudioLowerVolume , exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- & ${runAgsJs "'popup_osd(\"speaker\")'"} &"
|
||||||
];
|
];
|
||||||
bindn = [" , Escape , exec, ${runAgsJs "'closeAll()'"}"];
|
bindn = [" , Escape , exec, ${runAgsJs "'closeAll()'"}"];
|
||||||
bindr = ["CAPS, Caps_Lock, exec, ${runAgsJs "'Brightness.fetchCapsState()'"}"];
|
bindr = ["CAPS, Caps_Lock, exec, ${runAgsJs "'Brightness.fetchCapsState()'"}"];
|
||||||
|
|
|
@ -11,6 +11,7 @@ import Calendar from './widgets/date/main';
|
||||||
import Corners from './widgets/corners/main';
|
import Corners from './widgets/corners/main';
|
||||||
import IconBrowser from './widgets/icon-browser/main';
|
import IconBrowser from './widgets/icon-browser/main';
|
||||||
import { NotifPopups, NotifCenter } from './widgets/notifs/main';
|
import { NotifPopups, NotifCenter } from './widgets/notifs/main';
|
||||||
|
import OSD from './widgets/osd/main';
|
||||||
import PowerMenu from './widgets/powermenu/main';
|
import PowerMenu from './widgets/powermenu/main';
|
||||||
import Screenshot from './widgets/screenshot/main';
|
import Screenshot from './widgets/screenshot/main';
|
||||||
|
|
||||||
|
@ -62,6 +63,7 @@ switch (CONF) {
|
||||||
IconBrowser();
|
IconBrowser();
|
||||||
NotifPopups();
|
NotifPopups();
|
||||||
NotifCenter();
|
NotifCenter();
|
||||||
|
OSD();
|
||||||
PowerMenu();
|
PowerMenu();
|
||||||
Screenshot();
|
Screenshot();
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Brightness extends GObject.Object {
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
declare private _screenIcon: string;
|
private _screenIcon = 'display-brightness-high-symbolic';
|
||||||
|
|
||||||
@property(String)
|
@property(String)
|
||||||
get screenIcon() {
|
get screenIcon() {
|
||||||
|
@ -79,7 +79,7 @@ class Brightness extends GObject.Object {
|
||||||
return this._capsLevel;
|
return this._capsLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare private _capsIcon: string;
|
private _capsIcon = 'caps-lock-symbolic';
|
||||||
|
|
||||||
@property(String)
|
@property(String)
|
||||||
get capsIcon() {
|
get capsIcon() {
|
||||||
|
|
|
@ -1,9 +1,35 @@
|
||||||
@import 'colors.scss';
|
@import 'colors.scss';
|
||||||
|
|
||||||
window, viewport {
|
window,
|
||||||
|
viewport,
|
||||||
|
stack {
|
||||||
all: unset;
|
all: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
progressbar {
|
||||||
|
border-radius: 999px;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
trough {
|
||||||
|
background: #363847;
|
||||||
|
min-height: inherit;
|
||||||
|
border-radius: inherit;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
progress {
|
||||||
|
background: #79659f;
|
||||||
|
min-height: inherit;
|
||||||
|
border-radius: inherit;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.widget {
|
.widget {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
@ -19,5 +45,6 @@ window, viewport {
|
||||||
@import 'widgets/lockscreen/style.scss';
|
@import 'widgets/lockscreen/style.scss';
|
||||||
@import 'widgets/misc/style.scss';
|
@import 'widgets/misc/style.scss';
|
||||||
@import 'widgets/notifs/style.scss';
|
@import 'widgets/notifs/style.scss';
|
||||||
|
@import 'widgets/osd/style.scss';
|
||||||
@import 'widgets/powermenu/style.scss';
|
@import 'widgets/powermenu/style.scss';
|
||||||
@import 'widgets/screenshot/style.scss';
|
@import 'widgets/screenshot/style.scss';
|
||||||
|
|
177
nixosModules/ags/v2/widgets/osd/main.tsx
Normal file
177
nixosModules/ags/v2/widgets/osd/main.tsx
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
import { bind, timeout } from 'astal';
|
||||||
|
import { register } from 'astal/gobject';
|
||||||
|
import { App, Astal, astalify, Gtk, Widget, type ConstructProps } from 'astal/gtk3';
|
||||||
|
|
||||||
|
import AstalWp from "gi://AstalWp"
|
||||||
|
|
||||||
|
import PopupWindow from '../misc/popup-window';
|
||||||
|
import Brightness from '../../services/brightness';
|
||||||
|
|
||||||
|
/* Types */
|
||||||
|
declare global {
|
||||||
|
function popup_osd(osd: string): void;
|
||||||
|
}
|
||||||
|
@register()
|
||||||
|
class ProgressBar extends astalify(Gtk.ProgressBar) {
|
||||||
|
constructor(props: ConstructProps<
|
||||||
|
ProgressBar,
|
||||||
|
Gtk.ProgressBar.ConstructorProps
|
||||||
|
>) {
|
||||||
|
super(props as any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const HIDE_DELAY = 2000;
|
||||||
|
const transition_duration = 300;
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
let n_showing = 0;
|
||||||
|
let stack: Widget.Stack | undefined;
|
||||||
|
|
||||||
|
const popup = (osd: string) => {
|
||||||
|
if (!stack) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++n_showing;
|
||||||
|
stack.shown = osd;
|
||||||
|
|
||||||
|
App.get_window('win-osd')?.set_visible(true);
|
||||||
|
|
||||||
|
timeout(HIDE_DELAY, () => {
|
||||||
|
--n_showing;
|
||||||
|
|
||||||
|
if (n_showing === 0) {
|
||||||
|
App.get_window('win-osd')?.set_visible(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
globalThis.popup_osd = popup;
|
||||||
|
|
||||||
|
const speaker = AstalWp.get_default()?.audio.default_speaker!;
|
||||||
|
const microphone = AstalWp.get_default()?.audio.default_microphone!;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PopupWindow
|
||||||
|
name="osd"
|
||||||
|
anchor={Astal.WindowAnchor.BOTTOM}
|
||||||
|
exclusivity={Astal.Exclusivity.IGNORE}
|
||||||
|
close_on_unfocus="stay"
|
||||||
|
transition="slide bottom"
|
||||||
|
>
|
||||||
|
<stack
|
||||||
|
className="osd"
|
||||||
|
transitionDuration={transition_duration}
|
||||||
|
setup={(self) => {
|
||||||
|
timeout(1000, () => {
|
||||||
|
stack = self;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
|
||||||
|
<box
|
||||||
|
name="speaker"
|
||||||
|
css="margin-bottom: 80px;"
|
||||||
|
|
||||||
|
setup={(self) => {
|
||||||
|
self.hook(speaker, 'notify::mute', () => {
|
||||||
|
popup('speaker');
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<box className="osd-item widget">
|
||||||
|
<icon icon={bind(speaker, 'volumeIcon')} />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
fraction={bind(speaker, 'volume')}
|
||||||
|
sensitive={bind(speaker, 'mute').as((v) => !v)}
|
||||||
|
valign={Gtk.Align.CENTER}
|
||||||
|
/>
|
||||||
|
</box>
|
||||||
|
</box>
|
||||||
|
|
||||||
|
<box
|
||||||
|
name="microphone"
|
||||||
|
css="margin-bottom: 80px;"
|
||||||
|
|
||||||
|
setup={(self) => {
|
||||||
|
self.hook(microphone, 'notify::mute', () => {
|
||||||
|
popup('microphone');
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<box className="osd-item widget">
|
||||||
|
<icon icon={bind(microphone, 'volumeIcon')} />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
fraction={bind(microphone, 'volume')}
|
||||||
|
sensitive={bind(microphone, 'mute').as((v) => !v)}
|
||||||
|
valign={Gtk.Align.CENTER}
|
||||||
|
/>
|
||||||
|
</box>
|
||||||
|
</box>
|
||||||
|
|
||||||
|
<box
|
||||||
|
name="brightness"
|
||||||
|
css="margin-bottom: 80px;"
|
||||||
|
|
||||||
|
setup={(self) => {
|
||||||
|
self.hook(Brightness, 'notify::screen-icon', () => {
|
||||||
|
popup('brightness');
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<box className="osd-item widget">
|
||||||
|
<icon icon={bind(Brightness, 'screenIcon')} />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
fraction={bind(Brightness, 'screen')}
|
||||||
|
valign={Gtk.Align.CENTER}
|
||||||
|
/>
|
||||||
|
</box>
|
||||||
|
</box>
|
||||||
|
|
||||||
|
<box
|
||||||
|
name="keyboard"
|
||||||
|
css="margin-bottom: 80px;"
|
||||||
|
|
||||||
|
setup={(self) => {
|
||||||
|
self.hook(Brightness, 'notify::kbd-level', () => {
|
||||||
|
popup('keyboard');
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<box className="osd-item widget">
|
||||||
|
<icon icon="keyboard-brightness-symbolic" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
fraction={bind(Brightness, 'kbdLevel').as((v) => v / 2)}
|
||||||
|
sensitive={bind(Brightness, 'kbdLevel').as((v) => v !== 0)}
|
||||||
|
valign={Gtk.Align.CENTER}
|
||||||
|
/>
|
||||||
|
</box>
|
||||||
|
</box>
|
||||||
|
|
||||||
|
<box
|
||||||
|
name="caps"
|
||||||
|
css="margin-bottom: 80px;"
|
||||||
|
|
||||||
|
setup={(self) => {
|
||||||
|
self.hook(Brightness, 'notify::caps-icon', () => {
|
||||||
|
popup('caps');
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<box className="osd-item widget">
|
||||||
|
<icon icon={bind(Brightness, 'capsIcon')} />
|
||||||
|
|
||||||
|
<label label="Caps Lock" />
|
||||||
|
</box>
|
||||||
|
</box>
|
||||||
|
|
||||||
|
</stack>
|
||||||
|
</PopupWindow>
|
||||||
|
);
|
||||||
|
};
|
21
nixosModules/ags/v2/widgets/osd/style.scss
Normal file
21
nixosModules/ags/v2/widgets/osd/style.scss
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
.osd {
|
||||||
|
.osd-item {
|
||||||
|
padding: 12px 20px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
min-width: 170px;
|
||||||
|
}
|
||||||
|
|
||||||
|
progressbar {
|
||||||
|
min-height: 6px;
|
||||||
|
min-width: 170px;
|
||||||
|
}
|
||||||
|
|
||||||
|
icon {
|
||||||
|
font-size: 2rem;
|
||||||
|
color: white;
|
||||||
|
margin-left: -0.4rem;
|
||||||
|
margin-right: 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -185,11 +185,6 @@ in {
|
||||||
"$mainMod, Print, exec, bash -c \"grim -g \\\"$(slurp)\\\" - | satty -f -\""
|
"$mainMod, Print, exec, bash -c \"grim -g \\\"$(slurp)\\\" - | satty -f -\""
|
||||||
];
|
];
|
||||||
|
|
||||||
binde = [
|
|
||||||
",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ & ags -r 'popup_osd(\"speaker\")' &"
|
|
||||||
",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- & ags -r 'popup_osd(\"speaker\")' &"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Mouse Binds
|
# Mouse Binds
|
||||||
bindm = [
|
bindm = [
|
||||||
"$mainMod, mouse:272, movewindow"
|
"$mainMod, mouse:272, movewindow"
|
||||||
|
|
Loading…
Reference in a new issue