< prev index next >
src/java.desktop/unix/native/common/awt/systemscale/systemScale.c
Print this page
*** 20,46 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include "systemScale.h"
#include <stdlib.h>
! int getNativeScaleFactor() {
! static int scale = -2.0;
! if (scale == -2) {
! scale = getScale("J2D_UISCALE");
}
! if (scale >= 1) {
! return (int) scale;
}
! return getScale("GDK_SCALE");
}
! int getScale(const char *name) {
char *uiScale = getenv(name);
if (uiScale != NULL) {
double scale = strtod(uiScale, NULL);
if (scale < 1) {
return -1;
--- 20,206 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include "systemScale.h"
+ #include "jni.h"
+ #include "jni_util.h"
+ #include "jvm_md.h"
+ #include <dlfcn.h>
+ #include <stdio.h>
#include <stdlib.h>
+ #include <string.h>
! typedef void* g_settings_schema_source_get_default();
! typedef void* g_settings_schema_source_ref(void *);
! typedef void g_settings_schema_source_unref(void *);
! typedef void* g_settings_schema_source_lookup(void *, char *, int);
! typedef int g_settings_schema_has_key(void *, char *);
! typedef void* g_settings_new_full(void *, void *, char *);
! typedef void* g_settings_get_value(void *, char *);
! typedef int g_variant_is_of_type(void *, char *);
! typedef unsigned long g_variant_n_children(void *);
! typedef void* g_variant_get_child_value(void *, unsigned long);
! typedef void g_variant_unref(void *);
! typedef char* g_variant_get_string(void *, unsigned long *);
! typedef int g_variant_get_int32(void *);
! typedef double g_variant_get_double(void *);
!
! static g_settings_schema_has_key* fp_g_settings_schema_has_key;
! static g_settings_new_full* fp_g_settings_new_full;
! static g_settings_get_value* fp_g_settings_get_value;
! static g_variant_is_of_type* fp_g_variant_is_of_type;
! static g_variant_n_children* fp_g_variant_n_children;
! static g_variant_get_child_value* fp_g_variant_get_child_value;
! static g_variant_get_string* fp_g_variant_get_string;
! static g_variant_get_int32* fp_g_variant_get_int32;
! static g_variant_get_double* fp_g_variant_get_double;
! static g_variant_unref* fp_g_variant_unref;
!
! static void* get_schema_value(char *name, char *key) {
! static void *lib_handle;
! static int initialized = 0;
! static void * default_schema;
! static g_settings_schema_source_lookup* schema_lookup;
! if (!initialized) {
! initialized = 1;
! void *lib_handle = dlopen(JNI_LIB_NAME("gio-2.0"),
! RTLD_GLOBAL | RTLD_LAZY);
! if (!lib_handle) {
! lib_handle = dlopen(VERSIONED_JNI_LIB_NAME("gio-2.0", "0"),
! RTLD_GLOBAL | RTLD_LAZY);
! }
! if (lib_handle == NULL) {
! return NULL;
! }
! fp_g_settings_schema_has_key =
! dlsym(lib_handle, "g_settings_schema_has_key");
! if (!fp_g_settings_schema_has_key) {
! return NULL;
! }
! fp_g_settings_new_full = dlsym(lib_handle, "g_settings_new_full");
! if (!fp_g_settings_new_full) {
! return NULL;
! }
! fp_g_settings_get_value = dlsym(lib_handle, "g_settings_get_value");
! if (!fp_g_settings_get_value) {
! return NULL;
! }
! fp_g_variant_is_of_type = dlsym(lib_handle, "g_variant_is_of_type");
! if (!fp_g_variant_is_of_type) {
! return NULL;
! }
! fp_g_variant_n_children = dlsym(lib_handle, "g_variant_n_children");
! if (!fp_g_variant_n_children) {
! return NULL;
! }
! fp_g_variant_get_child_value =
! dlsym(lib_handle, "g_variant_get_child_value");
! if (!fp_g_variant_get_child_value) {
! return NULL;
! }
! fp_g_variant_get_string = dlsym(lib_handle, "g_variant_get_string");
! if (!fp_g_variant_get_string) {
! return NULL;
! }
! fp_g_variant_get_int32 = dlsym(lib_handle, "g_variant_get_int32");
! if (!fp_g_variant_get_int32) {
! return NULL;
! }
! fp_g_variant_get_double = dlsym(lib_handle, "g_variant_get_double");
! if (!fp_g_variant_get_double) {
! return NULL;
! }
! fp_g_variant_unref = dlsym(lib_handle, "g_variant_unref");
! if (!fp_g_variant_unref) {
! return NULL;
! }
! void *fp = dlsym(lib_handle, "g_settings_schema_source_get_default");
! if (fp) {
! default_schema = ((g_settings_schema_source_get_default*)fp)();
! }
! if (default_schema) {
! fp = dlsym(lib_handle, "g_settings_schema_source_ref");
! if (fp) {
! ((g_settings_schema_source_ref*)fp)(default_schema);
! }
! }
! schema_lookup = dlsym(lib_handle, "g_settings_schema_source_lookup");
! }
! if (!default_schema || !schema_lookup) {
! return NULL;
! }
! void *schema = schema_lookup(default_schema, name, 1);
! if (schema) {
! if (fp_g_settings_schema_has_key(schema, key)) {
! void *settings = fp_g_settings_new_full(schema, NULL, NULL);
! if (settings) {
! return fp_g_settings_get_value(settings, key);
! }
}
+ }
+ return NULL;
+ }
!
! static double getDesktopScale(char *output_name) {
! double result = -1;
! if(output_name) {
! void *value = get_schema_value("com.ubuntu.user-interface",
! "scale-factor");
! if (value) {
! if(fp_g_variant_is_of_type(value, "a{si}")) {
! int num = fp_g_variant_n_children(value);
! int i = 0;
! while (i < num) {
! void *entry = fp_g_variant_get_child_value(value, i++);
! if (entry) {
! void *screen = fp_g_variant_get_child_value(entry, 0);
! void *scale = fp_g_variant_get_child_value(entry, 1);
! if (screen && scale) {
! char *name = fp_g_variant_get_string(screen, NULL);
! if (name && strcmp(name, output_name)) {
! result = fp_g_variant_get_int32(scale) / 8.;
! }
! fp_g_variant_unref(screen);
! fp_g_variant_unref(scale);
! }
! fp_g_variant_unref(entry);
}
! if (result > 0) {
! break;
! }
! }
! }
! fp_g_variant_unref(value);
! }
! if (result > 0) {
! value = get_schema_value("com.canonical.Unity.Interface",
! "text-scale-factor");
! if (value && fp_g_variant_is_of_type(value, "d")) {
! result *= fp_g_variant_get_double(value);
! fp_g_variant_unref(value);
! }
! }
! }
!
! if (result <= 0) {
! void *value = get_schema_value("org.gnome.desktop.interface",
! "text-scaling-factor");
! if (value && fp_g_variant_is_of_type(value, "d")) {
! result = fp_g_variant_get_double(value);
! fp_g_variant_unref(value);
! }
! }
!
! return result;
!
}
! static int getScale(const char *name) {
char *uiScale = getenv(name);
if (uiScale != NULL) {
double scale = strtod(uiScale, NULL);
if (scale < 1) {
return -1;
*** 48,52 ****
--- 208,234 ----
return (int) scale;
}
return -1;
}
+ double getNativeScaleFactor(char *output_name) {
+
+ static int scale = -2.0;
+
+ if (scale == -2) {
+ scale = getScale("J2D_UISCALE");
+ }
+
+ if (scale > 0) {
+ return scale;
+ }
+
+ double native_scale = getDesktopScale(output_name);
+
+ if (native_scale <= 0) {
+ native_scale = 1;
+ }
+
+ int gdk_scale = getScale("GDK_SCALE");
+
+ return gdk_scale > 0 ? native_scale * gdk_scale : native_scale;
+ }
< prev index next >