Giter Club home page Giter Club logo

menu's Introduction

Menu Build Status Translation status Help Wanted Issues

Global menu bar written in Qt with as few Kf5 dependencies as possible

On FreeBSD:

On FreeBSD-based LIVEstep:

Dependencies

On Alpine Linux:

apk add --no-cache qt5-qtbase-dev kwindowsystem-dev qt5-qttools-dev kdbusaddons-dev baloo-dev xcb-util-wm-dev libdbusmenu-qt-dev procps-dev git cmake musl-dev alpine-sdk clang

On Arch Linux:

sudo pacman -Sy
sudo pacman -S cmake gcc qt5-base qt5-tools qt5-svg qt5-x11extras kwindowsystem baloo libxtst libxdamage libxcomposite libxrender libxcb xcb-util libdbusmenu-qt5 kdbusaddons libpulse glibc make pkgconf icu

Note that not all functionality is implemented for anything else than FreeBSD at this point. So building the Menu for operating systems other than FreeBSD will result in partly non-functional menu, currently only usable for development.

On FreeBSD:

sudo pkg install -y cmake pkgconf qt5-x11extras qt5-qmake qt5-widgets qt5-buildtools kf5-kdbusaddons kf5-kwindowsystem kf5-baloo libdbusmenu-qt5 qt5-concurrent qt5-qtmultimedia-dev libfm-dev libfm-extra-dev menu-cache-dev

Build

mkdir build
cd build
cmake ..
make
sudo make install

How to use

