static GtkStyleContext* StyleContext( GtkStyleContext* parent, GtkWidgetPath* path, GType type, const char* objectName, const char* className1 = NULL, const char* className2 = NULL) { gtk_widget_path_append_type(path, type); #if GTK_CHECK_VERSION(3,20,0) if (gtk_check_version(3,20,0) == NULL) gtk_widget_path_iter_set_object_name(path, -1, objectName); #endif if (className1) gtk_widget_path_iter_add_class(path, -1, className1); if (className2) gtk_widget_path_iter_add_class(path, -1, className2); GtkStyleContext* sc = gtk_style_context_new(); gtk_style_context_set_path(sc, path); if (parent) { #if GTK_CHECK_VERSION(3,4,0) if (gtk_check_version(3,4,0) == NULL) gtk_style_context_set_parent(sc, parent); #endif g_object_unref(parent); } return sc; }
static void gtk_text_handle_widget_style_updated (GtkWidget *widget, GtkTextHandle *handle) { GtkTextHandlePrivate *priv; priv = handle->priv; gtk_style_context_set_parent (gtk_widget_get_style_context (widget), gtk_widget_get_style_context (priv->parent)); _gtk_text_handle_update (handle, GTK_TEXT_HANDLE_POSITION_SELECTION_START); _gtk_text_handle_update (handle, GTK_TEXT_HANDLE_POSITION_SELECTION_END); }
static GtkWidget * _gtk_text_handle_ensure_widget (GtkTextHandle *handle, GtkTextHandlePosition pos) { GtkTextHandlePrivate *priv; priv = handle->priv; if (!priv->windows[pos].widget) { GtkWidget *widget, *window; GtkStyleContext *context; widget = gtk_event_box_new (); gtk_event_box_set_visible_window (GTK_EVENT_BOX (widget), TRUE); gtk_widget_set_events (widget, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK); gtk_widget_set_direction (widget, priv->windows[pos].dir); g_signal_connect (widget, "draw", G_CALLBACK (gtk_text_handle_widget_draw), handle); g_signal_connect (widget, "event", G_CALLBACK (gtk_text_handle_widget_event), handle); g_signal_connect (widget, "style-updated", G_CALLBACK (gtk_text_handle_widget_style_updated), handle); priv->windows[pos].widget = g_object_ref_sink (widget); window = gtk_widget_get_ancestor (priv->parent, GTK_TYPE_WINDOW); _gtk_window_add_popover (GTK_WINDOW (window), widget, priv->parent, FALSE); context = gtk_widget_get_style_context (widget); gtk_style_context_set_parent (context, gtk_widget_get_style_context (priv->parent)); gtk_css_node_set_name (gtk_widget_get_css_node (widget), I_("cursor-handle")); if (pos == GTK_TEXT_HANDLE_POSITION_SELECTION_END) { gtk_style_context_add_class (context, GTK_STYLE_CLASS_BOTTOM); if (priv->mode == GTK_TEXT_HANDLE_MODE_CURSOR) gtk_style_context_add_class (context, GTK_STYLE_CLASS_INSERTION_CURSOR); } else gtk_style_context_add_class (context, GTK_STYLE_CLASS_TOP); } return priv->windows[pos].widget; }
static GtkStyleContext * create_context_for_path (GtkWidgetPath *path, GtkStyleContext *parent) { GtkStyleContext *context; context = gtk_style_context_new (); gtk_style_context_set_path (context, path); gtk_style_context_set_parent (context, parent); /* Unfortunately, we have to explicitly set the state again here * for it to take effect */ gtk_style_context_set_state (context, gtk_widget_path_iter_get_state (path, -1)); gtk_widget_path_unref (path); return context; }
static void StyleContextFree(GtkStyleContext* sc) { if (gtk_check_version(3,16,0) == NULL || gtk_check_version(3,4,0)) { g_object_unref(sc); return; } #if GTK_CHECK_VERSION(3,4,0) // GTK+ < 3.16 does not properly handle freeing child context before parent do { GtkStyleContext* parent = gtk_style_context_get_parent(sc); if (parent) { g_object_ref(parent); gtk_style_context_set_parent(sc, NULL); } g_object_unref(sc); sc = parent; } while (sc); #endif }
static GtkStyleContext* CreateCSSNode(const char* aName, GtkStyleContext *aParentStyle) { static auto sGtkWidgetPathIterSetObjectName = reinterpret_cast<void (*)(GtkWidgetPath *, gint, const char *)> (dlsym(RTLD_DEFAULT, "gtk_widget_path_iter_set_object_name")); GtkWidgetPath* path = gtk_widget_path_copy(gtk_style_context_get_path(aParentStyle)); gtk_widget_path_append_type(path, G_TYPE_NONE); (*sGtkWidgetPathIterSetObjectName)(path, -1, aName); GtkStyleContext *context = gtk_style_context_new(); gtk_style_context_set_path(context, path); gtk_style_context_set_parent(context, aParentStyle); gtk_widget_path_unref(path); return context; }
static GtkStyleContext * get_style (GtkStyleContext *parent, const char *selector) { GtkWidgetPath *path; GtkStyleContext *context; if (parent) path = gtk_widget_path_copy (gtk_style_context_get_path (parent)); else path = gtk_widget_path_new (); append_element (path, selector); context = gtk_style_context_new (); gtk_style_context_set_path (context, path); gtk_style_context_set_parent (context, parent); gtk_widget_path_unref (path); return context; }