[gitg/gtk3: 20/20] Make GitgDiffLineRenderer compile



commit 9bcfa1327dbc8fa586f4538fa58991fc2c97ec0c
Author: Garrett Regier <alias301 gmail com>
Date:   Sat Jan 22 15:47:33 2011 -0800

    Make GitgDiffLineRenderer compile

 gitg/gitg-diff-line-renderer.c |  140 +++++++++++++++++++++++++++-------------
 gitg/gitg-diff-line-renderer.h |    6 +-
 gitg/gitg-diff-view.c          |   57 ++++++++++-------
 3 files changed, 131 insertions(+), 72 deletions(-)
---
diff --git a/gitg/gitg-diff-line-renderer.c b/gitg/gitg-diff-line-renderer.c
index 8da7f2b..8a1805a 100644
--- a/gitg/gitg-diff-line-renderer.c
+++ b/gitg/gitg-diff-line-renderer.c
@@ -41,7 +41,7 @@ struct _GitgDiffLineRendererPrivate
 	gchar *label;
 };
 
-G_DEFINE_TYPE (GitgDiffLineRenderer, gitg_diff_line_renderer, GTK_TYPE_CELL_RENDERER)
+G_DEFINE_TYPE (GitgDiffLineRenderer, gitg_diff_line_renderer, GTK_TYPE_SOURCE_GUTTER_RENDERER)
 
 static void
 gitg_diff_line_renderer_set_property (GObject      *object,
@@ -95,6 +95,36 @@ gitg_diff_line_renderer_get_property (GObject    *object,
 }
 
 static void
+gitg_diff_line_renderer_constructed (GObject *object)
+{
+	/*GitgDiffLineRenderer *self = GITG_DIFF_LINE_RENDERER (object);*/
+
+	
+
+	if (G_OBJECT_CLASS (gitg_diff_line_renderer_parent_class)->constructed)
+	{
+		G_OBJECT_CLASS (gitg_diff_line_renderer_parent_class)->constructed (object);
+	}
+}
+
+static void
+gitg_diff_line_renderer_dispose (GObject *object)
+{
+	GitgDiffLineRenderer *self = GITG_DIFF_LINE_RENDERER (object);
+
+	if (self->priv->label != NULL)
+	{
+		g_free (self->priv->label);
+		self->priv->label = NULL;
+	}
+
+	if (G_OBJECT_CLASS (gitg_diff_line_renderer_parent_class)->dispose)
+	{
+		G_OBJECT_CLASS (gitg_diff_line_renderer_parent_class)->dispose (object);
+	}
+}
+
+static void
 darken_or_lighten (cairo_t       *ctx,
                    GdkRGBA const *color)
 {
@@ -121,20 +151,24 @@ darken_or_lighten (cairo_t       *ctx,
 }
 
 static void
-render_label (GitgDiffLineRenderer *lr,
-              cairo_t              *ctx,
-              GtkWidget            *widget,
-              GdkRectangle         *background_area,
-              GdkRectangle         *cell_area,
-              GdkRectangle         *expose_area,
-              GtkCellRendererState  flags)
+render_label (GtkSourceGutterRenderer      *renderer,
+              cairo_t                      *ctx,
+              GdkRectangle                 *background_area,
+              GdkRectangle                 *cell_area,
+              GtkTextIter                  *start,
+              GtkTextIter                  *end,
+              GtkSourceGutterRendererState  renderer_state)
 {
+	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
+	GtkWidget *widget;
 	PangoLayout *layout;
 	GtkStyleContext *style_context;
 	GtkStateType state;
 	gint pixel_height;
 	GdkRGBA fg_color, bg_color;
 
+	widget = GTK_WIDGET (gtk_source_gutter_renderer_get_view (renderer));
+
 	layout = gtk_widget_create_pango_layout (widget, "");
 
 	pango_layout_set_markup (layout, lr->priv->label, -1);
@@ -182,14 +216,15 @@ render_label (GitgDiffLineRenderer *lr,
 }
 
 static void
-render_lines (GitgDiffLineRenderer *lr,
-              cairo_t              *ctx,
-              GtkWidget            *widget,
-              GdkRectangle         *background_area,
-              GdkRectangle         *cell_area,
-              GdkRectangle         *expose_area,
-              GtkCellRendererState  flags)
+render_lines (GtkSourceGutterRenderer      *renderer,
+              cairo_t                      *ctx,
+              GdkRectangle                 *background_area,
+              GdkRectangle                 *cell_area,
+              GtkTextIter                  *start,
+              GtkTextIter                  *end,
+              GtkSourceGutterRendererState  renderer_state)
 {
+	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
 	/* Render new/old in the cell area */
 	gchar old_str[16];
 	gchar new_str[16];
@@ -198,6 +233,8 @@ render_lines (GitgDiffLineRenderer *lr,
 	GtkWidget *widget;
 	GtkStyleContext *style_context;
 
+	widget = GTK_WIDGET (gtk_source_gutter_renderer_get_view (renderer));
+
 	PangoLayout *layout = gtk_widget_create_pango_layout (widget, "");
 	pango_layout_set_width (layout, cell_area->width / 2);
 
@@ -250,50 +287,60 @@ render_lines (GitgDiffLineRenderer *lr,
 }
 
 static void
-gitg_diff_line_renderer_render_impl (GtkCellRenderer      *cell,
-                                     cairo_t              *ctx,
-                                     GtkWidget            *widget,
-                                     GdkRectangle         *background_area,
-                                     GdkRectangle         *cell_area,
-                                     GdkRectangle         *expose_area,
-                                     GtkCellRendererState  flags)
+gitg_diff_line_renderer_draw_impl (GtkSourceGutterRenderer      *renderer,
+                                   cairo_t                      *ctx,
+                                   GdkRectangle                 *background_area,
+                                   GdkRectangle                 *cell_area,
+                                   GtkTextIter                  *start,
+                                   GtkTextIter                  *end,
+                                   GtkSourceGutterRendererState  renderer_state)
 {
-	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (cell);
+	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
+
+	/* Chain up to draw background */
+	GTK_SOURCE_GUTTER_RENDERER_CLASS (
+		gitg_diff_line_renderer_parent_class)->draw (renderer,
+		                                             ctx,
+		                                             background_area,
+		                                             cell_area,
+		                                             start,
+		                                             end,
+		                                             renderer_state);
 
 	if (lr->priv->label)
 	{
-		render_label (lr,
+		render_label (renderer,
 		              ctx,
-		              widget,
 		              background_area,
 		              cell_area,
-		              expose_area,
-		              flags);
+		              start,
+		              end,
+		              renderer_state);
 	}
 	else
 	{
-		render_lines (lr,
+		render_lines (renderer,
 		              ctx,
-		              widget,
 		              background_area,
 		              cell_area,
-		              expose_area,
-		              flags);
+		              start,
+		              end,
+		              renderer_state);
 	}
 }
-
+/*
 static void
-gitg_diff_line_renderer_get_size_impl (GtkCellRenderer *cell,
-                                       GtkWidget       *widget,
-                                       GdkRectangle    *cell_area,
-                                       gint            *x_offset,
-                                       gint            *y_offset,
-                                       gint            *width,
-                                       gint            *height)
+gitg_diff_line_renderer_get_size_impl (GtkSourceGutterRenderer *renderer,
+                                       GtkWidget               *widget,
+                                       GdkRectangle            *cell_area,
+                                       gint                    *x_offset,
+                                       gint                    *y_offset,
+                                       gint                    *width,
+                                       gint                    *height)
 {
-	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (cell);
+	GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
 
-	/* Get size of this rendering */
+	/ Get size of this rendering /
 	PangoLayout *layout;
 	gchar str[16];
 	gint pixel_width;
@@ -305,7 +352,7 @@ gitg_diff_line_renderer_get_size_impl (GtkCellRenderer *cell,
 	layout = gtk_widget_create_pango_layout (widget, str);
 	pango_layout_get_pixel_size(layout, &pixel_width, &pixel_height);
 
-	g_object_get (cell, "xpad", &xpad, "ypad", &ypad, NULL);
+	g_object_get (lr, "xpad", &xpad, "ypad", &ypad, NULL);
 	pixel_width += pixel_width + xpad * 2 + 3;
 
 	if (lr->priv->label)
@@ -360,19 +407,20 @@ gitg_diff_line_renderer_get_size_impl (GtkCellRenderer *cell,
 	}
 
 	g_object_unref (G_OBJECT (layout));
-}
+}*/
 
 static void
 gitg_diff_line_renderer_class_init (GitgDiffLineRendererClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	GtkCellRendererClass *cell_renderer_class = GTK_CELL_RENDERER_CLASS (klass);
+	GtkSourceGutterRendererClass *gutter_renderer_class = GTK_SOURCE_GUTTER_RENDERER_CLASS (klass);
 
-	cell_renderer_class->render = gitg_diff_line_renderer_render_impl;
-	cell_renderer_class->get_size = gitg_diff_line_renderer_get_size_impl;
+	gutter_renderer_class->draw = gitg_diff_line_renderer_draw_impl;
 
 	object_class->set_property = gitg_diff_line_renderer_set_property;
 	object_class->get_property = gitg_diff_line_renderer_get_property;
+	object_class->constructed = gitg_diff_line_renderer_constructed;
+	object_class->dispose = gitg_diff_line_renderer_dispose;
 
 	g_object_class_install_property (object_class,
 	                                 PROP_LINE_OLD,
diff --git a/gitg/gitg-diff-line-renderer.h b/gitg/gitg-diff-line-renderer.h
index 582d42f..deffacb 100644
--- a/gitg/gitg-diff-line-renderer.h
+++ b/gitg/gitg-diff-line-renderer.h
@@ -23,7 +23,7 @@
 #ifndef __GITG_DIFF_LINE_RENDERER_H__
 #define __GITG_DIFF_LINE_RENDERER_H__
 
-#include <gtk/gtk.h>
+#include <gtksourceview/gtksourceview.h>
 
 G_BEGIN_DECLS
 
@@ -40,13 +40,13 @@ typedef struct _GitgDiffLineRendererClass	GitgDiffLineRendererClass;
 typedef struct _GitgDiffLineRendererPrivate	GitgDiffLineRendererPrivate;
 
 struct _GitgDiffLineRenderer {
-	GtkCellRenderer parent;
+	GtkSourceGutterRenderer parent;
 	
 	GitgDiffLineRendererPrivate *priv;
 };
 
 struct _GitgDiffLineRendererClass {
-	GtkCellRendererClass parent_class;
+	GtkSourceGutterRendererClass parent_class;
 };
 
 GType gitg_diff_line_renderer_get_type (void) G_GNUC_CONST;
diff --git a/gitg/gitg-diff-view.c b/gitg/gitg-diff-view.c
index 63d3695..faf7dce 100644
--- a/gitg/gitg-diff-view.c
+++ b/gitg/gitg-diff-view.c
@@ -56,17 +56,16 @@ static void on_buffer_delete_range (GtkTextBuffer *buffer,
                                     GtkTextIter *end,
                                     GitgDiffView *view);
 
-static void
+/*static void
 line_renderer_size_func (GtkSourceGutter *gutter,
                          GtkCellRenderer *cell,
                          GitgDiffView    *view);
-static void
-line_renderer_data_func (GtkSourceGutter *gutter,
-                         GtkCellRenderer *cell,
-                         gint             line_number,
-                         gboolean         current_line,
-                         GitgDiffView    *view);
-
+*/
+static void line_renderer_query_data_cb (GtkSourceGutterRenderer      *renderer,
+                                         GtkTextIter                  *start,
+                                         GtkTextIter                  *end,
+                                         GtkSourceGutterRendererState  state,
+                                         GitgDiffView                 *view);
 static void disable_diff_view (GitgDiffView *view);
 static void enable_diff_view (GitgDiffView *view);
 
@@ -392,7 +391,7 @@ disable_diff_view (GitgDiffView *view)
 		                                     GTK_TEXT_WINDOW_LEFT);
 
 		gtk_source_gutter_remove (gutter,
-		                          GTK_CELL_RENDERER (view->priv->line_renderer));
+		                          GTK_SOURCE_GUTTER_RENDERER (view->priv->line_renderer));
 	}
 
 	view->priv->diff_enabled = FALSE;
@@ -446,20 +445,25 @@ enable_diff_view (GitgDiffView *view)
 	                                     GTK_TEXT_WINDOW_LEFT);
 
 	gtk_source_gutter_insert (gutter,
-	                          GTK_CELL_RENDERER (view->priv->line_renderer),
+	                          GTK_SOURCE_GUTTER_RENDERER (view->priv->line_renderer),
 	                          0);
 
-	gtk_source_gutter_set_cell_data_func (gutter,
-	                                      GTK_CELL_RENDERER (view->priv->line_renderer),
+	/*gtk_source_gutter_set_cell_data_func (gutter,
+	                                      GTK_SOURCE_GUTTER_RENDERER (view->priv->line_renderer),
 	                                      (GtkSourceGutterDataFunc)line_renderer_data_func,
 	                                      view,
 	                                      NULL);
 
 	gtk_source_gutter_set_cell_size_func (gutter,
-	                                      GTK_CELL_RENDERER (view->priv->line_renderer),
+	                                      GTK_SOURCE_GUTTER_RENDERER (view->priv->line_renderer),
 	                                      (GtkSourceGutterSizeFunc)line_renderer_size_func,
 	                                      view,
-	                                      NULL);
+	                                      NULL);*/
+
+	g_signal_connect (view->priv->line_renderer,
+	                  "query-data",
+	                  (GCallback) line_renderer_query_data_cb,
+	                  view);
 
 	view->priv->diff_enabled = TRUE;
 }
@@ -768,7 +772,7 @@ get_initial_counters (GitgDiffView *view, Region *region, guint line, guint coun
 			++counters[1];
 	}
 }
-
+/*
 static void
 line_renderer_size_func (GtkSourceGutter *gutter,
                          GtkCellRenderer *cell,
@@ -788,19 +792,26 @@ line_renderer_size_func (GtkSourceGutter *gutter,
 		g_object_set (cell, "label", label, NULL);
 		g_free (label);
 	}
-}
+}*/
 
 static void
-line_renderer_data_func (GtkSourceGutter *gutter,
-                         GtkCellRenderer *cell,
-                         gint             line_number,
-                         gboolean         current_line,
-                         GitgDiffView    *view)
+line_renderer_query_data_cb (GtkSourceGutterRenderer      *renderer,
+                             GtkTextIter                  *start,
+                             GtkTextIter                  *end,
+                             GtkSourceGutterRendererState  state,
+                             GitgDiffView                 *view)
 {
 	gint line_old = -1;
 	gint line_new = -1;
+	gint line_number;
+	gboolean current_line;
 	Region **current = &view->priv->lines_current_region;
 
+	line_number = gtk_text_iter_get_line (start) + 1;
+
+	current_line = (state & GTK_SOURCE_GUTTER_RENDERER_STATE_CURSOR) &&
+	               gtk_text_view_get_cursor_visible (gtk_source_gutter_renderer_get_view (renderer));
+
 	ensure_scan (view, line_number);
 
 	if (!*current || view->priv->lines_previous_line + 1 != line_number)
@@ -835,7 +846,7 @@ line_renderer_data_func (GtkSourceGutter *gutter,
 		}
 	}
 
-	g_object_set (cell, "line_old", line_old, "line_new", line_new, NULL);
+	g_object_set (renderer, "line_old", line_old, "line_new", line_new, NULL);
 
 	if (*current && (*current)->next && line_number == (*current)->next->line - 1)
 	{
@@ -849,7 +860,7 @@ line_renderer_data_func (GtkSourceGutter *gutter,
 		                                       line_number,
 		                                       view->priv->label_func_user_data);
 
-		g_object_set (cell, "label", label, NULL);
+		g_object_set (renderer, "label", label, NULL);
 		g_free (label);
 	}
 }



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