Qt applications (KDEPlasmaPlatformTheme.so and libqgtk3.so work, plain Qt and qt5ct don't work yet)

Currently only works with QT_QPA_PLATFORMTHEME=kde and https://github.com/helloSystem/QtPlugin using QT_QPA_PLATFORMTHEME=panda. FIXME: Make it work with e.g., QT_QPA_PLATFORMTHEME=qt5ct.

For this, it would probably need to support the Unity protocol?

Gtk applications (Inkscape, GIMP, Audacity work)

Firefox, Thunderbird need special patches to enable the global menu functionality. The Firefox derivative Pale Moon has it built it, but it needs to be specifically enabled.

Prerequisite: https://www.freshports.org/x11/gtk-app-menu/

E.g., Firefox and Chrome use

/usr/local/lib/gtk-2.0/modules/libappmenu-gtk-module.so
/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so

On FreeBSD:

git clone https://github.com/NorwegianRockCat/FreeBSD-my-ports
cd FreeBSD-my-ports/
cd x11/gtk-app-menu/
sudo make
sudo make install

gmenudbusmenuproxy https://phabricator.kde.org/D10461?id=28255

user@FreeBSD$ sudo pkg which /usr/local/bin/gmenudbusmenuproxy 
/usr/local/bin/gmenudbusmenuproxy was installed by package plasma5-plasma-workspace-5.19.2

Would be nice if it was packaged "standalone", without KDE Plasma.

Baloo file system search

If baloosearch returns results, then they are shown in Menu.

License

menubar is licensed under GPLv3.

Also see

https://github.com/cutefishos/statusbar/

menu's People

Contributors

alphamodh0 avatar antony-jr avatar b100w11 avatar badlop avatar balyaev-d-a avatar bitigchi avatar bittin avatar cococr300 avatar comradekingu avatar dynks avatar hugok79 avatar ijiki16 avatar jsm222 avatar larshenrikoern avatar louies0623 avatar maronghappy avatar milotype avatar piker3 avatar preyk avatar probonopd avatar reionwong avatar samob avatar satoq9 avatar sejcjan avatar skyonal avatar taraspanchenko avatar vitorhcl avatar weblate avatar yarons avatar ykla avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

menu's Issues

QCompleter: Automatically select the first search result

Automatically select the first search result once there is only one result left, so that one can just press Enter.

How it is right now:

image

How it should be:

image

https://stackoverflow.com/q/17782277 did not work for me so far:

Menu/src/appmenuwidget.cpp

Lines 177 to 180 in aaf8427

// Set first result active; https://stackoverflow.com/q/17782277. FIXME: This does not work yet. Why?
QItemSelectionModel* sm = new QItemSelectionModel(actionCompleter->completionModel());
actionCompleter->popup()->setSelectionModel(sm);
sm->select(actionCompleter->completionModel()->index(0,0), QItemSelectionModel::Select | QItemSelectionModel::Rows);

Style Action Search completer popup QListView more like QMenu

Style Action Search completer popup QListView more like QMenu.

Especially

  • The height of each result line should be more like the height of each QMenu entry
  • The location of the Action Search completer popup QListView is a few pixels too high compared to a QMenu

Unfortunately I could not find any way to fix this.

image

Also show other search results than just the menu items

E.g., combine it with something like DSBExec (the thing that coms up when you press Alt-F2) for application launcher functionality:

image

This way, the same search box that we are currently using for the Action Search ("Search in Menu") could also be used as an application launcher.

Is this possible in principle? Wdyt @antony-jr?

Search text field gets not activated on each invocation of the menubar executable

Executing the menu a second time when an instance is already running should always set the Search text field active.
It does not do this. Sometimes one needs to execute it multiple times until the already-running menubar sets the Search text field active.

This seemingly does not do its job:

case QEvent::WindowActivate:
{
// Whenever this window becomes active, then set the focus on the search box
reinterpret_cast<QLineEdit *>(parent())->setFocus();
break;
}

Why?

Quirks when selecting the only match

  • If you type fast, then it fails
  • In that situation, if you try to fix it by pressing the Arrow-Down button, it won't work

Any ideas how to work around this?

"Close" menu item with ⌘+W if the application does not use ⌘+W already

I would like to be able to close all windows using ⌘+W if ⌘+W is not already used by the application for another purpose (such as closing tabs, as e.g., Falkon does).

Hence, we need to first check the menu of the running application whether it is using ⌘+W, and only assign this shortcut to our "Close" menu entry if it does not.

Make global menu work for JetBrains (Java) applications

Make global menu work for JetBrains (Java) applications: bring the contents of (1) into (2).
This will also make the commands searchable via the search field in the global menu and the system-wide ⌘+Space, which large IDEs like the ones from JetBrains would benefit from.

image

How?

image

Make VSCode work with the global menu

It seems to do "something" regarding the global menu but then it does not really work, and I don't know why yet:

loading "/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so"
/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so valid_hash_sysv 1 valid_hash_gnu 1 dynsymcount 122
  0x8107b0000 .. 0x8107bafff: /usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so
 Searching for "libappmenu-gtk3-parser.so.0"
lm_find("/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so", "/usr/local/lib")
lmp_find("/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so")
  Trying "/usr/local/lib/libappmenu-gtk3-parser.so.0"
  Opened "/usr/local/lib/libappmenu-gtk3-parser.so.0", fd 33
loading "/usr/local/lib/libappmenu-gtk3-parser.so.0"
/usr/local/lib/libappmenu-gtk3-parser.so.0 valid_hash_sysv 1 valid_hash_gnu 1 dynsymcount 170
  0x8107bb000 .. 0x8107cefff: /usr/local/lib/libappmenu-gtk3-parser.so.0
relocating "/usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so"
relocating "/usr/local/lib/libappmenu-gtk3-parser.so.0"
calling init function for /usr/local/lib/libappmenu-gtk3-parser.so.0 at 0x8107cb4e8
calling init function for /usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so at 0x8107b6b38
"g_getenv" in "libappmenu-gtk-module.so" ==> 0x807c2ff30 in "libglib-2.0.so.0"
"gdk_display_get_default" in "libappmenu-gtk-module.so" ==> 0x80894c5c0 in "libgdk-3.so.0"
"gdk_x11_display_get_type" in "libappmenu-gtk-module.so" ==> 0x80897a4b0 in "libgdk-3.so.0"
"g_ascii_strcasecmp" in "libappmenu-gtk-module.so" ==> 0x807c69090 in "libglib-2.0.so.0"
"g_get_prgname" in "libappmenu-gtk-module.so" ==> 0x807c82b30 in "libglib-2.0.so.0"
"g_strcmp0" in "libappmenu-gtk-module.so" ==> 0x807c6da40 in "libglib-2.0.so.0"
"g_settings_new" in "libappmenu-gtk-module.so" ==> 0x807e77640 in "libgio-2.0.so.0"
"g_settings_get_value" in "libappmenu-gtk-module.so" ==> 0x807e77ae0 in "libgio-2.0.so.0"
"g_variant_type_checked_" in "libappmenu-gtk-module.so" ==> 0x807c95a00 in "libglib-2.0.so.0"
"g_variant_is_of_type" in "libappmenu-gtk-module.so" ==> 0x807c84730 in "libglib-2.0.so.0"
"g_main_context_push_thread_default" in "libdconfsettings.so" ==> 0x807c43dd0 in "libglib-2.0.so.0""g_variant_iter_init" in "libappmenu-gtk-module.so" ==> 0x807c85eb0 in "libglib-2.0.so.0"
reloc_jmpslot: *0x8111cd3f8 = 0x807c43dd0"g_variant_iter_loop" in "libappmenu-gtk-module.so" ==> 0x807c8bfe0 in "libglib-2.0.so.0"
"g_object_unref" in "libappmenu-gtk-module.so" ==> 0x807cd0e60 in "libgobject-2.0.so.0"
"g_variant_unref" in "libappmenu-gtk-module.so" ==> 0x807c8d270 in "libglib-2.0.so.0"
"g_bus_get_sync" in "libappmenu-gtk-module.so" ==> 0x807e8b690 in "libgio-2.0.so.0"
"g_dbus_connection_call_sync" in "libappmenu-gtk-module.so" ==> 0x807e8abd0 in "libgio-2.0.so.0"
"g_variant_get_child_value" in "libappmenu-gtk-module.so" ==> 0x807c8d900 in "libglib-2.0.so.0"
"g_variant_get" in "libappmenu-gtk-module.so" ==> 0x807c8b430 in "libglib-2.0.so.0"
"g_str_equal" in "libappmenu-gtk-module.so" ==> 0x807c35d80 in "libglib-2.0.so.0"
"g_variant_iter_free" in "libappmenu-gtk-module.so" ==> 0x807c88940 in "libglib-2.0.so.0"
"gtk_settings_get_default" in "libappmenu-gtk-module.so" ==> 0x80906a690 in "libgtk-3.so.0"
"gtk_settings_get_type" in "libappmenu-gtk-module.so" ==> 0x809069ec0 in "libgtk-3.so.0"
"g_object_class_find_property" in "libappmenu-gtk-module.so" ==> 0x807cd08b0 in "libgobject-2.0.so.0"
"g_type_check_instance_is_fundamentally_a" in "libappmenu-gtk-module.so" ==> 0x807ce9300 in "libgobject-2.0.so.0"
"g_settings_get_boolean" in "libappmenu-gtk-module.so" ==> 0x807e78f40 in "libgio-2.0.so.0"
"g_object_set" in "libappmenu-gtk-module.so" ==> 0x807cd33e0 in "libgobject-2.0.so.0"
"g_bus_watch_name" in "libappmenu-gtk-module.so" ==> 0x807e99180 in "libgio-2.0.so.0"
"unity_gtk_menu_shell_set_debug" in "libappmenu-gtk-module.so" ==> 0x8107c7100 in "libappmenu-gtk3-parser.so.0"
"unity_gtk_action_group_set_debug" in "libappmenu-gtk-module.so" ==> 0x8107c35f0 in "libappmenu-gtk3-parser.so.0""g_private_set" in "libgio-2.0.so.0" ==> 0x807c9be30 in "libglib-2.0.so.0"
"gtk_widget_get_type" in "libappmenu-gtk-module.so" ==> 0x80912f1b0 in "libgtk-3.so.0"
"g_type_class_ref" in "libappmenu-gtk-module.so" ==> 0x807ce4a30 in "libgobject-2.0.so.0"
"gtk_application_window_get_type" in "libappmenu-gtk-module.so" ==> 0x808e8e130 in "libgtk-3.so.0"
"gtk_window_get_type" in "libappmenu-gtk-module.so" ==> 0x809148c20 in "libgtk-3.so.0"
"g_type_children" in "libappmenu-gtk-module.so" ==> 0x807ce8990 in "libgobject-2.0.so.0"
"g_free" in "libappmenu-gtk-module.so" ==> 0x807c4ec20 in "libglib-2.0.so.0"
"gtk_menu_bar_get_type" in "libappmenu-gtk-module.so" ==> 0x808fdf830 in "libgtk-3.so.0"
"gtk_widget_get_screen" in "libappmenu-gtk-module.so" ==> 0x8091373e0 in "libgtk-3.so.0"
"gdk_screen_get_rgba_visual" in "libappmenu-gtk-module.so" ==> 0x80895bbd0 in "libgdk-3.so.0"
"g_type_check_instance_cast" in "libappmenu-gtk-module.so" ==> 0x807ce9410 in "libgobject-2.0.so.0"
"gtk_window_get_type_hint" in "libappmenu-gtk-module.so" ==> 0x80914b7c0 in "libgtk-3.so.0"
"gdk_wayland_display_get_type" in "libappmenu-gtk-module.so" ==> 0x8089adc10 in "libgdk-3.so.0"
"g_type_check_instance_is_a" in "libappmenu-gtk-module.so" ==> 0x807ce9180 in "libgobject-2.0.so.0"
"g_quark_from_static_string" in "libappmenu-gtk-module.so" ==> 0x807c58100 in "libglib-2.0.so.0"
"g_object_get_qdata" in "libappmenu-gtk-module.so" ==> 0x807cd4940 in "libgobject-2.0.so.0"
"g_strdup_printf" in "libappmenu-gtk-module.so" ==> 0x807c68360 in "libglib-2.0.so.0"
"gtk_widget_get_window" in "libappmenu-gtk-module.so" ==> 0x809141090 in "libgtk-3.so.0"
"gdk_window_get_display" in "libappmenu-gtk-module.so" ==> 0x80895f630 in "libgdk-3.so.0"
"gdk_x11_display_get_xdisplay" in "libappmenu-gtk-module.so" ==> 0x80897bb50 in "libgdk-3.so.0"
"gdk_x11_window_get_xid" in "libappmenu-gtk-module.so" ==> 0x808993450 in "libgdk-3.so.0"
"gdk_x11_get_xatom_by_name_for_display" in "libappmenu-gtk-module.so" ==> 0x80898a890 in "libgdk-3.so.0"
"XGetWindowProperty" in "libappmenu-gtk-module.so" ==> 0x807f8d340 in "libX11.so.6"
"g_slice_alloc" in "libappmenu-gtk-module.so" ==> 0x807c65930 in "libglib-2.0.so.0"
"g_menu_new" in "libappmenu-gtk-module.so" ==> 0x807e69af0 in "libgio-2.0.so.0"
"g_action_group_get_type" in "libappmenu-gtk-module.so" ==> 0x807e61d10 in "libgio-2.0.so.0"
"unity_gtk_action_group_new" in "libappmenu-gtk-module.so" ==> 0x8107c2170 in "libappmenu-gtk3-parser.so.0"
"g_once_init_enter" in "libappmenu-gtk3-parser.so.0" ==> 0x807c72070 in "libglib-2.0.so.0"
"g_intern_static_string" in "libappmenu-gtk3-parser.so.0" ==> 0x807c58270 in "libglib-2.0.so.0"
"g_type_register_static_simple" in "libappmenu-gtk3-parser.so.0" ==> 0x807ce6660 in "libgobject-2.0.so.0"
"g_action_group_get_type" in "libappmenu-gtk3-parser.so.0" ==> 0x807e61d10 in "libgio-2.0.so.0"
"g_type_add_interface_static" in "libappmenu-gtk3-parser.so.0" ==> 0x807ce7000 in "libgobject-2.0.so.0"
"g_once_init_leave" in "libappmenu-gtk3-parser.so.0" ==> 0x807c72120 in "libglib-2.0.so.0"
"g_object_new" in "libappmenu-gtk3-parser.so.0" ==> 0x807cd17a0 in "libgobject-2.0.so.0"
"g_type_class_peek_parent" in "libappmenu-gtk3-parser.so.0" ==> 0x807ce7f60 in "libgobject-2.0.so.0"
"g_type_check_class_cast" in "libappmenu-gtk3-parser.so.0" ==> 0x807ce9710 in "libgobject-2.0.so.0"
"g_hash_table_new_full" in "libappmenu-gtk3-parser.so.0" ==> 0x807c33580 in "libglib-2.0.so.0"
"g_menu_model_get_type" in "libappmenu-gtk-module.so" ==> 0x807e68740 in "libgio-2.0.so.0"
"g_dbus_connection_export_menu_model" in "libappmenu-gtk-module.so" ==> 0x807e6b350 in "libgio-2.0.so.0"
"g_dbus_connection_export_action_group" in "libappmenu-gtk-module.so" ==> 0x807e642f0 in "libgio-2.0.so.0"
"g_dbus_connection_get_unique_name" in "libappmenu-gtk-module.so" ==> 0x807e884d0 in "libgio-2.0.so.0"
"g_utf8_strlen" in "libappmenu-gtk-module.so" ==> 0x807c7ad50 in "libglib-2.0.so.0"
"XChangeProperty" in "libappmenu-gtk-module.so" ==> 0x807f83530 in "libX11.so.6"
"g_object_set_qdata_full" in "libappmenu-gtk-module.so" ==> 0x807cd4b50 in "libgobject-2.0.so.0"
"g_log" in "libappmenu-gtk-module.so" ==> 0x807c4f520 in "libglib-2.0.so.0"
 Searching for "libdbusmenu-glib.so"
relocating "/usr/local/lib/libXau.so.6"  Trying "/usr/local/share/code-oss/libdbusmenu-glib.so"
relocating "/usr/local/lib/libXdmcp.so.6"  Failed to open "/usr/local/share/code-oss/libdbusmenu-glib.so": No such file or directory
search_library_pathfds('libdbusmenu-glib.so', '(null)', fdp)
  Trying "/lib/libdbusmenu-glib.so"
  Failed to open "/lib/libdbusmenu-glib.so": No such file or directory
  Trying "/usr/lib/libdbusmenu-glib.so"
  Failed to open "/usr/lib/libdbusmenu-glib.so": No such file or directory
  Trying "/usr/lib/compat/libdbusmenu-glib.so"
  Failed to open "/usr/lib/compat/libdbusmenu-glib.so": No such file or directory
  Trying "/usr/local/lib/libdbusmenu-glib.so"
  Opened "/usr/local/lib/libdbusmenu-glib.so", fd 58
loading "/usr/local/lib/libdbusmenu-glib.so"
/usr/local/lib/libdbusmenu-glib.so valid_hash_sysv 1 valid_hash_gnu 1 dynsymcount 278relocating "/usr/local/lib/libwayland-client.so.0"
  0x818169000 .. 0x818189fff: /usr/local/lib/libdbusmenu-glib.so
relocating "/usr/local/lib/libdbusmenu-glib.so"
calling init function for /usr/local/lib/libdbusmenu-glib.so at 0x818185458
"g_once_init_enter" in "libdbusmenu-glib.so" ==> 0x807c72070 in "libglib-2.0.so.0"
"g_intern_static_string" in "libdbusmenu-glib.so" ==> 0x807c58270 in "libglib-2.0.so.0"
"g_type_register_static_simple" in "libdbusmenu-glib.so" ==> 0x807ce6660 in "libgobject-2.0.so.0"
"g_once_init_leave" in "libdbusmenu-glib.so" ==> 0x807c72120 in "libglib-2.0.so.0"
"g_object_new" in "libdbusmenu-glib.so" ==> 0x807cd17a0 in "libgobject-2.0.so.0"
"g_type_class_peek_parent" in "libdbusmenu-glib.so" ==> 0x807ce7f60 in "libgobject-2.0.so.0"
"g_type_check_class_cast" in "libdbusmenu-glib.so" ==> 0x807ce9710 in "libgobject-2.0.so.0"
"g_type_class_add_private" in "libdbusmenu-glib.so" ==> 0x807cea4b0 in "libgobject-2.0.so.0"
"g_signal_new" in "libdbusmenu-glib.so" ==> 0x807cdc090 in "libgobject-2.0.so.0"
"g_param_spec_string" in "libdbusmenu-glib.so" ==> 0x807cda850 in "libgobject-2.0.so.0"
"g_object_class_install_property" in "libdbusmenu-glib.so" ==> 0x807cd0370 in "libgobject-2.0.so.0"
"dbusmenu_menuitem_get_type" in "libdbusmenu-glib.so" ==> 0x818175c90 in "libdbusmenu-glib.so"
"g_param_spec_object" in "libdbusmenu-glib.so" ==> 0x807cdaaf0 in "libgobject-2.0.so.0"
"g_param_spec_uint" in "libdbusmenu-glib.so" ==> 0x807cda2c0 in "libgobject-2.0.so.0"
"dbusmenu_text_direction_get_type" in "libdbusmenu-glib.so" ==> 0x818175990 in "libdbusmenu-glib.so"
"g_enum_register_static" in "libdbusmenu-glib.so" ==> 0x807ccd600 in "libgobject-2.0.so.0"
"g_param_spec_enum" in "libdbusmenu-glib.so" ==> 0x807cda580 in "libgobject-2.0.so.0"
"dbusmenu_status_get_type" in "libdbusmenu-glib.so" ==> 0x818175b10 in "libdbusmenu-glib.so"
"g_dbus_node_info_new_for_xml" in "libdbusmenu-glib.so" ==> 0x807ea22b0 in "libgio-2.0.so.0"
"g_dbus_node_info_lookup_interface" in "libdbusmenu-glib.so" ==> 0x807ea3ca0 in "libgio-2.0.so.0"
"g_type_instance_get_private" in "libdbusmenu-glib.so" ==> 0x807ceaa40 in "libgobject-2.0.so.0"
"g_type_check_instance_cast" in "libdbusmenu-glib.so" ==> 0x807ce9410 in "libgobject-2.0.so.0"
"g_hash_table_new_full" in "libdbusmenu-glib.so" ==> 0x807c33580 in "libglib-2.0.so.0"
"g_getenv" in "libdbusmenu-glib.so" ==> 0x807c2ff30 in "libglib-2.0.so.0"
"g_dpgettext" in "libdbusmenu-glib.so" ==> 0x807c331c0 in "libglib-2.0.so.0"
"g_strcmp0" in "libdbusmenu-glib.so" ==> 0x807c6da40 in "libglib-2.0.so.0"
"g_value_dup_string" in "libdbusmenu-glib.so" ==> 0x807cf1c80 in "libgobject-2.0.so.0"
"g_cancellable_new" in "libdbusmenu-glib.so" ==> 0x807dceb60 in "libgio-2.0.so.0"
"g_object_ref" in "libdbusmenu-glib.so" ==> 0x807cd0d60 in "libgobject-2.0.so.0"
"g_bus_get" in "libdbusmenu-glib.so" ==> 0x807e8b840 in "libgio-2.0.so.0"
"g_param_spec_int" in "libdbusmenu-glib.so" ==> 0x807cda240 in "libgobject-2.0.so.0"
"g_value_type_transformable" in "libdbusmenu-glib.so" ==> 0x807cee410 in "libgobject-2.0.so.0"
"g_value_register_transform_func" in "libdbusmenu-glib.so" ==> 0x807cee160 in "libgobject-2.0.so.0"
"dbusmenu_defaults_ref_default" in "libdbusmenu-glib.so" ==> 0x818175120 in "libdbusmenu-glib.so"
"g_variant_new_boolean" in "libdbusmenu-glib.so" ==> 0x807c84630 in "libglib-2.0.so.0"
"dbusmenu_defaults_default_set" in "libdbusmenu-glib.so" ==> 0x818175200 in "libdbusmenu-glib.so"
"g_hash_table_lookup" in "libdbusmenu-glib.so" ==> 0x807c34280 in "libglib-2.0.so.0"
"g_strdup" in "libdbusmenu-glib.so" ==> 0x807c68190 in "libglib-2.0.so.0"
"g_malloc0" in "libdbusmenu-glib.so" ==> 0x807c4eb60 in "libglib-2.0.so.0"
"g_variant_type_copy" in "libdbusmenu-glib.so" ==> 0x807c957a0 in "libglib-2.0.so.0"
"g_variant_ref_sink" in "libdbusmenu-glib.so" ==> 0x807c8d410 in "libglib-2.0.so.0"
"g_hash_table_insert" in "libdbusmenu-glib.so" ==> 0x807c345d0 in "libglib-2.0.so.0"
"g_hash_table_replace" in "libdbusmenu-glib.so" ==> 0x807c34750 in "libglib-2.0.so.0"
"g_dgettext" in "libdbusmenu-glib.so" ==> 0x807c33100 in "libglib-2.0.so.0"
"g_variant_new_string" in "libdbusmenu-glib.so" ==> 0x807c864d0 in "libglib-2.0.so.0"
"g_variant_type_checked_" in "libdbusmenu-glib.so" ==> 0x807c95a00 in "libglib-2.0.so.0"
"g_object_add_weak_pointer" in "libdbusmenu-glib.so" ==> 0x807cd4450 in "libgobject-2.0.so.0"
"g_value_get_int" in "libdbusmenu-glib.so" ==> 0x807cf14f0 in "libgobject-2.0.so.0"
"dbusmenu_menuitem_property_set_variant" in "libdbusmenu-glib.so" ==> 0x8181778e0 in "libdbusmenu-glib.so"
"g_utf8_validate" in "libdbusmenu-glib.so" ==> 0x807c7d0b0 in "libglib-2.0.so.0"
"dbusmenu_defaults_default_get_type" in "libdbusmenu-glib.so" ==> 0x818175540 in "libdbusmenu-glib.so"
"g_variant_is_of_type" in "libdbusmenu-glib.so" ==> 0x807c84730 in "libglib-2.0.so.0"
"dbusmenu_defaults_default_get" in "libdbusmenu-glib.so" ==> 0x818175460 in "libdbusmenu-glib.so"
"g_variant_equal" in "libdbusmenu-glib.so" ==> 0x807c88420 in "libglib-2.0.so.0"
"g_hash_table_lookup_extended" in "libdbusmenu-glib.so" ==> 0x807c343f0 in "libglib-2.0.so.0"
"g_signal_emit" in "libdbusmenu-glib.so" ==> 0x807ce2a90 in "libgobject-2.0.so.0"
"g_variant_new" in "libdbusmenu-glib.so" ==> 0x807c8a9d0 in "libglib-2.0.so.0"
"g_variant_unref" in "libdbusmenu-glib.so" ==> 0x807c8d270 in "libglib-2.0.so.0"
"g_list_find" in "libdbusmenu-glib.so" ==> 0x807c42c80 in "libglib-2.0.so.0"
"dbusmenu_menuitem_set_parent" in "libdbusmenu-glib.so" ==> 0x818176930 in "libdbusmenu-glib.so"
"dbusmenu_menuitem_property_exist" in "libdbusmenu-glib.so" ==> 0x818176aa0 in "libdbusmenu-glib.so"
"g_list_append" in "libdbusmenu-glib.so" ==> 0x807c42330 in "libglib-2.0.so.0"
"g_list_length" in "libdbusmenu-glib.so" ==> 0x807c42db0 in "libglib-2.0.so.0"
"g_value_init" in "libdbusmenu-glib.so" ==> 0x807ced8a0 in "libgobject-2.0.so.0"
"g_value_set_object" in "libdbusmenu-glib.so" ==> 0x807cd4fa0 in "libgobject-2.0.so.0"
"g_object_set_property" in "libdbusmenu-glib.so" ==> 0x807cd35c0 in "libgobject-2.0.so.0"
"g_value_get_object" in "libdbusmenu-glib.so" ==> 0x807cd5160 in "libgobject-2.0.so.0"
"dbusmenu_menuitem_get_id" in "libdbusmenu-glib.so" ==> 0x818175dd0 in "libdbusmenu-glib.so"
"g_object_get_property" in "libdbusmenu-glib.so" ==> 0x807cd3610 in "libgobject-2.0.so.0"
"dbusmenu_menuitem_get_root" in "libdbusmenu-glib.so" ==> 0x8181777b0 in "libdbusmenu-glib.so"
"g_value_set_int" in "libdbusmenu-glib.so" ==> 0x807cf14a0 in "libgobject-2.0.so.0"
"dbusmenu_menuitem_get_children" in "libdbusmenu-glib.so" ==> 0x8181760d0 in "libdbusmenu-glib.so"
"dbusmenu_menuitem_set_root" in "libdbusmenu-glib.so" ==> 0x818178600 in "libdbusmenu-glib.so"
"dbusmenu_menuitem_foreach" in "libdbusmenu-glib.so" ==> 0x818178970 in "libdbusmenu-glib.so"
"g_signal_connect_data" in "libdbusmenu-glib.so" ==> 0x807cdf190 in "libgobject-2.0.so.0"
"g_list_foreach" in "libdbusmenu-glib.so" ==> 0x807c422f0 in "libglib-2.0.so.0"
"dbusmenu_menuitem_properties_list" in "libdbusmenu-glib.so" ==> 0x818178150 in "libdbusmenu-glib.so"
"g_hash_table_get_keys" in "libdbusmenu-glib.so" ==> 0x807c35b90 in "libglib-2.0.so.0"
"dbusmenu_menuitem_property_get_variant" in "libdbusmenu-glib.so" ==> 0x818177dd0 in "libdbusmenu-glib.so"
"g_array_new" in "libdbusmenu-glib.so" ==> 0x807c0fce0 in "libglib-2.0.so.0"
"g_array_append_vals" in "libdbusmenu-glib.so" ==> 0x807c10100 in "libglib-2.0.so.0"
"dbusmenu_menuitem_property_is_default" in "libdbusmenu-glib.so" ==> 0x818178df0 in "libdbusmenu-glib.so"
"g_idle_add" in "libdbusmenu-glib.so" ==> 0x807c492d0 in "libglib-2.0.so.0"
"g_list_free" in "libdbusmenu-glib.so" ==> 0x807c42260 in "libglib-2.0.so.0"
"g_object_unref" in "libdbusmenu-glib.so" ==> 0x807cd0e60 in "libgobject-2.0.so.0"
"g_signal_handlers_disconnect_matched" in "libdbusmenu-glib.so" ==> 0x807ce0790 in "libgobject-2.0.so.0"  Failed to open "/usr/local/share/code-oss/libcxxrt.so.1": No such file or directory
/lib/libcxxrt.so.1 valid_hash_sysv 1 valid_hash_gnu 1 dynsymcount 374"g_hash_table_remove" in "libdbusmenu-glib.so" ==> 0x807c34ba0 in "libglib-2.0.so.0"
"g_bus_get_finish" in "libdbusmenu-glib.so" ==> 0x807e8ba00 in "libgio-2.0.so.0"
"g_dbus_connection_signal_subscribe" in "libdbusmenu-glib.so" ==> 0x807e889b0 in "libgio-2.0.so.0"
lm_find("/usr/local/lib/libGL.so.1", "/usr/local/lib")"g_dbus_connection_register_object" in "libdbusmenu-glib.so" ==> 0x807e89510 in "libgio-2.0.so.0"
"g_dbus_connection_emit_signal" in "libdbusmenu-glib.so" ==> 0x807e8a360 in "libgio-2.0.so.0"
"dbusmenu_menuitem_exposed" in "libdbusmenu-glib.so" ==> 0x818178ed0 in "libdbusmenu-glib.so"lmp_find("$DEFAULT$")
"g_variant_parse" in "libdbusmenu-glib.so" ==> 0x807c8def0 in "libglib-2.0.so.0"
  Failed to open "/lib/libxcb-dri3.so.0": No such file or directory"g_free" in "libdbusmenu-glib.so" ==> 0x807c4ec20 in "libglib-2.0.so.0"
lmp_find("/usr/local/lib/libGL.so.1")"g_object_remove_weak_pointer" in "libdbusmenu-glib.so" ==> 0x807cd44c0 in "libgobject-2.0.so.0"
"g_hash_table_destroy" in "libdbusmenu-glib.so" ==> 0x807c341d0 in "libglib-2.0.so.0"
"g_array_free" in "libdbusmenu-glib.so" ==> 0x807c10020 in "libglib-2.0.so.0"lmp_find("$DEFAULT$")
"g_dbus_connection_unregister_object" in "libdbusmenu-glib.so" ==> 0x807e89890 in "libgio-2.0.so.0"
"g_dbus_connection_signal_unsubscribe" in "libdbusmenu-glib.so" ==> 0x807e89050 in "libgio-2.0.so.0"
"g_cancellable_is_cancelled" in "libdbusmenu-glib.so" ==> 0x807dcedb0 in "libgio-2.0.so.0"
"g_cancellable_cancel" in "libdbusmenu-glib.so" ==> 0x807dcf0c0 in "libgio-2.0.so.0"
"g_variant_type_free" in "libdbusmenu-glib.so" ==> 0x807c95790 in "libglib-2.0.so.0"
calling fini function for /usr/local/lib/libdbusmenu-glib.so at 0x81818546c
"__cxa_finalize" in "libdbusmenu-glib.so" ==> 0x80bea3040 in "libc.so.7"
calling fini function for /usr/local/lib/gtk-3.0/modules/libappmenu-gtk-module.so at 0x8107b6b4c
"__cxa_finalize" in "libappmenu-gtk-module.so" ==> 0x80bea3040 in "libc.so.7"
calling fini function for /usr/local/lib/libappmenu-gtk3-parser.so.0 at 0x8107cb4fc
"__cxa_finalize" in "libappmenu-gtk3-parser.so.0" ==> 0x80bea3040 in "libc.so.7"

Related to #29?

Reference: helloSystem/hello#116

Accessibility: Search menu responses to keyboard input

Example A

  1. boot from hello-0.3.0_0C160-FreeBSD-12.1-amd64.iso
  2. type rest
  3. observe selection of every character that was typed
  4. key Down

Expected:

  1. selection of System → Restart

Actual result:

  1. selection bounces away from the required action
  2. up to the Search field, with the entire phrase selected

Workaround:

  1. key Left does move the selection down, however this is wrong because at step (3) above there should be a text cursor

– key Left should move the vertical line one step to the left, to between the characters s and t

Make it work with the default Qt platform theme (QGenericUnixTheme), too

https://blog.broulik.de/2016/10/global-menus-returning/

KDE introduces _KDE_NET_WM_APPMENU_OBJECT_PATH and _KDE_NET_WM_APPMENU_SERVICE_NAME with the result that with platform themes (including the default Qt one) which do not have those global menus don't work anymore.

Those of you familar with Wayland might notice that it uses global window IDs, which don’t exist in a Wayland world.

Is there a way to do without this? I would be fine with a solution that leaves Wayland broken, if we can get global menus to work with the default Qt Unix platform theme again.

Automatically update the System menu using QFileSystemWatcher

The System menu now gets populated based on the filesystem structure on disk.
E.g., you put an app into /Applications and it will show up in the menu.

Currently one has to restart the menu for changes to take effect.

Hence we should find a way to automatically update the System menu using QFileSystemWatcher whenever something changes in the directories that are put in the System menu:

image

Have to click on menu entry in Qt 5.15.0

After updating Qt 5.14.2 to 5.15.0 menus do not work properly any more: It is no longer possible to click on a menu, hold the mouse pressed down while selecting a menu entry, and then select the menu entry by releasing the mouse over the chosen menu entry. Instead you now have to click on the chosen menu entry for the action to be executed.

Is this a known issue with Qt on FreeBSD @adriaandegroot?

Accessibility: keyboard navigation of push buttons

In, for example, the Shut Down dialogue:

  • keying Shift-Tab (or Left?) three times should reach the Restart button.

It does not, because the first Shift-Tab reaches the Shut Down button.

For predictability and consistency, it should be possible to begin navigating away from a default button with a single keystroke.

Compare with, for example, behaviours after keyboard-initiated presentation of a leaving dialogue with x11/sddm:

2021-01-25_02.33.21.mp4

Action Search does not contain actions from submenus

For Gtk applications, Action Search does not contain actions from submenus (e.g., in GIMP the filters are missing)

For Qt applications, Action Search does contain actions from submenus but not the full path is written.

Compare our Action Search (in the global menu) to the Action Search in Scribus (below):

image

[Idea] Make search field also function as an application launcher

At some point, we may have e.g., a SQLite database that contains all applications known to the system, their versions, which MIME types they can handle, etc.

It will not be based on the XDG standards, since that isn't really optimized for application bundles such as .AppDir, .app, .AppImage, etc.

Once we have that database, we can make it searchable from the existing search field too, so that it can also act as an application launcher.

Implement volume for FreeBSD

my volume is about 75%, and my audio work. but when i place my cursor on that, the current volume displayed -1 and there is no volume icon.

sorry for my bad english.

Accessibility: the Search menu cursor and user input lack visibility/legibility

I used the Search menu countless times, and looked for a cursor, but did not see it.

#44 (comment):

I do have a cursor here and it even blinks...

Here, on at least one real computer: no cursor.

2021-01-11.07.43.mp4

On computers where the cursor is visible: it's barely visible (if I hadn't been told of its existence, I would not have seen it). YMMV, if you're younger with better eyesight and so on.

