parent
9c01cbd74c
commit
936e9aacb0
11 changed files with 214 additions and 17 deletions
nixosModules/ags/config/widgets/audio
11
nixosModules/ags/config/widgets/audio/_index.scss
Normal file
11
nixosModules/ags/config/widgets/audio/_index.scss
Normal file
|
@ -0,0 +1,11 @@
|
|||
@use 'sass:color';
|
||||
@use '../../style/colors';
|
||||
|
||||
.widget.audio {
|
||||
.stream {
|
||||
margin: 5px;
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
background-color: color.adjust(colors.$window_bg_color, $lightness: -3%);
|
||||
}
|
||||
}
|
18
nixosModules/ags/config/widgets/audio/binto.tsx
Normal file
18
nixosModules/ags/config/widgets/audio/binto.tsx
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { Astal } from 'astal/gtk3';
|
||||
|
||||
import PopupWindow from '../misc/popup-window';
|
||||
import { get_gdkmonitor_from_desc } from '../../lib';
|
||||
|
||||
import AudioWidget from './main';
|
||||
|
||||
|
||||
export default () => (
|
||||
<PopupWindow
|
||||
name="audio"
|
||||
gdkmonitor={get_gdkmonitor_from_desc('desc:Acer Technologies Acer K212HQL T3EAA0014201')}
|
||||
anchor={Astal.WindowAnchor.RIGHT | Astal.WindowAnchor.TOP}
|
||||
transition="slide bottom"
|
||||
>
|
||||
<AudioWidget />
|
||||
</PopupWindow>
|
||||
);
|
111
nixosModules/ags/config/widgets/audio/main.tsx
Normal file
111
nixosModules/ags/config/widgets/audio/main.tsx
Normal file
|
@ -0,0 +1,111 @@
|
|||
import { bind } from 'astal';
|
||||
import { Gtk, Widget } from 'astal/gtk3';
|
||||
|
||||
import AstalWp from 'gi://AstalWp';
|
||||
|
||||
import { RadioButton, ToggleButton } from '../misc/subclasses';
|
||||
import Separator from '../misc/separator';
|
||||
|
||||
|
||||
export default () => {
|
||||
const audio = AstalWp.get_default()?.get_audio();
|
||||
|
||||
if (!audio) {
|
||||
throw new Error('Could not find default audio devices.');
|
||||
}
|
||||
|
||||
// TODO: make a stack to have outputs, inputs and currently playing apps
|
||||
// TODO: figure out ports and profiles
|
||||
|
||||
const defaultGroup = new RadioButton();
|
||||
|
||||
return (
|
||||
<box vertical className="widget audio">
|
||||
{bind(audio, 'speakers').as((speakers) => speakers.map((speaker) => (
|
||||
<box className="stream" vertical>
|
||||
<box className="title">
|
||||
<RadioButton
|
||||
css="margin-top: 1px;"
|
||||
|
||||
group={defaultGroup}
|
||||
active={speaker.isDefault}
|
||||
|
||||
setup={(self) => {
|
||||
speaker.connect('notify::isDefault', () => {
|
||||
self.active = speaker.isDefault;
|
||||
});
|
||||
}}
|
||||
|
||||
onToggled={(self) => {
|
||||
speaker.isDefault = self.active;
|
||||
}}
|
||||
/>
|
||||
|
||||
<Separator size={8} />
|
||||
|
||||
<label label={bind(speaker, 'description')} />
|
||||
</box>
|
||||
|
||||
<Separator size={4} vertical />
|
||||
|
||||
<box className="body">
|
||||
<ToggleButton
|
||||
cursor="pointer"
|
||||
valign={Gtk.Align.END}
|
||||
|
||||
active={speaker.mute}
|
||||
onToggled={(self) => {
|
||||
speaker.set_mute(self.active);
|
||||
|
||||
(self.get_child() as Widget.Icon).icon = self.active ?
|
||||
'audio-volume-muted-symbolic' :
|
||||
'audio-speakers-symbolic';
|
||||
}}
|
||||
>
|
||||
<icon icon={speaker.mute ?
|
||||
'audio-volume-muted-symbolic' :
|
||||
'audio-speakers-symbolic'}
|
||||
/>
|
||||
</ToggleButton>
|
||||
|
||||
<Separator size={4} />
|
||||
|
||||
{/*
|
||||
FIXME: lockChannels not working
|
||||
TODO: have two sliders when lockChannels === false
|
||||
*/}
|
||||
<ToggleButton
|
||||
cursor="pointer"
|
||||
valign={Gtk.Align.END}
|
||||
|
||||
active={speaker.lockChannels}
|
||||
onToggled={(self) => {
|
||||
speaker.set_lock_channels(self.active);
|
||||
|
||||
(self.get_child() as Widget.Icon).icon = self.active ?
|
||||
'channel-secure-symbolic' :
|
||||
'channel-insecure-symbolic';
|
||||
}}
|
||||
>
|
||||
<icon icon={speaker.lockChannels ?
|
||||
'channel-secure-symbolic' :
|
||||
'channel-insecure-symbolic'}
|
||||
/>
|
||||
</ToggleButton>
|
||||
|
||||
<slider
|
||||
hexpand
|
||||
halign={Gtk.Align.FILL}
|
||||
drawValue
|
||||
|
||||
value={bind(speaker, 'volume')}
|
||||
onDragged={(self) => {
|
||||
speaker.set_volume(self.value);
|
||||
}}
|
||||
/>
|
||||
</box>
|
||||
</box>
|
||||
)))}
|
||||
</box>
|
||||
);
|
||||
};
|
15
nixosModules/ags/config/widgets/audio/wim.tsx
Normal file
15
nixosModules/ags/config/widgets/audio/wim.tsx
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { Astal } from 'astal/gtk3';
|
||||
|
||||
import PopupWindow from '../misc/popup-window';
|
||||
|
||||
import AudioWidget from './main';
|
||||
|
||||
|
||||
export default () => (
|
||||
<PopupWindow
|
||||
name="audio"
|
||||
anchor={Astal.WindowAnchor.RIGHT | Astal.WindowAnchor.TOP}
|
||||
>
|
||||
<AudioWidget />
|
||||
</PopupWindow>
|
||||
);
|
Loading…
Add table
Add a link
Reference in a new issue