added TRAY_IMAGE_SIZE_FALLBACK and TRAY_MENU_IMAGE_SIZE_FALLBACK, changed anony to lambdas
This commit is contained in:
parent
0416f0b5d4
commit
f5f4bca004
@ -38,15 +38,24 @@ import dorkbox.jna.linux.structs.GtkStyle;
|
|||||||
import dorkbox.jna.linux.structs.PangoRectangle;
|
import dorkbox.jna.linux.structs.PangoRectangle;
|
||||||
import dorkbox.os.OS;
|
import dorkbox.os.OS;
|
||||||
import dorkbox.os.OSUtil;
|
import dorkbox.os.OSUtil;
|
||||||
|
import dorkbox.propertyLoader.Property;
|
||||||
import dorkbox.util.FileUtil;
|
import dorkbox.util.FileUtil;
|
||||||
import dorkbox.util.MathUtil;
|
import dorkbox.util.MathUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to contain all of the various methods needed to get information set by a GTK theme.
|
* Class to contain all of the various methods needed to get information set by a GTK theme.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"deprecation", "WeakerAccess"})
|
@SuppressWarnings({"unused", "WeakerAccess"})
|
||||||
public
|
public
|
||||||
class GtkTheme {
|
class GtkTheme {
|
||||||
|
@Property
|
||||||
|
/** Fallback for an unknown tray image size. */
|
||||||
|
public static int TRAY_IMAGE_SIZE_FALLBACK = 24;
|
||||||
|
|
||||||
|
@Property
|
||||||
|
/** Fallback for an unknown tray menu image size. */
|
||||||
|
public static int TRAY_MENU_IMAGE_SIZE_FALLBACK = 16;
|
||||||
|
|
||||||
public static
|
public static
|
||||||
Rectangle getPixelTextHeight(String text) {
|
Rectangle getPixelTextHeight(String text) {
|
||||||
// the following method requires an offscreen widget to get the size of text (for the checkmark size) via pango
|
// the following method requires an offscreen widget to get the size of text (for the checkmark size) via pango
|
||||||
@ -86,43 +95,39 @@ class GtkTheme {
|
|||||||
*/
|
*/
|
||||||
public static
|
public static
|
||||||
int getMenuEntryImageSize() {
|
int getMenuEntryImageSize() {
|
||||||
final AtomicReference<Integer> imageHeight = new AtomicReference<Integer>();
|
final AtomicReference<Integer> imageHeight = new AtomicReference<>();
|
||||||
|
|
||||||
GtkEventDispatch.dispatchAndWait(new Runnable() {
|
GtkEventDispatch.dispatchAndWait(()->{
|
||||||
@Override
|
Pointer offscreen = Gtk2.gtk_offscreen_window_new();
|
||||||
public
|
|
||||||
void run() {
|
|
||||||
Pointer offscreen = Gtk2.gtk_offscreen_window_new();
|
|
||||||
|
|
||||||
// get the default icon size for the "paste" icon.
|
// get the default icon size for the "paste" icon.
|
||||||
Pointer item = null;
|
Pointer item = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
item = Gtk2.gtk_image_menu_item_new_from_stock("gtk-paste", null);
|
item = Gtk2.gtk_image_menu_item_new_from_stock("gtk-paste", null);
|
||||||
|
|
||||||
// make sure the image is shown (sometimes it's not always shown, then height is 0)
|
// make sure the image is shown (sometimes it's not always shown, then height is 0)
|
||||||
Gtk2.gtk_image_menu_item_set_always_show_image(item, true);
|
Gtk2.gtk_image_menu_item_set_always_show_image(item, true);
|
||||||
|
|
||||||
Gtk2.gtk_container_add(offscreen, item);
|
Gtk2.gtk_container_add(offscreen, item);
|
||||||
Gtk2.gtk_widget_realize(offscreen);
|
Gtk2.gtk_widget_realize(offscreen);
|
||||||
Gtk2.gtk_widget_realize(item);
|
Gtk2.gtk_widget_realize(item);
|
||||||
Gtk2.gtk_widget_show_all(item);
|
Gtk2.gtk_widget_show_all(item);
|
||||||
|
|
||||||
PointerByReference r = new PointerByReference();
|
PointerByReference r = new PointerByReference();
|
||||||
GObject.g_object_get(item, "image", r.getPointer(), null);
|
GObject.g_object_get(item, "image", r.getPointer(), null);
|
||||||
|
|
||||||
Pointer imageWidget = r.getValue();
|
Pointer imageWidget = r.getValue();
|
||||||
|
|
||||||
GtkRequisition gtkRequisition = new GtkRequisition();
|
GtkRequisition gtkRequisition = new GtkRequisition();
|
||||||
Gtk2.gtk_widget_size_request(imageWidget, gtkRequisition.getPointer());
|
Gtk2.gtk_widget_size_request(imageWidget, gtkRequisition.getPointer());
|
||||||
gtkRequisition.read();
|
gtkRequisition.read();
|
||||||
|
|
||||||
imageHeight.set(gtkRequisition.height);
|
imageHeight.set(gtkRequisition.height);
|
||||||
} finally {
|
} finally {
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
Gtk2.gtk_widget_destroy(item);
|
Gtk2.gtk_widget_destroy(item);
|
||||||
Gtk2.gtk_widget_destroy(offscreen);
|
Gtk2.gtk_widget_destroy(offscreen);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -132,10 +137,9 @@ class GtkTheme {
|
|||||||
if (height > 0) {
|
if (height > 0) {
|
||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
LoggerFactory.getLogger(GtkTheme.class).warn("Unable to get tray menu image size. Using default.");
|
LoggerFactory.getLogger(GtkTheme.class).warn("Unable to get tray menu image size. Using fallback: " + TRAY_MENU_IMAGE_SIZE_FALLBACK);
|
||||||
return 16;
|
return TRAY_MENU_IMAGE_SIZE_FALLBACK;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -151,28 +155,24 @@ class GtkTheme {
|
|||||||
// 96 DPI is the default
|
// 96 DPI is the default
|
||||||
final double defaultDPI = 96.0;
|
final double defaultDPI = 96.0;
|
||||||
|
|
||||||
final AtomicReference<Double> screenScale = new AtomicReference<Double>();
|
final AtomicReference<Double> screenScale = new AtomicReference<>();
|
||||||
final AtomicInteger screenDPI = new AtomicInteger();
|
final AtomicInteger screenDPI = new AtomicInteger();
|
||||||
screenScale.set(0D);
|
screenScale.set(0D);
|
||||||
screenDPI.set(0);
|
screenDPI.set(0);
|
||||||
|
|
||||||
GtkEventDispatch.dispatchAndWait(new Runnable() {
|
GtkEventDispatch.dispatchAndWait(()->{
|
||||||
@Override
|
// screen DPI
|
||||||
public
|
Pointer screen = Gtk2.gdk_screen_get_default();
|
||||||
void run() {
|
if (screen != null) {
|
||||||
// screen DPI
|
// this call makes NO SENSE, but reading the documentation shows it is the CORRECT call.
|
||||||
Pointer screen = Gtk2.gdk_screen_get_default();
|
screenDPI.set((int) Gtk2.gdk_screen_get_resolution(screen));
|
||||||
if (screen != null) {
|
}
|
||||||
// this call makes NO SENSE, but reading the documentation shows it is the CORRECT call.
|
|
||||||
screenDPI.set((int) Gtk2.gdk_screen_get_resolution(screen));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isGtk3) {
|
if (isGtk3) {
|
||||||
Pointer window = Gtk2.gdk_get_default_root_window();
|
Pointer window = Gtk2.gdk_get_default_root_window();
|
||||||
if (window != null) {
|
if (window != null) {
|
||||||
double scale = Gtk3.gdk_window_get_scale_factor(window);
|
double scale = Gtk3.gdk_window_get_scale_factor(window);
|
||||||
screenScale.set(scale);
|
screenScale.set(scale);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -423,43 +423,39 @@ class GtkTheme {
|
|||||||
|
|
||||||
// try to use GTK to get the tray icon size
|
// try to use GTK to get the tray icon size
|
||||||
final AtomicInteger traySize = new AtomicInteger();
|
final AtomicInteger traySize = new AtomicInteger();
|
||||||
GtkEventDispatch.dispatchAndWait(new Runnable() {
|
GtkEventDispatch.dispatchAndWait(()->{
|
||||||
@Override
|
Pointer screen = Gtk2.gdk_screen_get_default();
|
||||||
public
|
Pointer settings = null;
|
||||||
void run() {
|
|
||||||
Pointer screen = Gtk2.gdk_screen_get_default();
|
|
||||||
Pointer settings = null;
|
|
||||||
|
|
||||||
if (screen != null) {
|
if (screen != null) {
|
||||||
settings = Gtk2.gtk_settings_get_for_screen(screen);
|
settings = Gtk2.gtk_settings_get_for_screen(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings != null) {
|
if (settings != null) {
|
||||||
PointerByReference pointer = new PointerByReference();
|
PointerByReference pointer = new PointerByReference();
|
||||||
|
|
||||||
// https://wiki.archlinux.org/index.php/GTK%2B
|
// https://wiki.archlinux.org/index.php/GTK%2B
|
||||||
// To use smaller icons, use a line like this:
|
// To use smaller icons, use a line like this:
|
||||||
// gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=16,16:gtk-small-toolbar=16,16:gtk-button=16,16"
|
// gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=16,16:gtk-small-toolbar=16,16:gtk-button=16,16"
|
||||||
|
|
||||||
// this gets icon sizes. On XFCE, ubuntu, it returns "panel-menu-bar=24,24"
|
// this gets icon sizes. On XFCE, ubuntu, it returns "panel-menu-bar=24,24"
|
||||||
// NOTE: gtk-icon-sizes is deprecated and ignored since GTK+ 3.10.
|
// NOTE: gtk-icon-sizes is deprecated and ignored since GTK+ 3.10.
|
||||||
|
|
||||||
// A list of icon sizes. The list is separated by colons, and item has the form: size-name = width , height
|
// A list of icon sizes. The list is separated by colons, and item has the form: size-name = width , height
|
||||||
GObject.g_object_get(settings, "gtk-icon-sizes", pointer.getPointer(), null);
|
GObject.g_object_get(settings, "gtk-icon-sizes", pointer.getPointer(), null);
|
||||||
|
Pointer value = pointer.getValue();
|
||||||
|
if (value != null) {
|
||||||
|
// this might be null for later versions of GTK!
|
||||||
|
String iconSizes = value.getString(0);
|
||||||
|
String[] strings = new String[] {"panel-menu-bar=", "panel=", "gtk-large-toolbar=", "gtk-small-toolbar="};
|
||||||
|
for (String var : strings) {
|
||||||
|
int i = iconSizes.indexOf(var);
|
||||||
|
if (i >= 0) {
|
||||||
|
String size = iconSizes.substring(i + var.length(), iconSizes.indexOf(",", i));
|
||||||
|
|
||||||
Pointer value = pointer.getValue();
|
if (MathUtil.isInteger(size)) {
|
||||||
if (value != null) {
|
traySize.set(Integer.parseInt(size));
|
||||||
String iconSizes = value.getString(0);
|
return;
|
||||||
String[] strings = new String[] {"panel-menu-bar=", "panel=", "gtk-large-toolbar=", "gtk-small-toolbar="};
|
|
||||||
for (String var : strings) {
|
|
||||||
int i = iconSizes.indexOf(var);
|
|
||||||
if (i >= 0) {
|
|
||||||
String size = iconSizes.substring(i + var.length(), iconSizes.indexOf(",", i));
|
|
||||||
|
|
||||||
if (MathUtil.isInteger(size)) {
|
|
||||||
traySize.set(Integer.parseInt(size));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -473,9 +469,8 @@ class GtkTheme {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sane default
|
// sane default
|
||||||
LoggerFactory.getLogger(GtkTheme.class).warn("Unable to get tray image size. Using default.");
|
LoggerFactory.getLogger(GtkTheme.class).warn("Unable to get tray image size. Using fallback: " + TRAY_IMAGE_SIZE_FALLBACK);
|
||||||
|
return TRAY_IMAGE_SIZE_FALLBACK;
|
||||||
return 24;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -483,41 +478,36 @@ class GtkTheme {
|
|||||||
*/
|
*/
|
||||||
public static
|
public static
|
||||||
Color getTextColor() {
|
Color getTextColor() {
|
||||||
final AtomicReference<Color> color = new AtomicReference<Color>(null);
|
final AtomicReference<Color> color = new AtomicReference<>(null);
|
||||||
GtkEventDispatch.dispatchAndWait(new Runnable() {
|
GtkEventDispatch.dispatchAndWait(()->{
|
||||||
@SuppressWarnings("UnusedAssignment")
|
Color c;
|
||||||
@Override
|
|
||||||
public
|
|
||||||
void run() {
|
|
||||||
Color c = null;
|
|
||||||
|
|
||||||
// the following method requires an offscreen widget to get the style information from.
|
// the following method requires an offscreen widget to get the style information from.
|
||||||
// don't forget to destroy everything!
|
// don't forget to destroy everything!
|
||||||
Pointer menu = null;
|
Pointer menu = null;
|
||||||
Pointer item = null;
|
Pointer item = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
menu = Gtk2.gtk_menu_new();
|
menu = Gtk2.gtk_menu_new();
|
||||||
item = Gtk2.gtk_image_menu_item_new_with_mnemonic("a");
|
item = Gtk2.gtk_image_menu_item_new_with_mnemonic("a");
|
||||||
|
|
||||||
Gtk2.gtk_container_add(menu, item);
|
Gtk2.gtk_container_add(menu, item);
|
||||||
|
|
||||||
Gtk2.gtk_widget_realize(menu);
|
Gtk2.gtk_widget_realize(menu);
|
||||||
Gtk2.gtk_widget_realize(item);
|
Gtk2.gtk_widget_realize(item);
|
||||||
Gtk2.gtk_widget_show_all(menu);
|
Gtk2.gtk_widget_show_all(menu);
|
||||||
|
|
||||||
GtkStyle style = Gtk2.gtk_rc_get_style(item);
|
GtkStyle style = Gtk2.gtk_rc_get_style(item);
|
||||||
style.read();
|
style.read();
|
||||||
|
|
||||||
// this is the same color chromium uses (fg)
|
// this is the same color chromium uses (fg)
|
||||||
// https://chromium.googlesource.com/chromium/src/+/b3ca230ddd7d1238ee96ed26ea23e369f10dd655/chrome/browser/ui/libgtk2ui/gtk2_ui.cc#873
|
// https://chromium.googlesource.com/chromium/src/+/b3ca230ddd7d1238ee96ed26ea23e369f10dd655/chrome/browser/ui/libgtk2ui/gtk2_ui.cc#873
|
||||||
c = style.fg[GtkState.NORMAL].getColor();
|
c = style.fg[GtkState.NORMAL].getColor();
|
||||||
|
|
||||||
color.set(c);
|
color.set(c);
|
||||||
} finally {
|
} finally {
|
||||||
Gtk2.gtk_widget_destroy(item);
|
Gtk2.gtk_widget_destroy(item);
|
||||||
Gtk2.gtk_widget_destroy(menu);
|
Gtk2.gtk_widget_destroy(menu);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user