White text input on a vivid blue background is not great. I reckon, if this can be fixed – to have black text on a white (or off-white) background – then a cursor, when it is visible, will be more clearly visible.

Can't build on linux

I'm trying to build Menu on my main production machine (Bedrock Linux) and here is what happens :
On an Oracle Linux stratum, which is my main one, the cmake works, but when I make it fails :

$ ~/src/Menu/build> LANG=C cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/byjumperx4/src/Menu/build
$ ~/src/Menu/build> LANG=C make
[  4%] Automatic MOC for target volume
[  4%] Automatic MOC for target menubar
[  6%] Automatic MOC for target statusnotifier
[  9%] Automatic MOC for target datetime
[  9%] Built target statusnotifier_autogen
[  9%] Built target datetime_autogen
[  9%] Built target menubar_autogen
[  9%] Built target volume_autogen
[ 27%] Built target datetime
[ 27%] Built target volume
[ 47%] Built target statusnotifier
[ 52%] Building CXX object src/CMakeFiles/menubar.dir/appmenuwidget.cpp.o
[ 52%] Building CXX object src/CMakeFiles/menubar.dir/main.cpp.o
/home/byjumperx4/src/Menu/src/main.cpp: In member function 'virtual bool Application::notify(QObject*, QEvent*)':
/home/byjumperx4/src/Menu/src/main.cpp:36:16: error: invalid use of incomplete type 'class QDebug'
         qDebug() << "probono: e.type():" << e->type();
                ^
