Blame gtksourceview/gtksourcegutterrenderer.c

Packit a7d494
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*-
Packit a7d494
 * gtksourcegutterrenderer.c
Packit a7d494
 * This file is part of GtkSourceView
Packit a7d494
 *
Packit a7d494
 * Copyright (C) 2010 - Jesse van den Kieboom
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is free software; you can redistribute it and/or
Packit a7d494
 * modify it under the terms of the GNU Lesser General Public
Packit a7d494
 * License as published by the Free Software Foundation; either
Packit a7d494
 * version 2.1 of the License, or (at your option) any later version.
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is distributed in the hope that it will be useful,
Packit a7d494
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a7d494
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a7d494
 * Lesser General Public License for more details.
Packit a7d494
 *
Packit a7d494
 * You should have received a copy of the GNU Lesser General Public
Packit a7d494
 * License along with this library; if not, write to the Free Software
Packit a7d494
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit a7d494
 */
Packit a7d494
Packit a7d494
#ifdef HAVE_CONFIG_H
Packit a7d494
#include <config.h>
Packit a7d494
#endif
Packit a7d494
Packit a7d494
#include "gtksourcegutterrenderer.h"
Packit a7d494
#include "gtksourcegutterrenderer-private.h"
Packit a7d494
#include "gtksourcestylescheme.h"
Packit a7d494
#include "gtksourceview-enumtypes.h"
Packit a7d494
#include "gtksourceview-i18n.h"
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * SECTION:gutterrenderer
Packit a7d494
 * @Short_description: Gutter cell renderer
Packit a7d494
 * @Title: GtkSourceGutterRenderer
Packit a7d494
 * @See_also: #GtkSourceGutter
Packit a7d494
 *
Packit a7d494
 * A #GtkSourceGutterRenderer represents a column in a #GtkSourceGutter. The
Packit a7d494
 * column contains one cell for each visible line of the #GtkTextBuffer. Due to
Packit a7d494
 * text wrapping, a cell can thus span multiple lines of the #GtkTextView. In
Packit a7d494
 * this case, #GtkSourceGutterRendererAlignmentMode controls the alignment of
Packit a7d494
 * the cell.
Packit a7d494
 *
Packit a7d494
 * The gutter renderer must announce its #GtkSourceGutterRenderer:size. The
Packit a7d494
 * height is determined by the text view height. The width must be determined by
Packit a7d494
 * the gutter renderer. The width generally takes into account the entire text
Packit a7d494
 * buffer. For instance, to display the line numbers, if the buffer contains 100
Packit a7d494
 * lines, the gutter renderer will always set its width such as three digits can
Packit a7d494
 * be printed, even if only the first 20 lines are shown. Another strategy is to
Packit a7d494
 * take into account only the visible lines.  In this case, only two digits are
Packit a7d494
 * necessary to display the line numbers of the first 20 lines. To take another
Packit a7d494
 * example, the gutter renderer for #GtkSourceMarks doesn't need to take
Packit a7d494
 * into account the text buffer to announce its width. It only depends on the
Packit a7d494
 * icons size displayed in the gutter column.
Packit a7d494
 *
Packit a7d494
 * An horizontal and vertical padding can be added with
Packit a7d494
 * gtk_source_gutter_renderer_set_padding().  The total width of a gutter
