From 87222f848329fc772d2ef128953fd8965e0d7e3b Mon Sep 17 00:00:00 2001 From: nathan Date: Sat, 8 Oct 2016 23:30:49 +0200 Subject: [PATCH] AppIndicator does not support BOLD text in menus, since we cater to the lowest common denominator, we remove bold text for status. We change to use a menu separator to define a "status" at the top of the menu --- src/dorkbox/systemTray/linux/GtkEntryItem.java | 5 ++--- src/dorkbox/systemTray/linux/GtkEntryStatus.java | 16 ++++++---------- src/dorkbox/systemTray/linux/GtkMenu.java | 7 ++----- src/dorkbox/systemTray/linux/jna/Gtk.java | 10 +--------- .../systemTray/swing/SwingEntryStatus.java | 7 +++---- 5 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/dorkbox/systemTray/linux/GtkEntryItem.java b/src/dorkbox/systemTray/linux/GtkEntryItem.java index 0c85dec..88cd85e 100644 --- a/src/dorkbox/systemTray/linux/GtkEntryItem.java +++ b/src/dorkbox/systemTray/linux/GtkEntryItem.java @@ -37,7 +37,7 @@ class GtkEntryItem extends GtkEntry implements GCallback { private volatile Pointer image; // these are necessary BECAUSE GTK menus look funky as hell when there are some menu entries WITH icons and some WITHOUT - private volatile boolean hasLegitIcon = true; + protected volatile boolean hasLegitIcon = true; // The mnemonic will ONLY show-up once a menu entry is selected. IT WILL NOT show up before then! // AppIndicators will only show if you use the keyboard to navigate @@ -52,7 +52,7 @@ class GtkEntryItem extends GtkEntry implements GCallback { super(parent, Gtk.gtk_image_menu_item_new_with_mnemonic("")); this.callback = callback; - + // cannot be done in a static initializer, because the tray icon size might not yet have been determined if (transparentIcon == null) { transparentIcon = ImageUtils.getTransparentImage(ImageUtils.ENTRY_SIZE); } @@ -149,7 +149,6 @@ class GtkEntryItem extends GtkEntry implements GCallback { } Gtk.gtk_menu_item_set_label(_native, text); - Gtk.gtk_widget_show_all(_native); } diff --git a/src/dorkbox/systemTray/linux/GtkEntryStatus.java b/src/dorkbox/systemTray/linux/GtkEntryStatus.java index f50a599..b785a3d 100644 --- a/src/dorkbox/systemTray/linux/GtkEntryStatus.java +++ b/src/dorkbox/systemTray/linux/GtkEntryStatus.java @@ -15,10 +15,7 @@ */ package dorkbox.systemTray.linux; -import com.sun.jna.Pointer; - import dorkbox.systemTray.SystemTrayMenuAction; -import dorkbox.systemTray.linux.jna.Gobject; import dorkbox.systemTray.linux.jna.Gtk; // you might wonder WHY this extends MenuEntryItem -- the reason is that an AppIndicator "status" will be offset from everyone else, @@ -31,20 +28,19 @@ class GtkEntryStatus extends GtkEntryItem { */ GtkEntryStatus(final GtkMenu parent, final String text) { super(parent, null); + // need that extra space so it matches windows/mac + hasLegitIcon = false; setText(text); } // called in the GTK thread @Override void renderText(final String text) { - // evil hacks abound... - // https://developer.gnome.org/pango/stable/PangoMarkupFormat.html + // AppIndicator strips out markup text. + // https://mail.gnome.org/archives/commits-list/2016-March/msg05444.html - Pointer label = Gtk.gtk_bin_get_child(_native); - Gtk.gtk_label_set_use_markup(label, Gtk.TRUE); - Pointer markup = Gobject.g_markup_printf_escaped("%s", text); - Gtk.gtk_label_set_markup(label, markup); - Gobject.g_free(markup); + Gtk.gtk_menu_item_set_label(_native, text); + Gtk.gtk_widget_show_all(_native); Gtk.gtk_widget_set_sensitive(_native, Gtk.FALSE); } diff --git a/src/dorkbox/systemTray/linux/GtkMenu.java b/src/dorkbox/systemTray/linux/GtkMenu.java index dc40c58..10b3542 100644 --- a/src/dorkbox/systemTray/linux/GtkMenu.java +++ b/src/dorkbox/systemTray/linux/GtkMenu.java @@ -282,14 +282,11 @@ class GtkMenu extends Menu implements MenuEntry { // now add back other menu entries synchronized (menuEntries) { - for (int i = 0; i < menuEntries.size(); i++) { - MenuEntry menuEntry__ = menuEntries.get(i); + for (MenuEntry menuEntry__ : menuEntries) { hasImages |= menuEntry__.hasImage(); } - for (int i = 0; i < menuEntries.size(); i++) { - MenuEntry menuEntry__ = menuEntries.get(i); - + for (MenuEntry menuEntry__ : menuEntries) { // the menu entry looks FUNKY when there are a mis-match of entries WITH and WITHOUT images if (menuEntry__ instanceof GtkEntry) { GtkEntry entry = (GtkEntry) menuEntry__; diff --git a/src/dorkbox/systemTray/linux/jna/Gtk.java b/src/dorkbox/systemTray/linux/jna/Gtk.java index 5dc2941..74a48dd 100644 --- a/src/dorkbox/systemTray/linux/jna/Gtk.java +++ b/src/dorkbox/systemTray/linux/jna/Gtk.java @@ -38,7 +38,7 @@ import dorkbox.systemTray.util.Swt; * * Direct-mapping, See: https://github.com/java-native-access/jna/blob/master/www/DirectMapping.md */ -@SuppressWarnings("Duplicates") +@SuppressWarnings({"Duplicates", "SameParameterValue", "DanglingJavadoc"}) public class Gtk { // For funsies to look at, SyncThing did a LOT of work on compatibility in python (unfortunate for us, but interesting). @@ -436,14 +436,6 @@ class Gtk { public static native void gtk_image_menu_item_set_always_show_image(Pointer menu_item, int forceShow); - public static native Pointer gtk_bin_get_child(Pointer parent); - - public static native void gtk_label_set_text(Pointer label, String text); - - public static native void gtk_label_set_markup(Pointer label, Pointer markup); - - public static native void gtk_label_set_use_markup(Pointer label, int gboolean); - public static native Pointer gtk_status_icon_new(); public static native void gtk_status_icon_set_from_file(Pointer widget, String label); diff --git a/src/dorkbox/systemTray/swing/SwingEntryStatus.java b/src/dorkbox/systemTray/swing/SwingEntryStatus.java index 3aa39d9..3edb61a 100644 --- a/src/dorkbox/systemTray/swing/SwingEntryStatus.java +++ b/src/dorkbox/systemTray/swing/SwingEntryStatus.java @@ -15,7 +15,6 @@ */ package dorkbox.systemTray.swing; -import java.awt.Font; import java.io.File; import javax.swing.JMenuItem; @@ -34,10 +33,10 @@ class SwingEntryStatus extends SwingEntry implements MenuStatus { // called in the EDT thread @Override void renderText(final String text) { + // AppIndicator strips out markup text, so we disable bold in order to have all of the menus MOSTLY look the same + // https://mail.gnome.org/archives/commits-list/2016-March/msg05444.html + ((JMenuItem) _native).setText(text); - Font font = _native.getFont(); - Font font1 = font.deriveFont(Font.BOLD); - _native.setFont(font1); _native.setEnabled(false); }