In file included from /usr/include/qt5/QtCore/qglobal.h:1206,
                 from /usr/include/qt5/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qframe.h:43,
                 from /usr/include/qt5/QtWidgets/QFrame:1,
                 from /home/byjumperx4/src/Menu/src/mainwindow.h:23,
                 from /home/byjumperx4/src/Menu/src/main.cpp:20:
/usr/include/qt5/QtCore/qlogging.h:57:7: note: forward declaration of 'class QDebug'
 class QDebug;
       ^~~~~~
/home/byjumperx4/src/Menu/src/main.cpp:39:20: error: invalid use of incomplete type 'class QDebug'
             qDebug() << "probono: QApplication::focusWidget()->objectName():" << QApplication::focusWidget()->objectName();
                    ^
In file included from /usr/include/qt5/QtCore/qglobal.h:1206,
                 from /usr/include/qt5/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qframe.h:43,
                 from /usr/include/qt5/QtWidgets/QFrame:1,
                 from /home/byjumperx4/src/Menu/src/mainwindow.h:23,
                 from /home/byjumperx4/src/Menu/src/main.cpp:20:
/usr/include/qt5/QtCore/qlogging.h:57:7: note: forward declaration of 'class QDebug'
 class QDebug;
       ^~~~~~
/home/byjumperx4/src/Menu/src/main.cpp:40:20: error: invalid use of incomplete type 'class QDebug'
             qDebug() << "probono: QApplication::focusWidget()->metaObject()->className():" << QApplication::focusWidget()->metaObject()->className();
                    ^
