Log undefined menu models and action groups. Fix null errors for workspaces and update array property accessors for services. (#583)

* Handle null values for actionGroup.

* Add logs

* more logs

* Fix property accessors and workspace null errors.
This commit is contained in:
Jas Singh
2024-12-21 14:53:26 -08:00
committed by GitHub
parent 006e9543f0
commit da0299f06b
6 changed files with 29 additions and 19 deletions

View File

@@ -10,7 +10,7 @@ const systemtray = AstalTray.get_default();
const { ignore, customIcons } = options.bar.systray;
//TODO: Connect to `notify::menu-model` and `notify::action-group` to have up to date menu and action group
const createMenu = (menuModel: Gio.MenuModel, actionGroup: Gio.ActionGroup): Gtk.Menu => {
const createMenu = (menuModel: Gio.MenuModel, actionGroup: Gio.ActionGroup | null): Gtk.Menu => {
const menu = Gtk.Menu.new_from_model(menuModel);
menu.insert_action_group('dbusmenu', actionGroup);
@@ -38,9 +38,14 @@ const MenuEntry = ({ item, child }: MenuEntryProps): JSX.Element => {
const entryBinding = Variable.derive(
[bind(item, 'menuModel'), bind(item, 'actionGroup')],
(menuModel, actionGroup) => {
if (menuModel && actionGroup) {
menu = createMenu(menuModel, actionGroup);
if (!menuModel) {
return console.error(`Menu Model not found for ${item.id}`);
}
if (!actionGroup) {
return console.error(`Action Group not found for ${item.id}`);
}
menu = createMenu(menuModel, actionGroup);
},
);

View File

@@ -33,9 +33,13 @@ export const getWorkspacesForMonitor = (
const monitorMap: MonitorMap = {};
const workspaceMonitorList = workspaceList.map((m) => {
return { id: m.monitor.id, name: m.monitor.name };
});
const wsList = workspaceList ?? [];
const workspaceMonitorList = wsList
.filter((m) => m !== null)
.map((m) => {
return { id: m.monitor?.id, name: m.monitor?.name };
});
const monitors = [...new Map([...workspaceMonitorList, ...monitorList].map((item) => [item.id, item])).values()];
@@ -150,7 +154,7 @@ const navigateWorkspace = (
if (workspacesList.length === 0) return;
const currentIndex = workspacesList.indexOf(hyprlandService.focusedWorkspace.id);
const currentIndex = workspacesList.indexOf(hyprlandService.focusedWorkspace?.id);
const step = direction === 'next' ? 1 : -1;
let newIndex = (currentIndex + step + workspacesList.length) % workspacesList.length;
let attempts = 0;
@@ -283,7 +287,8 @@ export const getWorkspacesToRender = (
let allWorkspaces = range(totalWorkspaces || 8);
const activeWorkspaces = workspaceList.map((ws) => ws.id);
const workspaceMonitorList = workspaceList.map((ws) => {
const wsList = workspaceList ?? [];
const workspaceMonitorList = wsList.map((ws) => {
return {
id: ws.monitor?.id || -1,
name: ws.monitor?.name || '',
@@ -310,7 +315,7 @@ export const getWorkspacesToRender = (
if (isMonitorSpecific) {
const workspacesInRange = range(totalWorkspaces).filter((ws) => {
return getWorkspacesForMonitor(ws, workspaceRules, monitor, workspaceList, monitorList);
return getWorkspacesForMonitor(ws, workspaceRules, monitor, wsList, monitorList);
});
allWorkspaces = [...new Set([...activesForMonitor, ...workspacesInRange])];

View File

@@ -21,7 +21,7 @@ const { showWsIcons, showAllActive, numbered_active_indicator: wsActiveIndicator
* @returns True if the workspace is active on the monitor, false otherwise.
*/
const isWorkspaceActiveOnMonitor = (monitor: number, i: number): boolean => {
return showAllActive.get() && hyprlandService.get_monitor(monitor).activeWorkspace.id === i;
return showAllActive.get() && hyprlandService.get_monitor(monitor)?.activeWorkspace?.id === i;
};
/**
@@ -84,7 +84,7 @@ export const getWsColor = (
showWsIcons.get() &&
smartHighlight &&
wsActiveIndicator.get() === 'highlight' &&
(hyprlandService.focusedWorkspace.id === i || isWorkspaceActiveOnMonitor(monitor, i))
(hyprlandService.focusedWorkspace?.id === i || isWorkspaceActiveOnMonitor(monitor, i))
) {
const iconColor = monochrome.get() ? background.get() : wsBackground.get();
const iconBackground = hasColor && isValidGjsColor(iconEntry.color) ? iconEntry.color : active.get();
@@ -122,7 +122,7 @@ export const getAppIcon = (
const clients = hyprlandService
.get_clients()
.filter((client) => client.workspace.id === workspaceIndex)
.filter((client) => client?.workspace?.id === workspaceIndex)
.map((client) => [client.class, client.title]);
if (!clients.length) {
@@ -200,7 +200,7 @@ export const renderClassnames = (
if (showNumbered || showWsIcons) {
const numActiveInd =
hyprlandService.focusedWorkspace.id === i || isWorkspaceActiveOnMonitor(monitor, i)
hyprlandService.focusedWorkspace?.id === i || isWorkspaceActiveOnMonitor(monitor, i)
? numberedActiveIndicator
: '';
@@ -255,7 +255,7 @@ export const renderLabel = (
}
if (showIcons) {
if (hyprlandService.focusedWorkspace.id === i || isWorkspaceActiveOnMonitor(monitor, i)) {
if (hyprlandService.focusedWorkspace?.id === i || isWorkspaceActiveOnMonitor(monitor, i)) {
return activeIndicator;
}
if ((hyprlandService.get_workspace(i)?.get_clients().length || 0) > 0) {

View File

@@ -86,7 +86,7 @@ export const WorkspaceModule = ({ monitor }: WorkspaceModuleProps): JSX.Element
smartHighlightEnabled: boolean,
monitorList: AstalHyprland.Monitor[],
) => {
const activeWorkspace = hyprlandService.focusedWorkspace.id;
const activeWorkspace = hyprlandService.focusedWorkspace?.id || -99999;
const workspacesToRender = getWorkspacesToRender(
totalWorkspaces,