import Gdk from 'gi://Gdk'; import Gtk from 'gi://Gtk'; import Gio from 'gi://Gio'; import GLib from 'gi://GLib'; export function addMenu(window) { const builder = new Gtk.Builder(); // add a dummy page and remove it immediately, to access headerbar builder.add_from_file(GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, '../ui/menu.ui', GLib.UriFlags.NONE))[0]); let menu_util = builder.get_object('menu_util'); window.add(menu_util); try { addMenuToHeader(window, builder); } catch (error) { // could not add menu... not so bad } window.remove(menu_util); } function addMenuToHeader(window, builder) { // a little hack to get to the headerbar const page = builder.get_object('menu_util'); const pages_stack = page.get_parent(); // AdwViewStack const content_stack = pages_stack.get_parent().get_parent(); // GtkStack const preferences = content_stack.get_parent(); // GtkBox const headerbar = preferences.get_first_child().get_next_sibling() .get_first_child().get_first_child().get_first_child(); // AdwHeaderBar headerbar.pack_start(builder.get_object('info_menu')); // setup menu actions const actionGroup = new Gio.SimpleActionGroup(); window.insert_action_group('prefs', actionGroup); // a list of actions with their associated link const actions = [ { name: 'open-bug-report', link: 'https://github.com/aunetx/blur-my-shell/issues' }, { name: 'open-readme', link: 'https://github.com/aunetx/blur-my-shell' }, { name: 'open-license', link: 'https://github.com/aunetx/blur-my-shell/blob/master/LICENSE' }, { name: 'donate-github', link: 'https://github.com/sponsors/aunetx' }, { name: 'donate-kofi', link: 'https://ko-fi.com/aunetx' }, ]; actions.forEach(action => { let act = new Gio.SimpleAction({ name: action.name }); act.connect( 'activate', () => Gtk.show_uri(window, action.link, Gdk.CURRENT_TIME) ); actionGroup.add_action(act); }); }