In file included from /usr/include/qt5/QtCore/qglobal.h:1206,
                 from /usr/include/qt5/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qframe.h:43,
                 from /usr/include/qt5/QtWidgets/QFrame:1,
                 from /home/byjumperx4/src/Menu/src/mainwindow.h:23,
                 from /home/byjumperx4/src/Menu/src/main.cpp:20:
/usr/include/qt5/QtCore/qlogging.h:57:7: note: forward declaration of 'class QDebug'
 class QDebug;
       ^~~~~~
make[2]: *** [src/CMakeFiles/menubar.dir/build.make:72: src/CMakeFiles/menubar.dir/main.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp: In member function 'void AppMenuWidget::actionAbout()':
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp:737:12: error: 'sha' was not declared in this scope
         if(sha != "" && url != "" && build != "") {
            ^~~
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp:737:12: note: suggested alternative: 'show'
         if(sha != "" && url != "" && build != "") {
            ^~~
            show
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp:737:25: error: 'url' was not declared in this scope
         if(sha != "" && url != "" && build != "") {
                         ^~~
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp:737:25: note: suggested alternative: 'QUrl'
         if(sha != "" && url != "" && build != "") {
                         ^~~
                         QUrl
/home/byjumperx4/src/Menu/src/appmenuwidget.cpp:737:38: error: 'build' was not declared in this scope
         if(sha != "" && url != "" && build != "") {
                                      ^~~~~
make[2]: *** [src/CMakeFiles/menubar.dir/build.make:163: src/CMakeFiles/menubar.dir/appmenuwidget.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:87: src/CMakeFiles/menubar.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
[ble: exit 2]
$ ~/src/Menu/build>

When I try to build from an Arch Linux strata with the dependencies that are on the README it won't event cmake:

$ ~/src/Menu/build> LANG=C strat arch cmake ..
-- The C compiler identification is GNU 10.2.0
-- The CXX compiler identification is GNU 10.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: /usr/sbin/cc
-- Check for working C compiler: /usr/sbin/cc - broken
CMake Error at /usr/share/cmake-3.19/Modules/CMakeTestCCompiler.cmake:66 (message):
  The C compiler

    "/usr/sbin/cc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/byjumperx4/src/Menu/build/CMakeFiles/CMakeTmp

    Run Build Command(s):/bedrock/cross/bin/gmake cmTC_46521/fast && /bedrock/cross/bin/gmake  -f CMakeFiles/cmTC_46521.dir/build.make CMakeFiles/cmTC_46521.dir/build
    gmake[1]: Entering directory '/home/byjumperx4/src/Menu/build/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_46521.dir/testCCompiler.c.o
    /usr/sbin/cc    -o CMakeFiles/cmTC_46521.dir/testCCompiler.c.o -c /home/byjumperx4/src/Menu/build/CMakeFiles/CMakeTmp/testCCompiler.c
    gmake[1]: /usr/sbin/cc: Command not found
    gmake[1]: *** [CMakeFiles/cmTC_46521.dir/build.make:85: CMakeFiles/cmTC_46521.dir/testCCompiler.c.o] Error 127
    gmake[1]: Leaving directory '/home/byjumperx4/src/Menu/build/CMakeFiles/CMakeTmp'
    gmake: *** [Makefile:140: cmTC_46521/fast] Error 2





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:3 (project)


-- Configuring incomplete, errors occurred!
See also "/home/byjumperx4/src/Menu/build/CMakeFiles/CMakeOutput.log".
See also "/home/byjumperx4/src/Menu/build/CMakeFiles/CMakeError.log".
[ble: exit 1]
$ ~/src/Menu/build>

Consider adding a menu item to list running programs

In the old system 7 the running programs were listed in a menu item at the far right which when clicked displayed a list of all running programs.
image

The dock takes too much space and the titles of the running programs are hidden unless the user hovers the cursor over the item.

Like the picture in System 7.0 section here: https://guidebookgallery.org/screenshots/running

I propose to improve this design by having an option to always display this menu item opened as a column at the right most of the screen (to use the right scree border limit).
And when set to always be on screen it would become like BeOs here: https://guidebookgallery.org/screenshots/running
image

Make it possible to click on the menu entry for a submenu

E.g., when the user clicks on "Applications", the /Applications directory should be opened in the File Manager.

image

// TODO: Make it possible to open the directory that contains the app by clicking on the submenu itself, not one of its items,
// https://stackoverflow.com/a/3799197 (seems to require subclassing QMenu; I tend to avoid subclassing Qt)

Integrate DSBExec like functionality into the search box; consider Alt-F2 expectations

From the foot of today's helloSystem/ISO#68 (comment):

… I'll take a look at this later. …

– and more generally, from the outset I was astonished to find the runner (currently DSBExec) not running when expected. There was brief discussion of this a few days ago … I can no longer find it (maybe it was in IRC?) but I assumed a general keyboard layout/map issue.

Since working around the main mapping issue, I see that an additional, more specific workaround is necessary:

image

Related

https://nomadbsd.org/handbook/handbook.html#globalkeybindings and other precedents

#8

helloSystem/ISO@76fa52d#diff-54b785d2d83f98fdc801bf23a2074a42ded323011d55b204073fc7905bae1ad1R320

#13

helloSystem/hello#8

helloSystem/hello#46

helloSystem/hello#58

https://github.com/helloSystem/docs/blob/main/user/components/preferences/keyboard.md

Menu for some Gtk applications appears only after switching to another one and back

Plasma 5.19.4 has introduced a bug in the Plasma global menu widget itself, which will not show the global menu for GTK applications unless you switch to a KDE/Qt application first and then back to the GTK application.

The bug has been reported to the KDE developers upstream, so they know about it.

Test case: Inkscape.

Are we suffering from the same bug?

Has it since been resolved in KDE Plasma?

Make menu Zeroconf-aware

RIght now we display various applications in the menu. Wouldn't it be nice if we could also show for each application's menu entry a submenu with services announced on the network that can be used with this application? E.g., the Printer application would show all printers in a submenu, the Terminal application would show all servers reachable on the LAN via SSH in a submenu, the Browser appliaction would show all websites on the LAN in a submenu, and so on.

This should also automatically make the network services available from Action Search...
and remove the need for a separate Zeroconf chooser utility like the one we currently have:

image

Instead, the "Chromium" menu entry would get submenus for http://Asterisk.local.:8088 etc.

image

We could then also type aster... into the Action Search box and would get a result that would open http://Asterisk.local.:8088 with Chrome (and each other browser installed):

image

For this to work, each application would have to specify which Zeroconf services it can handle and for how to invoke the application using the arguments provided by Zeroconf.

Prevent menu from being displayed as ">>" ever

Prevent menu from being displayed as ">>" if the font does not fit vertically:

image

image

This is happening e.g., if the font is too large (for example, because the proper UI font is not installed on the system). Instead, we want the text to still be centered in the menu bar (and cut off if needed).

This is how it should look:

image

Handle multi-monitor setups better

Traditionally, the Mac has shown he menu bar only on the main display.
Recent versions seem to show the same menu bar on all desktops.

Make Firefox and Thunderbird work with the global menu

https://askubuntu.com/a/1288592/25036[HowTo] Enabling KDE global menu support in Mozilla Firefox and Thunderbird - Contributions / Tutorials - Manjaro Linux Forum (2020-10-01) essentially:

  • four Linux KDE Plasma-oriented options for Firefox, not all of which offer source code, not all of which are maintained/supported
  • three Linux KDE Plasma-oriented options for Thunderbird, one of which offers source code.

Re: https://askubuntu.com/questions/1288516/how-to-use-kde-global-menu-with-firefox#comment2187794_1288516 ("… good idea to keep the question open …") consider voting up https://askubuntu.com/a/1288825/25036 without expecting it to become an accepted answer. Via this answer:

– vote appropriately; maybe something there is (or will become) not specific to Plasma on Linux.


https://github.com/helloSystem/hello/wiki/Status/_compare/ea548f3c47ea6a27e6ce2929cf007eeea080f576...2612ac0135f794e620389ce4efdfde1d19e9a8f3#diff-37279d912b8bd686a5f683ec6b465f7db4799fb56029601266b2ffa6ffb35ccfR18

Menu doesn't fill the screen when using a secondary display in portrait (90 deg rotated)

When using a secondary display in portrait the menu doesn't fit.
But if I disable the primary display to use only one display in portrait and restart the menu it fills the screen's top correctly.

Expected result on the portrait display when using 2 displays:
1613146855
Actual result:
1613146652

Steps to reproduce:

  1. Plug in an external display.
  2. rotate it and set it to portrait mode in the Screen Settings (screen layout editor)
  3. You should see something like on the screenshots.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.