forked from AuroraMiddleware/gtk
Return an appropriate GtkStyle from gtk_rc_get_style_by_paths()
Always returning NULL (no match) from gtk_rc_get_style_by_paths() means that looking up colors and style properties based on the GtkStyle will give default values instead of themed values. We can do better by returning a GtkStyle based on a GtkWidgetPath that we figure out from the values passed in to get_style_by_paths(). https://bugzilla.gnome.org/show_bug.cgi?id=637520
This commit is contained in:
parent
928fd84ebf
commit
a2dddb1da0
78
gtk/gtkrc.c
78
gtk/gtkrc.c
@ -807,7 +807,83 @@ gtk_rc_get_style_by_paths (GtkSettings *settings,
|
|||||||
const char *class_path,
|
const char *class_path,
|
||||||
GType type)
|
GType type)
|
||||||
{
|
{
|
||||||
return NULL;
|
GtkWidgetPath *path;
|
||||||
|
GtkStyle *style;
|
||||||
|
|
||||||
|
path = gtk_widget_path_new ();
|
||||||
|
|
||||||
|
/* For compatibility, we return a GtkStyle based on a GtkStyleContext
|
||||||
|
* with a GtkWidgetPath appropriate for the supplied information.
|
||||||
|
*
|
||||||
|
* GtkWidgetPath is composed of a list of GTypes with optional names;
|
||||||
|
* In GTK+-2.0, widget_path consisted of the widget names, or
|
||||||
|
* the class names for unnamed widgets, while class_path had the
|
||||||
|
* class names always. So, use class_path to determine the GTypes
|
||||||
|
* and extract widget names from widget_path as applicable.
|
||||||
|
*/
|
||||||
|
if (class_path == NULL)
|
||||||
|
{
|
||||||
|
gtk_widget_path_append_type (path, type == G_TYPE_NONE ? GTK_TYPE_WIDGET : type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const gchar *widget_p, *widget_next;
|
||||||
|
const gchar *class_p, *class_next;
|
||||||
|
|
||||||
|
widget_next = widget_path;
|
||||||
|
class_next = class_path;
|
||||||
|
|
||||||
|
while (*class_next)
|
||||||
|
{
|
||||||
|
GType component_type;
|
||||||
|
gchar *component_class;
|
||||||
|
gchar *component_name;
|
||||||
|
gint pos;
|
||||||
|
|
||||||
|
class_p = class_next;
|
||||||
|
if (*class_p == '.')
|
||||||
|
class_p++;
|
||||||
|
|
||||||
|
widget_p = widget_next; /* Might be NULL */
|
||||||
|
if (widget_p && *widget_p == '.')
|
||||||
|
widget_p++;
|
||||||
|
|
||||||
|
class_next = strchr (class_p, '.');
|
||||||
|
if (class_next == NULL)
|
||||||
|
class_next = class_p + strlen (class_p);
|
||||||
|
|
||||||
|
if (widget_p)
|
||||||
|
{
|
||||||
|
widget_next = strchr (widget_p, '.');
|
||||||
|
if (widget_next == NULL)
|
||||||
|
widget_next = widget_p + strlen (widget_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
component_class = g_strndup (class_p, class_next - class_p);
|
||||||
|
if (widget_p && *widget_p)
|
||||||
|
component_name = g_strndup (widget_p, widget_next - widget_p);
|
||||||
|
else
|
||||||
|
component_name = NULL;
|
||||||
|
|
||||||
|
component_type = g_type_from_name (component_class);
|
||||||
|
if (component_type == G_TYPE_INVALID)
|
||||||
|
component_type = GTK_TYPE_WIDGET;
|
||||||
|
|
||||||
|
pos = gtk_widget_path_append_type (path, component_type);
|
||||||
|
if (component_name != NULL && strcmp (component_name, component_name) != 0)
|
||||||
|
gtk_widget_path_iter_set_name (path, pos, component_name);
|
||||||
|
|
||||||
|
g_free (component_class);
|
||||||
|
g_free (component_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
style = _gtk_style_new_for_path (_gtk_settings_get_screen (settings),
|
||||||
|
path);
|
||||||
|
|
||||||
|
gtk_widget_path_free (path);
|
||||||
|
|
||||||
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -798,6 +798,26 @@ gtk_style_copy (GtkStyle *style)
|
|||||||
return new_style;
|
return new_style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GtkStyle*
|
||||||
|
_gtk_style_new_for_path (GdkScreen *screen,
|
||||||
|
GtkWidgetPath *path)
|
||||||
|
{
|
||||||
|
GtkStyleContext *context;
|
||||||
|
GtkStyle *style;
|
||||||
|
|
||||||
|
context = gtk_style_context_new ();
|
||||||
|
gtk_style_context_set_screen (context, screen);
|
||||||
|
gtk_style_context_set_path (context, path);
|
||||||
|
|
||||||
|
style = g_object_new (GTK_TYPE_STYLE,
|
||||||
|
"context", context,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_object_unref (context);
|
||||||
|
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gtk_style_new:
|
* gtk_style_new:
|
||||||
* @returns: a new #GtkStyle.
|
* @returns: a new #GtkStyle.
|
||||||
@ -809,22 +829,15 @@ gtk_style_copy (GtkStyle *style)
|
|||||||
GtkStyle*
|
GtkStyle*
|
||||||
gtk_style_new (void)
|
gtk_style_new (void)
|
||||||
{
|
{
|
||||||
GtkStyleContext *context;
|
|
||||||
GtkWidgetPath *path;
|
GtkWidgetPath *path;
|
||||||
GtkStyle *style;
|
GtkStyle *style;
|
||||||
|
|
||||||
context = gtk_style_context_new ();
|
|
||||||
gtk_style_context_set_screen (context, gdk_screen_get_default ());
|
|
||||||
|
|
||||||
path = gtk_widget_path_new ();
|
path = gtk_widget_path_new ();
|
||||||
gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
|
gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
|
||||||
gtk_style_context_set_path (context, path);
|
|
||||||
|
|
||||||
style = g_object_new (GTK_TYPE_STYLE,
|
style = _gtk_style_new_for_path (gdk_screen_get_default (),
|
||||||
"context", context,
|
path);
|
||||||
NULL);
|
|
||||||
|
|
||||||
g_object_unref (context);
|
|
||||||
gtk_widget_path_free (path);
|
gtk_widget_path_free (path);
|
||||||
|
|
||||||
return style;
|
return style;
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gtk/gtkenums.h>
|
#include <gtk/gtkenums.h>
|
||||||
|
#include <gtk/gtkwidgetpath.h>
|
||||||
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
@ -634,10 +635,13 @@ void gtk_style_get (GtkStyle *style,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* --- private API --- */
|
/* --- private API --- */
|
||||||
|
GtkStyle* _gtk_style_new_for_path (GdkScreen *screen,
|
||||||
|
GtkWidgetPath *path);
|
||||||
void _gtk_style_shade (const GdkColor *a,
|
void _gtk_style_shade (const GdkColor *a,
|
||||||
GdkColor *b,
|
GdkColor *b,
|
||||||
gdouble k);
|
gdouble k);
|
||||||
|
|
||||||
|
|
||||||
void gtk_draw_insertion_cursor (GtkWidget *widget,
|
void gtk_draw_insertion_cursor (GtkWidget *widget,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
const GdkRectangle *location,
|
const GdkRectangle *location,
|
||||||
|
Loading…
Reference in New Issue
Block a user