[AGS] Fixes for bar

This commit is contained in:
Janis Hutz 2025-04-25 17:22:07 +02:00
parent 19d59347b6
commit 54e216b5ec
4 changed files with 77 additions and 8 deletions

View File

@ -2,18 +2,44 @@ import { App } from "astal/gtk4"
import style from "./style.scss"
import Bar from "./components/bar/Bar";
import AstalHyprland from "gi://AstalHyprland?version=0.1";
import { hyprToGdk } from "./util/hyprland";
App.start({
instanceName: "runner",
css: style,
main() {
const hypr = AstalHyprland.get_default();
const monitors = App.get_monitors();
for (let index = 0; index < monitors.length; index++) {
Bar.Bar( monitors[ index ] );
const bars = new Map<number, string>();
const barCreator = ( monitor: AstalHyprland.Monitor ) => {
const gdkMonitor = hyprToGdk( monitor );
if ( gdkMonitor ) {
print( 'Bar added for screen ' + monitor.get_id() );
bars.set( monitor.get_id(), Bar.BarLauncher( gdkMonitor ) );
}
}
// TODO: Handle monitor add
for (const monitor of hypr.monitors) {
barCreator( monitor );
}
hypr.connect( 'monitor-added', ( _, monitor ) => {
barCreator( monitor );
} );
hypr.connect( 'monitor-removed', ( _, monitor ) => {
const windowName = bars.get( monitor );
if ( windowName ) {
const win = App.get_window( windowName );
if ( win ) {
App.toggle_window( windowName );
win.set_child( null );
App.remove_window( win );
print( 'Bar removed for screen', monitor );
}
bars.delete( monitor );
}
} );
},
requestHandler(request, res) {
const args = request.trimStart().split( ' ' );
@ -26,3 +52,4 @@ App.start({
}
},
})

View File

@ -5,13 +5,15 @@ import QuickView from "./modules/QuickView";
import SystemInfo from "./modules/SystemInfo";
import { CenterBox } from "astal/gtk4/widget";
const Bar = (gdkmonitor: Gdk.Monitor) => {
const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } ) => {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor;
return (
<window
gdkmonitor={gdkmonitor}
cssClasses={["Bar"]}
name={name}
namespace={"bar"}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT}
visible
@ -50,7 +52,19 @@ const cliHandler = (args: string[]): string => {
return "Not implemented";
};
const BarLauncher = ( monitor: Gdk.Monitor ) => {
const windowName = `bar-${monitor.get_connector()}`
const createBar = () => {
return <Bar gdkmonitor={monitor} name={windowName}></Bar>
}
// Actually start the bar
createBar();
return windowName;
}
export default {
Bar,
BarLauncher,
cliHandler,
};

View File

@ -1,4 +1,4 @@
$fg-color: #E6E6E6;
$bg-color: #141414;
$accent-color: #154881;
$accent-color-2: #ABADCD;
$accent-color: #B27BD1;
$accent-color-2: #5F50A6;

View File

@ -0,0 +1,28 @@
// ┌ ┐
// │ From https://github.com/Neurarian/matshell │
// └ ┘
import { App, Gdk } from "astal/gtk4";
import Hyprland from "gi://AstalHyprland";
/* Match Hyprland monitor to GDK monitor
THIS MAY NOT WORK AS INTENDED IF YOU HAVE MONITORS OF THE SAME MODEL
I did not find a more elegant solution to this.
On my setup GDK coordinates and hyprland coordinates are flipped,
so I cant match by coordinates. */
export function hyprToGdk(monitor: Hyprland.Monitor): Gdk.Monitor | null {
const monitors = App.get_monitors();
if (!monitors || monitors.length === 0) return null;
for (let gdkmonitor of monitors) {
if (
monitor &&
gdkmonitor &&
monitor.get_name() === gdkmonitor.get_connector()
)
return gdkmonitor;
}
// Default monitor with null safety
return monitors.length > 0 ? monitors[0] : null;
}