[gtk+] Port gtk_draw_insertion_cursor to GtkStyleContext



commit b42b47e7d37411d7410113aa8156146d35dfde43
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jan 24 00:24:12 2011 -0500

    Port gtk_draw_insertion_cursor to GtkStyleContext

 gtk/gtkentry.c         |    1 +
 gtk/gtkstyle.c         |  123 +++++++++++++++++-------------------------------
 gtk/gtkstyle.h         |    3 -
 gtk/gtktextdisplay.c   |    2 +
 gtk/gtkwidgetprivate.h |   23 +++++----
 5 files changed, 59 insertions(+), 93 deletions(-)
---
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 43c1394..38dbe9d 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -65,6 +65,7 @@
 #include "gtktooltip.h"
 #include "gtkiconfactory.h"
 #include "gtkicontheme.h"
+#include "gtkwidgetprivate.h"
 
 
 /**
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 954cfac..bf3a711 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -3971,102 +3971,58 @@ gtk_paint_spinner (GtkStyle           *style,
   cairo_restore (cr);
 }
 
-typedef struct _CursorInfo CursorInfo;
-
-struct _CursorInfo
-{
-  GType for_type;
-  GdkColor primary;
-  GdkColor secondary;
-};
-
 static void
-cursor_info_free (gpointer data)
+get_cursor_color (GtkWidget *widget,
+                  gboolean   primary,
+                  GdkColor  *color)
 {
-  g_slice_free (CursorInfo, data);
-}
+  GtkStyleContext *context;
+  GdkColor *style_color;
 
-static const GdkColor *
-get_insertion_cursor_color (GtkWidget *widget,
-                            gboolean   is_primary)
-{
-  CursorInfo *cursor_info;
-  GtkStyle *style;
-  GdkColor *cursor_color;
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (color != NULL);
+
+  context = gtk_widget_get_style_context (widget);
 
-  style = gtk_widget_get_style (widget);
+  gtk_style_context_get_style (context,
+                               primary ? "cursor-color" : "secondary-cursor-color",
+                               &style_color,
+                               NULL);
 
-  cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info");
-  if (!cursor_info)
+  if (style_color)
     {
-      cursor_info = g_slice_new (CursorInfo);
-      g_object_set_data_full (G_OBJECT (style), I_("gtk-style-cursor-info"),
-                              cursor_info, cursor_info_free);
-      cursor_info->for_type = G_TYPE_INVALID;
+      *color = *style_color;
+      gdk_color_free (style_color);
     }
-
-  /* We have to keep track of the type because gtk_widget_style_get()
-   * can return different results when called on the same property and
-   * same style but for different widgets. :-(. That is,
-   * GtkEntry::cursor-color = "red" in a style will modify the cursor
-   * color for entries but not for text view.
-   */
-  if (cursor_info->for_type != G_OBJECT_TYPE (widget))
+  else if (primary)
     {
-      cursor_info->for_type = G_OBJECT_TYPE (widget);
+      GdkRGBA fg;
 
-      /* Cursors in text widgets are drawn only in NORMAL state,
-       * so we can use text[GTK_STATE_NORMAL] as text color here
-       */
-      gtk_widget_style_get (widget, "cursor-color", &cursor_color, NULL);
-      if (cursor_color)
-        {
-          cursor_info->primary = *cursor_color;
-          gdk_color_free (cursor_color);
-        }
-      else
-        {
-          cursor_info->primary = style->text[GTK_STATE_NORMAL];
-        }
+      gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg);
 
-      gtk_widget_style_get (widget, "secondary-cursor-color", &cursor_color, NULL);
-      if (cursor_color)
-        {
-          cursor_info->secondary = *cursor_color;
-          gdk_color_free (cursor_color);
-        }
-      else
-        {
-          /* text_aa is the average of text and base colors,
-           * in usual black-on-white case it's grey. */
-          cursor_info->secondary = style->text_aa[GTK_STATE_NORMAL];
-        }
+      color->red = fg.red * 65535;
+      color->green = fg.green * 65535;
+      color->blue = fg.blue * 65535;
     }
-
-  if (is_primary)
-    return &cursor_info->primary;
   else
