fix(ags nvim): get eslint to work again and update deps
All checks were successful
Discord / discord commits (push) Has been skipped

This commit is contained in:
matt1432 2024-08-01 12:54:32 -04:00
parent a79cb29aaf
commit 28615e8152
31 changed files with 773 additions and 734 deletions

View file

@ -27,18 +27,18 @@ in
# lua # lua
'' ''
vim.api.nvim_create_autocmd('FileType', { vim.api.nvim_create_autocmd('FileType', {
pattern = { 'javascript', 'typescript', 'css', 'scss' }, pattern = { 'javascript', 'typescript', 'css', 'scss' },
command = 'setlocal ts=4 sw=4 sts=0 expandtab', command = 'setlocal ts=4 sw=4 sts=0 expandtab',
}); });
vim.api.nvim_create_autocmd('FileType', { vim.api.nvim_create_autocmd('FileType', {
pattern = 'html', pattern = 'html',
command = 'setlocal ts=2 sw=2 expandtab', command = 'setlocal ts=2 sw=2 expandtab',
}); });
vim.api.nvim_create_autocmd('FileType', { vim.api.nvim_create_autocmd('FileType', {
pattern = 'scss', pattern = 'scss',
command = 'setlocal iskeyword+=@-@', command = 'setlocal iskeyword+=@-@',
}); });
local lsp = require('lspconfig'); local lsp = require('lspconfig');
@ -66,6 +66,41 @@ in
command = 'EslintFixAll', command = 'EslintFixAll',
}); });
end, end,
settings = {
validate = 'on',
packageManager = 'npm',
useESLintClass = true,
useFlatConfig = true,
experimental = {
useFlatConfig = true,
},
codeAction = {
disableRuleComment = {
enable = true,
location = 'separateLine'
},
showDocumentation = {
enable = true,
},
},
codeActionOnSave = {
mode = 'all',
rules = {},
},
format = true,
quiet = false,
onIgnoredFiles = 'off',
rulesCustomizations = {},
run = 'onType',
problems = {
shortenToSingleLine = false,
},
nodePath = "",
workingDirectory = {
mode = 'location',
},
},
}); });
lsp.cssls.setup({ lsp.cssls.setup({

View file

@ -1,461 +1,454 @@
// TODO: switch to typescript https://github.com/eslint/eslint/pull/18134 // TODO: switch to typescript https://github.com/eslint/eslint/pull/18134
import eslint from '@eslint/js'; import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import tsPlugin from '@typescript-eslint/eslint-plugin';
import stylistic from '@stylistic/eslint-plugin';
// import stylisticRules from '@stylistic/eslint-plugin/rule-options';
import jsdoc from 'eslint-plugin-jsdoc'; import jsdoc from 'eslint-plugin-jsdoc';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
export default tseslint.config( export default tseslint.config({
// @ts-expect-error this works // @ts-expect-error this should work
eslint.configs.recommended, files: ['**/*.js', '**/*.ts'],
jsdoc.configs['flat/recommended-typescript'], ignores: ['node_modules/**', 'types/**'],
{ ignores: ['js'] }, extends: [
eslint.configs.recommended,
jsdoc.configs['flat/recommended-typescript'],
stylistic.configs['recommended-flat'],
...tseslint.configs.recommended,
...tseslint.configs.stylistic,
],
{ rules: {
plugins: { // JSDoc settings
jsdoc, 'jsdoc/tag-lines': ['warn', 'any', { startLines: 1 }],
'@stylistic': stylistic, // as typeof stylisticRules, 'jsdoc/check-line-alignment': ['warn', 'always', {
'@typescript-eslint': tsPlugin, tags: ['param', 'arg', 'argument', 'property', 'prop'],
}, }],
'jsdoc/no-types': 'off',
rules: { // Newer settings
// JSDoc settings '@typescript-eslint/no-extraneous-class': ['off'],
'jsdoc/tag-lines': ['warn', 'any', { startLines: 1 }], '@typescript-eslint/no-implied-eval': ['off'],
'jsdoc/check-line-alignment': ['warn', 'always', { 'class-methods-use-this': 'off',
tags: ['param', 'arg', 'argument', 'property', 'prop'], '@stylistic/no-multiple-empty-lines': 'off',
}],
// Newer settings // Pre-flat config
'@typescript-eslint/no-extraneous-class': ['off'], '@typescript-eslint/no-unused-vars': [
'@typescript-eslint/no-implied-eval': ['off'], 'error',
{
args: 'all',
argsIgnorePattern: '^_',
caughtErrors: 'all',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
// Pre-flat config 'array-callback-return': [
'@typescript-eslint/no-unused-vars': [ 'error',
'error', {
{ allowImplicit: true,
args: 'all', checkForEach: true,
argsIgnorePattern: '^_', },
caughtErrors: 'all', ],
caughtErrorsIgnorePattern: '^_', 'no-constructor-return': [
destructuredArrayIgnorePattern: '^_', 'error',
varsIgnorePattern: '^_', ],
ignoreRestSiblings: true, 'no-unreachable-loop': [
}, 'error',
], {
ignore: [
'array-callback-return': [ 'ForInStatement',
'error', 'ForOfStatement',
{ ],
allowImplicit: true, },
checkForEach: true, ],
}, 'no-use-before-define': [
], 'error',
'no-constructor-return': [ {
'error', functions: false,
], },
'no-unreachable-loop': [ ],
'error', 'block-scoped-var': [
{ 'error',
ignore: [ ],
'ForInStatement', 'curly': [
'ForOfStatement', 'warn',
], ],
}, 'default-case-last': [
], 'warn',
'no-use-before-define': [ ],
'error', 'default-param-last': [
{ 'error',
functions: false, ],
}, 'eqeqeq': [
], 'error',
'block-scoped-var': [ 'smart',
'error', ],
], 'func-names': [
'class-methods-use-this': [ 'warn',
'error', 'never',
], ],
'curly': [ 'func-style': [
'warn', 'warn',
], 'expression',
'default-case-last': [ ],
'warn', 'logical-assignment-operators': [
], 'warn',
'default-param-last': [ 'always',
'error', ],
], 'no-array-constructor': [
'eqeqeq': [ 'error',
'error', ],
'smart', 'no-empty-function': [
], 'warn',
'func-names': [ ],
'warn', 'no-empty-static-block': [
'never', 'warn',
], ],
'func-style': [ 'no-extend-native': [
'warn', 'error',
'expression', ],
], 'no-extra-bind': [
'logical-assignment-operators': [ 'warn',
'warn', ],
'always', 'no-implicit-coercion': [
], 'warn',
'no-array-constructor': [ ],
'error', 'no-iterator': [
], 'error',
'no-empty-function': [ ],
'warn', 'no-labels': [
], 'error',
'no-empty-static-block': [ ],
'warn', 'no-lone-blocks': [
], 'error',
'no-extend-native': [ ],
'error', 'no-lonely-if': [
], 'error',
'no-extra-bind': [ ],
'warn', 'no-loop-func': [
], 'error',
'no-implicit-coercion': [ ],
'warn', 'no-magic-numbers': [
], 'error',
'no-iterator': [ {
'error', ignore: [
], -1,
'no-labels': [ 0.1,
'error', 0,
], 1,
'no-lone-blocks': [ 2,
'error', 3,
], 4,
'no-lonely-if': [ 5,
'error', 10,
], 12,
'no-loop-func': [ 33,
'error', 66,
], 100,
'no-magic-numbers': [ 255,
'error', 360,
{ 450,
ignore: [ 500,
-1, 1000,
0.1, ],
0, ignoreDefaultValues: true,
1, ignoreClassFieldInitialValues: true,
2, },
3, ],
4, 'no-multi-assign': [
5, 'error',
10, ],
12, 'no-new-wrappers': [
33, 'error',
66, ],
100, 'no-object-constructor': [
255, 'error',
360, ],
450, 'no-proto': [
500, 'error',
1000, ],
], 'no-return-assign': [
ignoreDefaultValues: true, 'error',
ignoreClassFieldInitialValues: true, ],
}, 'no-sequences': [
], 'error',
'no-multi-assign': [ ],
'error', 'no-shadow': [
], 'error',
'no-new-wrappers': [ {
'error', builtinGlobals: true,
], allow: [
'no-object-constructor': [ 'Window',
'error', ],
], },
'no-proto': [ ],
'error', 'no-undef-init': [
], 'warn',
'no-return-assign': [ ],
'error', 'no-undefined': [
], 'error',
'no-sequences': [ ],
'error', 'no-useless-constructor': [
], 'warn',
'no-shadow': [ ],
'error', 'no-useless-escape': [
{ 'off',
builtinGlobals: true, ],
allow: [ 'no-useless-return': [
'Window', 'error',
], ],
}, 'no-var': [
], 'error',
'no-undef-init': [ ],
'warn', 'no-void': [
], 'off',
'no-undefined': [ ],
'error', 'no-with': [
], 'error',
'no-useless-constructor': [ ],
'warn', 'object-shorthand': [
], 'error',
'no-useless-escape': [ 'always',
'off', ],
], 'one-var': [
'no-useless-return': [ 'error',
'error', 'never',
], ],
'no-var': [ 'operator-assignment': [
'error', 'warn',
], 'always',
'no-void': [ ],
'off', 'prefer-arrow-callback': [
], 'error',
'no-with': [ ],
'error', 'prefer-const': [
], 'error',
'object-shorthand': [ ],
'error', 'prefer-object-has-own': [
'always', 'error',
], ],
'one-var': [ 'prefer-regex-literals': [
'error', 'error',
'never', ],
], 'prefer-template': [
'operator-assignment': [ 'warn',
'warn', ],
'always', 'no-prototype-builtins': 'off',
], '@typescript-eslint/no-var-requires': [
'prefer-arrow-callback': [ 'off',
'error', ],
], '@stylistic/array-bracket-newline': [
'prefer-const': [ 'warn',
'error', 'consistent',
], ],
'prefer-object-has-own': [ '@stylistic/array-bracket-spacing': [
'error', 'warn',
], 'never',
'prefer-regex-literals': [ ],
'error', '@stylistic/arrow-parens': [
], 'warn',
'prefer-template': [ 'always',
'warn', ],
], '@stylistic/brace-style': [
'no-prototype-builtins': 'off', 'warn',
'@typescript-eslint/no-var-requires': [ 'stroustrup',
'off', ],
], '@stylistic/comma-dangle': [
'@stylistic/array-bracket-newline': [ 'warn',
'warn', 'always-multiline',
'consistent', ],
], '@stylistic/comma-spacing': [
'@stylistic/array-bracket-spacing': [ 'warn',
'warn', {
'never', before: false,
], after: true,
'@stylistic/arrow-parens': [ },
'warn', ],
'always', '@stylistic/comma-style': [
], 'error',
'@stylistic/brace-style': [ 'last',
'warn', ],
'stroustrup', '@stylistic/dot-location': [
], 'error',
'@stylistic/comma-dangle': [ 'property',
'warn', ],
'always-multiline', '@stylistic/function-call-argument-newline': [
], 'warn',
'@stylistic/comma-spacing': [ 'consistent',
'warn', ],
{ '@stylistic/function-paren-newline': [
before: false, 'warn',
after: true, 'consistent',
}, ],
], '@stylistic/indent': [
'@stylistic/comma-style': [ 'warn',
'error', 4,
'last', {
], SwitchCase: 1,
'@stylistic/dot-location': [ ignoreComments: true,
'error', ignoredNodes: ['TemplateLiteral > *'],
'property', },
], ],
'@stylistic/function-call-argument-newline': [ '@stylistic/key-spacing': [
'warn', 'warn',
'consistent', {
], beforeColon: false,
'@stylistic/function-paren-newline': [ afterColon: true,
'warn', },
'consistent', ],
], '@stylistic/keyword-spacing': [
'@stylistic/indent': [ 'warn',
'warn', {
4, before: true,
{ },
SwitchCase: 1, ],
ignoreComments: true, '@stylistic/linebreak-style': [
ignoredNodes: ['TemplateLiteral > *'], 'error',
}, 'unix',
], ],
'@stylistic/key-spacing': [ '@stylistic/lines-between-class-members': [
'warn', 'warn',
{ 'always',
beforeColon: false, {
afterColon: true, exceptAfterSingleLine: true,
}, },
], ],
'@stylistic/keyword-spacing': [ '@stylistic/max-len': [
'warn', 'warn',
{ {
before: true, code: 105,
}, ignoreComments: true,
], ignoreTrailingComments: true,
'@stylistic/linebreak-style': [ ignoreUrls: true,
'error', },
'unix', ],
], '@stylistic/multiline-ternary': [
'@stylistic/lines-between-class-members': [ 'warn',
'warn', 'always-multiline',
'always', ],
{ '@stylistic/new-parens': [
exceptAfterSingleLine: true, 'error',
}, ],
], '@stylistic/no-mixed-operators': [
'@stylistic/max-len': [ 'warn',
'warn', ],
{ '@stylistic/no-mixed-spaces-and-tabs': [
code: 105, 'error',
ignoreComments: true, ],
ignoreTrailingComments: true, '@stylistic/no-multi-spaces': [
ignoreUrls: true, 'error',
}, ],
], '@stylistic/no-tabs': [
'@stylistic/multiline-ternary': [ 'error',
'warn', ],
'always-multiline', '@stylistic/no-trailing-spaces': [
], 'error',
'@stylistic/new-parens': [ ],
'error', '@stylistic/no-whitespace-before-property': [
], 'warn',
'@stylistic/no-mixed-operators': [ ],
'warn', '@stylistic/nonblock-statement-body-position': [
], 'error',
'@stylistic/no-mixed-spaces-and-tabs': [ 'below',
'error', ],
], '@stylistic/object-curly-newline': [
'@stylistic/no-multi-spaces': [ 'warn',
'error', {
], consistent: true,
'@stylistic/no-tabs': [ },
'error', ],
], '@stylistic/object-curly-spacing': [
'@stylistic/no-trailing-spaces': [ 'warn',
'error', 'always',
], ],
'@stylistic/no-whitespace-before-property': [ '@stylistic/operator-linebreak': [
'warn', 'warn',
], 'after',
'@stylistic/nonblock-statement-body-position': [ ],
'error', '@stylistic/padded-blocks': [
'below', 'error',
], 'never',
'@stylistic/object-curly-newline': [ ],
'warn', '@stylistic/padding-line-between-statements': [
{ 'warn',
consistent: true, {
}, blankLine: 'always',
], prev: '*',
'@stylistic/object-curly-spacing': [ next: 'return',
'warn', },
'always', {
], blankLine: 'always',
'@stylistic/operator-linebreak': [ prev: [
'warn', 'const',
'after', 'let',
], 'var',
'@stylistic/padded-blocks': [ ],
'error', next: '*',
'never', },
], {
'@stylistic/padding-line-between-statements': [ blankLine: 'any',
'warn', prev: [
{ 'const',
blankLine: 'always', 'let',
prev: '*', 'var',
next: 'return', ],
}, next: [
{ 'const',
blankLine: 'always', 'let',
prev: [ 'var',
'const', ],
'let', },
'var', {
], blankLine: 'always',
next: '*', prev: [
}, 'case',
{ 'default',
blankLine: 'any', ],
prev: [ next: '*',
'const', },
'let', ],
'var', '@stylistic/quote-props': [
], 'error',
next: [ 'consistent-as-needed',
'const', ],
'let', '@stylistic/quotes': [
'var', 'error',
], 'single',
}, {
{ avoidEscape: true,
blankLine: 'always', },
prev: [ ],
'case', '@stylistic/semi': [
'default', 'error',
], 'always',
next: '*', ],
}, '@stylistic/semi-spacing': [
], 'warn',
'@stylistic/quote-props': [ ],
'error', '@stylistic/space-before-blocks': [
'consistent-as-needed', 'warn',
], ],
'@stylistic/quotes': [ '@stylistic/space-before-function-paren': [
'error', 'warn',
'single', 'never',
{ ],
avoidEscape: true, '@stylistic/space-infix-ops': [
}, 'warn',
], ],
'@stylistic/semi': [ '@stylistic/spaced-comment': [
'error', 'warn',
'always', 'always',
], ],
'@stylistic/semi-spacing': [ '@stylistic/switch-colon-spacing': [
'warn', 'warn',
], ],
'@stylistic/space-before-blocks': [ '@stylistic/wrap-regex': [
'warn', 'warn',
], ],
'@stylistic/space-before-function-paren': [
'warn',
'never',
],
'@stylistic/space-infix-ops': [
'warn',
],
'@stylistic/spaced-comment': [
'warn',
'always',
],
'@stylistic/switch-colon-spacing': [
'warn',
],
'@stylistic/wrap-regex': [
'warn',
],
},
}, },
); });

View file

@ -5,137 +5,6 @@ import { Variable as Var } from 'types/variable';
import { Widget as agsWidget } from 'types/widgets/widget'; import { Widget as agsWidget } from 'types/widgets/widget';
export type AgsWidget = agsWidget<unknown> & Widget; export type AgsWidget = agsWidget<unknown> & Widget;
// For ./ts/applauncher/main.ts
import { Application } from 'types/service/applications.ts';
import { CursorBoxProps } from 'ts/misc/cursorbox';
export type AgsAppItem = AgsEventBox<Widget, { app: Application }
& CursorBoxProps<Widget, unknown>>;
// For ./ts/bar/hovers/keyboard.ts
export type Keyboard = {
address: string;
name: string;
rules: string;
model: string;
layout: string;
variant: string;
options: string;
active_keymap: string;
main: boolean;
};
// For ./ts/bar/items/workspaces.ts
// TODO: improve type
export type Workspace = AgsRevealer<unknown & Widget, unknown & { id: number }>;
// For ./ts/bar/fullscreen.ts
export type DefaultProps = RevealerProps<CenterBoxGeneric>;
// For ./ts/media-player/gesture.ts
export type Gesture = {
attribute?: object
setup?(self: OverlayGeneric): void
props?: OverlayProps<unknown & Widget, unknown>
};
// For ./ts/media-player/mpris.ts
type PlayerDragProps = unknown & { dragging: boolean };
export type PlayerDrag = AgsCenterBox<
unknown & Widget, unknown & Widget, unknown & Widget, unknown & PlayerDragProps
>;
type Colors = {
imageAccent: string;
buttonAccent: string;
buttonText: string;
hoverAccent: string;
};
// For ./ts/media-player
export type PlayerBoxProps = {
bgStyle: string,
player: MprisPlayer,
};
export type PlayerBox = AgsCenterBox<
unknown & Widget, unknown & Widget, unknown & Widget, PlayerBoxProps
>;
export type PlayerOverlay = AgsOverlay<AgsWidget, {
players: Map;
setup: boolean;
dragging: boolean;
includesWidget(playerW: PlayerBox): PlayerBox;
showTopOnly(): void;
moveToTop(player: PlayerBox): void;
}>;
export type PlayerButtonType = {
player: MprisPlayer
colors: Var<Colors>
children: StackProps['children']
onClick: string
prop: string
};
// For ./ts/notifications/gesture.js
type NotifGestureProps = {
dragging: boolean;
hovered: boolean
ready: boolean
id: number;
slideAway(side: 'Left' | 'Right'): void;
};
export type NotifGesture = AgsEventBox<BoxGeneric, NotifGestureProps>;
// For ./ts/osd/ctor.ts
export type OSDStack = AgsStack<unknown & Widget, {
popup(osd: string): void,
}>;
export type ConnectFunc = (self?: ProgressBarGeneric) => void;
export type OSD = {
name: string;
icon: IconPropsGeneric['icon'];
info: {
mod: GObject.Object;
signal?: string | string[];
logic?(self: ProgressBarGeneric): void;
widget?: AgsWidget;
}
};
// For ./ts/on-screen-keyboard
export type OskWindow = Window<BoxGeneric, {
startY: null | number;
setVisible: (state: boolean) => void;
killGestureSigs: () => void;
setSlideUp: () => void;
setSlideDown: () => void;
}>;
// For CursorBox
import { CursorBox, CursorBoxProps } from 'ts/misc/cursorbox';
export type CursorBox = CursorBox;
export type CursorBoxProps = CursorBoxProps;
// For PopupWindow
export type HyprTransition = 'slide' | 'slide top' | 'slide bottom' | 'slide left' |
'slide right' | 'popin' | 'fade';
export type CloseType = 'none' | 'stay' | 'released' | 'clicked';
import { PopupWindow } from 'ts/misc/popup';
export type PopupWindow = PopupWindow;
// For ./ts/quick-settings
import { BluetoothDevice as BTDev } from 'types/service/bluetooth.ts';
export type APType = {
bssid: string
address: string
lastSeen: number
ssid: string
active: boolean
strength: number
iconName: string
};
export type APBox = AgsBox<unknown & Widget, { ap: Var<APType> }>;
export type DeviceBox = AgsBox<unknown & Widget, { dev: BTDev }>;
// Generic widgets // Generic widgets
import AgsBox from 'types/widgets/box.ts'; import AgsBox from 'types/widgets/box.ts';
export type BoxGeneric = AgsBox<unknown & Widget, unknown>; export type BoxGeneric = AgsBox<unknown & Widget, unknown>;
@ -168,10 +37,141 @@ import AgsRevealer, { RevealerProps } from 'types/widgets/revealer';
export type RevealerGeneric = AgsRevealer<unknown & Widget, unknown>; export type RevealerGeneric = AgsRevealer<unknown & Widget, unknown>;
import AgsStack, { StackProps } from 'types/widgets/stack'; import AgsStack, { StackProps } from 'types/widgets/stack';
export type StackGeneric = AgsStack<{ [name: string]: Widget; }, unknown>; export type StackGeneric = AgsStack<Record<string, Widget>, unknown>;
import AgsScrollable from 'types/widgets/scrollable'; import AgsScrollable from 'types/widgets/scrollable';
export type ScrollableGeneric = AgsScrollable<unkown & Widget, unknown>; export type ScrollableGeneric = AgsScrollable<unkown & Widget, unknown>;
import AgsWindow from 'types/widgets/window'; import AgsWindow from 'types/widgets/window';
export type WindowGeneric = AgsWindow<unknown & Widget, unknown>; export type WindowGeneric = AgsWindow<unknown & Widget, unknown>;
// For ./ts/applauncher/main.ts
import { Application } from 'types/service/applications.ts';
import { CursorBoxProps } from 'ts/misc/cursorbox';
export type AgsAppItem = AgsEventBox<Widget, { app: Application }
& CursorBoxProps<Widget, unknown>>;
// For ./ts/bar/hovers/keyboard.ts
export interface Keyboard {
address: string
name: string
rules: string
model: string
layout: string
variant: string
options: string
active_keymap: string
main: boolean
}
// For ./ts/bar/items/workspaces.ts
// TODO: improve type
export type Workspace = AgsRevealer<unknown & Widget, unknown & { id: number }>;
// For ./ts/bar/fullscreen.ts
export type DefaultProps = RevealerProps<CenterBoxGeneric>;
// For ./ts/media-player/gesture.ts
export interface Gesture {
attribute?: object
setup?(self: OverlayGeneric): void
props?: OverlayProps<unknown & Widget, unknown>
}
// For ./ts/media-player/mpris.ts
type PlayerDragProps = unknown & { dragging: boolean };
export type PlayerDrag = AgsCenterBox<
unknown & Widget, unknown & Widget, unknown & Widget, unknown & PlayerDragProps
>;
interface Colors {
imageAccent: string
buttonAccent: string
buttonText: string
hoverAccent: string
}
// For ./ts/media-player
export interface PlayerBoxProps {
bgStyle: string
player: MprisPlayer
}
export type PlayerBox = AgsCenterBox<
unknown & Widget, unknown & Widget, unknown & Widget, PlayerBoxProps
>;
export type PlayerOverlay = AgsOverlay<AgsWidget, {
players: Map
setup: boolean
dragging: boolean
includesWidget(playerW: PlayerBox): PlayerBox
showTopOnly(): void
moveToTop(player: PlayerBox): void
}>;
export interface PlayerButtonType {
player: MprisPlayer
colors: Var<Colors>
children: StackProps['children']
onClick: string
prop: string
}
// For ./ts/notifications/gesture.js
interface NotifGestureProps {
dragging: boolean
hovered: boolean
ready: boolean
id: number
slideAway(side: 'Left' | 'Right'): void
}
export type NotifGesture = AgsEventBox<BoxGeneric, NotifGestureProps>;
// For ./ts/osd/ctor.ts
export type OSDStack = AgsStack<unknown & Widget, {
popup(osd: string): void
}>;
export type ConnectFunc = (self?: ProgressBarGeneric) => void;
export interface OSD {
name: string
icon: IconPropsGeneric['icon']
info: {
mod: GObject.Object
signal?: string | string[]
logic?(self: ProgressBarGeneric): void
widget?: AgsWidget
}
}
// For ./ts/on-screen-keyboard
export type OskWindow = Window<BoxGeneric, {
startY: null | number
setVisible: (state: boolean) => void
killGestureSigs: () => void
setSlideUp: () => void
setSlideDown: () => void
}>;
// For CursorBox
import { CursorBox, CursorBoxProps } from 'ts/misc/cursorbox';
export type CursorBox = CursorBox;
export type CursorBoxProps = CursorBoxProps;
// For PopupWindow
export type HyprTransition = 'slide' | 'slide top' | 'slide bottom' | 'slide left' |
'slide right' | 'popin' | 'fade';
export type CloseType = 'none' | 'stay' | 'released' | 'clicked';
import { PopupWindow } from 'ts/misc/popup';
export type PopupWindow = PopupWindow;
// For ./ts/quick-settings
import { BluetoothDevice as BTDev } from 'types/service/bluetooth.ts';
export interface APType {
bssid: string
address: string
lastSeen: number
ssid: string
active: boolean
strength: number
iconName: string
}
export type APBox = AgsBox<unknown & Widget, { ap: Var<APType> }>;
export type DeviceBox = AgsBox<unknown & Widget, { dev: BTDev }>;

View file

@ -1,7 +1,9 @@
const { execAsync, monitorFile } = Utils; const { execAsync, monitorFile } = Utils;
/** @param {string} host */ /**
* @param {string} host the name of the machine/user who's running ags
*/
const watchAndCompileSass = (host) => { const watchAndCompileSass = (host) => {
const reloadCss = () => { const reloadCss = () => {
const scss = `${App.configDir}/scss/${host}.scss`; const scss = `${App.configDir}/scss/${host}.scss`;
@ -20,7 +22,10 @@ const watchAndCompileSass = (host) => {
reloadCss(); reloadCss();
}; };
/** @param {string} host */ /**
* @param {string} host the name of the machine/user who's running ags
* @returns the config
*/
export const transpileTypeScript = async(host) => { export const transpileTypeScript = async(host) => {
const outPath = `/tmp/ags-${host}/index.js`; const outPath = `/tmp/ags-${host}/index.js`;

Binary file not shown.

View file

@ -5,16 +5,13 @@
"fzf": "0.5.2" "fzf": "0.5.2"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "9.7.0", "@eslint/js": "9.8.0",
"@stylistic/eslint-plugin": "2.3.0", "@stylistic/eslint-plugin": "2.6.1",
"@types/eslint__js": "8.42.3", "@types/eslint__js": "8.42.3",
"@types/node": "20.14.11", "@types/node": "22.0.2",
"eslint": "9.7.0", "eslint": "9.8.0",
"eslint-plugin-jsdoc": "48.7.0", "eslint-plugin-jsdoc": "48.10.2",
"typescript": "5.5.3", "typescript": "5.5.4",
"typescript-eslint": "7.16.1" "typescript-eslint": "8.0.0"
},
"overrides": {
"eslint": "$eslint"
} }
} }

View file

@ -41,22 +41,6 @@ class Brightness extends Service {
return this.#kbd; return this.#kbd;
} }
get screen() {
return this.#screen;
}
get screenIcon() {
return this.#screenIcon;
}
get caps() {
return this.#caps;
}
get capsIcon() {
return this.#capsIcon;
}
set kbd(value) { set kbd(value) {
if (value < 0 || value > this.#kbdMax) { if (value < 0 || value > this.#kbdMax) {
return; return;
@ -70,6 +54,10 @@ class Brightness extends Service {
.catch(console.error); .catch(console.error);
} }
get screen() {
return this.#screen;
}
set screen(percent) { set screen(percent) {
if (percent < 0) { if (percent < 0) {
percent = 0; percent = 0;
@ -88,16 +76,27 @@ class Brightness extends Service {
.catch(console.error); .catch(console.error);
} }
get screenIcon() {
return this.#screenIcon;
}
get caps() {
return this.#caps;
}
get capsIcon() {
return this.#capsIcon;
}
constructor() { constructor() {
super(); super();
try { try {
this.#monitorKbdState(); this.#monitorKbdState();
this.#kbdMax = Number(exec(`brightnessctl -d ${KBD} m`)); this.#kbdMax = Number(exec(`brightnessctl -d ${KBD} m`));
this.#caps = Number(exec(`bash -c brightnessctl -d ${this.#capsName} g`)); this.#caps = Number(exec(`bash -c brightnessctl -d ${this.#capsName} g`));
this.#screen = Number(exec('brightnessctl g')) / this.#screen = Number(exec('brightnessctl g')) / Number(exec('brightnessctl m'));
Number(exec('brightnessctl m'));
} }
catch (error) { catch (_e) {
console.error('missing dependancy: brightnessctl'); console.error('missing dependancy: brightnessctl');
} }
} }
@ -140,6 +139,7 @@ class Brightness extends Service {
} }
}, },
).catch(() => { ).catch(() => {
// @ts-expect-error this works in ags
interval.destroy(); interval.destroy();
}); });
}, INTERVAL); }, INTERVAL);

