From 38c6293f4f21ad751d64918b5eb715ea423708d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 7 Feb 2025 15:01:48 +0100 Subject: [PATCH] data: Generate dash/app-grid defaults from text files Defining default apps as serialized GVariants isn't very human-friendly, which likely contributes to the fact that the lists are in parts horribly outdated (Books! Cheese! Screenshot! gedit!). Instead, generate the lists at build time from simple text files, which should be much easier to update. Part-of: --- data/default-apps/app-grid.txt | 21 ++++++++++++++ data/default-apps/dash.txt | 6 ++++ data/default-apps/utilities-folder.txt | 17 +++++++++++ data/meson.build | 8 ++++++ data/org.gnome.shell.gschema.xml.in | 28 +++--------------- js/misc/config.js.in | 2 ++ js/misc/meson.build | 4 +++ js/ui/appDisplay.js | 22 ++------------ meson.build | 1 + meson/generate-app-list.py | 40 ++++++++++++++++++++++++++ 10 files changed, 106 insertions(+), 43 deletions(-) create mode 100644 data/default-apps/app-grid.txt create mode 100644 data/default-apps/dash.txt create mode 100644 data/default-apps/utilities-folder.txt create mode 100755 meson/generate-app-list.py diff --git a/data/default-apps/app-grid.txt b/data/default-apps/app-grid.txt new file mode 100644 index 000000000..d78ed165e --- /dev/null +++ b/data/default-apps/app-grid.txt @@ -0,0 +1,21 @@ +org.gnome.Geary.desktop +org.gnome.Contacts.desktop +org.gnome.Weather.desktop +org.gnome.clocks.desktop +org.gnome.Maps.desktop +org.gnome.Books.desktop +org.gnome.Photos.desktop +org.gnome.Totem.desktop +org.gnome.Calculator.desktop +org.gnome.gedit.desktop +simple-scan.desktop +org.gnome.Settings.desktop +org.gnome.SystemMonitor.desktop +org.gnome.Boxes.desktop +org.gnome.Terminal.desktop +Utilities # folder +org.gnome.Characters.desktop +yelp.desktop +org.gnome.Screenshot.desktop +org.gnome.Cheese.desktop +org.gnome.font-viewer.desktop diff --git a/data/default-apps/dash.txt b/data/default-apps/dash.txt new file mode 100644 index 000000000..2a8e8bcd0 --- /dev/null +++ b/data/default-apps/dash.txt @@ -0,0 +1,6 @@ +org.gnome.Epiphany.desktop +org.gnome.Calendar.desktop +org.gnome.Music.desktop +gnome.Nautilus.desktop +org.gnome.Software.desktop +org.gnome.TextEditor.desktop diff --git a/data/default-apps/utilities-folder.txt b/data/default-apps/utilities-folder.txt new file mode 100644 index 000000000..616997775 --- /dev/null +++ b/data/default-apps/utilities-folder.txt @@ -0,0 +1,17 @@ +# Sorted by name as shown in menus, not filename +nm-connection-editor.desktop # Advanced Network Configuration +org.gnome.DejaDup.desktop # Backups +org.gnome.Characters.desktop # Characters +org.gnome.Connections.desktop # Connections +org.gnome.DiskUtility.desktop # Disks +org.gnome.baobab.desktop # Disk Usage Analyzer +org.gnome.Evince.desktop # Document Viewer +org.gnome.FileRoller.desktop # File Roller +org.gnome.font-viewer.desktop # Fonts +org.gnome.Loupe.desktop # Image Viewer +org.gnome.Logs.desktop # Logs +org.freedesktop.MalcontentControl.desktop # Parental Controls +org.gnome.seahorse.Application.desktop # Passwords and Keys +org.freedesktop.GnomeAbrt.desktop # Problem Reporting +org.gnome.tweaks.desktop # Tweaks +org.gnome.Usage.desktop # Usage diff --git a/data/meson.build b/data/meson.build index c8f82bd75..338ea7053 100644 --- a/data/meson.build +++ b/data/meson.build @@ -100,6 +100,14 @@ install_data(keybinding_files, install_dir: keysdir) schemaconf = configuration_data() schemaconf.set('GETTEXT_PACKAGE', meson.project_name()) +schemaconf.set('DASH_APPS', run_command( + generate_app_list, 'default-apps/dash.txt', + check: true, +).stdout()) +schemaconf.set('APP_GRID_APPS', run_command( + generate_app_list, '--pages', 'default-apps/app-grid.txt', + check: true, +).stdout()) schema = configure_file( input: 'org.gnome.shell.gschema.xml.in', output: 'org.gnome.shell.gschema.xml', diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in index 3cd37692a..b1c2534f9 100644 --- a/data/org.gnome.shell.gschema.xml.in +++ b/data/org.gnome.shell.gschema.xml.in @@ -61,7 +61,9 @@ - [ 'org.gnome.Epiphany.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'org.gnome.TextEditor.desktop'] + + @DASH_APPS@ + List of desktop file IDs for favorite applications The applications corresponding to these identifiers @@ -118,29 +120,7 @@ }>, - 'org.gnome.Contacts.desktop': <{'position': <1>}>, - 'org.gnome.Weather.desktop': <{'position': <2>}>, - 'org.gnome.clocks.desktop': <{'position': <3>}>, - 'org.gnome.Maps.desktop': <{'position': <4>}>, - 'org.gnome.Books.desktop': <{'position': <5>}>, - 'org.gnome.Photos.desktop': <{'position': <6>}>, - 'org.gnome.Totem.desktop': <{'position': <7>}>, - 'org.gnome.Calculator.desktop': <{'position': <8>}>, - 'org.gnome.gedit.desktop': <{'position': <9>}>, - 'simple-scan.desktop': <{'position': <10>}>, - 'org.gnome.Settings.desktop': <{'position': <11>}>, - 'org.gnome.SystemMonitor.desktop': <{'position': <12>}>, - 'org.gnome.Boxes.desktop': <{'position': <13>}>, - 'org.gnome.Terminal.desktop': <{'position': <14>}>, - 'Utilities': <{'position': <15>}>, - 'org.gnome.Characters.desktop': <{'position': <16>}>, - 'yelp.desktop': <{'position': <17>}>, - 'org.gnome.Screenshot.desktop': <{'position': <18>}>, - 'org.gnome.Cheese.desktop': <{'position': <19>}>, - 'org.gnome.font-viewer.desktop': <{'position': <20>}> - }] + @APP_GRID_APPS@ ]]> Layout of the app picker diff --git a/js/misc/config.js.in b/js/misc/config.js.in index a5069e438..6485d614f 100644 --- a/js/misc/config.js.in +++ b/js/misc/config.js.in @@ -20,3 +20,5 @@ export const LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'; export const HAVE_BLUETOOTH = pkg.checkSymbol('GnomeBluetooth', '3.0', 'Client.default_adapter_state'); + +export const UTILITIES_FOLDER_APPS = @UTILS_FOLDER_APPS@; diff --git a/js/misc/meson.build b/js/misc/meson.build index 5fc8ca433..4b137ef3e 100644 --- a/js/misc/meson.build +++ b/js/misc/meson.build @@ -5,6 +5,10 @@ jsconf.set('GETTEXT_PACKAGE', meson.project_name()) jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version) jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager) jsconf.set10('HAVE_PORTAL_HELPER', have_portal_helper) +jsconf.set('UTILS_FOLDER_APPS', run_command( + generate_app_list, '../../data/default-apps/utilities-folder.txt', + check: true, +).stdout()) jsconf.set('datadir', datadir) jsconf.set('libexecdir', libexecdir) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 6f07b94cd..9801b7134 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -24,6 +24,8 @@ import * as SystemActions from '../misc/systemActions.js'; import * as Main from './main.js'; +import {UTILITIES_FOLDER_APPS} from '../misc/config.js'; + const MENU_POPUP_TIMEOUT = 600; const POPDOWN_DIALOG_TIMEOUT = 500; @@ -59,25 +61,7 @@ const DIALOG_SHADE_HIGHLIGHT = new Cogl.Color({red: 0, green: 0, blue: 0, alpha: const DEFAULT_FOLDERS = { 'Utilities': { name: 'X-GNOME-Shell-Utilities.directory', - apps: [ - // Sorted by name as shown in menus, not filename - 'nm-connection-editor.desktop', // Advanced Network Configuration - 'org.gnome.DejaDup.desktop', // Backups - 'org.gnome.Characters.desktop', // Characters - 'org.gnome.Connections.desktop', // Connections - 'org.gnome.DiskUtility.desktop', // Disks - 'org.gnome.baobab.desktop', // Disk Usage Analyzer - 'org.gnome.Evince.desktop', // Document Viewer - 'org.gnome.FileRoller.desktop', // File Roller - 'org.gnome.font-viewer.desktop', // Fonts - 'org.gnome.Loupe.desktop', // Image Viewer - 'org.gnome.Logs.desktop', // Logs - 'org.freedesktop.MalcontentControl.desktop', // Parental Controls - 'org.gnome.seahorse.Application.desktop', // Passwords and Keys - 'org.freedesktop.GnomeAbrt.desktop', // Problem Reporting - 'org.gnome.tweaks.desktop', // Tweaks - 'org.gnome.Usage.desktop', // Usage - ], + apps: UTILITIES_FOLDER_APPS, }, 'YaST': { name: 'suse-yast.directory', diff --git a/meson.build b/meson.build index ff3197410..4d7bc4c9c 100644 --- a/meson.build +++ b/meson.build @@ -142,6 +142,7 @@ endif mutter_typelibdir = mutter_dep.get_variable('typelibdir') python = find_program('python3') gjs = find_program('gjs') +generate_app_list = find_program('meson/generate-app-list.py') cc = meson.get_compiler('c') diff --git a/meson/generate-app-list.py b/meson/generate-app-list.py new file mode 100755 index 000000000..067c36967 --- /dev/null +++ b/meson/generate-app-list.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +import argparse + +def read_app_ids(path) -> str: + ids = [] + with open(path, "r") as file: + for line in file: + # strip comments + line, _, _ = line.partition('#'); + line = line.strip() + if len(line) > 0: + ids.append(line) + return ids + +def print_as_array(ids): + mapped_ids = list(map(lambda i: f" '{i}'", ids)) + print('[') + print(',\n'.join(mapped_ids)) + print(']') + +def print_as_pages(ids): + mapped_ids = [] + for i, id in enumerate(ids): + mapped_ids.append(f" '{id}': <{{'position': <{i}>}}>") + + print('[{') + print(',\n'.join(mapped_ids)) + print('}]') + +parser = argparse.ArgumentParser() +parser.add_argument('--pages', action='store_true') +parser.add_argument('file') +args = parser.parse_args() + +ids = read_app_ids(args.file) +if args.pages: + print_as_pages(ids) +else: + print_as_array(ids)