-    return &cursor_info->secondary;
+    {
+      GdkRGBA fg;
+      GdkRGBA bg;
+
+      gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg);
+      gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
+
+      color->red = (fg.red + bg.red) * 0.5 * 65535;
+      color->green = (fg.green + bg.green) * 0.5 * 65535;
+      color->blue = (fg.blue + bg.green) * 0.5 * 65535;
+    }
 }
 
 void
 _gtk_widget_get_cursor_color (GtkWidget *widget,
                               GdkColor  *color)
 {
-  GdkColor *style_color;
-
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (color != NULL);
-
-  gtk_widget_style_get (widget, "cursor-color", &style_color, NULL);
-
-  if (style_color)
-    {
-      *color = *style_color;
-      gdk_color_free (style_color);
-    }
-  else
-    *color = gtk_widget_get_style (widget)->text[GTK_STATE_NORMAL];
+  get_cursor_color (widget, TRUE, color);
 }
 
 /**
@@ -4098,19 +4054,26 @@ gtk_draw_insertion_cursor (GtkWidget          *widget,
   gint x, y;
   gfloat cursor_aspect_ratio;
   gint offset;
+  GtkStyleContext *context;
+  GdkColor color;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (cr != NULL);
   g_return_if_fail (location != NULL);
   g_return_if_fail (direction != GTK_TEXT_DIR_NONE);
 
-  gdk_cairo_set_source_color (cr, get_insertion_cursor_color (widget, is_primary));
+  context = gtk_widget_get_style_context (widget);
+
+  get_cursor_color (widget, is_primary, &color);
+  gdk_cairo_set_source_color (cr, &color);
 
   /* When changing the shape or size of the cursor here,
    * propagate the changes to gtktextview.c:text_window_invalidate_cursors().
    */
 
-  gtk_widget_style_get (widget, "cursor-aspect-ratio", &cursor_aspect_ratio, NULL);
+  gtk_style_context_get_style (context,
+                               "cursor-aspect-ratio", &cursor_aspect_ratio,
+                               NULL);
 
   stem_width = location->height * cursor_aspect_ratio + 1;
   arrow_width = stem_width + 1;
diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h
index 7aec22d..5396b26 100644
--- a/gtk/gtkstyle.h
+++ b/gtk/gtkstyle.h
@@ -641,15 +641,12 @@ void          _gtk_style_shade               (const GdkColor     *a,
                                               GdkColor           *b,
                                               gdouble             k);
 
-
 void   gtk_draw_insertion_cursor    (GtkWidget          *widget,
                                      cairo_t            *cr,
                                      const GdkRectangle *location,
                                      gboolean            is_primary,
                                      GtkTextDirection    direction,
                                      gboolean            draw_arrow);
-void   _gtk_widget_get_cursor_color (GtkWidget          *widget,
-				     GdkColor           *color);
 
 gboolean   gtk_style_has_context    (GtkStyle *style);
 
diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c
index 7ea85f7..7af3857 100644
--- a/gtk/gtktextdisplay.c
+++ b/gtk/gtktextdisplay.c
@@ -77,7 +77,9 @@
 #define GTK_TEXT_USE_INTERNAL_UNSUPPORTED_API
 #include "config.h"
 #include "gtktextdisplay.h"
+#include "gtkwidgetprivate.h"
 #include "gtkintl.h"
+
 /* DO NOT go putting private headers in here. This file should only
  * use the semi-public headers, as with gtktextview.c.
  */
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index c566646..4ba0f66 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -8,7 +8,7 @@
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
@@ -80,18 +80,21 @@ void         _gtk_widget_set_height_request_needed (GtkWidget *widget,
                                                     gboolean   height_request_needed);
 
 void _gtk_widget_override_size_request (GtkWidget *widget,
-					int        width,
-					int        height,
-					int       *old_width,
-					int       *old_height);
+                                        int        width,
+                                        int        height,
+                                        int       *old_width,
+                                        int       *old_height);
 void _gtk_widget_restore_size_request  (GtkWidget *widget,
-					int        old_width,
-					int        old_height);
+                                        int        old_width,
+                                        int        old_height);
 
 gboolean _gtk_widget_get_translation_to_window (GtkWidget      *widget,
-						GdkWindow      *window,
-						int            *x,
-						int            *y);
+                                                GdkWindow      *window,
+                                                int            *x,
+                                                int            *y);
+
+void  _gtk_widget_get_cursor_color (GtkWidget *widget,
+                                    GdkColor  *color);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]