8218469: JSlider display issue with slider for GTKLookAndFeel
8218470: JScrollBar display issue with GTKLookAndFeel 8218472: JProgressBar display issue with GTKLookAndFeel 8203627: Swing applications with JRadioButton and JCheckbox fail to render correctly when using GTK3 and the GTK L&F Reviewed-by: serb, prr
This commit is contained in:
parent
72f1f20605
commit
73d2181d56
@ -767,6 +767,14 @@ class GTKStyle extends SynthStyle implements GTKConstants {
|
||||
if (classKey != null) {
|
||||
Object value = getClassSpecificValue(classKey);
|
||||
if (value != null) {
|
||||
//This is a workaround as the "slider-length" property has been
|
||||
//deprecated for GtkScale from gtk 3.20, so default value of 31
|
||||
//is used and makes redering of slider wrong. Value 14 is being
|
||||
//used as default value for Slider.thumbHeight is 14 and making
|
||||
//width 14 as well makes slider thumb render in proper shape
|
||||
if ("Slider.thumbWidth".equals(key) && value.equals(31)) {
|
||||
return 14;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@ -779,8 +787,15 @@ class GTKStyle extends SynthStyle implements GTKConstants {
|
||||
return getColorForState(context, ColorType.FOREGROUND);
|
||||
}
|
||||
else if (key == "ScrollBar.minimumThumbSize") {
|
||||
//This is a workaround as the "min-slider-length" property has been
|
||||
//deprecated for GtkScrollBar from gtk 3.20, so default value of 21
|
||||
//is used and makes ScrollBar thumb very small. Value 40 is being
|
||||
//used as this is the value mentioned in css files
|
||||
int len =
|
||||
getClassSpecificIntValue(context, "min-slider-length", 21);
|
||||
if (len == 21) {
|
||||
len = 40;
|
||||
}
|
||||
JScrollBar sb = (JScrollBar)context.getComponent();
|
||||
if (sb.getOrientation() == JScrollBar.HORIZONTAL) {
|
||||
return new DimensionUIResource(len, 0);
|
||||
|
@ -258,6 +258,7 @@ static void empty() {}
|
||||
|
||||
static gboolean gtk3_version_3_10 = TRUE;
|
||||
static gboolean gtk3_version_3_14 = FALSE;
|
||||
static gboolean gtk3_version_3_20 = FALSE;
|
||||
|
||||
GtkApi* gtk3_load(JNIEnv *env, const char* lib_name)
|
||||
{
|
||||
@ -400,6 +401,18 @@ GtkApi* gtk3_load(JNIEnv *env, const char* lib_name)
|
||||
}
|
||||
gtk3_version_3_14 = !fp_gtk_check_version(3, 14, 0);
|
||||
|
||||
if (!fp_gtk_check_version(3, 20, 0)) {
|
||||
gtk3_version_3_20 = TRUE;
|
||||
fp_gtk_widget_path_copy = dl_symbol("gtk_widget_path_copy");
|
||||
fp_gtk_widget_path_new = dl_symbol("gtk_widget_path_new");
|
||||
fp_gtk_widget_path_append_type = dl_symbol("gtk_widget_path_append_type");
|
||||
fp_gtk_widget_path_iter_set_object_name = dl_symbol("gtk_widget_path_iter_set_object_name");
|
||||
fp_gtk_style_context_set_path = dl_symbol("gtk_style_context_set_path");
|
||||
fp_gtk_widget_path_unref = dl_symbol("gtk_widget_path_unref");
|
||||
fp_gtk_style_context_get_path = dl_symbol("gtk_style_context_get_path");
|
||||
fp_gtk_style_context_new = dl_symbol("gtk_style_context_new");
|
||||
}
|
||||
|
||||
fp_gdk_window_create_similar_surface =
|
||||
dl_symbol("gdk_window_create_similar_surface");
|
||||
fp_gtk_settings_get_for_screen =
|
||||
@ -561,7 +574,6 @@ GtkApi* gtk3_load(JNIEnv *env, const char* lib_name)
|
||||
"gtk_combo_box_new_with_entry");
|
||||
fp_gtk_separator_tool_item_new = dlsym(gtk3_libhandle,
|
||||
"gtk_separator_tool_item_new");
|
||||
|
||||
fp_g_list_append = dl_symbol("g_list_append");
|
||||
fp_g_list_free = dl_symbol("g_list_free");
|
||||
fp_g_list_free_full = dl_symbol("g_list_free_full");
|
||||
@ -1362,6 +1374,90 @@ static GtkWidget *gtk3_get_widget(WidgetType widget_type)
|
||||
return result;
|
||||
}
|
||||
|
||||
static void append_element (GtkWidgetPath *path, const gchar *selector)
|
||||
{
|
||||
fp_gtk_widget_path_append_type (path, G_TYPE_NONE);
|
||||
fp_gtk_widget_path_iter_set_object_name (path, -1, selector);
|
||||
}
|
||||
|
||||
static GtkWidgetPath* createWidgetPath(const GtkWidgetPath* path) {
|
||||
if (path == NULL) {
|
||||
return fp_gtk_widget_path_new();
|
||||
} else {
|
||||
return fp_gtk_widget_path_copy(path);
|
||||
}
|
||||
}
|
||||
|
||||
static GtkStyleContext* get_style(WidgetType widget_type, const gchar *detail)
|
||||
{
|
||||
if (!gtk3_version_3_20) {
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
fp_gtk_style_context_save (context);
|
||||
if (detail != 0) {
|
||||
transform_detail_string(detail, context);
|
||||
}
|
||||
return context;
|
||||
} else {
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
GtkStyleContext* widget_context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
GtkWidgetPath *path = NULL;
|
||||
if (detail != 0) {
|
||||
if (strcmp(detail, "checkbutton") == 0) {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, "check");
|
||||
} else if (strcmp(detail, "radiobutton") == 0) {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, "radio");
|
||||
} else if (strcmp(detail, "vscale") == 0 || strcmp(detail, "hscale") == 0) {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, "slider");
|
||||
} else if (strcmp(detail, "trough") == 0) {
|
||||
//This is a fast solution to the scrollbar trough not being rendered properly
|
||||
if (widget_type == HSCROLL_BAR || widget_type == HSCROLL_BAR_TRACK ||
|
||||
widget_type == VSCROLL_BAR || widget_type == VSCROLL_BAR_TRACK) {
|
||||
path = createWidgetPath (NULL);
|
||||
} else {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
}
|
||||
append_element(path, detail);
|
||||
} else if (strcmp(detail, "bar") == 0) {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, "trough");
|
||||
append_element(path, "progress");
|
||||
} else if (strcmp(detail, "vscrollbar") == 0 || strcmp(detail, "hscrollbar") == 0) {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, "button");
|
||||
} else if (strcmp(detail, "check") == 0) {
|
||||
path = createWidgetPath (NULL);
|
||||
append_element(path, detail);
|
||||
} else if (strcmp(detail, "option") == 0) {
|
||||
path = createWidgetPath (NULL);
|
||||
append_element(path, "radio");
|
||||
} else {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
append_element(path, detail);
|
||||
}
|
||||
} else {
|
||||
path = createWidgetPath (fp_gtk_style_context_get_path (widget_context));
|
||||
}
|
||||
|
||||
GtkStyleContext *context = fp_gtk_style_context_new ();
|
||||
fp_gtk_style_context_set_path (context, path);
|
||||
fp_gtk_widget_path_unref (path);
|
||||
return context;
|
||||
}
|
||||
}
|
||||
|
||||
static void disposeOrRestoreContext(GtkStyleContext *context)
|
||||
{
|
||||
if (!gtk3_version_3_20) {
|
||||
fp_gtk_style_context_restore (context);
|
||||
} else {
|
||||
fp_g_object_unref (context);
|
||||
}
|
||||
}
|
||||
|
||||
static void gtk3_paint_arrow(WidgetType widget_type, GtkStateType state_type,
|
||||
GtkShadowType shadow_type, const gchar *detail,
|
||||
gint x, gint y, gint width, gint height,
|
||||
@ -1509,13 +1605,9 @@ static void gtk3_paint_box(WidgetType widget_type, GtkStateType state_type,
|
||||
*/
|
||||
gtk3_set_direction(gtk3_widget, dir);
|
||||
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
fp_gtk_style_context_save (context);
|
||||
|
||||
transform_detail_string(detail, context);
|
||||
GtkStyleContext* context = get_style(widget_type, detail);
|
||||
|
||||
GtkStateFlags flags = get_gtk_flags(state_type);
|
||||
|
||||
if (shadow_type == GTK_SHADOW_IN && widget_type != COMBO_BOX_ARROW_BUTTON) {
|
||||
flags |= GTK_STATE_FLAG_ACTIVE;
|
||||
}
|
||||
@ -1532,23 +1624,31 @@ static void gtk3_paint_box(WidgetType widget_type, GtkStateType state_type,
|
||||
fp_gtk_style_context_add_class (context, "default");
|
||||
}
|
||||
|
||||
fp_gtk_style_context_set_state (context, flags);
|
||||
|
||||
if (fp_gtk_style_context_has_class(context, "progressbar")) {
|
||||
fp_gtk_render_activity (context, cr, x, y, width, height);
|
||||
} else {
|
||||
fp_gtk_render_background (context, cr, x, y, width, height);
|
||||
if (shadow_type != GTK_SHADOW_NONE) {
|
||||
fp_gtk_render_frame(context, cr, x, y, width, height);
|
||||
}
|
||||
if (fp_gtk_style_context_has_class(context, "trough")) {
|
||||
flags |= GTK_STATE_FLAG_BACKDROP;
|
||||
}
|
||||
|
||||
fp_gtk_style_context_restore (context);
|
||||
fp_gtk_style_context_set_state (context, flags);
|
||||
|
||||
fp_gtk_render_background (context, cr, x, y, width, height);
|
||||
if (shadow_type != GTK_SHADOW_NONE) {
|
||||
fp_gtk_render_frame(context, cr, x, y, width, height);
|
||||
}
|
||||
|
||||
disposeOrRestoreContext(context);
|
||||
|
||||
/*
|
||||
* Reset the text direction to the default value so that we don't
|
||||
* accidentally affect other operations and widgets.
|
||||
*/
|
||||
gtk3_set_direction(gtk3_widget, GTK_TEXT_DIR_LTR);
|
||||
|
||||
//This is a fast solution to the scrollbar trough not being rendered properly
|
||||
if ((widget_type == HSCROLL_BAR || widget_type == HSCROLL_BAR_TRACK ||
|
||||
widget_type == VSCROLL_BAR || widget_type == VSCROLL_BAR_TRACK) && detail != 0) {
|
||||
gtk3_paint_box(widget_type, state_type, shadow_type, NULL,
|
||||
x, y, width, height, synth_state, dir);
|
||||
}
|
||||
}
|
||||
|
||||
static void gtk3_paint_box_gap(WidgetType widget_type, GtkStateType state_type,
|
||||
@ -1580,23 +1680,19 @@ static void gtk3_paint_box_gap(WidgetType widget_type, GtkStateType state_type,
|
||||
static void gtk3_paint_check(WidgetType widget_type, gint synth_state,
|
||||
const gchar *detail, gint x, gint y, gint width, gint height)
|
||||
{
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
|
||||
fp_gtk_style_context_save (context);
|
||||
GtkStyleContext* context = get_style(widget_type, detail);
|
||||
|
||||
GtkStateFlags flags = get_gtk_state_flags(synth_state);
|
||||
if (gtk3_version_3_14 && (synth_state & SELECTED)) {
|
||||
flags = GTK_STATE_FLAG_CHECKED;
|
||||
flags &= ~GTK_STATE_FLAG_SELECTED;
|
||||
flags |= GTK_STATE_FLAG_CHECKED;
|
||||
}
|
||||
fp_gtk_style_context_set_state(context, flags);
|
||||
|
||||
fp_gtk_style_context_add_class (context, "check");
|
||||
|
||||
fp_gtk_render_check (context, cr, x, y, width, height);
|
||||
|
||||
fp_gtk_style_context_restore (context);
|
||||
fp_gtk_render_background(context, cr, x, y, width, height);
|
||||
fp_gtk_render_frame(context, cr, x, y, width, height);
|
||||
fp_gtk_render_check(context, cr, x, y, width, height);
|
||||
disposeOrRestoreContext(context);
|
||||
}
|
||||
|
||||
|
||||
@ -1684,7 +1780,6 @@ static void gtk3_paint_flat_box(WidgetType widget_type, GtkStateType state_type,
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
|
||||
fp_gtk_style_context_save (context);
|
||||
|
||||
if (detail != 0) {
|
||||
@ -1787,25 +1882,19 @@ static void gtk3_paint_vline(WidgetType widget_type, GtkStateType state_type,
|
||||
static void gtk3_paint_option(WidgetType widget_type, gint synth_state,
|
||||
const gchar *detail, gint x, gint y, gint width, gint height)
|
||||
{
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
|
||||
fp_gtk_style_context_save (context);
|
||||
GtkStyleContext* context = get_style(widget_type, detail);
|
||||
|
||||
GtkStateFlags flags = get_gtk_state_flags(synth_state);
|
||||
if (gtk3_version_3_14 && (synth_state & SELECTED)) {
|
||||
flags = GTK_STATE_FLAG_CHECKED;
|
||||
flags &= ~GTK_STATE_FLAG_SELECTED;
|
||||
flags |= GTK_STATE_FLAG_CHECKED;
|
||||
}
|
||||
fp_gtk_style_context_set_state(context, flags);
|
||||
|
||||
if (detail != 0) {
|
||||
transform_detail_string(detail, context);
|
||||
}
|
||||
|
||||
fp_gtk_render_background(context, cr, x, y, width, height);
|
||||
fp_gtk_render_frame(context, cr, x, y, width, height);
|
||||
fp_gtk_render_option(context, cr, x, y, width, height);
|
||||
|
||||
fp_gtk_style_context_restore (context);
|
||||
disposeOrRestoreContext(context);
|
||||
}
|
||||
|
||||
static void gtk3_paint_shadow(WidgetType widget_type, GtkStateType state_type,
|
||||
@ -1864,15 +1953,7 @@ static void gtk3_paint_slider(WidgetType widget_type, GtkStateType state_type,
|
||||
gint x, gint y, gint width, gint height, GtkOrientation orientation,
|
||||
gboolean has_focus)
|
||||
{
|
||||
gtk3_widget = gtk3_get_widget(widget_type);
|
||||
|
||||
GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
|
||||
|
||||
fp_gtk_style_context_save (context);
|
||||
|
||||
if (detail) {
|
||||
transform_detail_string(detail, context);
|
||||
}
|
||||
GtkStyleContext *context = get_style(widget_type, detail);
|
||||
|
||||
GtkStateFlags flags = get_gtk_flags(state_type);
|
||||
|
||||
@ -1886,9 +1967,10 @@ static void gtk3_paint_slider(WidgetType widget_type, GtkStateType state_type,
|
||||
|
||||
fp_gtk_style_context_set_state (context, flags);
|
||||
|
||||
fp_gtk_render_background (context, cr, x, y, width, height);
|
||||
fp_gtk_render_frame(context, cr, x, y, width, height);
|
||||
(*fp_gtk_render_slider)(context, cr, x, y, width, height, orientation);
|
||||
|
||||
fp_gtk_style_context_restore (context);
|
||||
disposeOrRestoreContext(context);
|
||||
}
|
||||
|
||||
static void gtk3_paint_background(WidgetType widget_type,
|
||||
|
@ -162,6 +162,7 @@ typedef void GtkAdjustment;
|
||||
typedef void GtkRange;
|
||||
typedef void GtkProgressBar;
|
||||
typedef void GtkProgress;
|
||||
typedef void GtkWidgetPath;
|
||||
|
||||
/* Some real structures */
|
||||
typedef struct
|
||||
@ -238,7 +239,6 @@ typedef struct {
|
||||
GType owner_type;
|
||||
} GParamSpec;
|
||||
|
||||
|
||||
static gchar* (*fp_glib_check_version)(guint required_major,
|
||||
guint required_minor, guint required_micro);
|
||||
|
||||
@ -573,5 +573,18 @@ static void (*fp_gtk_arrow_set)(GtkWidget* arrow,
|
||||
static void (*fp_gtk_widget_size_request)(GtkWidget *widget,
|
||||
GtkRequisition *requisition);
|
||||
static GtkAdjustment* (*fp_gtk_range_get_adjustment)(GtkRange* range);
|
||||
static GtkWidgetPath* (*fp_gtk_widget_path_copy)
|
||||
(const GtkWidgetPath *path);
|
||||
static const GtkWidgetPath* (*fp_gtk_style_context_get_path)
|
||||
(GtkStyleContext *context);
|
||||
static GtkWidgetPath* (*fp_gtk_widget_path_new) (void);
|
||||
static gint (*fp_gtk_widget_path_append_type)
|
||||
(GtkWidgetPath *path, GType type);
|
||||
static void (*fp_gtk_widget_path_iter_set_object_name)
|
||||
(GtkWidgetPath *path, gint pos, const char *name);
|
||||
static void (*fp_gtk_style_context_set_path)
|
||||
(GtkStyleContext *context, GtkWidgetPath *path);
|
||||
static void (*fp_gtk_widget_path_unref) (GtkWidgetPath *path);
|
||||
static GtkStyleContext* (*fp_gtk_style_context_new) (void);
|
||||
|
||||
#endif /* !_GTK3_INTERFACE_H */
|
||||
|
Loading…
Reference in New Issue
Block a user