diff options
Diffstat (limited to 'modules/inspector/css-editor.c')
-rw-r--r-- | modules/inspector/css-editor.c | 354 |
1 files changed, 0 insertions, 354 deletions
diff --git a/modules/inspector/css-editor.c b/modules/inspector/css-editor.c deleted file mode 100644 index 861ad54a54..0000000000 --- a/modules/inspector/css-editor.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "config.h" -#include "css-editor.h" -#include <glib/gi18n-lib.h> - -#define GTK_INSPECTOR_CSS_EDITOR_TEXT "inspector-css-editor-text" -#define GTK_INSPECTOR_CSS_EDITOR_PROVIDER "inspector-css-editor-provider" - -enum -{ - COLUMN_ENABLED, - COLUMN_NAME, - COLUMN_USER -}; - -enum -{ - PROP_0, - PROP_GLOBAL -}; - -typedef struct -{ - gboolean enabled; - gboolean user; -} GtkInspectorCssEditorByContext; - -struct _GtkInspectorCssEditorPrivate -{ - GtkWidget *toolbar; - GtkWidget *view; - GtkTextBuffer *text; - GtkCssProvider *provider; - gboolean global; - GtkStyleContext *context; - GtkToggleToolButton *disable_button; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorCssEditor, gtk_inspector_css_editor, GTK_TYPE_BOX) - -static void -set_initial_text (GtkInspectorCssEditor *ce) -{ - const gchar *text = NULL; - - if (ce->priv->context) - text = g_object_get_data (G_OBJECT (ce->priv->context), GTK_INSPECTOR_CSS_EDITOR_TEXT); - if (text) - gtk_text_buffer_set_text (GTK_TEXT_BUFFER (ce->priv->text), text, -1); - else - { - gchar *initial_text; - if (ce->priv->global) - initial_text = g_strconcat ("/*\n", - _("You can type here any CSS rule recognized by GTK+."), "\n", - _("You can temporarily disable this custom CSS by clicking on the \"Pause\" button above."), "\n\n", - _("Changes are applied instantly and globally, for the whole application."), "\n", - "*/\n\n", NULL); - else - initial_text = g_strconcat ("/*\n", - _("You can type here any CSS rule recognized by GTK+."), "\n", - _("You can temporarily disable this custom CSS by clicking on the \"Pause\" button above."), "\n\n", - _("Changes are applied instantly, only for this selected widget."), "\n", - "*/\n\n", NULL); - gtk_text_buffer_set_text (GTK_TEXT_BUFFER (ce->priv->text), initial_text, -1); - g_free (initial_text); - } -} - -static void -disable_toggled (GtkToggleToolButton *button, - GtkInspectorCssEditor *ce) -{ - if (gtk_toggle_tool_button_get_active (button)) - { - if (ce->priv->global) - gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (), - GTK_STYLE_PROVIDER (ce->priv->provider)); - else if (ce->priv->context) - gtk_style_context_remove_provider (ce->priv->context, - GTK_STYLE_PROVIDER (g_object_get_data (G_OBJECT (ce->priv->context), GTK_INSPECTOR_CSS_EDITOR_PROVIDER))); - } - else - { - if (ce->priv->global) - gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), - GTK_STYLE_PROVIDER (ce->priv->provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - else if (ce->priv->context) - gtk_style_context_add_provider (ce->priv->context, - GTK_STYLE_PROVIDER (g_object_get_data (G_OBJECT (ce->priv->context), GTK_INSPECTOR_CSS_EDITOR_PROVIDER)), - G_MAXUINT); - } -} - -static void -apply_system_font (GtkInspectorCssEditor *ce) -{ - GSettings *s = g_settings_new ("org.gnome.desktop.interface"); - gchar *font_name = g_settings_get_string (s, "monospace-font-name"); - PangoFontDescription *font_desc = pango_font_description_from_string (font_name); - - gtk_widget_override_font (ce->priv->view, font_desc); - - pango_font_description_free (font_desc); - g_free (font_name); - g_object_unref (s); -} - -static gchar * -get_current_text (GtkTextBuffer *buffer) -{ - GtkTextIter start, end; - - gtk_text_buffer_get_start_iter (buffer, &start); - gtk_text_buffer_get_end_iter (buffer, &end); - gtk_text_buffer_remove_all_tags (buffer, &start, &end); - - return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); -} - -static void -text_changed (GtkTextBuffer *buffer, - GtkInspectorCssEditor *ce) -{ - GtkCssProvider *provider; - gchar *text; - - if (ce->priv->global) - provider = ce->priv->provider; - else if (ce->priv->context) - provider = g_object_get_data (G_OBJECT (ce->priv->context), GTK_INSPECTOR_CSS_EDITOR_PROVIDER); - else - return; - - text = get_current_text (buffer); - gtk_css_provider_load_from_data (provider, text, -1, NULL); - g_free (text); - - gtk_style_context_reset_widgets (gdk_screen_get_default ()); -} - -static void -show_parsing_error (GtkCssProvider *provider, - GtkCssSection *section, - const GError *error, - GtkInspectorCssEditor *ce) -{ - GtkTextIter start, end; - const char *tag_name; - GtkTextBuffer *buffer = GTK_TEXT_BUFFER (ce->priv->text); - - gtk_text_buffer_get_iter_at_line_index (buffer, - &start, - gtk_css_section_get_start_line (section), - gtk_css_section_get_start_position (section)); - gtk_text_buffer_get_iter_at_line_index (buffer, - &end, - gtk_css_section_get_end_line (section), - gtk_css_section_get_end_position (section)); - - if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED)) - tag_name = "warning"; - else - tag_name = "error"; - - gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end); -} - -static void -create_provider (GtkInspectorCssEditor *ce) -{ - GtkCssProvider *provider = gtk_css_provider_new (); - - if (ce->priv->global) - { - ce->priv->provider = provider; - gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), - GTK_STYLE_PROVIDER (ce->priv->provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - else if (ce->priv->context) - { - gtk_style_context_add_provider (ce->priv->context, - GTK_STYLE_PROVIDER (provider), - G_MAXUINT); - g_object_set_data_full (G_OBJECT (ce->priv->context), - GTK_INSPECTOR_CSS_EDITOR_PROVIDER, provider, - g_object_unref); - } - - g_signal_connect (provider, "parsing-error", - G_CALLBACK (show_parsing_error), ce); -} - -static void -gtk_inspector_css_editor_init (GtkInspectorCssEditor *ce) -{ - ce->priv = gtk_inspector_css_editor_get_instance_private (ce); - gtk_widget_init_template (GTK_WIDGET (ce)); -} - -static void -constructed (GObject *object) -{ - GtkInspectorCssEditor *ce = GTK_INSPECTOR_CSS_EDITOR (object); - - create_provider (ce); - apply_system_font (ce); - set_initial_text (ce); -} - -static void -get_property (GObject *object, - guint param_id, - GValue *value, - GParamSpec *pspec) -{ - GtkInspectorCssEditor *ce = GTK_INSPECTOR_CSS_EDITOR (object); - - switch (param_id) - { - case PROP_GLOBAL: - g_value_set_boolean (value, ce->priv->global); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); - break; - } -} - -static void -set_property (GObject *object, - guint param_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkInspectorCssEditor *ce = GTK_INSPECTOR_CSS_EDITOR (object); - - switch (param_id) - { - case PROP_GLOBAL: - ce->priv->global = g_value_get_boolean (value); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); - break; - } -} - -static void -gtk_inspector_css_editor_class_init (GtkInspectorCssEditorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - object_class->get_property = get_property; - object_class->set_property = set_property; - object_class->constructed = constructed; - - g_object_class_install_property (object_class, PROP_GLOBAL, - g_param_spec_boolean ("global", "Global", "Whether this editor changes the whole application or just the selected widget", - TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/css-editor.ui"); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssEditor, toolbar); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssEditor, text); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssEditor, view); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssEditor, disable_button); - gtk_widget_class_bind_template_callback (widget_class, disable_toggled); - gtk_widget_class_bind_template_callback (widget_class, text_changed); -} - -GtkWidget * -gtk_inspector_css_editor_new (gboolean global) -{ - return GTK_WIDGET (g_object_new (GTK_TYPE_INSPECTOR_CSS_EDITOR, - "global", global, - NULL)); -} - -static void -remove_dead_object (gpointer data, GObject *dead_object) -{ - GtkInspectorCssEditor *ce = data; - - ce->priv->context = NULL; - gtk_widget_hide (GTK_WIDGET (ce)); -} - -void -gtk_inspector_css_editor_set_object (GtkInspectorCssEditor *ce, - GObject *object) -{ - gchar *text; - GtkCssProvider *provider; - - g_return_if_fail (GTK_INSPECTOR_IS_CSS_EDITOR (ce)); - g_return_if_fail (!ce->priv->global); - - if (ce->priv->context) - { - g_object_weak_unref (G_OBJECT (ce->priv->context), remove_dead_object, ce); - text = get_current_text (GTK_TEXT_BUFFER (ce->priv->text)); - g_object_set_data_full (G_OBJECT (ce->priv->context), - GTK_INSPECTOR_CSS_EDITOR_TEXT, - text, g_free); - ce->priv->context = NULL; - } - - if (!GTK_IS_WIDGET (object)) - { - gtk_widget_hide (GTK_WIDGET (ce)); - return; - } - - gtk_widget_show (GTK_WIDGET (ce)); - - ce->priv->context = gtk_widget_get_style_context (GTK_WIDGET (object)); - - provider = g_object_get_data (G_OBJECT (ce->priv->context), GTK_INSPECTOR_CSS_EDITOR_PROVIDER); - if (!provider) - create_provider (ce); - - set_initial_text (ce); - disable_toggled (ce->priv->disable_button, ce); - - g_object_weak_ref (G_OBJECT (ce->priv->context), remove_dead_object, ce); -} - -// vim: set et sw=2 ts=2: |