View file

@ -16,7 +16,7 @@ class Clipboard extends Service {
// Class Attributes // Class Attributes
private _clips_left = 0; private _clips_left = 0;
private _clips: Map<number, { clip: string; isImage: boolean }> = new Map(); private _clips = new Map<number, { clip: string, isImage: boolean }>();
get clips() { get clips() {
return this._clips; return this._clips;
@ -75,7 +75,7 @@ class Clipboard extends Service {
this._clips_left = Math.min(rawClips.length - 1, n); this._clips_left = Math.min(rawClips.length - 1, n);
rawClips.forEach(async (clip, i) => { rawClips.forEach(async(clip, i) => {
if (i > n) { if (i > n) {
return; return;
} }
@ -83,7 +83,7 @@ class Clipboard extends Service {
if (clip.includes('img')) { if (clip.includes('img')) {
this._decrementClipsLeft(); this._decrementClipsLeft();
const newClip: [number, {clip: string; isImage: boolean;}] = [ const newClip: [number, { clip: string, isImage: boolean }] = [
parseInt((clip.match('[0-9]+') ?? [''])[0]), parseInt((clip.match('[0-9]+') ?? [''])[0]),
{ {
clip, clip,
@ -98,7 +98,7 @@ class Clipboard extends Service {
const decodedClip = await this._decodeItem(clip); const decodedClip = await this._decodeItem(clip);
if (decodedClip) { if (decodedClip) {
const newClip: [number, {clip: string; isImage: boolean;}] = [ const newClip: [number, { clip: string, isImage: boolean }] = [
parseInt(clip), parseInt(clip),
{ {
clip: decodedClip, clip: decodedClip,
@ -120,7 +120,7 @@ class Clipboard extends Service {
() => { () => {
this._getHistory(1); this._getHistory(1);
}, },
() => {/**/}, () => { /**/ },
); );
} }
} }

View file

@ -57,7 +57,7 @@ class GSR extends Service {
}, },
); );
}, },
() => {/**/}, () => { /**/ },
); );
} }

View file

@ -14,27 +14,27 @@ const ON_CLICK_TRIGGERS = [
// Types // Types
import { PopupWindow } from 'global-types'; import { PopupWindow } from 'global-types';
import { Subprocess } from 'types/@girs/gio-2.0/gio-2.0.cjs'; import { Subprocess } from 'types/@girs/gio-2.0/gio-2.0.cjs';
type Layer = { interface Layer {
address: string; address: string
x: number; x: number
y: number; y: number
w: number; w: number
h: number; h: number
namespace: string; namespace: string
}; }
type Levels = { interface Levels {
0?: Array<Layer> | null; 0?: Layer[] | null
1?: Array<Layer> | null; 1?: Layer[] | null
2?: Array<Layer> | null; 2?: Layer[] | null
3?: Array<Layer> | null; 3?: Layer[] | null
}; }
type Layers = { interface Layers {
levels: Levels; levels: Levels
}; }
type CursorPos = { interface CursorPos {
x: number; x: number
y: number; y: number
}; }
class Pointers extends Service { class Pointers extends Service {
@ -51,7 +51,7 @@ class Pointers extends Service {
#process = null as Subprocess | null; #process = null as Subprocess | null;
#lastLine = ''; #lastLine = '';
#pointers = [] as Array<string>; #pointers = [] as string[];
get process() { get process() {
return this.#process; return this.#process;
@ -111,12 +111,12 @@ class Pointers extends Service {
#initAppConnection() { #initAppConnection() {
App.connect('window-toggled', () => { App.connect('window-toggled', () => {
const anyVisibleAndClosable = const anyVisibleAndClosable =
(App.windows as Array<PopupWindow>).some((w) => { (App.windows as PopupWindow[]).some((w) => {
const closable = w.close_on_unfocus && const closable = w.close_on_unfocus &&
!( !(
w.close_on_unfocus === 'none' || w.close_on_unfocus === 'none' ||
w.close_on_unfocus === 'stay' w.close_on_unfocus === 'stay'
); );
return w.visible && closable; return w.visible && closable;
}); });
@ -132,7 +132,7 @@ class Pointers extends Service {
} }
static detectClickedOutside(clickStage: string) { static detectClickedOutside(clickStage: string) {
const toClose = ((App.windows as Array<PopupWindow>)).some((w) => { const toClose = ((App.windows as PopupWindow[])).some((w) => {
const closable = ( const closable = (
w.close_on_unfocus && w.close_on_unfocus &&
w.close_on_unfocus === clickStage w.close_on_unfocus === clickStage
@ -160,8 +160,8 @@ class Pointers extends Service {
'osk', 'osk',
]; ];
const getNoCloseWidgets = (names: Array<string>) => { const getNoCloseWidgets = (names: string[]) => {
const arr = [] as Array<Layer>; const arr = [] as Layer[];
names.forEach((name) => { names.forEach((name) => {
arr.push( arr.push(
@ -184,7 +184,7 @@ class Pointers extends Service {
}; };
const clickIsOnWidget = (w: Layer) => { const clickIsOnWidget = (w: Layer) => {
return pos.x > w.x && pos.x < w.x + w.w && return pos.x > w.x && pos.x < w.x + w.w &&
pos.y > w.y && pos.y < w.y + w.h; pos.y > w.y && pos.y < w.y + w.h;
}; };
const noCloseWidgets = const noCloseWidgets =
@ -200,9 +200,9 @@ class Pointers extends Service {
} }
return window && return window &&
window.close_on_unfocus && window.close_on_unfocus &&
window.close_on_unfocus === window.close_on_unfocus ===
clickStage; clickStage;
}); });
if (noCloseWidgets.some(clickIsOnWidget)) { if (noCloseWidgets.some(clickIsOnWidget)) {
@ -212,7 +212,7 @@ class Pointers extends Service {
widgets.forEach( widgets.forEach(
(w) => { (w) => {
if (!(pos.x > w.x && pos.x < w.x + w.w && if (!(pos.x > w.x && pos.x < w.x + w.w &&
pos.y > w.y && pos.y < w.y + w.h)) { pos.y > w.y && pos.y < w.y + w.h)) {
App.closeWindow(w.namespace); App.closeWindow(w.namespace);
} }
}, },

View file

@ -5,7 +5,7 @@ import { Application } from 'types/service/applications.ts';
const bash = async(strings: TemplateStringsArray | string, ...values: unknown[]) => { const bash = async(strings: TemplateStringsArray | string, ...values: unknown[]) => {
const cmd = typeof strings === 'string' ? const cmd = typeof strings === 'string' ?
strings : strings :
strings.flatMap((str, i) => `${str }${values[i] ?? ''}`) strings.flatMap((str, i) => `${str}${values[i] ?? ''}`)
.join(''); .join('');
return Utils.execAsync(['bash', '-c', cmd]).catch((err) => { return Utils.execAsync(['bash', '-c', cmd]).catch((err) => {

View file

@ -69,7 +69,7 @@ export default () => {
rows.forEach((row) => { rows.forEach((row) => {
row.changed(); row.changed();
const item = (row.get_children()[0] as AgsAppItem); const item = row.get_children()[0] as AgsAppItem;
if (item.attribute.app) { if (item.attribute.app) {
const isMatching = fzfResults.some((r) => { const isMatching = fzfResults.some((r) => {

View file

@ -27,7 +27,7 @@ Hyprland.connect('event', (hyprObj) => {
const mon = Hyprland.getMonitor(c.monitor); const mon = Hyprland.getMonitor(c.monitor);
return c.fullscreen && return c.fullscreen &&
c.workspace.id === mon?.activeWorkspace.id; c.workspace.id === mon?.activeWorkspace.id;
}); });
const monitors = fsClients.map((c) => const monitors = fsClients.map((c) =>

View file

@ -9,11 +9,11 @@ export default () => HoverRevealer({
icon: Icon().hook(Network, (self) => { icon: Icon().hook(Network, (self) => {
if (Network.wifi.internet === 'connected' || if (Network.wifi.internet === 'connected' ||
Network.wifi.internet === 'connecting') { Network.wifi.internet === 'connecting') {
self.icon = Network.wifi.icon_name; self.icon = Network.wifi.icon_name;
} }
else if (Network.wired.internet === 'connected' || else if (Network.wired.internet === 'connected' ||
Network.wired.internet === 'connecting') { Network.wired.internet === 'connecting') {
self.icon = Network.wired.icon_name; self.icon = Network.wired.icon_name;
} }
else { else {
@ -23,11 +23,11 @@ export default () => HoverRevealer({
label: Label().hook(Network, (self) => { label: Label().hook(Network, (self) => {
if (Network.wifi.internet === 'connected' || if (Network.wifi.internet === 'connected' ||
Network.wifi.internet === 'connecting') { Network.wifi.internet === 'connecting') {
self.label = Network.wifi.ssid || 'Unknown'; self.label = Network.wifi.ssid || 'Unknown';
} }
else if (Network.wired.internet === 'connected' || else if (Network.wired.internet === 'connected' ||
Network.wired.internet === 'connecting') { Network.wired.internet === 'connecting') {
self.label = 'Connected'; self.label = 'Connected';
} }
else { else {

View file

@ -50,7 +50,7 @@ const Workspace = ({ id }: { id: number }) => {
// Deal with urgent windows // Deal with urgent windows
const client = Hyprland.getClient(addr); const client = Hyprland.getClient(addr);
const isThisUrgent = client && const isThisUrgent = client &&
client.workspace.id === id; client.workspace.id === id;
if (isThisUrgent) { if (isThisUrgent) {
self.toggleClassName('urgent', true); self.toggleClassName('urgent', true);

View file

@ -3,10 +3,12 @@ import CalendarWidget from './main.ts';
import { get_gdkmonitor_from_desc } from '../lib.ts'; import { get_gdkmonitor_from_desc } from '../lib.ts';
const RIGHT_MARGIN = 20;
export default () => PopupWindow({ export default () => PopupWindow({
name: 'calendar', name: 'calendar',
anchor: ['bottom', 'right'], anchor: ['bottom', 'right'],
margins: [0, 20, 0, 0], margins: [0, RIGHT_MARGIN, 0, 0],
transition: 'slide bottom', transition: 'slide bottom',
gdkmonitor: get_gdkmonitor_from_desc('desc:Acer Technologies Acer K212HQL T3EAA0014201'), gdkmonitor: get_gdkmonitor_from_desc('desc:Acer Technologies Acer K212HQL T3EAA0014201'),

View file

@ -15,8 +15,8 @@ import { Box as AgsBox } from 'types/widgets/box';
const lock = Lock.prepare_lock(); const lock = Lock.prepare_lock();
const windows: Map<Gdk.Monitor, Gtk.Window> = new Map(); const windows = new Map<Gdk.Monitor, Gtk.Window>();
const blurBGs: AgsBox<Gtk.Widget, { geometry: { w: number, h: number }; }>[] = []; const blurBGs: AgsBox<Gtk.Widget, { geometry: { w: number, h: number } }>[] = [];
const transition_duration = 1000; const transition_duration = 1000;
const WINDOW_MARGINS = -2; const WINDOW_MARGINS = -2;

View file

@ -19,7 +19,7 @@ import {
export default ({ export default ({
setup = () => {/**/}, setup = () => { /**/ },
...props ...props
}: Gesture) => { }: Gesture) => {
const widget = EventBox(); const widget = EventBox();

View file

@ -3,10 +3,10 @@ import { PopupWindow } from 'global-types';
export default () => { export default () => {
(App.windows as Array<PopupWindow>) (App.windows as PopupWindow[])
.filter((w) => w && .filter((w) => w &&
w.close_on_unfocus && w.close_on_unfocus &&
w.close_on_unfocus !== 'stay') w.close_on_unfocus !== 'stay')
.forEach((w) => { .forEach((w) => {
App.closeWindow(w.name); App.closeWindow(w.name);
}); });

View file

@ -5,6 +5,9 @@ import Gdk from 'gi://Gdk?version=3.0';
import { BaseProps, Widget as AgsWidget } from 'types/widgets/widget'; import { BaseProps, Widget as AgsWidget } from 'types/widgets/widget';
type EventHandler<Self> = (self: Self, event: Gdk.Event) => boolean | unknown; type EventHandler<Self> = (self: Self, event: Gdk.Event) => boolean | unknown;
// eslint-disable-next-line
export interface CursorBox<Child, Attr> extends AgsWidget<Attr> { }
export type CursorBoxProps< export type CursorBoxProps<
Child extends Gtk.Widget, Child extends Gtk.Widget,
Attr = unknown, Attr = unknown,
@ -26,10 +29,8 @@ export type CursorBoxProps<
on_secondary_click_release?: EventHandler<Self> on_secondary_click_release?: EventHandler<Self>
}, Attr>; }, Attr>;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface CursorBox<Child, Attr> extends AgsWidget<Attr> { }
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
export class CursorBox<Child extends Gtk.Widget, Attr> extends Gtk.EventBox { export class CursorBox<Child extends Gtk.Widget, Attr> extends Gtk.EventBox {
static { static {
Widget.register(this, { Widget.register(this, {

View file

@ -3,7 +3,7 @@ const { get_home_dir } = imports.gi.GLib;
import GObject from 'types/@girs/gobject-2.0/gobject-2.0'; import GObject from 'types/@girs/gobject-2.0/gobject-2.0';
type Persist = { interface Persist {
name: string name: string
gobject: GObject.Object gobject: GObject.Object
prop: string prop: string
@ -11,7 +11,7 @@ type Persist = {
whenTrue?: boolean | string whenTrue?: boolean | string
whenFalse?: boolean | string whenFalse?: boolean | string
signal?: string signal?: string
}; }
export default ({ export default ({

View file

@ -8,6 +8,9 @@ import { Window } from 'resource:///com/github/Aylur/ags/widgets/window.js';
import type { WindowProps } from 'types/widgets/window'; import type { WindowProps } from 'types/widgets/window';
import type { Widget as AgsWidget } from 'types/widgets/widget'; import type { Widget as AgsWidget } from 'types/widgets/widget';
// eslint-disable-next-line
export interface PopupWindow<Child, Attr> extends AgsWidget<Attr> { }
import { import {
CloseType, CloseType,
HyprTransition, HyprTransition,
@ -18,17 +21,15 @@ export type PopupWindowProps<
Attr = unknown, Attr = unknown,
Self = PopupWindow<Child, Attr>, Self = PopupWindow<Child, Attr>,
> = WindowProps<Child, Attr, Self> & { > = WindowProps<Child, Attr, Self> & {
transition?: HyprTransition; transition?: HyprTransition
on_open?(self: PopupWindow<Child, Attr>): void; on_open?(self: PopupWindow<Child, Attr>): void
on_close?(self: PopupWindow<Child, Attr>): void; on_close?(self: PopupWindow<Child, Attr>): void
close_on_unfocus?: CloseType; close_on_unfocus?: CloseType
anchor?: Array<'top' | 'bottom' | 'right' | 'left'>; anchor?: ('top' | 'bottom' | 'right' | 'left')[]
}; };
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface PopupWindow<Child, Attr> extends AgsWidget<Attr> { }
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
export class PopupWindow< export class PopupWindow<
Child extends Gtk.Widget, Child extends Gtk.Widget,
Attr, Attr,
@ -68,6 +69,7 @@ export class PopupWindow<
} }
// eslint-disable-next-line no-use-before-define
protected _on_open: (self: PopupWindow<Child, Attr>) => void; protected _on_open: (self: PopupWindow<Child, Attr>) => void;
get on_open() { get on_open() {
@ -79,6 +81,7 @@ export class PopupWindow<
} }
// eslint-disable-next-line no-use-before-define
private _on_close: (self: PopupWindow<Child, Attr>) => void; private _on_close: (self: PopupWindow<Child, Attr>) => void;
get on_close() { get on_close() {
@ -92,8 +95,8 @@ export class PopupWindow<
constructor({ constructor({
transition = 'slide top', transition = 'slide top',
on_open = () => {/**/ }, on_open = () => { /**/ },
on_close = () => {/**/ }, on_close = () => { /**/ },
// Window props // Window props
name, name,

View file

@ -9,22 +9,24 @@ import { ListBoxRow } from 'types/@girs/gtk-3.0/gtk-3.0.cjs';
import { Monitor } from 'types/service/hyprland'; import { Monitor } from 'types/service/hyprland';
import { Binding } from 'types/service'; import { Binding } from 'types/service';
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
export interface SortedList<Attr> extends AgsWidget<Attr> { }
// eslint-disable-next-line no-use-before-define
type MakeChild = ReturnType<typeof makeChild>; type MakeChild = ReturnType<typeof makeChild>;
type SortedListProps<Attr = unknown, Self = SortedList<Attr>> = type SortedListProps<Attr = unknown, Self = SortedList<Attr>> =
PopupWindowProps<MakeChild['child'], Attr, Self> & { PopupWindowProps<MakeChild['child'], Attr, Self> & {
on_select: (row: ListBoxRow) => void; on_select: (row: ListBoxRow) => void
init_rows?: (list: MakeChild['list']) => void; init_rows?: (list: MakeChild['list']) => void
set_sort: ( set_sort: (
text: string, text: string,
list: MakeChild['list'], list: MakeChild['list'],
placeholder: MakeChild['placeholder'], placeholder: MakeChild['placeholder'],
) => void; ) => void
setup_list?: (list: MakeChild['list']) => void; setup_list?: (list: MakeChild['list']) => void
}; };
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface SortedList<Attr> extends AgsWidget<Attr> { }
const centerCursor = async(): Promise<void> => { const centerCursor = async(): Promise<void> => {
@ -108,6 +110,7 @@ const makeChild = (class_name: string | Binding<any, any, string>) => {
}; };
}; };
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
export class SortedList< export class SortedList<
Attr, Attr,
> extends PopupWindow<MakeChild['child'], Attr> { > extends PopupWindow<MakeChild['child'], Attr> {

View file

@ -14,11 +14,11 @@ import { launchApp } from '../applauncher/launch.ts';
// Types // Types
import { Notification as NotifObj } from 'types/service/notifications.ts'; import { Notification as NotifObj } from 'types/service/notifications.ts';
import { Client } from 'types/service/hyprland.ts'; import { Client } from 'types/service/hyprland.ts';
type NotificationWidget = { interface NotificationWidget {
notif: NotifObj notif: NotifObj
slideIn?: 'Left' | 'Right' slideIn?: 'Left' | 'Right'
command?(): void command?(): void
}; }
import { import {
CursorBox as CBox, CursorBox as CBox,
EventBoxGeneric, EventBoxGeneric,
@ -46,7 +46,7 @@ const getDragState = (box: EventBoxGeneric) => (box
const NotificationIcon = (notif: NotifObj) => { const NotificationIcon = (notif: NotifObj) => {
let iconCmd = (box: CBox):void => { let iconCmd = (box: CBox): void => {
if (!box) { if (!box) {
console.log(); console.log();
} }
@ -66,16 +66,16 @@ const NotificationIcon = (notif: NotifObj) => {
if (!getDragState(box)) { if (!getDragState(box)) {
if (wmClass === 'Proton Mail') { if (wmClass === 'Proton Mail') {
Hyprland.messageAsync('dispatch ' + Hyprland.messageAsync('dispatch ' +
'togglespecialworkspace thunder'); 'togglespecialworkspace thunder');
} }
else if (wmClass === 'Spotify') { else if (wmClass === 'Spotify') {
Hyprland.messageAsync('dispatch ' + Hyprland.messageAsync('dispatch ' +
'togglespecialworkspace spot'); 'togglespecialworkspace spot');
} }
else { else {
Hyprland.messageAsync('j/clients').then((msg) => { Hyprland.messageAsync('j/clients').then((msg) => {
const clients = JSON.parse(msg) as Array<Client>; const clients = JSON.parse(msg) as Client[];
const classes = [] as Array<string>; const classes = [] as string[];
for (const key of clients) { for (const key of clients) {
if (key.class) { if (key.class) {
@ -85,7 +85,7 @@ const NotificationIcon = (notif: NotifObj) => {
if (wmClass && classes.includes(wmClass)) { if (wmClass && classes.includes(wmClass)) {
Hyprland.messageAsync('dispatch ' + Hyprland.messageAsync('dispatch ' +
`focuswindow ^(${wmClass})`); `focuswindow ^(${wmClass})`);
} }
else { else {
Hyprland.messageAsync('dispatch workspace empty') Hyprland.messageAsync('dispatch workspace empty')
@ -168,7 +168,7 @@ export const HasNotifs = Variable(false);
export const Notification = ({ export const Notification = ({
notif, notif,
slideIn = 'Left', slideIn = 'Left',
command = () => {/**/}, command = () => { /**/ },
}: NotificationWidget) => { }: NotificationWidget) => {
if (!notif) { if (!notif) {
return; return;
@ -248,7 +248,7 @@ export const Notification = ({
notif.close(), notif.close(),
child: Icon('window-close' + child: Icon('window-close' +
'-symbolic'), '-symbolic'),
}), }),
}), }),
], ],

View file

@ -44,7 +44,7 @@ const defaultStyle = `${TRANSITION} margin: unset; opacity: 1;`;
export default ({ export default ({
id, id,
slideIn = 'Left', slideIn = 'Left',
command = () => {/**/}, command = () => { /**/ },
...props ...props
}) => { }) => {
const widget = EventBox({ const widget = EventBox({

View file

@ -28,7 +28,7 @@ export default (window: OskWindow) => {
window.child.setCss(`margin-bottom: -${HIDDEN_MARGIN}px;`); window.child.setCss(`margin-bottom: -${HIDDEN_MARGIN}px;`);
let signals = [] as Array<number>; let signals = [] as number[];
window.attribute = { window.attribute = {
startY: null, startY: null,

View file

@ -45,14 +45,14 @@ const LCTRL_CODE = 29;
// Types // Types
import { Variable as Var } from 'types/variable.ts'; import { Variable as Var } from 'types/variable.ts';
type Key = { interface Key {
keytype: string, keytype: string
label: string, label: string
labelShift?: string, labelShift?: string
labelAltGr?: string, labelAltGr?: string
shape: string, shape: string
keycode: number keycode: number
}; }
const ModKey = (key: Key) => { const ModKey = (key: Key) => {

View file

@ -7,7 +7,7 @@ import PopupWindow from '../misc/popup.ts';
import { BoxGeneric } from 'global-types'; import { BoxGeneric } from 'global-types';
// Import all the OSDs as an array // Import all the OSDs as an array
const OSDList = [] as Array<() => BoxGeneric>; const OSDList = [] as (() => BoxGeneric)[];
import * as Modules from './osds.ts'; import * as Modules from './osds.ts';
for (const osd in Modules) { for (const osd in Modules) {

View file

@ -187,7 +187,7 @@ export const BluetoothMenu = () => {
// Make bottom scroll indicator appear only // Make bottom scroll indicator appear only
// when first getting overflowing children // when first getting overflowing children
if (!(bottomArrow.reveal_child === true || if (!(bottomArrow.reveal_child === true ||
topArrow.reveal_child === true)) { topArrow.reveal_child === true)) {
bottomArrow.reveal_child = true; bottomArrow.reveal_child = true;
} }
} }
@ -200,7 +200,7 @@ export const BluetoothMenu = () => {
} }
// Trigger sort_func // Trigger sort_func
(self.get_children() as Array<ListBoxRow>) (self.get_children() as ListBoxRow[])
.forEach((ch) => { .forEach((ch) => {
ch.changed(); ch.changed();
}); });

View file

@ -36,7 +36,7 @@ type IndicatorTuple = [
signal?: string, signal?: string,
]; ];
type GridButtonType = { interface GridButtonType {
command?(): void command?(): void
secondary_command?(): void secondary_command?(): void
on_open?(menu: RevealerGeneric): void on_open?(menu: RevealerGeneric): void
@ -44,17 +44,17 @@ type GridButtonType = {
indicator?: IndicatorTuple indicator?: IndicatorTuple
// @ts-expect-error me is lazy // @ts-expect-error me is lazy
menu?: Widget menu?: Widget
}; }
// TODO: do vpn button // TODO: do vpn button
const SPACING = 28; const SPACING = 28;
const ButtonStates = [] as Array<Var<boolean>>; const ButtonStates = [] as Var<boolean>[];
const GridButton = ({ const GridButton = ({
command = () => {/**/}, command = () => { /**/ },
secondary_command = () => {/**/}, secondary_command = () => { /**/ },
on_open = () => {/**/}, on_open = () => { /**/ },
icon, icon,
indicator, indicator,
menu, menu,
@ -158,7 +158,7 @@ const GridButton = ({
?.children[1] as BoxGeneric; ?.children[1] as BoxGeneric;
const isSetup = (rowMenu const isSetup = (rowMenu
.get_children() as Array<BoxGeneric>) .get_children() as BoxGeneric[])
.find((ch) => ch === menu); .find((ch) => ch === menu);
if (!isSetup) { if (!isSetup) {

View file

@ -43,7 +43,7 @@ const AccessPoint = (ap: APType) => {
self.setCss( self.setCss(
`opacity: ${ `opacity: ${
widget.attribute.ap.value.ssid === widget.attribute.ap.value.ssid ===
Network.wifi.ssid ? Network.wifi.ssid ?
'1' : '1' :
'0' '0'
}; };
@ -150,7 +150,7 @@ export const NetworkMenu = () => {
self.hook(Network, () => { self.hook(Network, () => {
// Add missing APs // Add missing APs
const currentAPs = Network.wifi const currentAPs = Network.wifi
?.access_points as Array<APType>; ?.access_points as APType[];
currentAPs.forEach((ap) => { currentAPs.forEach((ap) => {
if (ap.ssid !== 'Unknown') { if (ap.ssid !== 'Unknown') {
@ -214,7 +214,7 @@ export const NetworkMenu = () => {
// Make bottom scroll indicator appear only // Make bottom scroll indicator appear only
// when first getting overflowing children // when first getting overflowing children
if (!(bottomArrow.reveal_child === true || if (!(bottomArrow.reveal_child === true ||
topArrow.reveal_child === true)) { topArrow.reveal_child === true)) {
bottomArrow.reveal_child = true; bottomArrow.reveal_child = true;
} }
} }
@ -227,7 +227,7 @@ export const NetworkMenu = () => {
} }
// Trigger sort_func // Trigger sort_func
(self.get_children() as Array<ListBoxRow>) (self.get_children() as ListBoxRow[])
.forEach((ch) => { .forEach((ch) => {
ch.changed(); ch.changed();
}); });