Packit a7d494
 * renderer is its size (#GtkSourceGutterRenderer:size) plus two times the
Packit a7d494
 * horizontal padding (#GtkSourceGutterRenderer:xpad).
Packit a7d494
 *
Packit a7d494
 * When the available size to render a cell is greater than the required size to
Packit a7d494
 * render the cell contents, the cell contents can be aligned horizontally and
Packit a7d494
 * vertically with gtk_source_gutter_renderer_set_alignment().
Packit a7d494
 *
Packit a7d494
 * The cells rendering occurs in three phases:
Packit a7d494
 * - begin: the gtk_source_gutter_renderer_begin() function is called when some
Packit a7d494
 *   cells need to be redrawn. It provides the associated region of the
Packit a7d494
 *   #GtkTextBuffer. The cells need to be redrawn when the #GtkTextView is
Packit a7d494
 *   scrolled, or when the state of the cells change (see
Packit a7d494
 *   #GtkSourceGutterRendererState).
Packit a7d494
 * - draw: gtk_source_gutter_renderer_draw() is called for each cell that needs
Packit a7d494
 *   to be drawn.
Packit a7d494
 * - end: finally, gtk_source_gutter_renderer_end() is called.
Packit a7d494
 */
Packit a7d494
Packit a7d494
enum
Packit a7d494
{
Packit a7d494
	ACTIVATE,
Packit a7d494
	QUEUE_DRAW,
Packit a7d494
	QUERY_TOOLTIP,
Packit a7d494
	QUERY_DATA,
Packit a7d494
	QUERY_ACTIVATABLE,
Packit a7d494
	N_SIGNALS
Packit a7d494
};
Packit a7d494
Packit a7d494
struct _GtkSourceGutterRendererPrivate
Packit a7d494
{
Packit a7d494
	GtkTextView *view;
Packit a7d494
	GtkTextBuffer *buffer;
Packit a7d494
	GtkTextWindowType window_type;
Packit a7d494
Packit a7d494
	gint xpad;
Packit a7d494
	gint ypad;
Packit a7d494
Packit a7d494
	gfloat xalign;
Packit a7d494
	gfloat yalign;
Packit a7d494
Packit a7d494
	gint size;
Packit a7d494
Packit a7d494
	GtkSourceGutterRendererAlignmentMode alignment_mode;
Packit a7d494
Packit a7d494
	GdkRGBA background_color;
Packit a7d494
Packit a7d494
	guint background_set : 1;
Packit a7d494
	guint visible : 1;
Packit a7d494
};
Packit a7d494
Packit a7d494
static guint signals[N_SIGNALS];
Packit a7d494
Packit a7d494
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkSourceGutterRenderer, gtk_source_gutter_renderer, G_TYPE_INITIALLY_UNOWNED)
Packit a7d494
Packit a7d494
enum
Packit a7d494
{
Packit a7d494
	PROP_0,
Packit a7d494
	PROP_VISIBLE,
Packit a7d494
	PROP_XPAD,
Packit a7d494
	PROP_YPAD,
Packit a7d494
	PROP_XALIGN,
Packit a7d494
	PROP_YALIGN,
Packit a7d494
	PROP_VIEW,
Packit a7d494
	PROP_ALIGNMENT_MODE,
Packit a7d494
	PROP_WINDOW_TYPE,
Packit a7d494
	PROP_SIZE,
Packit a7d494
	PROP_BACKGROUND_RGBA,
Packit a7d494
	PROP_BACKGROUND_SET
Packit a7d494
};
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_buffer (GtkSourceGutterRenderer *renderer,
Packit a7d494
            GtkTextBuffer           *buffer)
Packit a7d494
{
Packit a7d494
	if (renderer->priv->buffer != NULL)
Packit a7d494
	{
Packit a7d494
		g_object_remove_weak_pointer (G_OBJECT (renderer->priv->buffer),
Packit a7d494
		                              (gpointer) &renderer->priv->buffer);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (buffer != NULL)
Packit a7d494
	{
Packit a7d494
		g_object_add_weak_pointer (G_OBJECT (buffer),
Packit a7d494
		                           (gpointer) &renderer->priv->buffer);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	renderer->priv->buffer = buffer;
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
emit_buffer_changed (GtkTextView             *view,
Packit a7d494
                     GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	GtkTextBuffer* buffer;
Packit a7d494
Packit a7d494
	buffer = gtk_text_view_get_buffer (view);
Packit a7d494
Packit a7d494
	if (buffer != renderer->priv->buffer)
Packit a7d494
	{
Packit a7d494
		if (GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->change_buffer)
Packit a7d494
		{
Packit a7d494
			GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->change_buffer (renderer,
Packit a7d494
			                                                                renderer->priv->buffer);
Packit a7d494
		}
Packit a7d494
Packit a7d494
		set_buffer (renderer, buffer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
on_buffer_changed (GtkTextView             *view,
Packit a7d494
                   GParamSpec              *spec,
Packit a7d494
                   GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	emit_buffer_changed (view, renderer);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
renderer_change_view_impl (GtkSourceGutterRenderer *renderer,
Packit a7d494
                           GtkTextView             *old_view)
Packit a7d494
{
Packit a7d494
	if (old_view)
Packit a7d494
	{
Packit a7d494
		g_signal_handlers_disconnect_by_func (old_view,
Packit a7d494
		                                      G_CALLBACK (on_buffer_changed),
Packit a7d494
		                                      renderer);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (renderer->priv->view)
Packit a7d494
	{
Packit a7d494
		emit_buffer_changed (renderer->priv->view, renderer);
Packit a7d494
Packit a7d494
		g_signal_connect (renderer->priv->view,
Packit a7d494
		                  "notify::buffer",
Packit a7d494
		                  G_CALLBACK (on_buffer_changed),
Packit a7d494
		                  renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_gutter_renderer_dispose (GObject *object)
Packit a7d494
{
Packit a7d494
	GtkSourceGutterRenderer *renderer;
Packit a7d494
Packit a7d494
	renderer = GTK_SOURCE_GUTTER_RENDERER (object);
Packit a7d494
Packit a7d494
	set_buffer (renderer, NULL);
Packit a7d494
Packit a7d494
	if (renderer->priv->view)
Packit a7d494
	{
Packit a7d494
		_gtk_source_gutter_renderer_set_view (renderer,
Packit a7d494
		                                      NULL,
Packit a7d494
		                                      GTK_TEXT_WINDOW_PRIVATE);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	G_OBJECT_CLASS (gtk_source_gutter_renderer_parent_class)->dispose (object);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_visible (GtkSourceGutterRenderer *renderer,
Packit a7d494
             gboolean                 visible)
Packit a7d494
{
Packit a7d494
	visible = visible != FALSE;
Packit a7d494
Packit a7d494
	if (renderer->priv->visible != visible)
Packit a7d494
	{
Packit a7d494
		renderer->priv->visible = visible;
Packit a7d494
		g_object_notify (G_OBJECT (renderer), "visible");
Packit a7d494
Packit a7d494
		gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_padding (GtkSourceGutterRenderer *renderer,
Packit a7d494
             gint                    *field,
Packit a7d494
             gint                     padding,
Packit a7d494
             const gchar             *name)
Packit a7d494
{
Packit a7d494
	if (*field == padding || padding < 0)
Packit a7d494
	{
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	*field = padding;
Packit a7d494
	g_object_notify (G_OBJECT (renderer), name);
Packit a7d494
Packit a7d494
	return TRUE;
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_xpad (GtkSourceGutterRenderer *renderer,
Packit a7d494
          gint                     xpad)
Packit a7d494
{
Packit a7d494
	return set_padding (renderer,
Packit a7d494
	                    &renderer->priv->xpad,
Packit a7d494
	                    xpad,
Packit a7d494
	                    "xpad");
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_ypad (GtkSourceGutterRenderer *renderer,
Packit a7d494
          gint                     ypad)
Packit a7d494
{
Packit a7d494
	return set_padding (renderer,
Packit a7d494
	                    &renderer->priv->ypad,
Packit a7d494
	                    ypad,
Packit a7d494
	                    "ypad");
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_alignment (GtkSourceGutterRenderer *renderer,
Packit a7d494
               gfloat                  *field,
Packit a7d494
               gfloat                   align,
Packit a7d494
               const gchar             *name,
Packit a7d494
               gboolean                 emit)
Packit a7d494
{
Packit a7d494
	if (*field == align || align < 0)
Packit a7d494
	{
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	*field = align;
Packit a7d494
	g_object_notify (G_OBJECT (renderer), name);
Packit a7d494
Packit a7d494
	if (emit)
Packit a7d494
	{
Packit a7d494
		gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	return TRUE;
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_xalign (GtkSourceGutterRenderer *renderer,
Packit a7d494
            gfloat                   xalign,
Packit a7d494
            gboolean                 emit)
Packit a7d494
{
Packit a7d494
	return set_alignment (renderer,
Packit a7d494
	                      &renderer->priv->xalign,
Packit a7d494
	                      xalign,
Packit a7d494
	                      "xalign",
Packit a7d494
	                      emit);
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
set_yalign (GtkSourceGutterRenderer *renderer,
Packit a7d494
            gfloat                   yalign,
Packit a7d494
            gboolean                 emit)
Packit a7d494
{
Packit a7d494
	return set_alignment (renderer,
Packit a7d494
	                      &renderer->priv->yalign,
Packit a7d494
	                      yalign,
Packit a7d494
	                      "yalign",
Packit a7d494
	                      emit);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_alignment_mode (GtkSourceGutterRenderer              *renderer,
Packit a7d494
                    GtkSourceGutterRendererAlignmentMode  mode)
Packit a7d494
{
Packit a7d494
	if (renderer->priv->alignment_mode == mode)
Packit a7d494
	{
Packit a7d494
		return;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	renderer->priv->alignment_mode = mode;
Packit a7d494
	g_object_notify (G_OBJECT (renderer), "alignment-mode");
Packit a7d494
Packit a7d494
	gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_size (GtkSourceGutterRenderer *renderer,
Packit a7d494
          gint                     value)
Packit a7d494
{
Packit a7d494
	if (renderer->priv->size == value)
Packit a7d494
	{
Packit a7d494
		return;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	renderer->priv->size = value;
Packit a7d494
	g_object_notify (G_OBJECT (renderer), "size");
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_background_color_set (GtkSourceGutterRenderer *renderer,
Packit a7d494
                          gboolean                 isset)
Packit a7d494
{
Packit a7d494
	isset = (isset != FALSE);
Packit a7d494
Packit a7d494
	if (isset != renderer->priv->background_set)
Packit a7d494
	{
Packit a7d494
		renderer->priv->background_set = isset;
Packit a7d494
		gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
set_background_color (GtkSourceGutterRenderer *renderer,
Packit a7d494
                      const GdkRGBA          *color)
Packit a7d494
{
Packit a7d494
	if (!color)
Packit a7d494
	{
Packit a7d494
		set_background_color_set (renderer, FALSE);
Packit a7d494
	}
Packit a7d494
	else
Packit a7d494
	{
Packit a7d494
		renderer->priv->background_color = *color;
Packit a7d494
		renderer->priv->background_set = TRUE;
Packit a7d494
Packit a7d494
		gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_gutter_renderer_set_property (GObject      *object,
Packit a7d494
                                         guint         prop_id,
Packit a7d494
                                         const GValue *value,
Packit a7d494
                                         GParamSpec   *pspec)
Packit a7d494
{
Packit a7d494
	GtkSourceGutterRenderer *self = GTK_SOURCE_GUTTER_RENDERER (object);
Packit a7d494
Packit a7d494
	switch (prop_id)
Packit a7d494
	{
Packit a7d494
		case PROP_VISIBLE:
Packit a7d494
			set_visible (self, g_value_get_boolean (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_XPAD:
Packit a7d494
			set_xpad (self, g_value_get_int (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_YPAD:
Packit a7d494
			set_ypad (self, g_value_get_int (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_XALIGN:
Packit a7d494
			set_xalign (self, g_value_get_float (value), TRUE);
Packit a7d494
			break;
Packit a7d494
		case PROP_YALIGN:
Packit a7d494
			set_yalign (self, g_value_get_float (value), TRUE);
Packit a7d494
			break;
Packit a7d494
		case PROP_ALIGNMENT_MODE:
Packit a7d494
			set_alignment_mode (self, g_value_get_enum (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_VIEW:
Packit a7d494
			self->priv->view = g_value_get_object (value);
Packit a7d494
			break;
Packit a7d494
		case PROP_WINDOW_TYPE:
Packit a7d494
			self->priv->window_type = g_value_get_enum (value);
Packit a7d494
			break;
Packit a7d494
		case PROP_SIZE:
Packit a7d494
			set_size (self, g_value_get_int (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_BACKGROUND_RGBA:
Packit a7d494
			set_background_color (self,
Packit a7d494
			                      g_value_get_boxed (value));
Packit a7d494
			break;
Packit a7d494
		case PROP_BACKGROUND_SET:
Packit a7d494
			set_background_color_set (self,
Packit a7d494
			                          g_value_get_boolean (value));
Packit a7d494
			break;
Packit a7d494
		default:
Packit a7d494
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit a7d494
			break;
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_gutter_renderer_get_property (GObject    *object,
Packit a7d494
                                         guint       prop_id,
Packit a7d494
                                         GValue     *value,
Packit a7d494
                                         GParamSpec *pspec)
Packit a7d494
{
Packit a7d494
	GtkSourceGutterRenderer *self = GTK_SOURCE_GUTTER_RENDERER (object);
Packit a7d494
Packit a7d494
	switch (prop_id)
Packit a7d494
	{
Packit a7d494
		case PROP_VISIBLE:
Packit a7d494
			g_value_set_boolean (value, self->priv->visible);
Packit a7d494
			break;
Packit a7d494
		case PROP_XPAD:
Packit a7d494
			g_value_set_int (value, self->priv->xpad);
Packit a7d494
			break;
Packit a7d494
		case PROP_YPAD:
Packit a7d494
			g_value_set_int (value, self->priv->ypad);
Packit a7d494
			break;
Packit a7d494
		case PROP_XALIGN:
Packit a7d494
			g_value_set_float (value, self->priv->xalign);
Packit a7d494
			break;
Packit a7d494
		case PROP_YALIGN:
Packit a7d494
			g_value_set_float (value, self->priv->yalign);
Packit a7d494
			break;
Packit a7d494
		case PROP_VIEW:
Packit a7d494
			g_value_set_object (value, self->priv->view);
Packit a7d494
			break;
Packit a7d494
		case PROP_ALIGNMENT_MODE:
Packit a7d494
			g_value_set_enum (value, self->priv->alignment_mode);
Packit a7d494
			break;
Packit a7d494
		case PROP_WINDOW_TYPE:
Packit a7d494
			g_value_set_enum (value, self->priv->window_type);
Packit a7d494
			break;
Packit a7d494
		case PROP_SIZE:
Packit a7d494
			g_value_set_int (value, self->priv->size);
Packit a7d494
			break;
Packit a7d494
		case PROP_BACKGROUND_RGBA:
Packit a7d494
			g_value_set_boxed (value, &self->priv->background_color);
Packit a7d494
			break;
Packit a7d494
		case PROP_BACKGROUND_SET:
Packit a7d494
			g_value_set_boolean (value, self->priv->background_set);
Packit a7d494
			break;
Packit a7d494
		default:
Packit a7d494
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit a7d494
			break;
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
renderer_draw_impl (GtkSourceGutterRenderer      *renderer,
Packit a7d494
                    cairo_t                      *cr,
Packit a7d494
                    GdkRectangle                 *background_area,
Packit a7d494
                    GdkRectangle                 *cell_area,
Packit a7d494
                    GtkTextIter                  *start,
Packit a7d494
                    GtkTextIter                  *end,
Packit a7d494
                    GtkSourceGutterRendererState  state)
Packit a7d494
{
Packit a7d494
	if (renderer->priv->background_set)
Packit a7d494
	{
Packit a7d494
		cairo_save (cr);
Packit a7d494
		gdk_cairo_rectangle (cr, background_area);
Packit a7d494
		gdk_cairo_set_source_rgba (cr, &renderer->priv->background_color);
Packit a7d494
		cairo_fill (cr);
Packit a7d494
		cairo_restore (cr);
Packit a7d494
	}
Packit a7d494
	else if ((state & GTK_SOURCE_GUTTER_RENDERER_STATE_CURSOR) != 0 &&
Packit a7d494
		 GTK_SOURCE_IS_VIEW (renderer->priv->view) &&
Packit a7d494
		 gtk_source_view_get_highlight_current_line (GTK_SOURCE_VIEW (renderer->priv->view)))
Packit a7d494
	{
Packit a7d494
		GtkStyleContext *context;
Packit a7d494
Packit a7d494
		context = gtk_widget_get_style_context (GTK_WIDGET (renderer->priv->view));
Packit a7d494
Packit a7d494
		gtk_style_context_save (context);
Packit a7d494
		gtk_style_context_add_class (context, "current-line-number");
Packit a7d494
Packit a7d494
		gtk_render_background (context,
Packit a7d494
				       cr,
Packit a7d494
				       background_area->x,
Packit a7d494
				       background_area->y,
Packit a7d494
				       background_area->width,
Packit a7d494
				       background_area->height);
Packit a7d494
Packit a7d494
		gtk_style_context_restore (context);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_gutter_renderer_class_init (GtkSourceGutterRendererClass *klass)
Packit a7d494
{
Packit a7d494
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit a7d494
Packit a7d494
	object_class->dispose = gtk_source_gutter_renderer_dispose;
Packit a7d494
Packit a7d494
	object_class->get_property = gtk_source_gutter_renderer_get_property;
Packit a7d494
	object_class->set_property = gtk_source_gutter_renderer_set_property;
Packit a7d494
Packit a7d494
	klass->draw = renderer_draw_impl;
Packit a7d494
	klass->change_view = renderer_change_view_impl;
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:visible:
Packit a7d494
	 *
Packit a7d494
	 * The visibility of the renderer.
Packit a7d494
	 *
Packit a7d494
	 **/
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_VISIBLE,
Packit a7d494
	                                 g_param_spec_boolean ("visible",
Packit a7d494
	                                                       "Visible",
Packit a7d494
	                                                       "Visible",
Packit a7d494
	                                                       TRUE,
Packit a7d494
	                                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:xpad:
Packit a7d494
	 *
Packit a7d494
	 * The left and right padding of the renderer.
Packit a7d494
	 */
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_XPAD,
Packit a7d494
	                                 g_param_spec_int ("xpad",
Packit a7d494
	                                                   "X Padding",
Packit a7d494
	                                                   "The x-padding",
Packit a7d494
	                                                   -1,
Packit a7d494
	                                                   G_MAXINT,
Packit a7d494
	                                                   0,
Packit a7d494
	                                                   G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:ypad:
Packit a7d494
	 *
Packit a7d494
	 * The top and bottom padding of the renderer.
Packit a7d494
	 */
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_YPAD,
Packit a7d494
	                                 g_param_spec_int ("ypad",
Packit a7d494
	                                                   "Y Padding",
Packit a7d494
	                                                   "The y-padding",
Packit a7d494
	                                                   -1,
Packit a7d494
	                                                   G_MAXINT,
Packit a7d494
	                                                   0,
Packit a7d494
	                                                   G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:xalign:
Packit a7d494
	 *
Packit a7d494
	 * The horizontal alignment of the renderer. Set to 0 for a left
Packit a7d494
	 * alignment. 1 for a right alignment. And 0.5 for centering the cells.
Packit a7d494
	 * A value lower than 0 doesn't modify the alignment.
Packit a7d494
	 */
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_XALIGN,
Packit a7d494
	                                 g_param_spec_float ("xalign",
Packit a7d494
	                                                     "X Alignment",
Packit a7d494
	                                                     "The x-alignment",
Packit a7d494
	                                                     -1,
Packit a7d494
	                                                     1,
Packit a7d494
	                                                     0,
Packit a7d494
	                                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:yalign:
Packit a7d494
	 *
Packit a7d494
	 * The vertical alignment of the renderer. Set to 0 for a top
Packit a7d494
	 * alignment. 1 for a bottom alignment. And 0.5 for centering the cells.
Packit a7d494
	 * A value lower than 0 doesn't modify the alignment.
Packit a7d494
	 */
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_YALIGN,
Packit a7d494
	                                 g_param_spec_float ("yalign",
Packit a7d494
	                                                     "Y Alignment",
Packit a7d494
	                                                     "The y-alignment",
Packit a7d494
	                                                     -1,
Packit a7d494
	                                                     1,
Packit a7d494
	                                                     0,
Packit a7d494
	                                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer::activate:
Packit a7d494
	 * @renderer: the #GtkSourceGutterRenderer who emits the signal
Packit a7d494
	 * @iter: a #GtkTextIter
Packit a7d494
	 * @area: a #GdkRectangle
Packit a7d494
	 * @event: the event that caused the activation
Packit a7d494
	 *
Packit a7d494
	 * The ::activate signal is emitted when the renderer is
Packit a7d494
	 * activated.
Packit a7d494
	 *
Packit a7d494
	 */
Packit a7d494
	signals[ACTIVATE] =
Packit a7d494
		g_signal_new ("activate",
Packit a7d494
		              G_TYPE_FROM_CLASS (object_class),
Packit a7d494
		              G_SIGNAL_RUN_LAST,
Packit a7d494
		              G_STRUCT_OFFSET (GtkSourceGutterRendererClass, activate),
Packit a7d494
		              NULL, NULL, NULL,
Packit a7d494
		              G_TYPE_NONE,
Packit a7d494
		              3,
Packit a7d494
		              GTK_TYPE_TEXT_ITER,
Packit a7d494
		              GDK_TYPE_RECTANGLE,
Packit a7d494
		              GDK_TYPE_EVENT);
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer::queue-draw:
Packit a7d494
	 * @renderer: the #GtkSourceGutterRenderer who emits the signal
Packit a7d494
	 *
Packit a7d494
	 * The ::queue-draw signal is emitted when the renderer needs
Packit a7d494
	 * to be redrawn. Use gtk_source_gutter_renderer_queue_draw()
Packit a7d494
	 * to emit this signal from an implementation of the
Packit a7d494
	 * #GtkSourceGutterRenderer interface.
Packit a7d494
	 */
Packit a7d494
	signals[QUEUE_DRAW] =
Packit a7d494
		g_signal_new ("queue-draw",
Packit a7d494
		              G_TYPE_FROM_CLASS (object_class),
Packit a7d494
		              G_SIGNAL_RUN_LAST,
Packit a7d494
		              G_STRUCT_OFFSET (GtkSourceGutterRendererClass, queue_draw),
Packit a7d494
		              NULL, NULL, NULL,
Packit a7d494
		              G_TYPE_NONE, 0);
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer::query-tooltip:
Packit a7d494
	 * @renderer: the #GtkSourceGutterRenderer who emits the signal
Packit a7d494
	 * @iter: a #GtkTextIter
Packit a7d494
	 * @area: a #GdkRectangle
Packit a7d494
	 * @x: the x position (in window coordinates)
Packit a7d494
	 * @y: the y position (in window coordinates)
Packit a7d494
	 * @tooltip: a #GtkTooltip
Packit a7d494
	 *
Packit a7d494
	 * The ::query-tooltip signal is emitted when the renderer can
Packit a7d494
	 * show a tooltip.
Packit a7d494
	 *
Packit a7d494
	 */
Packit a7d494
	signals[QUERY_TOOLTIP] =
Packit a7d494
		g_signal_new ("query-tooltip",
Packit a7d494
		              G_TYPE_FROM_CLASS (object_class),
Packit a7d494
		              G_SIGNAL_RUN_LAST,
Packit a7d494
		              G_STRUCT_OFFSET (GtkSourceGutterRendererClass, query_tooltip),
Packit a7d494
		              g_signal_accumulator_true_handled,
Packit a7d494
		              NULL,
Packit a7d494
		              NULL,
Packit a7d494
		              G_TYPE_BOOLEAN,
Packit a7d494
		              5,
Packit a7d494
		              GTK_TYPE_TEXT_ITER,
Packit a7d494
		              GDK_TYPE_RECTANGLE,
Packit a7d494
		              G_TYPE_INT,
Packit a7d494
		              G_TYPE_INT,
Packit a7d494
		              GTK_TYPE_TOOLTIP);
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer::query-data:
Packit a7d494
	 * @renderer: the #GtkSourceGutterRenderer who emits the signal
Packit a7d494
	 * @start: a #GtkTextIter
Packit a7d494
	 * @end: a #GtkTextIter
Packit a7d494
	 * @state: the renderer state
Packit a7d494
	 *
Packit a7d494
	 * The ::query-data signal is emitted when the renderer needs
Packit a7d494
	 * to be filled with data just before a cell is drawn. This can
Packit a7d494
	 * be used by general renderer implementations to allow render
Packit a7d494
	 * data to be filled in externally.
Packit a7d494
	 *
Packit a7d494
	 */
Packit a7d494
	signals[QUERY_DATA] =
Packit a7d494
		g_signal_new ("query-data",
Packit a7d494
		              G_TYPE_FROM_CLASS (object_class),
Packit a7d494
		              G_SIGNAL_RUN_LAST,
Packit a7d494
		              G_STRUCT_OFFSET (GtkSourceGutterRendererClass, query_data),
Packit a7d494
		              NULL, NULL, NULL,
Packit a7d494
		              G_TYPE_NONE,
Packit a7d494
		              3,
Packit a7d494
		              GTK_TYPE_TEXT_ITER,
Packit a7d494
		              GTK_TYPE_TEXT_ITER,
Packit a7d494
		              GTK_SOURCE_TYPE_GUTTER_RENDERER_STATE);
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer::query-activatable:
Packit a7d494
	 * @renderer: the #GtkSourceGutterRenderer who emits the signal
Packit a7d494
	 * @iter: a #GtkTextIter
Packit a7d494
	 * @area: a #GdkRectangle
Packit a7d494
	 * @event: the #GdkEvent that is causing the activatable query
Packit a7d494
	 *
Packit a7d494
	 * The ::query-activatable signal is emitted when the renderer
Packit a7d494
	 * can possibly be activated.
Packit a7d494
	 *
Packit a7d494
	 */
Packit a7d494
	signals[QUERY_ACTIVATABLE] =
Packit a7d494
		g_signal_new ("query-activatable",
Packit a7d494
		              G_TYPE_FROM_CLASS (object_class),
Packit a7d494
		              G_SIGNAL_RUN_LAST,
Packit a7d494
		              G_STRUCT_OFFSET (GtkSourceGutterRendererClass, query_activatable),
Packit a7d494
		              g_signal_accumulator_true_handled,
Packit a7d494
		              NULL,
Packit a7d494
		              NULL,
Packit a7d494
		              G_TYPE_BOOLEAN,
Packit a7d494
		              3,
Packit a7d494
		              GTK_TYPE_TEXT_ITER,
Packit a7d494
		              GDK_TYPE_RECTANGLE,
Packit a7d494
		              GDK_TYPE_EVENT);
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:view:
Packit a7d494
	 *
Packit a7d494
	 * The view on which the renderer is placed.
Packit a7d494
	 *
Packit a7d494
	 **/
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_VIEW,
Packit a7d494
	                                 g_param_spec_object ("view",
Packit a7d494
	                                                      "The View",
Packit a7d494
	                                                      "The view",
Packit a7d494
	                                                      GTK_TYPE_TEXT_VIEW,
Packit a7d494
	                                                      G_PARAM_READABLE));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:alignment-mode:
Packit a7d494
	 *
Packit a7d494
	 * The alignment mode of the renderer. This can be used to indicate
Packit a7d494
	 * that in the case a cell spans multiple lines (due to text wrapping)
Packit a7d494
	 * the alignment should work on either the full cell, the first line
Packit a7d494
	 * or the last line.
Packit a7d494
	 *
Packit a7d494
	 **/
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_ALIGNMENT_MODE,
Packit a7d494
	                                 g_param_spec_enum ("alignment-mode",
Packit a7d494
	                                                    "Alignment Mode",
Packit a7d494
	                                                    "The alignment mode",
Packit a7d494
	                                                    GTK_SOURCE_TYPE_GUTTER_RENDERER_ALIGNMENT_MODE,
Packit a7d494
	                                                    GTK_SOURCE_GUTTER_RENDERER_ALIGNMENT_MODE_CELL,
Packit a7d494
	                                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	/**
Packit a7d494
	 * GtkSourceGutterRenderer:window-type:
Packit a7d494
	 *
Packit a7d494
	 * The window type of the view on which the renderer is placed (left,
Packit a7d494
	 * or right).
Packit a7d494
	 *
Packit a7d494
	 **/
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_WINDOW_TYPE,
Packit a7d494
	                                 g_param_spec_enum ("window-type",
Packit a7d494
	                                                    "Window Type",
Packit a7d494
	                                                    "The window type",
Packit a7d494
	                                                    GTK_TYPE_TEXT_WINDOW_TYPE,
Packit a7d494
	                                                    GTK_TEXT_WINDOW_PRIVATE,
Packit a7d494
	                                                    G_PARAM_READABLE));
Packit a7d494
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_SIZE,
Packit a7d494
	                                 g_param_spec_int ("size",
Packit a7d494
	                                                   "Size",
Packit a7d494
	                                                   "The size",
Packit a7d494
	                                                   0,
Packit a7d494
	                                                   G_MAXINT,
Packit a7d494
	                                                   0,
Packit a7d494
	                                                   G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_BACKGROUND_RGBA,
Packit a7d494
	                                 g_param_spec_boxed ("background-rgba",
Packit a7d494
	                                                     "Background Color",
Packit a7d494
	                                                     "The background color",
Packit a7d494
	                                                     GDK_TYPE_RGBA,
Packit a7d494
	                                                     G_PARAM_READWRITE));
Packit a7d494
Packit a7d494
	g_object_class_install_property (object_class,
Packit a7d494
	                                 PROP_BACKGROUND_SET,
Packit a7d494
	                                 g_param_spec_boolean ("background-set",
Packit a7d494
	                                                       "Background Set",
Packit a7d494
	                                                       "Whether the background color is set",
Packit a7d494
	                                                       FALSE,
Packit a7d494
	                                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_gutter_renderer_init (GtkSourceGutterRenderer *self)
Packit a7d494
{
Packit a7d494
	self->priv = gtk_source_gutter_renderer_get_instance_private (self);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_begin:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @cr: a #cairo_t
Packit a7d494
 * @background_area: a #GdkRectangle
Packit a7d494
 * @cell_area: a #GdkRectangle
Packit a7d494
 * @start: a #GtkTextIter
Packit a7d494
 * @end: a #GtkTextIter
Packit a7d494
 *
Packit a7d494
 * Called when drawing a region begins. The region to be drawn is indicated
Packit a7d494
 * by @start and @end. The purpose is to allow the implementation to precompute
Packit a7d494
 * some state before the draw method is called for each cell.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_begin (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                  cairo_t                 *cr,
Packit a7d494
                                  GdkRectangle            *background_area,
Packit a7d494
                                  GdkRectangle            *cell_area,
Packit a7d494
                                  GtkTextIter             *start,
Packit a7d494
                                  GtkTextIter             *end)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
	g_return_if_fail (cr != NULL);
Packit a7d494
	g_return_if_fail (background_area != NULL);
Packit a7d494
	g_return_if_fail (cell_area != NULL);
Packit a7d494
	g_return_if_fail (start != NULL);
Packit a7d494
	g_return_if_fail (end != NULL);
Packit a7d494
Packit a7d494
	if (GTK_SOURCE_GUTTER_RENDERER_CLASS (G_OBJECT_GET_CLASS (renderer))->begin)
Packit a7d494
	{
Packit a7d494
		GTK_SOURCE_GUTTER_RENDERER_CLASS (
Packit a7d494
			G_OBJECT_GET_CLASS (renderer))->begin (renderer,
Packit a7d494
			                                       cr,
Packit a7d494
			                                       background_area,
Packit a7d494
			                                       cell_area,
Packit a7d494
			                                       start,
Packit a7d494
			                                       end);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_draw:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @cr: the cairo render context
Packit a7d494
 * @background_area: a #GdkRectangle indicating the total area to be drawn
Packit a7d494
 * @cell_area: a #GdkRectangle indicating the area to draw content
Packit a7d494
 * @start: a #GtkTextIter
Packit a7d494
 * @end: a #GtkTextIter
Packit a7d494
 * @state: a #GtkSourceGutterRendererState
Packit a7d494
 *
Packit a7d494
 * Main renderering method. Implementations should implement this method to draw
Packit a7d494
 * onto the cairo context. The @background_area indicates the total area of the
Packit a7d494
 * cell to be drawn. The @cell_area indicates the area where content can be
Packit a7d494
 * drawn (text, images, etc).
Packit a7d494
 *
Packit a7d494
 * The @background_area is the @cell_area plus the padding on each side (two
Packit a7d494
 * times the #GtkSourceGutterRenderer:xpad horizontally and two times the
Packit a7d494
 * #GtkSourceGutterRenderer:ypad vertically, so that the @cell_area is centered
Packit a7d494
 * inside @background_area).
Packit a7d494
 *
Packit a7d494
 * The @state argument indicates the current state of the renderer and should
Packit a7d494
 * be taken into account to properly draw the different possible states
Packit a7d494
 * (cursor, prelit, selected) if appropriate.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_draw (GtkSourceGutterRenderer      *renderer,
Packit a7d494
                                 cairo_t                      *cr,
Packit a7d494
                                 GdkRectangle                 *background_area,
Packit a7d494
                                 GdkRectangle                 *cell_area,
Packit a7d494
                                 GtkTextIter                  *start,
Packit a7d494
                                 GtkTextIter                  *end,
Packit a7d494
                                 GtkSourceGutterRendererState  state)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
	g_return_if_fail (cr != NULL);
Packit a7d494
	g_return_if_fail (background_area != NULL);
Packit a7d494
	g_return_if_fail (cell_area != NULL);
Packit a7d494
	g_return_if_fail (start != NULL);
Packit a7d494
	g_return_if_fail (end != NULL);
Packit a7d494
Packit a7d494
	if (GTK_SOURCE_GUTTER_RENDERER_CLASS (G_OBJECT_GET_CLASS (renderer))->draw)
Packit a7d494
	{
Packit a7d494
		GTK_SOURCE_GUTTER_RENDERER_CLASS (
Packit a7d494
			G_OBJECT_GET_CLASS (renderer))->draw (renderer,
Packit a7d494
			                                      cr,
Packit a7d494
			                                      background_area,
Packit a7d494
			                                      cell_area,
Packit a7d494
			                                      start,
Packit a7d494
			                                      end,
Packit a7d494
			                                      state);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_end:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Called when drawing a region of lines has ended.
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_end (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	if (GTK_SOURCE_GUTTER_RENDERER_CLASS (G_OBJECT_GET_CLASS (renderer))->end)
Packit a7d494
	{
Packit a7d494
		GTK_SOURCE_GUTTER_RENDERER_CLASS (G_OBJECT_GET_CLASS (renderer))->end (renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_query_activatable:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @iter: a #GtkTextIter at the start of the line to be activated
Packit a7d494
 * @area: a #GdkRectangle of the cell area to be activated
Packit a7d494
 * @event: the event that triggered the query
Packit a7d494
 *
Packit a7d494
 * Get whether the renderer is activatable at the location in @event. This is
Packit a7d494
 * called from #GtkSourceGutter to determine whether a renderer is activatable
Packit a7d494
 * using the mouse pointer.
Packit a7d494
 *
Packit a7d494
 * Returns: %TRUE if the renderer can be activated, %FALSE otherwise
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
gboolean
Packit a7d494
gtk_source_gutter_renderer_query_activatable (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                              GtkTextIter             *iter,
Packit a7d494
                                              GdkRectangle            *area,
Packit a7d494
                                              GdkEvent                *event)
Packit a7d494
{
Packit a7d494
	gboolean ret;
Packit a7d494
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), FALSE);
Packit a7d494
	g_return_val_if_fail (iter != NULL, FALSE);
Packit a7d494
	g_return_val_if_fail (area != NULL, FALSE);
Packit a7d494
	g_return_val_if_fail (event != NULL, FALSE);
Packit a7d494
Packit a7d494
	ret = FALSE;
Packit a7d494
Packit a7d494
	g_signal_emit (renderer,
Packit a7d494
	               signals[QUERY_ACTIVATABLE],
Packit a7d494
	               0,
Packit a7d494
	               iter,
Packit a7d494
	               area,
Packit a7d494
	               event,
Packit a7d494
	               &ret;;
Packit a7d494
Packit a7d494
	return ret;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_activate:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @iter: a #GtkTextIter at the start of the line where the renderer is activated
Packit a7d494
 * @area: a #GdkRectangle of the cell area where the renderer is activated
Packit a7d494
 * @event: the event that triggered the activation
Packit a7d494
 *
Packit a7d494
 * Emits the #GtkSourceGutterRenderer::activate signal of the renderer. This is
Packit a7d494
 * called from #GtkSourceGutter and should never have to be called manually.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_activate (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                     GtkTextIter             *iter,
Packit a7d494
                                     GdkRectangle            *area,
Packit a7d494
                                     GdkEvent                *event)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
	g_return_if_fail (iter != NULL);
Packit a7d494
	g_return_if_fail (area != NULL);
Packit a7d494
	g_return_if_fail (event != NULL);
Packit a7d494
Packit a7d494
	g_signal_emit (renderer, signals[ACTIVATE], 0, iter, area, event);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_queue_draw:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Emits the #GtkSourceGutterRenderer::queue-draw signal of the renderer. Call
Packit a7d494
 * this from an implementation to inform that the renderer has changed such that
Packit a7d494
 * it needs to redraw.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_queue_draw (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	g_signal_emit (renderer, signals[QUEUE_DRAW], 0);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_query_tooltip:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer.
Packit a7d494
 * @iter: a #GtkTextIter.
Packit a7d494
 * @area: a #GdkRectangle.
Packit a7d494
 * @x: The x position of the tooltip.
Packit a7d494
 * @y: The y position of the tooltip.
Packit a7d494
 * @tooltip: a #GtkTooltip.
Packit a7d494
 *
Packit a7d494
 * Emits the #GtkSourceGutterRenderer::query-tooltip signal. This function is
Packit a7d494
 * called from #GtkSourceGutter. Implementations can override the default signal
Packit a7d494
 * handler or can connect to the signal externally.
Packit a7d494
 *
Packit a7d494
 * Returns: %TRUE if the tooltip has been set, %FALSE otherwise
Packit a7d494
 */
Packit a7d494
gboolean
Packit a7d494
gtk_source_gutter_renderer_query_tooltip (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                          GtkTextIter             *iter,
Packit a7d494
                                          GdkRectangle            *area,
Packit a7d494
                                          gint                     x,
Packit a7d494
                                          gint                     y,
Packit a7d494
                                          GtkTooltip              *tooltip)
Packit a7d494
{
Packit a7d494
	gboolean ret;
Packit a7d494
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), FALSE);
Packit a7d494
	g_return_val_if_fail (iter != NULL, FALSE);
Packit a7d494
	g_return_val_if_fail (area != NULL, FALSE);
Packit a7d494
	g_return_val_if_fail (GTK_IS_TOOLTIP (tooltip), FALSE);
Packit a7d494
Packit a7d494
	ret = FALSE;
Packit a7d494
Packit a7d494
	g_signal_emit (renderer,
Packit a7d494
	               signals[QUERY_TOOLTIP],
Packit a7d494
	               0,
Packit a7d494
	               iter,
Packit a7d494
	               area,
Packit a7d494
	               x,
Packit a7d494
	               y,
Packit a7d494
	               tooltip,
Packit a7d494
	               &ret;;
Packit a7d494
Packit a7d494
	return ret;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_query_data:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer.
Packit a7d494
 * @start: a #GtkTextIter.
Packit a7d494
 * @end: a #GtkTextIter.
Packit a7d494
 * @state: a #GtkSourceGutterRendererState.
Packit a7d494
 *
Packit a7d494
 * Emit the #GtkSourceGutterRenderer::query-data signal. This function is called
Packit a7d494
 * to query for data just before rendering a cell. This is called from the
Packit a7d494
 * #GtkSourceGutter.  Implementations can override the default signal handler or
Packit a7d494
 * can connect a signal handler externally to the
Packit a7d494
 * #GtkSourceGutterRenderer::query-data signal.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_query_data (GtkSourceGutterRenderer      *renderer,
Packit a7d494
                                       GtkTextIter                  *start,
Packit a7d494
                                       GtkTextIter                  *end,
Packit a7d494
                                       GtkSourceGutterRendererState  state)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
	g_return_if_fail (start != NULL);
Packit a7d494
	g_return_if_fail (end != NULL);
Packit a7d494
Packit a7d494
Packit a7d494
	/* Signal emission is relatively expensive and this code path is
Packit a7d494
	 * frequent enough to optimize the common case where we only have the
Packit a7d494
	 * override and no connected handlers.
Packit a7d494
	 *
Packit a7d494
	 * This is the same trick used by gtk_widget_draw().
Packit a7d494
	 */
Packit a7d494
	if (G_UNLIKELY (g_signal_has_handler_pending (renderer, signals[QUERY_DATA], 0, FALSE)))
Packit a7d494
	{
Packit a7d494
		g_signal_emit (renderer, signals[QUERY_DATA], 0, start, end, state);
Packit a7d494
	}
Packit a7d494
	else if (GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->query_data)
Packit a7d494
	{
Packit a7d494
		GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->query_data (renderer, start, end, state);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_visible:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @visible: the visibility
Packit a7d494
 *
Packit a7d494
 * Set whether the gutter renderer is visible.
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_visible (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                        gboolean                 visible)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	set_visible (renderer, visible);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_visible:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Get whether the gutter renderer is visible.
Packit a7d494
 *
Packit a7d494
 * Returns: %TRUE if the renderer is visible, %FALSE otherwise
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
gboolean
Packit a7d494
gtk_source_gutter_renderer_get_visible (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), FALSE);
Packit a7d494
Packit a7d494
	return renderer->priv->visible;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_padding:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @xpad: the x-padding
Packit a7d494
 * @ypad: the y-padding
Packit a7d494
 *
Packit a7d494
 * Set the padding of the gutter renderer. Both @xpad and @ypad can be
Packit a7d494
 * -1, which means the values will not be changed (this allows changing only
Packit a7d494
 * one of the values).
Packit a7d494
 *
Packit a7d494
 * @xpad is the left and right padding. @ypad is the top and bottom padding.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_padding (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                        gint                     xpad,
Packit a7d494
                                        gint                     ypad)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	set_xpad (renderer, xpad);
Packit a7d494
	set_ypad (renderer, ypad);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_padding:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @xpad: (out caller-allocates) (optional): return location for the x-padding,
Packit a7d494
 *   or %NULL to ignore.
Packit a7d494
 * @ypad: (out caller-allocates) (optional): return location for the y-padding,
Packit a7d494
 *   or %NULL to ignore.
Packit a7d494
 *
Packit a7d494
 * Get the x-padding and y-padding of the gutter renderer.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_get_padding (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                        gint                    *xpad,
Packit a7d494
                                        gint                    *ypad)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	if (xpad)
Packit a7d494
	{
Packit a7d494
		*xpad = renderer->priv->xpad;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (ypad)
Packit a7d494
	{
Packit a7d494
		*ypad = renderer->priv->ypad;
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_alignment:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @xalign: the x-alignment
Packit a7d494
 * @yalign: the y-alignment
Packit a7d494
 *
Packit a7d494
 * Set the alignment of the gutter renderer. Both @xalign and @yalign can be
Packit a7d494
 * -1, which means the values will not be changed (this allows changing only
Packit a7d494
 * one of the values).
Packit a7d494
 *
Packit a7d494
 * @xalign is the horizontal alignment. Set to 0 for a left alignment. 1 for a
Packit a7d494
 * right alignment. And 0.5 for centering the cells. @yalign is the vertical
Packit a7d494
 * alignment. Set to 0 for a top alignment. 1 for a bottom alignment.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_alignment (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                          gfloat                   xalign,
Packit a7d494
                                          gfloat                   yalign)
Packit a7d494
{
Packit a7d494
	gboolean changed_x;
Packit a7d494
	gboolean changed_y;
Packit a7d494
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	changed_x = set_xalign (renderer, xalign, FALSE);
Packit a7d494
	changed_y = set_yalign (renderer, yalign, FALSE);
Packit a7d494
Packit a7d494
	if (changed_x || changed_y)
Packit a7d494
	{
Packit a7d494
		gtk_source_gutter_renderer_queue_draw (renderer);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_alignment:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @xalign: (out caller-allocates) (optional): return location for the x-alignment,
Packit a7d494
 *   or %NULL to ignore.
Packit a7d494
 * @yalign: (out caller-allocates) (optional): return location for the y-alignment,
Packit a7d494
 *   or %NULL to ignore.
Packit a7d494
 *
Packit a7d494
 * Get the x-alignment and y-alignment of the gutter renderer.
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_get_alignment (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                          gfloat                  *xalign,
Packit a7d494
                                          gfloat                  *yalign)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	if (xalign)
Packit a7d494
	{
Packit a7d494
		*xalign = renderer->priv->xalign;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (yalign)
Packit a7d494
	{
Packit a7d494
		*yalign = renderer->priv->yalign;
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_alignment_mode:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @mode: a #GtkSourceGutterRendererAlignmentMode
Packit a7d494
 *
Packit a7d494
 * Set the alignment mode. The alignment mode describes the manner in which the
Packit a7d494
 * renderer is aligned (see :xalign and :yalign).
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_alignment_mode (GtkSourceGutterRenderer              *renderer,
Packit a7d494
                                               GtkSourceGutterRendererAlignmentMode  mode)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	set_alignment_mode (renderer, mode);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_alignment_mode:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Get the alignment mode. The alignment mode describes the manner in which the
Packit a7d494
 * renderer is aligned (see :xalign and :yalign).
Packit a7d494
 *
Packit a7d494
 * Returns: a #GtkSourceGutterRendererAlignmentMode
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
GtkSourceGutterRendererAlignmentMode
Packit a7d494
gtk_source_gutter_renderer_get_alignment_mode (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), 0);
Packit a7d494
Packit a7d494
	return renderer->priv->alignment_mode;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_window_type:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Get the #GtkTextWindowType associated with the gutter renderer.
Packit a7d494
 *
Packit a7d494
 * Returns: a #GtkTextWindowType
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
GtkTextWindowType
Packit a7d494
gtk_source_gutter_renderer_get_window_type (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), GTK_TEXT_WINDOW_PRIVATE);
Packit a7d494
Packit a7d494
	return renderer->priv->window_type;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_view:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Get the view associated to the gutter renderer
Packit a7d494
 *
Packit a7d494
 * Returns: (transfer none): a #GtkTextView
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
GtkTextView *
Packit a7d494
gtk_source_gutter_renderer_get_view (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), NULL);
Packit a7d494
Packit a7d494
	return renderer->priv->view;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_size:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 *
Packit a7d494
 * Get the size of the renderer.
Packit a7d494
 *
Packit a7d494
 * Returns: the size of the renderer.
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
gint
Packit a7d494
gtk_source_gutter_renderer_get_size (GtkSourceGutterRenderer *renderer)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), 0);
Packit a7d494
Packit a7d494
	return renderer->priv->size;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_size:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @size: the size
Packit a7d494
 *
Packit a7d494
 * Sets the size of the renderer. A value of -1 specifies that the size
Packit a7d494
 * is to be determined dynamically.
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_size (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                     gint                     size)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	set_size (renderer, size);
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_get_background:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @color: (out caller-allocates) (optional): return value for a #GdkRGBA
Packit a7d494
 *
Packit a7d494
 * Get the background color of the renderer.
Packit a7d494
 *
Packit a7d494
 * Returns: %TRUE if the background color is set, %FALSE otherwise
Packit a7d494
 *
Packit a7d494
 **/
Packit a7d494
gboolean
Packit a7d494
gtk_source_gutter_renderer_get_background (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                           GdkRGBA                 *color)
Packit a7d494
{
Packit a7d494
	g_return_val_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer), FALSE);
Packit a7d494
Packit a7d494
	if (color)
Packit a7d494
	{
Packit a7d494
		*color = renderer->priv->background_color;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	return renderer->priv->background_set;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_gutter_renderer_set_background:
Packit a7d494
 * @renderer: a #GtkSourceGutterRenderer
Packit a7d494
 * @color: (nullable): a #GdkRGBA or %NULL
Packit a7d494
 *
Packit a7d494
 * Set the background color of the renderer. If @color is set to %NULL, the
Packit a7d494
 * renderer will not have a background color.
Packit a7d494
 *
Packit a7d494
 */
Packit a7d494
void
Packit a7d494
gtk_source_gutter_renderer_set_background (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                           const GdkRGBA           *color)
Packit a7d494
{
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
Packit a7d494
	set_background_color (renderer, color);
Packit a7d494
}
Packit a7d494
Packit a7d494
void
Packit a7d494
_gtk_source_gutter_renderer_set_view (GtkSourceGutterRenderer *renderer,
Packit a7d494
                                      GtkTextView             *view,
Packit a7d494
                                      GtkTextWindowType        window_type)
Packit a7d494
{
Packit a7d494
	GtkTextView *old_view;
Packit a7d494
Packit a7d494
	g_return_if_fail (GTK_SOURCE_IS_GUTTER_RENDERER (renderer));
Packit a7d494
	g_return_if_fail (view == NULL || GTK_IS_TEXT_VIEW (view));
Packit a7d494
Packit a7d494
	old_view = renderer->priv->view;
Packit a7d494
Packit a7d494
	renderer->priv->window_type = window_type;
Packit a7d494
	renderer->priv->view = view != NULL ? g_object_ref (view) : NULL;
Packit a7d494
Packit a7d494
	if (GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->change_view)
Packit a7d494
	{
Packit a7d494
		GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->change_view (renderer,
Packit a7d494
		                                                              old_view);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (old_view)
Packit a7d494
	{
Packit a7d494
		g_object_unref (old_view);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	g_object_notify (G_OBJECT (renderer), "view");
Packit a7d494
	g_object_notify (G_OBJECT (renderer), "window_type");
Packit a7d494
}