diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml
index a23390c44..a392c6f15 100644
--- a/.github/workflows/CI.yaml
+++ b/.github/workflows/CI.yaml
@@ -9,65 +9,52 @@ on:
jobs:
CI:
+ # https://github.com/actions/runner-images/issues/13964
runs-on: ubuntu-26.04
+
steps:
- - uses: actions/checkout@v3
+ # Cache apt
+ - name: Cache apt
+ uses: actions/cache@v4
with:
- submodules: recursive
+ path: /var/cache/apt/archives
+ key: apt-cache-${{ runner.arch }}
- - uses: actions/setup-node@v3
+ # Cache Flatpak
+ - name: Cache Flatpak dependencies
+ uses: actions/cache@v4
with:
- node-version: 20
- cache: "npm"
+ path: ~/.local/share/flatpak
+ key: flatpak-deps-${{ runner.arch }}
+
+ # Cache flatpak-builder state
+ - name: Cache .flatpak-builder
+ uses: actions/cache@v4
+ with:
+ path: .flatpak-builder
+ key: flatpak-builder-${{ runner.arch }}
+
+ # Cache Foundry
+ - name: Cache .foundry
+ uses: actions/cache@v4
+ with:
+ path: .foundry
+ key: foundry-${{ runner.arch }}
- name: Install host dependencies
run: |
- sudo apt-get update
- sudo apt-get install flatpak mutter flatpak-builder foundry
+ sudo apt-get -y update
+ sudo apt-get -y install flatpak mutter flatpak-builder foundry
- # Restore caches
- - name: Restore Flatpak dependencies
- uses: actions/cache/restore@v3
- with:
- path: ~/.local/share/flatpak
- key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }}
- restore-keys: |
- ${{ runner.os }}-flatpak-dependencies-
- - name: Restore .flatpak-builder
- uses: actions/cache/restore@v3
+ - uses: actions/checkout@v4
with:
- path: .flatpak-builder
- key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }}
- restore-keys: |
- ${{ runner.os }}-flatpak-builder-
- - name: Restore .foundry
- uses: actions/cache/restore@v3
+ submodules: recursive
+
+ - uses: actions/setup-node@v4
with:
- path: .foundry
- key: ${{ runner.os }}-foundry-${{ github.run_id }}
- restore-keys: |
- ${{ runner.os }}-foundry-
+ node-version: 24
+ cache: "npm"
- run: mutter --wayland --no-x11 --headless --wayland-display=wayland-0 --virtual-monitor 1280x720 > /tmp/mutter.log 2>&1 &
- run: make ci
- run: cat /tmp/mutter.log
-
- # Save caches
- - name: Save Flatpak dependencies
- uses: actions/cache/save@v3
- if: always()
- with:
- path: ~/.local/share/flatpak
- key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }}
- - name: Save .flatpak-builder
- uses: actions/cache/save@v3
- if: always()
- with:
- path: .flatpak-builder
- key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }}
- - name: Save .foundry
- uses: actions/cache/save@v3
- if: always()
- with:
- path: .foundry
- key: ${{ runner.os }}-foundry-${{ github.run_id }}
diff --git a/Makefile b/Makefile
index bb483f535..62e66a1d3 100644
--- a/Makefile
+++ b/Makefile
@@ -46,7 +46,6 @@ lint:
unit:
foundry run -- gjs -m $(ROOT)/troll/tst/bin.js $(ROOT)/test/*.test.js
-#./build-aux/wip/run.js build-aux/re.sonny.Workbench.Devel.json -- gjs -m ./troll/tst/bin.js test/*.test.js
# https://github.com/ximion/appstream/issues/398#issuecomment-1129454985
# flatpak run org.freedesktop.appstream.cli validate --override=release-time-missing=info --no-net data/app.metainfo.xml
@@ -60,12 +59,20 @@ unit:
test: unit lint
foundry run -- workbench-cli ci $(ROOT)/demos/src/Welcome
-# ./build-aux/wip/run.js build-aux/re.sonny.Workbench.Devel.json -- workbench-cli ci demos/src/Welcome/
-ci: setup build test
-# See Permissions.js
-# flatpak override --user --share=network --socket=pulseaudio --device=input re.sonny.Workbench.Devel
- foundry run -- workbench-cli ci $(ROOT)/demos/src/*
+install:
+ artifact=$$(foundry export \
+ | grep -oE 'file://[^[:space:]]+' \
+ | tail -n1 \
+ | sed 's|^file://||'); \
+ test -n "$$artifact" || { echo "No artifact found"; exit 1; }; \
+ flatpak install --user --assumeyes "$$artifact"
+
+ci: setup build test install
+# We install because foundry has no flag to override permissions
+# see Permissions.js for why we need them
+ flatpak run --command="workbench-cli" --share=network --socket=pulseaudio --device=input --filesystem=$(ROOT) re.sonny.Workbench.Devel ci $(ROOT)/demos/src/*
+
flatpak:
flatpak run org.flatpak.Builder --ccache --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json
diff --git a/data/app.metainfo.xml b/data/app.metainfo.xml
index 68a88ec14..6c89f2b27 100644
--- a/data/app.metainfo.xml
+++ b/data/app.metainfo.xml
@@ -43,11 +43,12 @@
-
+
- Use GNOME 50
- - Fix runnng Rust projects
+ - Fix discarding/closing of sessions
+ - Fix running Rust demos
Library:
diff --git a/demos b/demos
index b74e83e57..d49188e64 160000
--- a/demos
+++ b/demos
@@ -1 +1 @@
-Subproject commit b74e83e5759e4c1aaa9f61d3400a83ca94d82a01
+Subproject commit d49188e6441d7103304d29739672101db1b95cae
diff --git a/package-lock.json b/package-lock.json
index 7e2d92bf6..cfd2d6c3b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -74,7 +74,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
"integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
"dev": true,
- "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.25.7",
@@ -704,7 +703,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true,
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -969,7 +967,6 @@
"url": "https://github.com/sponsors/ai"
}
],
- "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001663",
"electron-to-chromium": "^1.5.28",
@@ -1400,7 +1397,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -3355,7 +3351,6 @@
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
"integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
"dev": true,
- "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -3526,7 +3521,6 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz",
"integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==",
"dev": true,
- "peer": true,
"bin": {
"rollup": "dist/bin/rollup"
},
@@ -4344,7 +4338,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
"integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
"dev": true,
- "peer": true,
"requires": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.25.7",
@@ -4813,8 +4806,7 @@
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"acorn-jsx": {
"version": "5.3.2",
@@ -4987,7 +4979,6 @@
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
"integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
"dev": true,
- "peer": true,
"requires": {
"caniuse-lite": "^1.0.30001663",
"electron-to-chromium": "^1.5.28",
@@ -5294,7 +5285,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true,
- "peer": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -6666,8 +6656,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
"integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
- "dev": true,
- "peer": true
+ "dev": true
},
"prettier-linter-helpers": {
"version": "1.0.0",
@@ -6771,7 +6760,6 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz",
"integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==",
"dev": true,
- "peer": true,
"requires": {
"fsevents": "~2.3.2"
}
diff --git a/src/Previewer/meson.build b/src/Previewer/meson.build
index 154246e1e..6b4556e41 100644
--- a/src/Previewer/meson.build
+++ b/src/Previewer/meson.build
@@ -1,6 +1,6 @@
executable('workbench-previewer-module',
'previewer.vala',
- dependencies: [ dependency('gtksourceview-5'), dependency('gmodule-2.0'), dependency('libadwaita-1'), dependency('shumate-1.0'), dependency('webkitgtk-6.0'), libworkbench_vapi ],
+ dependencies: [ dependency('gtksourceview-5'), dependency('gmodule-2.0'), dependency('libadwaita-1'), dependency('glycin-2'), dependency('shumate-1.0'), dependency('webkitgtk-6.0'), libworkbench_vapi ],
# vala_args: [ '--gresourcesdir=' + meson.current_build_dir() ],
install: true,
link_with: libworkbench,
diff --git a/src/cli/blueprint.js b/src/cli/blueprint.js
index 42de8e31d..1cb6d9d7c 100644
--- a/src/cli/blueprint.js
+++ b/src/cli/blueprint.js
@@ -6,9 +6,19 @@ import { getLanguage } from "../common.js";
import { parse } from "../langs/xml/xml.js";
import { LSPError } from "../lsp/LSP.js";
import { checkFile, diagnose } from "./util.js";
+import { ignore_codes } from "../langs/blueprint/blueprint.js";
const languageId = "blueprint";
+// No replacements yet
+const ignore_messages = [
+ "Gtk.ShortcutsShortcut is deprecated\nhint: This widget will be removed in GTK 5",
+ "Gtk.ShortcutLabel is deprecated\nhint: This widget will be removed in GTK 5",
+ "Gtk.ShortcutsWindow is deprecated\nhint: This widget will be removed in GTK 5",
+ "Gtk.ShortcutsGroup is deprecated\nhint: This widget will be removed in GTK 5",
+ "Gtk.ShortcutsSection is deprecated\nhint: This widget will be removed in GTK 5",
+];
+
export default async function blueprint({ file, lspc }) {
print(` ${file.get_path()}`);
@@ -17,14 +27,9 @@ export default async function blueprint({ file, lspc }) {
lspc,
languageId,
filter(diagnostic) {
- // No replacements yet
- return ![
- "Gtk.ShortcutsShortcut is deprecated\nhint: This widget will be removed in GTK 5",
- "Gtk.ShortcutLabel is deprecated\nhint: This widget will be removed in GTK 5",
- "Gtk.ShortcutsWindow is deprecated\nhint: This widget will be removed in GTK 5",
- "Gtk.ShortcutsGroup is deprecated\nhint: This widget will be removed in GTK 5",
- "Gtk.ShortcutsSection is deprecated\nhint: This widget will be removed in GTK 5",
- ].includes(diagnostic.message);
+ if (ignore_codes.includes(diagnostic.code)) return false;
+ if (ignore_messages.includes(diagnostic.message)) return false;
+ return true;
},
});
diff --git a/src/cli/main.js b/src/cli/main.js
index 5fc584860..4958d3e69 100644
--- a/src/cli/main.js
+++ b/src/cli/main.js
@@ -22,6 +22,7 @@ import vala from "./vala.js";
import python from "./python.js";
import rust from "./rust.js";
import { Interrupt } from "./util.js";
+import { isTypeScriptEnabled } from "../Extensions/Extensions.js";
GObject.type_ensure(Shumate.SimpleMap);
GObject.type_ensure(WebKit.WebView);
@@ -102,16 +103,12 @@ const application = new Adw.Application();
const window = new Adw.ApplicationWindow();
function createLSPClients({ root_uri }) {
+ const langs = ["javascript", "blueprint", "css", "vala", "rust", "python"];
+ if (isTypeScriptEnabled()) {
+ langs.push("typescript");
+ }
return Object.fromEntries(
- [
- "javascript",
- "blueprint",
- "css",
- "vala",
- "rust",
- "python",
- "typescript",
- ].map((id) => {
+ langs.map((id) => {
const lang = languages.find((language) => language.id === id);
const lspc = createLSPClient({
lang,
@@ -175,18 +172,20 @@ async function ci({ filenames }) {
});
}
- const file_typescript = demo_dir.get_child("main.ts");
- if (file_typescript.query_exists(null)) {
- await typescript({
- file: file_typescript,
- lspc: lsp_clients.typescript,
- blueprint_object_ids,
- demo_dir,
- application,
- builder,
- template,
- window,
- });
+ if (isTypeScriptEnabled()) {
+ const file_typescript = demo_dir.get_child("main.ts");
+ if (file_typescript.query_exists(null)) {
+ await typescript({
+ file: file_typescript,
+ lspc: lsp_clients.typescript,
+ blueprint_object_ids,
+ demo_dir,
+ application,
+ builder,
+ template,
+ window,
+ });
+ }
}
const file_vala = demo_dir.get_child("main.vala");
diff --git a/src/cli/vala.js b/src/cli/vala.js
index f5bbefb1d..e50a6f93a 100644
--- a/src/cli/vala.js
+++ b/src/cli/vala.js
@@ -42,6 +42,16 @@ export default async function vala({ file, lspc, demo_dir }) {
diagnostic.message !==
"`Gtk.StyleContext' has been deprecated since 4.10"
);
+ } else if (demo_dir.get_basename() === "Drag and Drop") {
+ // I don't see what else we can use
+ // var icon = Gtk.DragIcon.get_for_drag(drag);
+ return !["use `new' operator to create new objects"].includes(
+ diagnostic.message,
+ );
+ } else if (demo_dir.get_basename() === "Shortcuts Window") {
+ return ![
+ "`Gtk.ShortcutsWindow' has been deprecated since 4.18",
+ ].includes(diagnostic.message);
}
return true;
},
diff --git a/src/langs/blueprint/blueprint.js b/src/langs/blueprint/blueprint.js
index 66249f88e..7e5682e8d 100644
--- a/src/langs/blueprint/blueprint.js
+++ b/src/langs/blueprint/blueprint.js
@@ -4,6 +4,39 @@ import { createLSPClient } from "../../common.js";
import { getLanguage } from "../../util.js";
import { CompletionItemKind } from "../../lsp/LSP.js";
+export const ignore_codes = [
+ // FIXME: let's add a11y label to all demo images?
+ "missing_descriptive_text",
+ // This is potentially confusing to newcomers?
+ // Should we update all demos to use Adw.Bin instead of Box?
+ "use_adw_bin",
+ // The top level widget in Workbench demos has no ID
+ "unused_widget",
+ // Fails for:
+ // adjustment: Adjustment {
+ // lower: 100;
+ // upper: 1000;
+ // value: 200;
+ // step-increment: 10;
+ // };
+ // TODO: file an issue
+ "adjustment_prop_order",
+ // Fails for:
+ // Label {
+ // label: "foo"
+ // use-markup: true
+ // }
+ // TODO: file an issue
+ "use_unicode",
+ // TODO: many warnings, investigate
+ "missing_user_facing_text",
+ // "SVG" or "CSS" is all caps and that's fine
+ "avoid_all_caps",
+ // Sometimes we don't want the widget to scroll
+ // e.g. CSS Gradients demo GtkSource.View
+ "scrollable_parent",
+];
+
export function setup({ document }) {
const { file, code_view, buffer } = document;
@@ -20,7 +53,11 @@ export function setup({ document }) {
if (params.uri !== file.get_uri()) {
return;
}
- code_view.handleDiagnostics(params.diagnostics);
+ // FIXME: Somehow merge with the similar logic of cli/blueprint.js
+ const diagnostics = params.diagnostics.filter(
+ (diag) => !ignore_codes.includes(diag.code),
+ );
+ code_view.handleDiagnostics(diagnostics);
},
);