Skip to content

Commit aa93296

Browse files
authored
Support Flatpak < 1.15.6 for permissions (#992)
1 parent 5506bf8 commit aa93296

File tree

7 files changed

+90
-29
lines changed

7 files changed

+90
-29
lines changed

src/Extensions/Extensions.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import Interface from "./Extensions.blp" with { type: "uri" };
66
import illustration from "./extensions.svg";
77

88
import "./Extension.js";
9-
import { getFlatpakInfo, settings } from "../util.js";
9+
import { settings } from "../util.js";
10+
import { getFlatpakInfo } from "../flatpak.js";
1011

1112
export const action_extensions = new Gio.SimpleAction({
1213
name: "extensions",

src/Permissions/Permissions.blp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Adw.Dialog dialog {
4242
}
4343

4444
Label {
45-
label: _("Workbench needs additional permissions. Please run the following command in a terminal and restart the app.");
45+
label: _("Workbench needs additional permissions. Please run the following command in a terminal and restart Workbench.");
4646
wrap: true;
4747
justify: center;
4848
}
@@ -133,13 +133,13 @@ Adw.Dialog dialog {
133133
]
134134
}
135135

136-
Adw.ActionRow {
136+
Adw.ActionRow action_row_device {
137137
[prefix]
138138
Image {
139139
icon-name: "re.sonny.Workbench-gamepad-symbolic";
140140
}
141141

142-
title: _("--device=input");
142+
// title: _("--device=input");
143143
subtitle: _("Access to input device such as gamepads");
144144

145145
styles [

src/Permissions/Permissions.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import Gio from "gi://Gio";
2-
import GLib from "gi://GLib";
32
import Gtk from "gi://Gtk";
43

54
import { build } from "../../troll/src/main.js";
@@ -8,21 +7,31 @@ import Interface from "./Permissions.blp" with { type: "uri" };
87

98
import illustration from "./permissions.svg";
109

11-
import { getFlatpakInfo } from "../util.js";
10+
import {
11+
getFlatpakId,
12+
getFlatpakInfo,
13+
isDeviceInputOverrideAvailable,
14+
} from "../flatpak.js";
1215

1316
const action_permissions = new Gio.SimpleAction({
1417
name: "permissions",
1518
parameter_type: null,
1619
});
1720

1821
export function Permissions({ window }) {
19-
const { dialog, picture_illustration, label_command, button_info } =
20-
build(Interface);
22+
const {
23+
dialog,
24+
picture_illustration,
25+
label_command,
26+
button_info,
27+
action_row_device,
28+
} = build(Interface);
2129

2230
picture_illustration.set_resource(illustration);
23-
label_command.label = `flatpak override --user --share=network --socket=pulseaudio --device=input ${GLib.getenv(
24-
"FLATPAK_ID",
25-
)}`;
31+
32+
const device = isDeviceInputOverrideAvailable() ? "input" : "all";
33+
label_command.label = `flatpak override --user --share=network --socket=pulseaudio --device=${device} ${getFlatpakId()}`;
34+
action_row_device.title = `--input=${device}`;
2635

2736
button_info.connect("clicked", () => {
2837
new Gtk.UriLauncher({

src/about.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
getGjsVersion,
99
getGLibVersion,
1010
} from "../troll/src/util.js";
11-
import { getFlatpakInfo } from "./util.js";
11+
import { getFlatpakInfo } from "./flatpak.js";
1212

1313
export default function About({ application }) {
1414
const flatpak_info = getFlatpakInfo();

src/flatpak.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import GLib from "gi://GLib";
2+
3+
let flatpak_info;
4+
export function getFlatpakInfo() {
5+
if (flatpak_info) return flatpak_info;
6+
flatpak_info = new GLib.KeyFile();
7+
try {
8+
flatpak_info.load_from_file("/.flatpak-info", GLib.KeyFileFlags.NONE);
9+
} catch (err) {
10+
if (!err.matches(GLib.FileError, GLib.FileError.NOENT)) {
11+
console.error(err);
12+
}
13+
return null;
14+
}
15+
return flatpak_info;
16+
}
17+
18+
export function getFlatpakId() {
19+
return getFlatpakInfo().get_string("Application", "name");
20+
}
21+
22+
// https://repology.org/project/flatpak/versions
23+
export function isDeviceInputOverrideAvailable(flatpak_version) {
24+
flatpak_version ??= getFlatpakInfo().get_string(
25+
"Instance",
26+
"flatpak-version",
27+
);
28+
29+
// https://github.com/flatpak/flatpak/releases/tag/1.15.6
30+
return (
31+
flatpak_version.localeCompare("1.15.6", undefined, {
32+
numeric: true,
33+
sensitivity: "base",
34+
}) > -1
35+
);
36+
}

src/util.js

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Gio from "gi://Gio";
33
import Xdp from "gi://Xdp";
44
import GObject from "gi://GObject";
55
import { getLanguage } from "./common.js";
6+
import { getFlatpakId } from "./flatpak.js";
67

78
export const portal = new Xdp.Portal();
89

@@ -25,21 +26,6 @@ export function ensureDir(file) {
2526
}
2627
}
2728

28-
let flatpak_info;
29-
export function getFlatpakInfo() {
30-
if (flatpak_info) return flatpak_info;
31-
flatpak_info = new GLib.KeyFile();
32-
try {
33-
flatpak_info.load_from_file("/.flatpak-info", GLib.KeyFileFlags.NONE);
34-
} catch (err) {
35-
if (!err.matches(GLib.FileError, GLib.FileError.NOENT)) {
36-
console.error(err);
37-
}
38-
return null;
39-
}
40-
return flatpak_info;
41-
}
42-
4329
export { getLanguage };
4430

4531
export function listenProperty(object, property, fn, { initial = false } = {}) {
@@ -158,8 +144,8 @@ export function makeDropdownFlat(dropdown) {
158144

159145
export function buildRuntimePath(...args) {
160146
return GLib.build_filenamev([
161-
GLib.getenv("XDG_RUNTIME_DIR"),
162-
GLib.getenv("FLATPAK_ID"),
147+
GLib.get_user_runtime_dir(),
148+
getFlatpakId(),
163149
...args,
164150
]);
165151
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import "../src/init.js";
2+
3+
import tst, { assert } from "../troll/tst/tst.js";
4+
5+
import { isDeviceInputOverrideAvailable } from "../src/flatpak.js";
6+
7+
const test = tst("isDeviceInputOverrideAvailable");
8+
9+
test("returns a boolean", () => {
10+
assert.equal(typeof isDeviceInputOverrideAvailable(), "boolean");
11+
});
12+
13+
test("returns true if Flatpak version is equal to 1.15.6", () => {
14+
assert.equal(isDeviceInputOverrideAvailable("1.15.6"), true);
15+
});
16+
17+
test("returns true if Flatpak version is higher than 1.15.6", () => {
18+
assert.equal(isDeviceInputOverrideAvailable("1.15.7"), true);
19+
assert.equal(isDeviceInputOverrideAvailable("1.16.5"), true);
20+
assert.equal(isDeviceInputOverrideAvailable("2.15.4"), true);
21+
});
22+
23+
test("returns false if Flatpak version is lower than 1.15.6", () => {
24+
assert.equal(isDeviceInputOverrideAvailable("1.15.5"), false);
25+
assert.equal(isDeviceInputOverrideAvailable("1.14.7"), false);
26+
assert.equal(isDeviceInputOverrideAvailable("0.16.7"), false);
27+
});
28+
29+
export default test;

0 commit comments

Comments
 (0)