Merge branch 'gtk3' into master

Conflicts:
	NEWS
	README
	configure.ac
	data/Makefile.am
	gitg/gitg-commit-view.c
	gitg/gitg-revision-details-panel.c
	gitg/gitg-window.c
	gitg/gitg.c
	gitg/gseal-gtk-compat.h
This commit is contained in:
Jesse van den Kieboom 2011-07-23 00:02:36 +02:00
commit c579e3fea0
37 changed files with 1279 additions and 1600 deletions

42
NEWS
View file

@ -1,3 +1,45 @@
= gitg 0.2.3 =
Version 0.2.3 was released on 2011-07-21
== Features ==
* Use ustar format for distcheck
== Bug fixes ==
* Use GLADE_CATALOG_DIR instead of GLADE_CATALOGDIR
* Fix spinner in repository dialog
* No longer use Gtk[HV]Box as it is deprecated
* Fix repository dialog
* Remove and reattach model while loading repository
* Fix ENABLE_DEBUG use in Makefile.am
* Fix --disable-debug
== Features ==
= gitg 0.2.2 =
Version 0.2.2 was released on 2011-03-27
== Features ==
* Added glade catalog file
== Bug fixes ==
* Disable auto-utf8 for repository loading
= gitg 0.2.1 =
Version 0.2.1 was released on 2011-03-25
== Features ==
* Improved debugging
* Add UTF8 as the first candidate encoding
== Bug fixes ==
* Adjust to GtkSourceView API break
= gitg 0.2.0 =
Version 0.2.0 was released on 2011-02-26
== Features ==
* Port gitg to gtk+ 3
= gitg 0.1.2 =
Version 0.1.2 was released on 2011-03-27

6
README
View file

@ -3,7 +3,7 @@ gitg is a GitX clone for GNOME/gtk+. It aims at being a small, fast and
convenient tool to visualize git history and actions that benefit from a
graphical presentation.
The latest version of gitg is 0.1.2.
The latest version of gitg is 0.2.3.
Website: http://trac.novowork.com/gitg
Bugs: http://bugzilla.gnome.org/browse.cgi?product=gitg
@ -15,8 +15,8 @@ To install the latest version of gitg, make sure to download gitg-0.1.2.tar.bz2
from the download site. After downloading the following procedure installs
gitg:
$ tar -xjf gitg-0.1.2.tar.bz2
$ cd gitg-0.1.0
$ tar Jxf gitg-0.2.3.tar.bz2
$ cd gitg-0.2.3
$ ./configure
$ make
$ sudo make install

View file

@ -3,8 +3,8 @@ dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.64])
m4_define(gitg_major_version, 0)
m4_define(gitg_minor_version, 1)
m4_define(gitg_micro_version, 2)
m4_define(gitg_minor_version, 2)
m4_define(gitg_micro_version, 3)
m4_define(gitg_version, gitg_major_version.gitg_minor_version.gitg_micro_version)
AC_INIT([gitg],
@ -25,7 +25,7 @@ AC_SUBST(GITG_MINOR_VERSION, gitg_minor_version)
AC_DEFINE(GITG_MICRO_VERSION, gitg_micro_version, [GitG micro version])
AC_SUBST(GITG_MICRO_VERSION, gitg_micro_version)
AM_INIT_AUTOMAKE([1.11 dist-bzip2 no-dist-gzip])
AM_INIT_AUTOMAKE([1.11 tar-ustar dist-xz no-dist-gzip -Wno-portability])
AM_MAINTAINER_MODE([enable])
AM_SILENT_RULES([yes])
@ -52,20 +52,14 @@ GETTEXT_PACKAGE=gitg
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package])
AC_CHECK_LIB([m], [sinf])
# Which gtk+ API version to compile against
GTK_REQUIRED=gtk+-2.0
GTK_REQUIRED_VERSION=2.18.0
GTKSOURCEVIEW_REQUIRED=gtksourceview-2.0
GTKSOURCEVIEW_REQUIRED_VERSION=2.8.0
GLIB_REQUIRED_VERSION=2.26
GTK_REQUIRED_VERSION=3.0.0
GTKSOURCEVIEW_REQUIRED_VERSION=3.0.0
PKG_CHECK_MODULES(GITG, [
$GTK_REQUIRED >= $GTK_REQUIRED_VERSION
gtk+-3.0 >= $GTK_REQUIRED_VERSION
gthread-2.0 >= $GLIB_REQUIRED_VERSION
glib-2.0 >= $GLIB_REQUIRED_VERSION
gobject-2.0 >= $GLIB_REQUIRED_VERSION
@ -75,7 +69,7 @@ PKG_CHECK_MODULES(GITG, [
])
PKG_CHECK_MODULES(PACKAGE, [
$GTKSOURCEVIEW_REQUIRED >= $GTKSOURCEVIEW_REQUIRED_VERSION
gtksourceview-3.0 >= $GTKSOURCEVIEW_REQUIRED_VERSION
gsettings-desktop-schemas
])
@ -100,35 +94,26 @@ if test "$enable_deprecations" = "yes"; then
-DGDK_DISABLE_DEPRECATED \
-DGTK_DISABLE_DEPRECATED \
-DGDK_PIXBUF_DISABLE_DEPRECATED \
-DGNOME_DISABLE_DEPRECATED"
-DGNOME_DISABLE_DEPRECATED \
-DGSEAL_ENABLE"
fi
if $PKG_CONFIG --atleast-version 2.19.0 $GTK_REQUIRED; then
gtkatleast=
else
gtkatleast=no
fi
AM_CONDITIONAL(BUILD_SPINNER, test "$gtkatleast" = "no")
if test "$gtkatleast" = "no"; then
AC_DEFINE([BUILD_SPINNER],[1],[Whether to use GitgSpinner instead of GtkSpinner])
fi
if $PKG_CONFIG --atleast-version 2.21.0 $GTK_REQUIRED; then
gtkatleast=yes
else
gtkatleast=
fi
if test "$gtkatleast" = "yes"; then
DISABLE_DEPRECATED_CFLAGS="$DISABLE_DEPRECATED_CFLAGS -DGSEAL_ENABLE"
fi
AC_SUBST(DISABLE_DEPRECATED_CFLAGS)
PACKAGE_LIBS="$PACKAGE_LIBS -lm"
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--disable-debug],
[disable debug information [default=yes]])],
[enable_debug=$enableval], [enable_debug=yes])
if test "x$enable_debug" = "xyes"; then
PACKAGE_CFLAGS="$PACKAGE_CFLAGS -g"
AC_DEFINE([ENABLE_DEBUG],[1],[Whether debugging support is enabled])
fi
AM_CONDITIONAL([ENABLE_DEBUG], [test "$enable_debug" = "yes"])
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--disable-debug],
[disable debug information [default=yes]])],

View file

@ -16,7 +16,7 @@ gitgstyles_DATA = gitgstyle.xml
gsettings_SCHEMAS = org.gnome.gitg.gschema.xml
if GLADE_CATALOG
catalogdir = $(GLADE_CATALOGDIR)
catalogdir = $(GLADE_CATALOG_DIR)
dist_catalog_DATA = gitg-glade.xml
endif

View file

@ -13,6 +13,7 @@ AM_CPPFLAGS = \
NOINST_H_FILES = \
gitg-activatable.h \
gitg-avatar-cache.h \
gitg-branch-actions.h \
gitg-cell-renderer-path.h \
gitg-commit-view.h \
@ -30,13 +31,13 @@ NOINST_H_FILES = \
gitg-stat-view.h \
gitg-uri.h \
gitg-utils.h \
gitg-window.h \
gseal-gtk-compat.h
gitg-window.h
gitg_SOURCES = \
$(BUILT_SOURCES) \
gitg.c \
gitg-activatable.c \
gitg-avatar-cache.c \
gitg-branch-actions.c \
gitg-cell-renderer-path.c \
gitg-commit-view.c \
@ -55,14 +56,8 @@ gitg_SOURCES = \
gitg-uri.c \
gitg-utils.c \
gitg-window.c \
gseal-gtk-compat.c \
$(NOINST_H_FILES)
if BUILD_SPINNER
gitg_SOURCES += gitg-spinner.c
NOINST_H_FILES += gitg-spinner.h
endif
gitg_LDADD = \
$(GITG_LIBS) \
$(PACKAGE_LIBS) \

416
gitg/gitg-avatar-cache.c Normal file
View file

@ -0,0 +1,416 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2009 Mathias Hasselmann
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "gitg-avatar-cache.h"
#include <glib.h>
#include <gio/gio.h>
#include <string.h>
#define AVATAR_SIZE 80
typedef struct _GitgAvatarCacheLoader GitgAvatarCacheLoader;
struct _GitgAvatarCacheLoader
{
gchar *uri;
GitgAvatarCache *cache;
GCancellable *cancellable;
gchar buffer[8192];
GdkPixbufLoader *pixbuf_loader;
GdkPixbuf *pixbuf;
GSimpleAsyncResult *result;
};
struct _GitgAvatarCachePrivate
{
GChecksum *checksum;
GHashTable *pixbuf_table;
GList *active_loaders;
};
G_DEFINE_TYPE (GitgAvatarCache, gitg_avatar_cache, G_TYPE_OBJECT)
static void
avatar_cache_loader_finish (GitgAvatarCacheLoader *loader,
GError *error)
{
if (loader->cache)
{
g_object_remove_weak_pointer (G_OBJECT (loader->cache),
(gpointer) &loader->cache);
}
if (loader->cancellable)
{
g_cancellable_cancel (loader->cancellable);
g_object_unref (loader->cancellable);
}
if (loader->pixbuf_loader)
{
gdk_pixbuf_loader_close (loader->pixbuf_loader, NULL);
g_object_unref (loader->pixbuf_loader);
}
if (loader->pixbuf)
{
g_simple_async_result_set_op_res_gpointer (loader->result,
g_object_ref (loader->pixbuf),
g_object_unref);
}
else
{
g_simple_async_result_set_from_error (loader->result, error);
g_error_free (error);
}
g_simple_async_result_complete_in_idle (loader->result);
g_object_unref (loader->result);
g_slice_free (GitgAvatarCacheLoader, loader);
}
static void
gitg_avatar_cache_init (GitgAvatarCache *cache)
{
cache->priv = G_TYPE_INSTANCE_GET_PRIVATE (cache,
GITG_TYPE_AVATAR_CACHE,
GitgAvatarCachePrivate);
}
static void
cached_pixbuf_unref0 (gpointer pixbuf)
{
if (pixbuf != NULL)
{
g_object_unref (pixbuf);
}
}
static void
avatar_cache_insert (GitgAvatarCache *cache,
const gchar *uri,
GdkPixbuf *pixbuf)
{
GitgAvatarCachePrivate *priv = cache->priv;
if (!priv->pixbuf_table)
{
priv->pixbuf_table = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
cached_pixbuf_unref0);
}
if (pixbuf != NULL)
{
g_object_ref (pixbuf);
}
g_hash_table_insert (priv->pixbuf_table, g_strdup (uri), pixbuf);
}
static void
avatar_cache_close_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
GitgAvatarCacheLoader *loader = user_data;
GInputStream *stream = G_INPUT_STREAM (object);
GError *error = NULL;
if (g_input_stream_close_finish (stream, result, &error) &&
gdk_pixbuf_loader_close (loader->pixbuf_loader, &error))
{
loader->pixbuf = gdk_pixbuf_loader_get_pixbuf (loader->pixbuf_loader);
avatar_cache_insert (loader->cache, loader->uri, loader->pixbuf);
g_object_unref (loader->pixbuf_loader);
loader->pixbuf_loader = NULL;
}
if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("%s: %s", G_STRFUNC, error->message);
avatar_cache_loader_finish (loader, error);
}
static void
avatar_cache_read_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
GitgAvatarCacheLoader *loader = user_data;
GInputStream *stream = G_INPUT_STREAM (object);
GError *error = NULL;
gssize len;
len = g_input_stream_read_finish (stream, result, &error);
if (len > 0)
{
if (gdk_pixbuf_loader_write (loader->pixbuf_loader, (gpointer)
loader->buffer, len, &error))
{
g_input_stream_read_async (stream, loader->buffer,
sizeof (loader->buffer),
G_PRIORITY_DEFAULT,
loader->cancellable,
avatar_cache_read_cb,
loader);
}
else
{
len = -2;
}
}
if (0 >= len)
{
g_input_stream_close_async (stream, G_PRIORITY_DEFAULT,
loader->cancellable,
avatar_cache_close_cb, loader);
}
if (error)
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("%s: %s", G_STRFUNC, error->message);
g_error_free (error);
}
}
static void
avatar_cache_open_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
GitgAvatarCacheLoader *loader = user_data;
GError *error = NULL;
GFileInputStream *stream;
stream = g_file_read_finish (G_FILE (object), result, &error);
if (stream)
{
g_input_stream_read_async (G_INPUT_STREAM (stream),
loader->buffer, sizeof (loader->buffer),
G_PRIORITY_DEFAULT, loader->cancellable,
avatar_cache_read_cb, loader);
}
else
{
/* At the moment G_IO_ERROR_NOT_FOUND is not being returned
* and instead an error code of 404 is. This is HTTP's
* File Not Found error.
*/
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND) ||
(error != NULL && error->code == 404))
{
avatar_cache_insert (loader->cache, loader->uri, NULL);
}
else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{
g_warning ("%s: %s", G_STRFUNC, error->message);
}
avatar_cache_loader_finish (loader, error);
}
}
static void
avatar_cache_finalize (GObject *object)
{
GitgAvatarCachePrivate *priv = GITG_AVATAR_CACHE (object)->priv;
GitgAvatarCacheLoader *loader;
GList *l;
if (priv->pixbuf_table)
{
g_hash_table_unref (priv->pixbuf_table);
}
if (priv->checksum)
{
g_checksum_free (priv->checksum);
}
for (l = priv->active_loaders; l; l = g_list_delete_link (l, l))
{
loader = priv->active_loaders->data;
g_cancellable_cancel (loader->cancellable);
}
G_OBJECT_CLASS (gitg_avatar_cache_parent_class)->finalize (object);
}
static void
gitg_avatar_cache_class_init (GitgAvatarCacheClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
object_class->finalize = avatar_cache_finalize;
g_type_class_add_private (class, sizeof (GitgAvatarCachePrivate));
}
GitgAvatarCache *
gitg_avatar_cache_new (void)
{
return g_object_new (GITG_TYPE_AVATAR_CACHE, NULL);
}
void
gitg_avatar_cache_load_uri_async (GitgAvatarCache *cache,
const gchar *uri,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
GitgAvatarCachePrivate *priv;
gboolean found = FALSE;
GdkPixbuf *pixbuf = NULL;
GSimpleAsyncResult *result;
GitgAvatarCacheLoader *loader;
GFile *file;
g_return_if_fail (GITG_IS_AVATAR_CACHE (cache));
g_return_if_fail (NULL != callback);
g_return_if_fail (NULL != uri);
priv = cache->priv;
result = g_simple_async_result_new (G_OBJECT (cache), callback, user_data,
gitg_avatar_cache_load_uri_async);
if (priv->pixbuf_table)
{
found = g_hash_table_lookup_extended (priv->pixbuf_table, uri,
NULL, (gpointer *) &pixbuf);
}
if (found)
{
if (pixbuf == NULL)
{
g_simple_async_result_set_error (result, G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Not Found");
}
else
{
g_simple_async_result_set_op_res_gpointer (result,
g_object_ref (pixbuf),
g_object_unref);
}
g_simple_async_result_complete_in_idle (result);
}
else
{
if (cancellable)
{
g_object_ref (cancellable);
}
else
{
cancellable = g_cancellable_new ();
}
loader = g_slice_new0 (GitgAvatarCacheLoader);
loader->pixbuf_loader = gdk_pixbuf_loader_new ();
loader->result = g_object_ref (result);
loader->cancellable = cancellable;
loader->uri = g_strdup (uri);
loader->cache = cache;
g_object_add_weak_pointer (G_OBJECT (loader->cache),
(gpointer) &loader->cache);
file = g_file_new_for_uri (uri);
g_file_read_async (file, G_PRIORITY_DEFAULT, loader->cancellable,
avatar_cache_open_cb, loader);
g_object_unref (file);
}
g_object_unref (result);
}
GdkPixbuf *
gitg_avatar_cache_load_finish (GitgAvatarCache *cache,
GAsyncResult *result,
GError **error)
{
GSimpleAsyncResult *simple;
gpointer source_tag;
g_return_val_if_fail (GITG_IS_AVATAR_CACHE (cache), NULL);
g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), NULL);
simple = G_SIMPLE_ASYNC_RESULT (result);
source_tag = g_simple_async_result_get_source_tag (simple);
g_return_val_if_fail (source_tag == gitg_avatar_cache_load_uri_async, NULL);
if (g_simple_async_result_propagate_error (simple, error))
return NULL;
return g_simple_async_result_get_op_res_gpointer (simple);
}
gchar *
gitg_avatar_cache_get_gravatar_uri (GitgAvatarCache *cache,
const gchar *gravatar_id)
{
GitgAvatarCachePrivate *priv;
gssize len;
gchar *lowercase_id;
g_return_val_if_fail (GITG_IS_AVATAR_CACHE (cache), NULL);
g_return_val_if_fail (NULL != gravatar_id, NULL);
priv = cache->priv;
if (priv->checksum)
{
g_checksum_reset (priv->checksum);
}
else
{
priv->checksum = g_checksum_new (G_CHECKSUM_MD5);
}
len = strlen (gravatar_id);
lowercase_id = g_ascii_strdown (gravatar_id, len);
g_checksum_update (priv->checksum, (gpointer) lowercase_id, len);
g_free (lowercase_id);
/* d=404 will return a File Not Found if the avatar does not exist */
return g_strdup_printf ("http://www.gravatar.com/avatar/%s?d=404&s=%d",
g_checksum_get_string (priv->checksum),
AVATAR_SIZE);
}

73
gitg/gitg-avatar-cache.h Normal file
View file

@ -0,0 +1,73 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2009 Mathias Hasselmann
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GITG_AVATAR_CACHE_H__
#define __GITG_AVATAR_CACHE_H__
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gio/gio.h>
G_BEGIN_DECLS
#define GITG_TYPE_AVATAR_CACHE (gitg_avatar_cache_get_type ())
#define GITG_AVATAR_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_AVATAR_CACHE, GitgAvatarCache))
#define GITG_AVATAR_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GITG_TYPE_AVATAR_CACHE, GitgAvatarCacheClass))
#define GITG_IS_AVATAR_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GITG_TYPE_AVATAR_CACHE))
#define GITG_IS_AVATAR_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GITG_TYPE_AVATAR_CACHE))
#define GITG_AVATAR_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GITG_TYPE_AVATAR_CACHE, GitgAvatarCacheClass))
typedef struct _GitgAvatarCache GitgAvatarCache;
typedef struct _GitgAvatarCachePrivate GitgAvatarCachePrivate;
typedef struct _GitgAvatarCacheClass GitgAvatarCacheClass;
struct _GitgAvatarCache
{
GObject parent_instance;
GitgAvatarCachePrivate *priv;
};
struct _GitgAvatarCacheClass
{
GObjectClass parent_class;
};
GType gitg_avatar_cache_get_type (void) G_GNUC_CONST;
GitgAvatarCache *gitg_avatar_cache_new (void);
void gitg_avatar_cache_load_uri_async (GitgAvatarCache *cache,
const gchar *uri,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GdkPixbuf *gitg_avatar_cache_load_finish (GitgAvatarCache *cache,
GAsyncResult *result,
GError **error);
gchar *gitg_avatar_cache_get_gravatar_uri (GitgAvatarCache *cache,
const gchar *gravatar_id);
G_END_DECLS
#endif /* __GITG_AVATAR_CACHE_H__ */

View file

@ -622,13 +622,9 @@ rename_dialog (GitgWindow *window, const gchar *oldname)
"_Rename", GTK_RESPONSE_OK,
NULL);
#if ! GTK_CHECK_VERSION(2, 22, 0)
gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE);
#endif
gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK);
GtkWidget *box = gtk_hbox_new (FALSE, 6);
GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
GtkWidget *label = gtk_label_new (_("Name:"));
GtkWidget *entry = gtk_entry_new ();

View file

@ -113,7 +113,7 @@ gitg_cell_renderer_path_finalize(GObject *object)
}
static void
renderer_get_size(GtkCellRenderer *renderer, GtkWidget *widget, GdkRectangle *area, gint *xoffset, gint *yoffset, gint *width, gint *height)
renderer_get_size(GtkCellRenderer *renderer, GtkWidget *widget, const GdkRectangle *area, gint *xoffset, gint *yoffset, gint *width, gint *height)
{
GitgCellRendererPath *self = GITG_CELL_RENDERER_PATH(renderer);
@ -131,7 +131,7 @@ renderer_get_size(GtkCellRenderer *renderer, GtkWidget *widget, GdkRectangle *ar
}
static void
draw_arrow(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area, gint8 laneidx, gboolean top)
draw_arrow(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area, gint8 laneidx, gboolean top)
{
gdouble cw = self->priv->lane_width;
gdouble xpos = area->x + laneidx * cw + cw / 2.0;
@ -154,7 +154,7 @@ draw_arrow(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area, gint8 la
}
static void
draw_paths_real(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area, GitgRevision *revision, gdouble yoffset)
draw_paths_real(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area, GitgRevision *revision, gdouble yoffset)
{
if (!revision)
return;
@ -190,19 +190,19 @@ draw_paths_real(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area, Git
}
static void
draw_top_paths(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
draw_top_paths(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area)
{
draw_paths_real(self, cr, area, self->priv->revision, -1);
}
static void
draw_bottom_paths(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
draw_bottom_paths(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area)
{
draw_paths_real(self, cr, area, self->priv->next_revision, 1);
}
static void
draw_arrows(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
draw_arrows(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area)
{
GSList *item;
gint8 to = 0;
@ -222,7 +222,7 @@ draw_arrows(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
}
static void
draw_paths(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
draw_paths(GitgCellRendererPath *self, cairo_t *cr, const GdkRectangle *area)
{
cairo_set_line_width(cr, 2);
//cairo_set_source_rgb(cr, 0.45, 0.6, 0.74);
@ -234,7 +234,7 @@ draw_paths(GitgCellRendererPath *self, cairo_t *cr, GdkRectangle *area)
}
static void
draw_labels(GitgCellRendererPath *self, GtkWidget *widget, cairo_t *context, GdkRectangle *area)
draw_labels(GitgCellRendererPath *self, GtkWidget *widget, cairo_t *context, const GdkRectangle *area)
{
gint offset = num_lanes(self) * self->priv->lane_width;
PangoFontDescription *font;
@ -249,7 +249,7 @@ draw_labels(GitgCellRendererPath *self, GtkWidget *widget, cairo_t *context, Gdk
}
static void
draw_indicator_triangle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *context, GdkRectangle *area)
draw_indicator_triangle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *context, const GdkRectangle *area)
{
gdouble offset = gitg_revision_get_mylane(self->priv->revision) * self->priv->lane_width + (self->priv->lane_width - self->priv->triangle_width) / 2.0;
gdouble radius = self->priv->triangle_width / 2.0;
@ -281,7 +281,7 @@ draw_indicator_triangle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *con
}
static void
draw_indicator_circle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *context, GdkRectangle *area)
draw_indicator_circle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *context, const GdkRectangle *area)
{
gdouble offset = gitg_revision_get_mylane(self->priv->revision) * self->priv->lane_width + (self->priv->lane_width - self->priv->dot_width) / 2.0;
gdouble radius = self->priv->dot_width / 2.0;
@ -307,7 +307,7 @@ draw_indicator_circle(GitgCellRendererPath *self, GitgLane *lane, cairo_t *conte
}
static void
draw_indicator(GitgCellRendererPath *self, cairo_t *context, GdkRectangle *area)
draw_indicator(GitgCellRendererPath *self, cairo_t *context, const GdkRectangle *area)
{
GitgLane *lane = gitg_revision_get_lane(self->priv->revision);
@ -318,14 +318,12 @@ draw_indicator(GitgCellRendererPath *self, cairo_t *context, GdkRectangle *area)
}
static void
renderer_render(GtkCellRenderer *renderer, GdkDrawable *window, GtkWidget *widget, GdkRectangle *area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags)
renderer_render(GtkCellRenderer *renderer, cairo_t *cr, GtkWidget *widget, const GdkRectangle *area, const GdkRectangle *cell_area, GtkCellRendererState flags)
{
GitgCellRendererPath *self = GITG_CELL_RENDERER_PATH(renderer);
self->priv->last_height = area->height;
cairo_t *cr = gdk_cairo_create(window);
gdk_cairo_rectangle (cr, area);
cairo_clip(cr);
@ -336,13 +334,12 @@ renderer_render(GtkCellRenderer *renderer, GdkDrawable *window, GtkWidget *widge
/* draw labels */
draw_labels(self, widget, cr, area);
cairo_destroy(cr);
area->x += total_width(self, widget);
cell_area->x += total_width(self, widget);
((GdkRectangle *) area)->x += total_width(self, widget);
((GdkRectangle *) cell_area)->x += total_width(self, widget);
if (GTK_CELL_RENDERER_CLASS(parent_class)->render)
GTK_CELL_RENDERER_CLASS(parent_class)->render(renderer, window, widget, area, cell_area, expose_area, flags);
GTK_CELL_RENDERER_CLASS(parent_class)->render(renderer, cr, widget, area, cell_area, flags);
}
static void

View file

@ -31,7 +31,6 @@
#include "gitg-commit-view.h"
#include "gitg-diff-view.h"
#include "gitg-utils.h"
#include "gseal-gtk-compat.h"
#define GITG_COMMIT_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_COMMIT_VIEW, GitgCommitViewPrivate))
#define CATEGORY_UNSTAGE_HUNK "CategoryUnstageHunk"
@ -147,7 +146,7 @@ gitg_commit_view_finalize (GObject *object)
g_object_unref (view->priv->shell);
g_object_unref (view->priv->ui_manager);
gdk_cursor_unref (view->priv->hand);
g_object_unref (view->priv->hand);
G_OBJECT_CLASS (gitg_commit_view_parent_class)->finalize (object);
}
@ -370,8 +369,7 @@ get_selected_files(GtkTreeView *tree_view,
}
else
{
g_list_foreach(items, (GFunc)gtk_tree_path_free, NULL);
g_list_free(items);
g_list_free_full (items, (GDestroyNotify)gtk_tree_path_free);
}
if (files)
@ -422,8 +420,7 @@ check_selection(GtkTreeView *tree_view,
ret = TRUE;
}
g_list_foreach(paths, (GFunc)gtk_tree_path_free, NULL);
g_list_free(paths);
g_list_free_full (paths, (GDestroyNotify)gtk_tree_path_free);
return ret;
}
@ -559,11 +556,6 @@ staged_selection_changed (GtkTreeSelection *selection, GitgCommitView *view)
}
else
{
gchar *basename;
basename = g_file_get_basename(f);
g_free(basename);
gtk_widget_set_sensitive (GTK_WIDGET (view->priv->hscale_context),
FALSE);
@ -1249,8 +1241,7 @@ on_tree_view_drag_data_get (GtkWidget *widget,
g_strfreev(uris);
g_list_foreach(selected, (GFunc)g_object_unref, NULL);
g_list_free(selected);
g_list_free_full (selected, g_object_unref);
}
static void
@ -1363,6 +1354,8 @@ on_tag_added (GtkTextTagTable *table,
static void
gitg_commit_view_parser_finished(GtkBuildable *buildable, GtkBuilder *builder)
{
GtkSourceMarkAttributes *attrs;
if (parent_iface.parser_finished)
parent_iface.parser_finished(buildable, builder);
@ -1428,16 +1421,30 @@ gitg_commit_view_parser_finished(GtkBuildable *buildable, GtkBuilder *builder)
if (pixbuf)
{
gtk_source_view_set_mark_category_icon_from_pixbuf(self->priv->changes_view, CATEGORY_STAGE_HUNK, pixbuf);
g_object_unref(pixbuf);
attrs = gtk_source_mark_attributes_new ();
gtk_source_mark_attributes_set_pixbuf (attrs, pixbuf);
gtk_source_view_set_mark_attributes (self->priv->changes_view,
CATEGORY_STAGE_HUNK,
attrs, 1);
g_object_unref (pixbuf);
g_object_unref (attrs);
}
pixbuf = gtk_icon_theme_load_icon(theme, GTK_STOCK_REMOVE, 12, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
if (pixbuf)
{
gtk_source_view_set_mark_category_icon_from_pixbuf(self->priv->changes_view, CATEGORY_UNSTAGE_HUNK, pixbuf);
g_object_unref(pixbuf);
attrs = gtk_source_mark_attributes_new ();
gtk_source_mark_attributes_set_pixbuf (attrs, pixbuf);
gtk_source_view_set_mark_attributes (self->priv->changes_view,
CATEGORY_UNSTAGE_HUNK,
attrs, 2);
g_object_unref (pixbuf);
g_object_unref (attrs);
}
gitg_utils_set_monospace_font(GTK_WIDGET(self->priv->changes_view));

View file

@ -39,9 +39,16 @@ struct _GitgDiffLineRendererPrivate
gint line_old;
gint line_new;
gchar *label;
gint num_digits;
PangoLayout *cached_layout;
PangoAttribute *fg_attr;
PangoAttrList *cached_attr_list;
glong changed_handler_id;
};
G_DEFINE_TYPE (GitgDiffLineRenderer, gitg_diff_line_renderer, GTK_TYPE_CELL_RENDERER)
G_DEFINE_TYPE (GitgDiffLineRenderer, gitg_diff_line_renderer, GTK_SOURCE_TYPE_GUTTER_RENDERER)
static void
gitg_diff_line_renderer_set_property (GObject *object,
@ -95,14 +102,67 @@ gitg_diff_line_renderer_get_property (GObject *object,
}
static void
darken_or_lighten (cairo_t *ctx,
GdkColor const *color)
gitg_diff_line_renderer_finalize (GObject *object)
{
GitgDiffLineRenderer *self = GITG_DIFF_LINE_RENDERER (object);
g_free (self->priv->label);
G_OBJECT_CLASS (gitg_diff_line_renderer_parent_class)->finalize (object);
}
static void
create_layout (GitgDiffLineRenderer *renderer,
GtkWidget *widget)
{
PangoLayout *layout;
PangoAttribute *attr;
GtkStyleContext *context;
GdkRGBA color;
PangoAttrList *attr_list;
layout = gtk_widget_create_pango_layout (widget, NULL);
context = gtk_widget_get_style_context (widget);
gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &color);
attr = pango_attr_foreground_new (color.red * 65535,
color.green * 65535,
color.blue * 65535);
attr->start_index = 0;
attr->end_index = G_MAXINT;
attr_list = pango_attr_list_new ();
pango_attr_list_insert (attr_list, attr);
renderer->priv->fg_attr = attr;
renderer->priv->cached_layout = layout;
renderer->priv->cached_attr_list = attr_list;
}
static void
gitg_diff_line_renderer_begin (GtkSourceGutterRenderer *renderer,
cairo_t *cr,
GdkRectangle *background_area,
GdkRectangle *cell_area,
GtkTextIter *start,
GtkTextIter *end)
{
GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
create_layout (lr, GTK_WIDGET (gtk_source_gutter_renderer_get_view (renderer)));
}
static void
darken_or_lighten (cairo_t *ctx,
GdkRGBA const *color)
{
float r, g, b;
r = color->red / 65535.0;
g = color->green / 65535.0;
b = color->blue / 65535.0;
r = color->red;
g = color->green;
b = color->blue;
if ((r + g + b) / 3 > 0.5)
{
@ -121,20 +181,24 @@ darken_or_lighten (cairo_t *ctx,
}
static void
render_label (GitgDiffLineRenderer *lr,
GdkDrawable *window,
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;
GtkStyle *style;
GtkStyleContext *style_context;
GtkStateType state;
gint pixel_height;
GdkRGBA fg_color, bg_color;
layout = gtk_widget_create_pango_layout (widget, "");
widget = GTK_WIDGET (gtk_source_gutter_renderer_get_view (renderer));
layout = lr->priv->cached_layout;
pango_layout_set_markup (layout, lr->priv->label, -1);
pango_layout_set_width (layout, cell_area->width);
@ -143,15 +207,13 @@ render_label (GitgDiffLineRenderer *lr,
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
style = gtk_widget_get_style (widget);
style_context = gtk_widget_get_style_context (widget);
state = gtk_widget_get_state (widget);
cairo_t *ctx = gdk_cairo_create (window);
gtk_style_context_get_color (style_context, state, &fg_color);
gtk_style_context_get_background_color (style_context, state, &bg_color);
gdk_cairo_rectangle (ctx, expose_area);
cairo_clip (ctx);
gdk_cairo_set_source_color (ctx, &(style->fg[state]));
gdk_cairo_set_source_rgba (ctx, &fg_color);
gitg_utils_rounded_rectangle (ctx,
cell_area->x + 0.5,
@ -162,12 +224,12 @@ render_label (GitgDiffLineRenderer *lr,
cairo_fill_preserve (ctx);
darken_or_lighten (ctx, &(style->fg[state]));
darken_or_lighten (ctx, &fg_color);
cairo_set_line_width (ctx, 1);
cairo_stroke (ctx);
gdk_cairo_set_source_color (ctx, &(style->base[state]));
gdk_cairo_set_source_rgba (ctx, &bg_color);
cairo_move_to (ctx,
cell_area->x + cell_area->width / 2,
@ -175,37 +237,33 @@ render_label (GitgDiffLineRenderer *lr,
pango_cairo_show_layout (ctx, layout);
cairo_destroy (ctx);
/*gtk_paint_layout (style,
window,
state,
FALSE,
NULL,
widget,
NULL,
cell_area->x + cell_area->width / 2,
cell_area->y,
layout);*/
/*gtk_render_layout (style_context,
ctx,
cell_area->x + cell_area->width / 2,
cell_area->y,
layout);*/
}
static void
render_lines (GitgDiffLineRenderer *lr,
GdkDrawable *window,
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];
guint xpad;
guint ypad;
GtkStyle *style;
PangoLayout *layout;
GtkWidget *widget;
GtkStyleContext *style_context;
widget = GTK_WIDGET (gtk_source_gutter_renderer_get_view (renderer));
layout = lr->priv->cached_layout;
PangoLayout *layout = gtk_widget_create_pango_layout (widget, "");
pango_layout_set_width (layout, cell_area->width / 2);
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
@ -228,171 +286,234 @@ render_lines (GitgDiffLineRenderer *lr,
*new_str = '\0';
}
g_object_get (lr, "xpad", &xpad, "ypad", &ypad, NULL);
pango_layout_set_text (layout, old_str, -1);
style = gtk_widget_get_style (widget);
style_context = gtk_widget_get_style_context (widget);
gtk_paint_layout (style,
window,
gtk_widget_get_state (widget),
FALSE,
NULL,
widget,
NULL,
cell_area->x + cell_area->width / 2 - 1 - xpad,
cell_area->y,
layout);
gtk_render_layout (style_context,
ctx,
cell_area->x + cell_area->width / 2 - 1,
cell_area->y,
layout);
pango_layout_set_text (layout, new_str, -1);
gtk_paint_layout (style,
window,
gtk_widget_get_state (widget),
FALSE,
NULL,
widget,
NULL,
cell_area->x + cell_area->width - xpad,
cell_area->y,
layout);
gtk_render_layout (style_context,
ctx,
cell_area->x + cell_area->width,
cell_area->y,
layout);
g_object_unref (layout);
gtk_paint_vline (style,
window,
gtk_widget_get_state (widget),
NULL,
widget,
NULL,
background_area->y,
background_area->y + background_area->height,
background_area->x + background_area->width / 2);
gtk_render_line (style_context,
ctx,
background_area->x + background_area->width / 2,
background_area->y - 1,
background_area->x + background_area->width / 2,
background_area->y + background_area->height);
}
static void
gitg_diff_line_renderer_render_impl (GtkCellRenderer *cell,
GdkDrawable *window,
GtkWidget *widget,
GdkRectangle *background_area,
GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags)
gitg_diff_line_renderer_draw (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,
window,
widget,
render_label (renderer,
ctx,
background_area,
cell_area,
expose_area,
flags);
start,
end,
renderer_state);
}
else
{
render_lines (lr,
window,
widget,
render_lines (renderer,
ctx,
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_end (GtkSourceGutterRenderer *renderer)
{
GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (cell);
GitgDiffLineRenderer *lr = GITG_DIFF_LINE_RENDERER (renderer);
/* Get size of this rendering */
g_object_unref (lr->priv->cached_layout);
lr->priv->cached_layout = NULL;
pango_attr_list_unref (lr->priv->cached_attr_list);
lr->priv->cached_attr_list = NULL;
lr->priv->fg_attr = NULL;
}
static void
measure_text (GitgDiffLineRenderer *lr,
const gchar *markup,
const gchar *text,
gint *width,
gint *height)
{
PangoLayout *layout;
gchar str[16];
gint pixel_width;
gint pixel_height;
guint xpad;
guint ypad;
gint w;
gint h;
GtkSourceGutterRenderer *r;
GtkTextView *view;
g_snprintf(str, sizeof(str), "%d", MAX(MAX(99, lr->priv->line_old), lr->priv->line_new));
layout = gtk_widget_create_pango_layout (widget, str);
pango_layout_get_pixel_size(layout, &pixel_width, &pixel_height);
r = GTK_SOURCE_GUTTER_RENDERER (lr);
view = gtk_source_gutter_renderer_get_view (r);
g_object_get (cell, "xpad", &xpad, "ypad", &ypad, NULL);
pixel_width += pixel_width + xpad * 2 + 3;
layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), NULL);
if (lr->priv->label)
if (markup)
{
PangoLayout *lbl_layout;
gint lbl_pixel_width;
gint lbl_pixel_height;
lbl_layout = gtk_widget_create_pango_layout (widget,
"");
pango_layout_set_markup (lbl_layout, lr->priv->label, -1);
pango_layout_get_pixel_size (lbl_layout,
&lbl_pixel_width,
&lbl_pixel_height);
lbl_pixel_width += 4;
if (lbl_pixel_width > pixel_width)
{
pixel_width = lbl_pixel_width;
}
if (lbl_pixel_height > pixel_height)
{
pixel_height = lbl_pixel_height;
}
pango_layout_set_markup (layout,
markup,
-1);
}
else
{
pango_layout_set_text (layout,
text,
-1);
}
pixel_width += xpad * 2;
pixel_height += ypad * 2;
pango_layout_get_size (layout, &w, &h);
if (width)
{
*width = pixel_width;
*width = w / PANGO_SCALE;
}
if (height)
{
*height = pixel_height;
*height = h / PANGO_SCALE;
}
if (x_offset)
g_object_unref (layout);
}
static void
recalculate_size (GitgDiffLineRenderer *lr)
{
/* Get size of this rendering */
gint num_digits, num;
num_digits = 0;
num = lr->priv->line_old;
while (num > 0)
{
*x_offset = 0;
num /= 10;
++num_digits;
}
if (y_offset)
num = lr->priv->line_new;
while (num > 0)
{
*y_offset = 0;
num /= 10;
++num_digits;
}
g_object_unref (G_OBJECT (layout));
num_digits = MAX (num_digits, 2);
if (num_digits != lr->priv->num_digits)
{
gchar *markup;
gint size;
lr->priv->num_digits = num_digits;
markup = g_strdup_printf ("<b>%d %d</b>",
lr->priv->line_old,
lr->priv->line_new);
measure_text (lr, markup, NULL, &size, NULL);
g_free (markup);
gtk_source_gutter_renderer_set_size (GTK_SOURCE_GUTTER_RENDERER (lr),
size);
}
}
static void
on_buffer_changed (GtkSourceBuffer *buffer,
GitgDiffLineRenderer *renderer)
{
recalculate_size (renderer);
}
static void
gitg_diff_line_renderer_change_buffer (GtkSourceGutterRenderer *renderer,
GtkTextBuffer *old_buffer)
{
GitgDiffLineRenderer *lr;
GtkTextView *view;
lr = GITG_DIFF_LINE_RENDERER (renderer);
if (old_buffer)
{
g_signal_handler_disconnect (old_buffer,
lr->priv->changed_handler_id);
}
view = gtk_source_gutter_renderer_get_view (renderer);
if (view)
{
GtkTextBuffer *buffer;
buffer = gtk_text_view_get_buffer (view);
if (buffer)
{
lr->priv->changed_handler_id =
g_signal_connect (buffer,
"changed",
G_CALLBACK (on_buffer_changed),
lr);
recalculate_size (lr);
}
}
}
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 *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;
renderer_class->begin = gitg_diff_line_renderer_begin;
renderer_class->draw = gitg_diff_line_renderer_draw;
renderer_class->end= gitg_diff_line_renderer_end;
renderer_class->change_buffer = gitg_diff_line_renderer_change_buffer;
object_class->set_property = gitg_diff_line_renderer_set_property;
object_class->get_property = gitg_diff_line_renderer_get_property;
object_class->finalize = gitg_diff_line_renderer_finalize;
g_object_class_install_property (object_class,
PROP_LINE_OLD,

View file

@ -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;

View file

@ -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);
@ -143,9 +142,9 @@ struct _GitgDiffViewPrivate
GDestroyNotify label_func_destroy_notify;
};
G_DEFINE_TYPE (GitgDiffView, gitg_diff_view, GTK_TYPE_SOURCE_VIEW)
G_DEFINE_TYPE (GitgDiffView, gitg_diff_view, GTK_SOURCE_TYPE_VIEW)
static gboolean gitg_diff_view_expose (GtkWidget *widget, GdkEventExpose *event);
static gboolean gitg_diff_view_draw (GtkWidget *widget, cairo_t *cr);
static guint diff_view_signals[NUM_SIGNALS] = {0,};
static void
@ -295,10 +294,7 @@ gitg_diff_view_constructed (GObject *object)
{
g_object_set (object, "show-line-numbers", FALSE, NULL);
if (G_OBJECT_CLASS (gitg_diff_view_parent_class)->constructed)
{
G_OBJECT_CLASS (gitg_diff_view_parent_class)->constructed (object);
}
G_OBJECT_CLASS (gitg_diff_view_parent_class)->constructed (object);
}
static void
@ -314,7 +310,7 @@ gitg_diff_view_class_init (GitgDiffViewClass *klass)
object_class->constructed = gitg_diff_view_constructed;
widget_class->expose_event = gitg_diff_view_expose;
widget_class->draw = gitg_diff_view_draw;
diff_view_signals[HEADER_ADDED] =
g_signal_new ("header-added",
@ -392,7 +388,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 +442,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 +769,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 +789,22 @@ 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;
Region **current = &view->priv->lines_current_region;
line_number = gtk_text_iter_get_line (start) + 1;
ensure_scan (view, line_number);
if (!*current || view->priv->lines_previous_line + 1 != line_number)
@ -835,7 +839,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,26 +853,26 @@ 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);
}
}
static gint
gitg_diff_view_expose (GtkWidget *widget,
GdkEventExpose *event)
gitg_diff_view_draw (GtkWidget *widget,
cairo_t *cr)
{
GitgDiffView *view = GITG_DIFF_VIEW (widget);
/* Prepare for new round of expose on the line renderer */
/* Prepare for new round of draw on the line renderer */
view->priv->lines_current_region = NULL;
view->priv->lines_previous_line = -1;
view->priv->lines_counters[0] = 0;
view->priv->lines_counters[1] = 0;
if (GTK_WIDGET_CLASS (gitg_diff_view_parent_class)->expose_event)
if (GTK_WIDGET_CLASS (gitg_diff_view_parent_class)->draw)
{
return GTK_WIDGET_CLASS (gitg_diff_view_parent_class)->expose_event (widget, event);
return GTK_WIDGET_CLASS (gitg_diff_view_parent_class)->draw (widget, cr);
}
else
{

View file

@ -26,7 +26,6 @@
#include "gitg-cell-renderer-path.h"
#include "gitg-window.h"
#include "gitg-branch-actions.h"
#include "gseal-gtk-compat.h"
#include "gitg-utils.h"
#include <string.h>
@ -532,7 +531,7 @@ vertical_autoscroll (GitgDndData *data)
}
}
GtkAdjustment *adj = gtk_tree_view_get_vadjustment (data->tree_view);
GtkAdjustment *adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (data->tree_view));
value = CLAMP (gtk_adjustment_get_value (adj) + offset, 0.0,
gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj));

View file

@ -184,7 +184,7 @@ render_label (cairo_t *context, PangoLayout *layout, GitgRef *ref, gint x, gint
}
void
gitg_label_renderer_draw(GtkWidget *widget, PangoFontDescription *description, cairo_t *context, GSList *labels, GdkRectangle *area)
gitg_label_renderer_draw(GtkWidget *widget, PangoFontDescription *description, cairo_t *context, GSList *labels, const GdkRectangle *area)
{
GSList *item;
double pos = MARGIN + 0.5;

View file

@ -28,7 +28,7 @@
#include <libgitg/gitg-ref.h>
gint gitg_label_renderer_width(GtkWidget *widget, PangoFontDescription *description, GSList *labels);
void gitg_label_renderer_draw(GtkWidget *widget, PangoFontDescription *description, cairo_t *context, GSList *labels, GdkRectangle *area);
void gitg_label_renderer_draw(GtkWidget *widget, PangoFontDescription *description, cairo_t *context, GSList *labels, const GdkRectangle *area);
GitgRef *gitg_label_renderer_get_ref_at_pos (GtkWidget *widget, PangoFontDescription *description, GSList *labels, gint x, gint *hot_x);

View file

@ -32,6 +32,7 @@
<object class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="expand">True</property>
<child>
<object class="GtkVBox" id="vbox_history">
<property name="visible">True</property>
@ -104,6 +105,7 @@
<object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="expand">False</property>
<child>
<object class="GtkLabel" id="label10">
<property name="visible">True</property>
@ -302,6 +304,7 @@
<object class="GtkVBox" id="vbox11">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="expand">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
@ -510,6 +513,7 @@
<object class="GtkVBox" id="vbox">
<property name="visible">True</property>
<property name="spacing">6</property>
<property name="expand">False</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>

View file

@ -33,10 +33,6 @@
#include <config.h>
#endif
#ifdef BUILD_SPINNER
#include "gitg-spinner.h"
#endif
void on_button_fetch_remote_clicked (GtkButton *button,
GitgRepositoryDialog *dialog);
@ -104,11 +100,7 @@ typedef struct
GitgShell *shell;
GtkTreeRowReference *reference;
#ifdef BUILD_SPINNER
GitgSpinner *spinner;
#else
guint pulse_id;
#endif
} FetchInfo;
static void
@ -125,13 +117,6 @@ fetch_cleanup (FetchInfo *info)
&iter,
path);
#ifdef BUILD_SPINNER
gtk_list_store_set (info->dialog->priv->list_store_remotes,
&iter,
COLUMN_SPINNER, NULL,
-1);
#endif
gtk_list_store_set (info->dialog->priv->list_store_remotes,
&iter,
COLUMN_FETCH, FALSE,
@ -140,14 +125,7 @@ fetch_cleanup (FetchInfo *info)
gtk_tree_path_free (path);
}
#ifdef BUILD_SPINNER
if (info->spinner)
{
g_object_unref (info->spinner);
}
#else
g_source_remove (info->pulse_id);
#endif
gtk_tree_row_reference_free (info->reference);
g_object_unref (info->shell);
@ -252,8 +230,7 @@ update_fetch (GitgRepositoryDialog *dialog)
dialog->priv->show_fetch = show_fetch;
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
static void
@ -270,8 +247,7 @@ update_sensitivity (GitgRepositoryDialog *dialog)
update_fetch (dialog);
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
static void
@ -290,25 +266,6 @@ add_remote (GitgRepositoryDialog *dialog, gchar const *name, gchar const *url, G
-1);
}
#ifdef BUILD_SPINNER
static void
on_spinner_frame (GitgSpinner *spinner, GdkPixbuf *pixbuf, FetchInfo *info)
{
GtkTreeIter iter;
GtkTreePath *path = gtk_tree_row_reference_get_path (info->reference);
gtk_tree_model_get_iter (GTK_TREE_MODEL (info->dialog->priv->list_store_remotes),
&iter,
path);
gtk_list_store_set (info->dialog->priv->list_store_remotes,
&iter,
COLUMN_SPINNER, pixbuf,
-1);
gtk_tree_path_free (path);
}
#else
static gboolean
pulse_row (FetchInfo *info)
{
@ -339,7 +296,6 @@ pulse_row (FetchInfo *info)
return fetch;
}
#endif
static void
on_fetch_begin_loading (GitgShell *shell, FetchInfo *info)
@ -356,33 +312,14 @@ on_fetch_begin_loading (GitgShell *shell, FetchInfo *info)
COLUMN_FETCH, TRUE,
-1);
#ifdef BUILD_SPINNER
info->spinner = gitg_spinner_new (GTK_ICON_SIZE_MENU);
gitg_spinner_set_screen (info->spinner, gtk_widget_get_screen (GTK_WIDGET (info->dialog)));
g_signal_connect (info->spinner, "frame", G_CALLBACK (on_spinner_frame), info);
gitg_spinner_start (info->spinner);
#else
GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (info->dialog->priv->tree_view_remotes));
GValue cycle_duration = {0,};
GValue num_steps = {0,};
g_value_init (&cycle_duration, G_TYPE_UINT);
g_value_init (&num_steps, G_TYPE_UINT);
gtk_style_get_style_property (style, GTK_TYPE_SPINNER, "num-steps", &num_steps);
gtk_style_get_style_property (style, GTK_TYPE_SPINNER, "cycle-duration", &cycle_duration);
info->pulse_id = g_timeout_add (g_value_get_uint (&cycle_duration) /
g_value_get_uint (&num_steps),
/* We can't tell how often we are supposed to pulse so just pulse
* at the interval of the default engine. Yes this is annoying but,
* mclasen said to "blame the engine."
*/
info->pulse_id = g_timeout_add (750 / 12,
(GSourceFunc)pulse_row,
info);
g_value_unset (&cycle_duration);
g_value_unset (&num_steps);
#endif
gtk_tree_path_free (path);
update_fetch (info->dialog);
}
@ -516,7 +453,6 @@ init_properties(GitgRepositoryDialog *dialog)
init_remotes(dialog);
}
#ifndef BUILD_SPINNER
static void
fetch_data_spinner_cb (GtkTreeViewColumn *column,
GtkCellRenderer *cell,
@ -538,7 +474,6 @@ fetch_data_spinner_cb (GtkTreeViewColumn *column,
"pulse", pulse,
NULL);
}
#endif
static void
fetch_data_icon_cb (GtkTreeViewColumn *column,
@ -547,21 +482,6 @@ fetch_data_icon_cb (GtkTreeViewColumn *column,
GtkTreeIter *iter,
GitgRepositoryDialog *dialog)
{
#ifdef BUILD_SPINNER
GdkPixbuf *fetch;
gtk_tree_model_get (model, iter, COLUMN_SPINNER, &fetch, -1);
if (fetch)
{
g_object_set (cell, "pixbuf", fetch, NULL);
g_object_unref (fetch);
}
else
{
g_object_set (cell, "stock-id", GTK_STOCK_NETWORK, NULL);
}
#else
gboolean fetch;
gtk_tree_model_get (model, iter, COLUMN_FETCH, &fetch, -1);
@ -569,7 +489,6 @@ fetch_data_icon_cb (GtkTreeViewColumn *column,
g_object_set (G_OBJECT (cell),
"visible", !fetch,
NULL);
#endif
}
@ -603,7 +522,6 @@ create_repository_dialog (GitgWindow *window)
GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (b, "tree_view_remotes_column_name"));
#ifndef BUILD_SPINNER
GtkCellRenderer *spinner_renderer = gtk_cell_renderer_spinner_new ();
g_object_set (spinner_renderer, "visible", FALSE, NULL);
@ -615,7 +533,6 @@ create_repository_dialog (GitgWindow *window)
(GtkTreeCellDataFunc)fetch_data_spinner_cb,
repository_dialog,
NULL);
#endif
GtkCellRenderer *icon_renderer = GTK_CELL_RENDERER (gtk_builder_get_object (b, "tree_view_remotes_renderer_icon"));
gtk_tree_view_column_set_cell_data_func (column,

View file

@ -23,7 +23,6 @@
<property name="default_width">500</property>
<property name="default_height">300</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog_vbox_main">
<property name="visible">True</property>
@ -197,6 +196,7 @@
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<property name="expand">False</property>
<child>
<object class="GtkLabel" id="label_configuration_user_name">
<property name="visible">True</property>

View file

@ -485,16 +485,11 @@ free_cached_header (gpointer header)
static void
free_cached_headers (GitgRevisionChangesPanel *changes_panel)
{
g_slist_foreach (changes_panel->priv->cached_headers,
(GFunc)free_cached_header,
NULL);
g_slist_free (changes_panel->priv->cached_headers);
g_slist_free_full (changes_panel->priv->cached_headers, free_cached_header);
changes_panel->priv->cached_headers = NULL;
}
static void
gitg_revision_changes_panel_finalize (GObject *object)
{
@ -704,7 +699,7 @@ on_diff_files_begin_loading (GitgShell *shell,
gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (self->priv->diff_files)),
cursor);
gdk_cursor_unref (cursor);
g_object_unref (cursor);
}
static void
@ -819,7 +814,7 @@ on_diff_begin_loading (GitgShell *shell,
GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET(self->priv->diff)),
cursor);
gdk_cursor_unref (cursor);
g_object_unref (cursor);
}
static void

View file

@ -26,6 +26,7 @@
#include "gitg-revision-panel.h"
#include "gitg-stat-view.h"
#include "gitg-uri.h"
#include "gitg-avatar-cache.h"
#include <glib/gi18n.h>
#include <stdlib.h>
@ -46,6 +47,7 @@ struct _GitgRevisionDetailsPanelPrivate
GtkLabel *committer;
GtkLabel *subject;
GtkTable *parents;
GtkImage *avatar;
GtkWidget *panel_widget;
GtkTextView *text_view;
@ -60,6 +62,8 @@ struct _GitgRevisionDetailsPanelPrivate
GSList *stats;
GitgWindow *window;
GitgAvatarCache *cache;
};
static void gitg_revision_panel_iface_init (GitgRevisionPanelInterface *iface);
@ -125,6 +129,7 @@ initialize_ui (GitgRevisionDetailsPanel *panel)
priv->subject = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_subject"));
priv->parents = GTK_TABLE (gtk_builder_get_object (priv->builder, "table_parents"));
priv->text_view = GTK_TEXT_VIEW (gtk_builder_get_object (priv->builder, "text_view_details"));
priv->avatar = GTK_IMAGE (gtk_builder_get_object (priv->builder, "image_avatar"));
gchar const *lbls[] = {
"label_subject_lbl",
@ -211,6 +216,12 @@ gitg_revision_details_panel_dispose (GObject *object)
panel->priv->shell = NULL;
}
if (panel->priv->cache)
{
g_object_unref (panel->priv->cache);
panel->priv->cache = NULL;
}
G_OBJECT_CLASS (gitg_revision_details_panel_parent_class)->dispose (object);
}
static void
@ -236,7 +247,7 @@ on_shell_begin (GitgShell *shell,
panel->priv->in_stat = FALSE;
gdk_cursor_unref (cursor);
g_object_unref (cursor);
}
static gboolean
@ -369,7 +380,7 @@ make_stats_table (GitgRevisionDetailsPanel *panel)
0,
0.5);
g_signal_connect (file,
"clicked",
"activate-link",
G_CALLBACK (link_button_activate_link_cb),
panel->priv->window);
@ -548,6 +559,8 @@ gitg_revision_details_panel_init (GitgRevisionDetailsPanel *self)
"update",
G_CALLBACK (on_shell_update),
self);
self->priv->cache = gitg_avatar_cache_new ();
}
#define HASH_KEY "GitgRevisionDetailsPanelHashKey"
@ -691,7 +704,7 @@ update_parents (GitgRevisionDetailsPanel *self)
}
}
gdk_cursor_unref (cursor);
g_object_unref (cursor);
g_strfreev (parents);
}
@ -725,6 +738,51 @@ update_details (GitgRevisionDetailsPanel *panel)
g_free (sha1);
}
static void
avatar_ready (GObject *source_object,
GAsyncResult *res,
GitgRevisionDetailsPanel *panel)
{
GdkPixbuf *pixbuf;
GError *error = NULL;
pixbuf = gitg_avatar_cache_load_finish (panel->priv->cache,
res,
&error);
gtk_widget_set_visible (GTK_WIDGET (panel->priv->avatar),
error == NULL);
if (error == NULL)
{
gtk_image_set_from_pixbuf (panel->priv->avatar, pixbuf);
}
}
static void
set_avatar (GitgRevisionDetailsPanel *panel,
const gchar *email)
{
if (email == NULL || *email == '\0')
{
gtk_widget_hide (GTK_WIDGET (panel->priv->avatar));
}
else
{
gchar *uri;
uri = gitg_avatar_cache_get_gravatar_uri (panel->priv->cache,
email);
gitg_avatar_cache_load_uri_async (panel->priv->cache,
uri,
G_PRIORITY_DEFAULT,
NULL,
(GAsyncReadyCallback)avatar_ready,
panel);
g_free (uri);
}
}
static void
reload (GitgRevisionDetailsPanel *panel)
{
@ -775,6 +833,8 @@ reload (GitgRevisionDetailsPanel *panel)
gtk_clipboard_set_text (cb, sha, -1);
g_free (sha);
set_avatar (panel, gitg_revision_get_author_email (panel->priv->revision));
}
else
{
@ -782,6 +842,7 @@ reload (GitgRevisionDetailsPanel *panel)
gtk_label_set_text (panel->priv->committer, "");
gtk_label_set_text (panel->priv->subject, "");
gtk_label_set_text (panel->priv->sha, "");
set_avatar (panel, NULL);
}
// Update parents

View file

@ -1,130 +1,180 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkVBox" id="revision_details_page">
<object class="GtkBox" id="revision_details_page">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">3</property>
<child>
<object class="GtkTable" id="table1">
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label_author">
<object class="GtkGrid" id="grid2">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_sha">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_author_lbl">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Author:</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_sha_lbl">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">SHA:</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_committer_lbl">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Committer:</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_committer">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_subject">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_subject_lbl">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Subject:</property>
</object>
<packing>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkTable" id="table_parents">
<property name="visible">True</property>
<property name="n_columns">2</property>
<property name="column_spacing">3</property>
<property name="row_spacing">2</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<child>
<object class="GtkLabel" id="label_sha_lbl">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">SHA:</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_author_lbl">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Author:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_committer_lbl">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Committer:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_subject_lbl">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Subject:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_parent_lbl">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Parent:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkTable" id="table_parents">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="n_columns">2</property>
<property name="column_spacing">3</property>
<property name="row_spacing">2</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_subject">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_committer">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_author">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_sha">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="use_markup">True</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
@ -133,30 +183,63 @@
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_parent_lbl">
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Parent:</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="image_avatar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="padding">3</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@ -164,21 +247,22 @@
<object class="GtkScrolledWindow" id="scrolled_window_details">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="vexpand">True</property>
<property name="shadow_type">etched-in</property>
<child>
<object class="GtkTextView" id="text_view_details">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="wrap_mode">word-char</property>
<property name="cursor_visible">False</property>
<property name="accepts_tab">False</property>
<property name="wrap-mode">word-char</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>

View file

@ -287,8 +287,7 @@ on_selection_changed (GtkTreeSelection *selection,
path = gtk_tree_path_copy ((GtkTreePath *)rows->data);
}
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
if (!path)
{
@ -526,9 +525,6 @@ gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
files_view->priv->contents = GTK_SOURCE_VIEW (gtk_builder_get_object (builder,
"revision_files_contents"));
gtk_text_view_set_buffer (GTK_TEXT_VIEW(files_view->priv->contents),
GTK_TEXT_BUFFER(gtk_source_buffer_new (NULL)));
gitg_utils_set_monospace_font (GTK_WIDGET(files_view->priv->contents));
gtk_tree_view_set_model (files_view->priv->tree_view,
GTK_TREE_MODEL(files_view->priv->store));

View file

@ -1,5 +1,6 @@
<?xml version="1.0"?>
<interface>
<object class="GtkSourceBuffer" id="source_buffer"></object>
<object class="GitgRevisionFilesView" id="revision_files_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -50,6 +51,7 @@
<property name="shadow_type">etched-in</property>
<child>
<object class="GtkSourceView" id="revision_files_contents">
<property name="buffer">source_buffer</property>
<property name="editable">False</property>
<property name="show_line_numbers">True</property>
</object>

View file

@ -1,794 +0,0 @@
/*
* gitg-spinner.c
* This file is part of gitg
*
* Copyright (C) 2009 - Jesse van den kieboom
* Copyright (C) 2005 - Paolo Maggi
* Copyright (C) 2002-2004 Marco Pesenti Gritti
* Copyright (C) 2004 Christian Persch
* Copyright (C) 2000 - Eazel, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* This widget was originally written by Andy Hertzfeld <andy@eazel.com> for
* Nautilus. It was then modified by Marco Pesenti Gritti and Christian Persch
* for Epiphany.
*
* Modified by the gitg Team, 2005. See the AUTHORS file for a
* list of people on the gitg Team.
* See the ChangeLog files for a list of changes.
*
* Modified by the gitg team, 2009.
*
* $Id$
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "gitg-spinner.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
/* Spinner cache implementation */
#define GITG_TYPE_SPINNER_CACHE (gitg_spinner_cache_get_type())
#define GITG_SPINNER_CACHE(object) (G_TYPE_CHECK_INSTANCE_CAST((object), GITG_TYPE_SPINNER_CACHE, GitgSpinnerCache))
#define GITG_SPINNER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GITG_TYPE_SPINNER_CACHE, GitgSpinnerCacheClass))
#define GITG_IS_SPINNER_CACHE(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), GITG_TYPE_SPINNER_CACHE))
#define GITG_IS_SPINNER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GITG_TYPE_SPINNER_CACHE))
#define GITG_SPINNER_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GITG_TYPE_SPINNER_CACHE, GitgSpinnerCacheClass))
typedef struct _GitgSpinnerCache GitgSpinnerCache;
typedef struct _GitgSpinnerCacheClass GitgSpinnerCacheClass;
typedef struct _GitgSpinnerCachePrivate GitgSpinnerCachePrivate;
struct _GitgSpinnerCacheClass
{
GObjectClass parent_class;
};
struct _GitgSpinnerCache
{
GObject parent_object;
/*< private >*/
GitgSpinnerCachePrivate *priv;
};
#define GITG_SPINNER_CACHE_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GITG_TYPE_SPINNER_CACHE, GitgSpinnerCachePrivate))
struct _GitgSpinnerCachePrivate
{
/* Hash table of GdkScreen -> GitgSpinnerCacheData */
GHashTable *hash;
};
typedef struct
{
guint ref_count;
GtkIconSize size;
gint width;
gint height;
GdkPixbuf **animation_pixbufs;
guint n_animation_pixbufs;
} GitgSpinnerImages;
#define LAST_ICON_SIZE GTK_ICON_SIZE_DIALOG + 1
#define SPINNER_ICON_NAME "process-working"
#define SPINNER_FALLBACK_ICON_NAME "gnome-spinner"
#define GITG_SPINNER_IMAGES_INVALID ((GitgSpinnerImages *) 0x1)
typedef struct
{
GdkScreen *screen;
GtkIconTheme *icon_theme;
GitgSpinnerImages *images[LAST_ICON_SIZE];
} GitgSpinnerCacheData;
static void gitg_spinner_cache_class_init (GitgSpinnerCacheClass *klass);
static void gitg_spinner_cache_init (GitgSpinnerCache *cache);
static GObjectClass *gitg_spinner_cache_parent_class;
static GType
gitg_spinner_cache_get_type (void)
{
static GType type = 0;
if (G_UNLIKELY (type == 0))
{
const GTypeInfo our_info =
{
sizeof (GitgSpinnerCacheClass),
NULL,
NULL,
(GClassInitFunc) gitg_spinner_cache_class_init,
NULL,
NULL,
sizeof (GitgSpinnerCache),
0,
(GInstanceInitFunc) gitg_spinner_cache_init
};
type = g_type_register_static (G_TYPE_OBJECT,
"GitgSpinnerCache",
&our_info, 0);
}
return type;
}
static GitgSpinnerImages *
gitg_spinner_images_ref (GitgSpinnerImages *images)
{
g_return_val_if_fail (images != NULL, NULL);
images->ref_count++;
return images;
}
static void
gitg_spinner_images_unref (GitgSpinnerImages *images)
{
g_return_if_fail (images != NULL);
images->ref_count--;
if (images->ref_count == 0)
{
guint i;
/* LOG ("Freeing spinner images %p for size %d", images, images->size); */
for (i = 0; i < images->n_animation_pixbufs; ++i)
{
g_object_unref (images->animation_pixbufs[i]);
}
g_free (images->animation_pixbufs);
g_free (images);
}
}
static void
gitg_spinner_cache_data_unload (GitgSpinnerCacheData *data)
{
GtkIconSize size;
GitgSpinnerImages *images;
g_return_if_fail (data != NULL);
/* LOG ("GitgSpinnerDataCache unload for screen %p", data->screen); */
for (size = GTK_ICON_SIZE_INVALID; size < LAST_ICON_SIZE; ++size)
{
images = data->images[size];
data->images[size] = NULL;
if (images != NULL && images != GITG_SPINNER_IMAGES_INVALID)
{
gitg_spinner_images_unref (images);
}
}
}
static GdkPixbuf *
extract_frame (GdkPixbuf *grid_pixbuf,
int x,
int y,
int size)
{
GdkPixbuf *pixbuf;
if (x + size > gdk_pixbuf_get_width (grid_pixbuf) ||
y + size > gdk_pixbuf_get_height (grid_pixbuf))
{
return NULL;
}
pixbuf = gdk_pixbuf_new_subpixbuf (grid_pixbuf,
x, y,
size, size);
g_return_val_if_fail (pixbuf != NULL, NULL);
return pixbuf;
}
static GdkPixbuf *
scale_to_size (GdkPixbuf *pixbuf,
int dw,
int dh)
{
GdkPixbuf *result;
int pw, ph;
g_return_val_if_fail (pixbuf != NULL, NULL);
pw = gdk_pixbuf_get_width (pixbuf);
ph = gdk_pixbuf_get_height (pixbuf);
if (pw != dw || ph != dh)
{
result = gdk_pixbuf_scale_simple (pixbuf, dw, dh,
GDK_INTERP_BILINEAR);
g_object_unref (pixbuf);
return result;
}
return pixbuf;
}
static GitgSpinnerImages *
gitg_spinner_images_load (GdkScreen *screen,
GtkIconTheme *icon_theme,
GtkIconSize icon_size)
{
GitgSpinnerImages *images;
GdkPixbuf *icon_pixbuf, *pixbuf;
GtkIconInfo *icon_info = NULL;
int grid_width, grid_height, x, y, requested_size, size, isw, ish, n;
const char *icon;
GSList *list = NULL, *l;
/* LOG ("GitgSpinnerCacheData loading for screen %p at size %d", screen, icon_size); */
/* START_PROFILER ("loading spinner animation") */
if (screen == NULL)
screen = gdk_screen_get_default ();
if (!gtk_icon_size_lookup_for_settings (gtk_settings_get_for_screen (screen),
icon_size, &isw, &ish))
goto loser;
requested_size = MAX (ish, isw);
/* Load the animation. The 'rest icon' is the 0th frame */
icon_info = gtk_icon_theme_lookup_icon (icon_theme,
SPINNER_ICON_NAME,
requested_size, 0);
if (icon_info == NULL)
{
g_warning ("Throbber animation not found");
/* If the icon naming spec compliant name wasn't found, try the old name */
icon_info = gtk_icon_theme_lookup_icon (icon_theme,
SPINNER_FALLBACK_ICON_NAME,
requested_size, 0);
if (icon_info == NULL)
{
g_warning ("Throbber fallback animation not found either");
goto loser;
}
}
g_assert (icon_info != NULL);
size = gtk_icon_info_get_base_size (icon_info);
icon = gtk_icon_info_get_filename (icon_info);
if (icon == NULL)
goto loser;
icon_pixbuf = gdk_pixbuf_new_from_file (icon, NULL);
gtk_icon_info_free (icon_info);
icon_info = NULL;
if (icon_pixbuf == NULL)
{
g_warning ("Could not load the spinner file");
goto loser;
}
grid_width = gdk_pixbuf_get_width (icon_pixbuf);
grid_height = gdk_pixbuf_get_height (icon_pixbuf);
n = 0;
for (y = 0; y < grid_height; y += size)
{
for (x = 0; x < grid_width ; x += size)
{
pixbuf = extract_frame (icon_pixbuf, x, y, size);
if (pixbuf)
{
list = g_slist_prepend (list, pixbuf);
++n;
}
else
{
g_warning ("Cannot extract frame (%d, %d) from the grid\n", x, y);
}
}
}
g_object_unref (icon_pixbuf);
if (list == NULL)
goto loser;
/* g_assert (n > 0); */
if (size > requested_size)
{
for (l = list; l != NULL; l = l->next)
{
l->data = scale_to_size (l->data, isw, ish);
}
}
/* Now we've successfully got all the data */
images = g_new (GitgSpinnerImages, 1);
images->ref_count = 1;
images->size = icon_size;
images->width = images->height = requested_size;
images->n_animation_pixbufs = n;
images->animation_pixbufs = g_new (GdkPixbuf *, n);
for (l = list; l != NULL; l = l->next)
{
g_assert (l->data != NULL);
images->animation_pixbufs[--n] = l->data;
}
g_assert (n == 0);
g_slist_free (list);
/* STOP_PROFILER ("loading spinner animation") */
return images;
loser:
if (icon_info)
{
gtk_icon_info_free (icon_info);
}
g_slist_foreach (list, (GFunc) g_object_unref, NULL);
/* STOP_PROFILER ("loading spinner animation") */
return NULL;
}
static GitgSpinnerCacheData *
gitg_spinner_cache_data_new (GdkScreen *screen)
{
GitgSpinnerCacheData *data;
data = g_new0 (GitgSpinnerCacheData, 1);
data->screen = screen;
data->icon_theme = gtk_icon_theme_get_for_screen (screen);
g_signal_connect_swapped (data->icon_theme,
"changed",
G_CALLBACK (gitg_spinner_cache_data_unload),
data);
return data;
}
static void
gitg_spinner_cache_data_free (GitgSpinnerCacheData *data)
{
g_return_if_fail (data != NULL);
g_return_if_fail (data->icon_theme != NULL);
g_signal_handlers_disconnect_by_func (data->icon_theme,
G_CALLBACK (gitg_spinner_cache_data_unload),
data);
gitg_spinner_cache_data_unload (data);
g_free (data);
}
static GitgSpinnerImages *
gitg_spinner_cache_get_images (GitgSpinnerCache *cache,
GdkScreen *screen,
GtkIconSize icon_size)
{
GitgSpinnerCachePrivate *priv = cache->priv;
GitgSpinnerCacheData *data;
GitgSpinnerImages *images;
g_return_val_if_fail (icon_size >= 0 && icon_size < LAST_ICON_SIZE, NULL);
data = g_hash_table_lookup (priv->hash, screen);
if (data == NULL)
{
data = gitg_spinner_cache_data_new (screen);
/* FIXME: think about what happens when the screen's display is closed later on */
g_hash_table_insert (priv->hash, screen, data);
}
images = data->images[icon_size];
if (images == GITG_SPINNER_IMAGES_INVALID)
{
/* Load failed, but don't try endlessly again! */
return NULL;
}
if (images != NULL)
{
/* Return cached data */
return gitg_spinner_images_ref (images);
}
images = gitg_spinner_images_load (screen, data->icon_theme, icon_size);
if (images == NULL)
{
/* Mark as failed-to-load */
data->images[icon_size] = GITG_SPINNER_IMAGES_INVALID;
return NULL;
}
data->images[icon_size] = images;
return gitg_spinner_images_ref (images);
}
static void
gitg_spinner_cache_init (GitgSpinnerCache *cache)
{
GitgSpinnerCachePrivate *priv;
priv = cache->priv = GITG_SPINNER_CACHE_GET_PRIVATE (cache);
/* LOG ("GitgSpinnerCache initialising"); */
priv->hash = g_hash_table_new_full (g_direct_hash,
g_direct_equal,
NULL,
(GDestroyNotify) gitg_spinner_cache_data_free);
}
static void
gitg_spinner_cache_finalize (GObject *object)
{
GitgSpinnerCache *cache = GITG_SPINNER_CACHE (object);
GitgSpinnerCachePrivate *priv = cache->priv;
g_hash_table_destroy (priv->hash);
/* LOG ("GitgSpinnerCache finalised"); */
G_OBJECT_CLASS (gitg_spinner_cache_parent_class)->finalize (object);
}
static void
gitg_spinner_cache_class_init (GitgSpinnerCacheClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
gitg_spinner_cache_parent_class = g_type_class_peek_parent (klass);
object_class->finalize = gitg_spinner_cache_finalize;
g_type_class_add_private (object_class, sizeof (GitgSpinnerCachePrivate));
}
static GitgSpinnerCache *spinner_cache = NULL;
static GitgSpinnerCache *
gitg_spinner_cache_ref (void)
{
if (spinner_cache == NULL)
{
GitgSpinnerCache **cache_ptr;
spinner_cache = g_object_new (GITG_TYPE_SPINNER_CACHE, NULL);
cache_ptr = &spinner_cache;
g_object_add_weak_pointer (G_OBJECT (spinner_cache),
(gpointer *) cache_ptr);
return spinner_cache;
}
return g_object_ref (spinner_cache);
}
/* Spinner implementation */
#define SPINNER_TIMEOUT 50 /* ms */
#define GITG_SPINNER_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GITG_TYPE_SPINNER, GitgSpinnerPrivate))
struct _GitgSpinnerPrivate
{
GdkScreen *screen;
GitgSpinnerCache *cache;
GtkIconSize size;
GitgSpinnerImages *images;
guint current_image;
guint timeout;
guint timer_task;
guint spinning : 1;
guint need_load : 1;
};
enum
{
FRAME,
NUM_SIGNALS
};
static guint spinner_signals[NUM_SIGNALS] = {0,};
static void gitg_spinner_class_init (GitgSpinnerClass *class);
static void gitg_spinner_init (GitgSpinner *spinner);
static GObjectClass *parent_class;
GType
gitg_spinner_get_type (void)
{
static GType type = 0;
if (G_UNLIKELY (type == 0))
{
const GTypeInfo our_info =
{
sizeof (GitgSpinnerClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gitg_spinner_class_init,
NULL,
NULL, /* class_data */
sizeof (GitgSpinner),
0, /* n_preallocs */
(GInstanceInitFunc) gitg_spinner_init
};
type = g_type_register_static (G_TYPE_OBJECT,
"GitgSpinner",
&our_info, 0);
}
return type;
}
static gboolean
gitg_spinner_load_images (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
if (priv->need_load)
{
priv->images = gitg_spinner_cache_get_images (priv->cache, priv->screen, priv->size);
priv->current_image = 0; /* 'rest' icon */
priv->need_load = FALSE;
}
return priv->images != NULL;
}
static void
gitg_spinner_unload_images (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
if (priv->images != NULL)
{
gitg_spinner_images_unref (priv->images);
priv->images = NULL;
}
priv->current_image = 0;
priv->need_load = TRUE;
}
static void
gitg_spinner_init (GitgSpinner *spinner)
{
spinner->priv = GITG_SPINNER_GET_PRIVATE (spinner);
spinner->priv->cache = gitg_spinner_cache_ref ();
spinner->priv->size = GTK_ICON_SIZE_MENU;
spinner->priv->timeout = SPINNER_TIMEOUT;
spinner->priv->need_load = TRUE;
}
static gboolean
bump_spinner_frame_cb (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
/* This can happen when we've unloaded the images on a theme
* change, but haven't been in the queued size request yet.
* Just skip this update.
*/
if (priv->images == NULL)
{
if (!gitg_spinner_load_images (spinner))
{
return FALSE;
}
}
priv->current_image++;
if (priv->current_image >= priv->images->n_animation_pixbufs)
{
/* the 0th frame is the 'rest' icon */
priv->current_image = MIN (1, priv->images->n_animation_pixbufs);
}
g_signal_emit (spinner, spinner_signals[FRAME], 0, priv->images->animation_pixbufs[priv->current_image]);
/* run again */
return TRUE;
}
/**
* gitg_spinner_start:
* @spinner: a #GitgSpinner
*
* Start the spinner animation.
**/
void
gitg_spinner_start (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
priv->spinning = TRUE;
if (priv->timer_task == 0 && gitg_spinner_load_images (spinner))
{
/* the 0th frame is the 'rest' icon */
priv->current_image = MIN (0, priv->images->n_animation_pixbufs);
priv->timer_task = g_timeout_add_full (G_PRIORITY_LOW,
priv->timeout,
(GSourceFunc) bump_spinner_frame_cb,
spinner,
NULL);
bump_spinner_frame_cb (spinner);
}
}
static void
gitg_spinner_remove_update_callback (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
if (priv->timer_task != 0)
{
g_source_remove (priv->timer_task);
priv->timer_task = 0;
}
}
/**
* gitg_spinner_stop:
* @spinner: a #GitgSpinner
*
* Stop the spinner animation.
**/
void
gitg_spinner_stop (GitgSpinner *spinner)
{
GitgSpinnerPrivate *priv = spinner->priv;
priv->spinning = FALSE;
priv->current_image = 0;
if (priv->timer_task != 0)
{
gitg_spinner_remove_update_callback (spinner);
}
}
void
gitg_spinner_set_screen (GitgSpinner *spinner, GdkScreen *screen)
{
g_return_if_fail (GITG_IS_SPINNER (spinner));
g_return_if_fail (GDK_IS_SCREEN (screen));
if (spinner->priv->screen != screen)
{
gitg_spinner_unload_images (spinner);
if (spinner->priv->screen)
{
g_object_unref (spinner->priv->screen);
}
spinner->priv->screen = g_object_ref (screen);
}
}
static void
gitg_spinner_dispose (GObject *object)
{
//GitgSpinner *spinner = GITG_SPINNER (object);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gitg_spinner_finalize (GObject *object)
{
GitgSpinner *spinner = GITG_SPINNER (object);
gitg_spinner_remove_update_callback (spinner);
gitg_spinner_unload_images (spinner);
g_object_unref (spinner->priv->cache);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
gitg_spinner_class_init (GitgSpinnerClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
parent_class = g_type_class_peek_parent (class);
object_class->dispose = gitg_spinner_dispose;
object_class->finalize = gitg_spinner_finalize;
spinner_signals[FRAME] =
g_signal_new ("frame",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GitgSpinnerClass, frame),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
GDK_TYPE_PIXBUF);
g_type_class_add_private (object_class, sizeof (GitgSpinnerPrivate));
}
GitgSpinner *
gitg_spinner_new (GtkIconSize size)
{
GitgSpinner *spinner = g_object_new (GITG_TYPE_SPINNER, NULL);
spinner->priv->size = size;
return spinner;
}
GdkPixbuf *
gitg_spinner_get_pixbuf (GitgSpinner *spinner)
{
g_return_val_if_fail (GITG_IS_SPINNER (spinner), NULL);
if (spinner->priv->timer_task == 0)
{
return NULL;
}
return g_object_ref (spinner->priv->images->animation_pixbufs[spinner->priv->current_image]);
}

View file

@ -1,99 +0,0 @@
/*
* gitg-spinner.h
* This file is part of gitg
*
* Copyright (C) 2009 - Jesse van den Kieboom
* Copyright (C) 2005 - Paolo Maggi
* Copyright (C) 2000 - Eazel, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* This widget was originally written by Andy Hertzfeld <andy@eazel.com> for
* Nautilus.
*
* Modified by the gitg Team, 2005. See the AUTHORS file for a
* list of people on the gitg Team.
* See the ChangeLog files for a list of changes.
*
* Modified by the gitg Team, 2009
*
* $Id$
*/
#ifndef __GITG_SPINNER_H__
#define __GITG_SPINNER_H__
#include <gtk/gtk.h>
G_BEGIN_DECLS
/*
* Type checking and casting macros
*/
#define GITG_TYPE_SPINNER (gitg_spinner_get_type ())
#define GITG_SPINNER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GITG_TYPE_SPINNER, GitgSpinner))
#define GITG_SPINNER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GITG_TYPE_SPINNER, GitgSpinnerClass))
#define GITG_IS_SPINNER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GITG_TYPE_SPINNER))
#define GITG_IS_SPINNER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GITG_TYPE_SPINNER))
#define GITG_SPINNER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GITG_TYPE_SPINNER, GitgSpinnerClass))
/* Private structure type */
typedef struct _GitgSpinnerPrivate GitgSpinnerPrivate;
/*
* Main object structure
*/
typedef struct _GitgSpinner GitgSpinner;
struct _GitgSpinner
{
GObject parent;
/*< private >*/
GitgSpinnerPrivate *priv;
};
/*
* Class definition
*/
typedef struct _GitgSpinnerClass GitgSpinnerClass;
struct _GitgSpinnerClass
{
GObjectClass parent_class;
void (*frame)(GitgSpinner *spinner, GdkPixbuf *pixbuf);
};
/*
* Public methods
*/
GType gitg_spinner_get_type (void) G_GNUC_CONST;
GitgSpinner *gitg_spinner_new (GtkIconSize size);
void gitg_spinner_set_screen (GitgSpinner *spinner,
GdkScreen *screen);
void gitg_spinner_start (GitgSpinner *spinner);
void gitg_spinner_stop (GitgSpinner *spinner);
GdkPixbuf *gitg_spinner_get_pixbuf (GitgSpinner *spinner);
G_END_DECLS
#endif /* __GITG_SPINNER_H__ */

View file

@ -3,7 +3,6 @@
#include "gitg-utils.h"
#include <math.h>
#include <cairo.h>
#include "gseal-gtk-compat.h"
#define GITG_STAT_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_STAT_VIEW, GitgStatViewPrivate))
@ -64,9 +63,9 @@ gitg_stat_view_finalize (GObject *object)
static void
update_colors (GitgStatView *view)
{
GtkStyle *style;
GdkColor bg_color;
gdouble r, g, b;
GtkStyleContext *style_context;
GtkStateFlags state;
GdkRGBA bg_color;
gdouble hue, sat, val;
if (!gtk_widget_get_realized (GTK_WIDGET (view)))
@ -74,14 +73,11 @@ update_colors (GitgStatView *view)
return;
}
style = gtk_widget_get_style (GTK_WIDGET (view));
bg_color = style->base[gtk_widget_get_state (GTK_WIDGET (view))];
style_context = gtk_widget_get_style_context (GTK_WIDGET (view));
state = gtk_widget_get_state (GTK_WIDGET (view));
gtk_style_context_get_background_color (style_context, state, &bg_color);
r = bg_color.red / 65535.0;
g = bg_color.green / 65535.0;
b = bg_color.blue / 65535.0;
gtk_rgb_to_hsv (r, g, b, &hue, &sat, &val);
gtk_rgb_to_hsv (bg_color.red, bg_color.green, bg_color.blue, &hue, &sat, &val);
sat = MIN(sat * 0.5 + 0.5, 1);
val = MIN((pow(val + 1, 3) - 1) / 7 * 0.6 + 0.2, 1);
@ -117,21 +113,21 @@ gitg_stat_view_realize (GtkWidget *widget)
static void
update_styles (GitgStatView *view)
{
gtk_style_get (gtk_widget_get_style (GTK_WIDGET (view)),
GITG_TYPE_STAT_VIEW,
"radius", &view->priv->radius,
"stat-padding", &view->priv->stat_padding,
"show-lines", &view->priv->show_lines,
"lines-spacing", &view->priv->lines_spacing,
NULL);
gtk_style_context_get_style (gtk_widget_get_style_context (GTK_WIDGET (view)),
gtk_widget_get_state (GTK_WIDGET (view)),
"radius", &view->priv->radius,
"stat-padding", &view->priv->stat_padding,
"show-lines", &view->priv->show_lines,
"lines-spacing", &view->priv->lines_spacing,
NULL);
}
static void
gitg_stat_view_style_set (GtkWidget *widget, GtkStyle *prev_style)
gitg_stat_view_style_updated (GtkWidget *widget)
{
if (GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->style_set)
if (GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->style_updated)
{
GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->style_set (widget, prev_style);
GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->style_updated (widget);
}
update_colors (GITG_STAT_VIEW (widget));
@ -255,9 +251,9 @@ draw_stat (GitgStatView *view,
}
static gboolean
gitg_stat_view_expose (GtkWidget *widget, GdkEventExpose *event)
gitg_stat_view_draw (GtkWidget *widget,
cairo_t *ctx)
{
cairo_t *ctx;
GdkRectangle alloc;
guint added_width;
guint removed_width;
@ -265,9 +261,9 @@ gitg_stat_view_expose (GtkWidget *widget, GdkEventExpose *event)
GitgStatView *view;
guint padding;
if (GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->expose_event)
if (GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->draw)
{
GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->expose_event (widget, event);
GTK_WIDGET_CLASS (gitg_stat_view_parent_class)->draw (widget, ctx);
}
view = GITG_STAT_VIEW (widget);
@ -287,11 +283,6 @@ gitg_stat_view_expose (GtkWidget *widget, GdkEventExpose *event)
padding = 2;
}
ctx = gdk_cairo_create (event->window);
gdk_cairo_rectangle (ctx, &event->area);
cairo_clip (ctx);
gtk_widget_get_allocation (widget, &alloc);
update_gradients (view, &alloc);
@ -329,8 +320,6 @@ gitg_stat_view_expose (GtkWidget *widget, GdkEventExpose *event)
alloc.height);
}
cairo_destroy (ctx);
return TRUE;
}
@ -413,8 +402,8 @@ gitg_stat_view_class_init (GitgStatViewClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->expose_event = gitg_stat_view_expose;
widget_class->style_set = gitg_stat_view_style_set;
widget_class->draw = gitg_stat_view_draw;
widget_class->style_updated = gitg_stat_view_style_updated;
widget_class->realize = gitg_stat_view_realize;
widget_class->configure_event = gitg_stat_view_configure;

View file

@ -10,7 +10,6 @@
<property name="default_height">200</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog_vbox_main">
<property name="visible">True</property>

View file

@ -27,8 +27,6 @@
#include <string.h>
#include <math.h>
#include "gseal-gtk-compat.h"
gchar *
gitg_utils_get_content_type(GFile *file)
{
@ -159,7 +157,7 @@ gitg_utils_set_monospace_font(GtkWidget *widget)
if (description)
{
gtk_widget_modify_font(widget, description);
gtk_widget_override_font(widget, description);
pango_font_description_free(description);
}
}
@ -220,7 +218,7 @@ gitg_utils_menu_position_under_widget (GtkMenu *menu,
GtkRequisition requisition;
gdk_window_get_origin (gtk_widget_get_window (w), x, y);
gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
gtk_widget_get_preferred_size (GTK_WIDGET (menu), &requisition, NULL);
GtkAllocation alloc;
gtk_widget_get_allocation (w, &alloc);
@ -275,7 +273,7 @@ gitg_utils_menu_position_under_tree_view (GtkMenu *menu,
if (gtk_widget_get_direction (GTK_WIDGET (tree)) == GTK_TEXT_DIR_RTL)
{
GtkRequisition requisition;
gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
gtk_widget_get_preferred_size (GTK_WIDGET (menu), &requisition, NULL);
*x += rect.width - requisition.width;
}
}
@ -372,7 +370,7 @@ gitg_utils_find_cell_at_pos (GtkTreeView *tree_view, GtkTreeViewColumn *column,
continue;
}
gtk_cell_renderer_get_size (renderer, GTK_WIDGET (tree_view), NULL, NULL, NULL, &width, 0);
gtk_cell_renderer_get_preferred_width (renderer, GTK_WIDGET (tree_view), &width, NULL);
if (x >= start && x <= start + width)
{

View file

@ -46,8 +46,6 @@
#include "gitg-activatable.h"
#include "gitg-uri.h"
#include "gseal-gtk-compat.h"
#define DYNAMIC_ACTION_DATA_KEY "GitgDynamicActionDataKey"
#define DYNAMIC_ACTION_DATA_REMOTE_KEY "GitgDynamicActionDataRemoteKey"
#define DYNAMIC_ACTION_DATA_BRANCH_KEY "GitgDynamicActionDataBranchKey"
@ -192,7 +190,7 @@ gitg_window_finalize (GObject *object)
GitgWindow *self = GITG_WINDOW(object);
g_timer_destroy (self->priv->load_timer);
gdk_cursor_unref (self->priv->hand);
g_object_unref (self->priv->hand);
GList *copy = g_list_copy (self->priv->branch_actions);
GList *item;
@ -520,7 +518,7 @@ build_search_entry (GitgWindow *window,
GClosure *closure = g_cclosure_new (G_CALLBACK (focus_search), entry, NULL);
gtk_accel_group_connect (group, GDK_f, GDK_CONTROL_MASK, 0, closure);
gtk_accel_group_connect (group, GDK_KEY_f, GDK_CONTROL_MASK, 0, closure);
gtk_window_add_accel_group (GTK_WINDOW(window), group);
}
@ -1085,19 +1083,16 @@ gitg_window_delete_event (GtkWidget *widget,
}
static void
gitg_window_destroy (GtkObject *object)
gitg_window_destroy (GtkWidget *widget)
{
GitgWindow *window = GITG_WINDOW(object);
GitgWindow *window = GITG_WINDOW(widget);
if (!window->priv->destroy_has_run)
{
gtk_tree_view_set_model (window->priv->tree_view, NULL);
g_slist_foreach (window->priv->revision_panels, (GFunc)g_object_unref, NULL);
g_slist_free (window->priv->revision_panels);
g_slist_foreach (window->priv->activatables, (GFunc)g_object_unref, NULL);
g_slist_free (window->priv->activatables);
g_slist_free_full (window->priv->revision_panels, g_object_unref);
g_slist_free_full (window->priv->activatables, g_object_unref);
window->priv->revision_panels = NULL;
window->priv->activatables = NULL;
@ -1105,9 +1100,9 @@ gitg_window_destroy (GtkObject *object)
window->priv->destroy_has_run = TRUE;
}
if (GTK_OBJECT_CLASS(parent_class)->destroy)
if (GTK_WIDGET_CLASS(parent_class)->destroy)
{
GTK_OBJECT_CLASS(parent_class)->destroy (object);
GTK_WIDGET_CLASS(parent_class)->destroy (widget);
}
}
@ -1125,7 +1120,7 @@ gitg_window_window_state_event (GtkWidget *widget,
show = !(event->new_window_state &
(GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN));
gtk_statusbar_set_has_resize_grip (window->priv->statusbar, show);
gtk_window_set_has_resize_grip (GTK_WINDOW (window), show);
}
/* Save the window state */
@ -1182,7 +1177,6 @@ static void
gitg_window_class_init (GitgWindowClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkWindowClass *window_class = GTK_WINDOW_CLASS (klass);
@ -1190,8 +1184,8 @@ gitg_window_class_init (GitgWindowClass *klass)
object_class->finalize = gitg_window_finalize;
object_class->dispose = gitg_window_dispose;
gtkobject_class->destroy = gitg_window_destroy;
widget_class->destroy = gitg_window_destroy;
widget_class->delete_event = gitg_window_delete_event;
widget_class->window_state_event = gitg_window_window_state_event;
window_class->set_focus = gitg_window_set_focus;
@ -1651,8 +1645,7 @@ fill_branches_combo (GitgWindow *window)
gtk_combo_box_set_active_iter (window->priv->combo_branches, &active);
}
g_slist_foreach (refs, (GFunc)gitg_ref_free, NULL);
g_slist_free (refs);
g_slist_free_full (refs, (GDestroyNotify)gitg_ref_free);
if (active_from_selection)
{
@ -1700,7 +1693,7 @@ on_repository_load (GitgRepository *repository,
{
GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (window->priv->tree_view)), cursor);
gdk_cursor_unref (cursor);
g_object_unref (cursor);
gtk_statusbar_push (window->priv->statusbar, 0, _ ("Begin loading repository"));
@ -2217,20 +2210,7 @@ on_help_about (GtkAction *action,
static gchar const copyright[] = "Copyright \xc2\xa9 2009 Jesse van den Kieboom";
static gchar const *authors[] = {"Jesse van den Kieboom <jessevdk@gnome.org>", NULL};
static gchar const *comments = N_ ("gitg is a git repository viewer for gtk+/GNOME");
static gchar const *license = N_ ("This program is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"
"the Free Software Foundation; either version 2 of the License, or\n"
"(at your option) any later version.\n"
"\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n"
"\n"
"You should have received a copy of the GNU General Public License\n"
"along with this program; if not, write to the Free Software\n"
"Foundation, Inc., 59 Temple Place, Suite 330,\n"
"Boston, MA 02111-1307, USA.");
gchar *path = gitg_dirs_get_data_filename ("icons", "gitg.svg", NULL);
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (path, NULL);
@ -2249,8 +2229,9 @@ on_help_about (GtkAction *action,
"comments", _ (comments),
"version", VERSION,
"website", PACKAGE_URL,
"website-label", "gitg homepage",
"logo", pixbuf,
"license", _ (license),
"license-type", GTK_LICENSE_GPL_2_0,
NULL);
if (pixbuf)
@ -2721,8 +2702,7 @@ update_merge_rebase (GitgWindow *window,
}
}
g_slist_foreach (refs, (GFunc)gitg_ref_free, NULL);
g_slist_free (refs);
g_slist_free_full (refs, (GDestroyNotify)gitg_ref_free);
if (gitg_ref_get_ref_type (ref) == GITG_REF_TYPE_BRANCH)
{
@ -2804,8 +2784,7 @@ has_local_ref (GitgWindow *window,
}
}
g_slist_foreach (refs, (GFunc)gitg_ref_free, NULL);
g_slist_free (refs);
g_slist_free_full (refs, (GDestroyNotify)gitg_ref_free);
return ret;
}
@ -2964,8 +2943,7 @@ on_cherry_pick_activated (GtkAction *action,
gitg_revision_unref (rev);
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
static void
@ -3050,8 +3028,7 @@ update_cherry_pick (GitgWindow *window)
}
}
g_slist_foreach (refs, (GFunc)gitg_ref_free, NULL);
g_slist_free (refs);
g_slist_free_full (refs, (GDestroyNotify)gitg_ref_free);
}
static gboolean
@ -3117,8 +3094,7 @@ popup_revision (GitgWindow *window,
gtk_action_set_visible (tag, FALSE);
}
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
if (!show)
{
@ -3394,9 +3370,7 @@ on_format_patch_response (GtkDialog *dialog,
}
}
g_list_foreach (info->revisions, (GFunc)gitg_revision_unref, NULL);
g_list_free (info->revisions);
g_list_free_full (info->revisions, (GDestroyNotify)gitg_revision_unref);
g_slice_free (FormatPatchInfo, info);
gtk_widget_destroy (GTK_WIDGET (dialog));
@ -3481,8 +3455,7 @@ on_revision_format_patch_activate (GtkAction *action,
gtk_widget_show (dialog);
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
void
@ -3525,8 +3498,7 @@ on_revision_new_branch_activate (GtkAction *action,
gitg_revision_unref (rev);
}
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
void
@ -3577,8 +3549,7 @@ on_revision_tag_activate (GtkAction *action,
gitg_revision_unref (rev);
}
g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
g_list_free (rows);
g_list_free_full (rows, (GDestroyNotify)gtk_tree_path_free);
}
void

View file

@ -162,8 +162,7 @@ set_icons ()
gtk_window_set_default_icon_list (icons);
g_list_foreach (icons, (GFunc)g_object_unref, NULL);
g_list_free (icons);
g_list_free_full (icons, g_object_unref);
}
int

View file

@ -1,21 +0,0 @@
#include "gseal-gtk-compat.h"
#if !GTK_CHECK_VERSION (2, 24, 0)
gint
gitg_gseal_gtk_compat_window_get_width (GdkWindow *window)
{
gint width;
gdk_drawable_get_size (GDK_DRAWABLE (window), &width, NULL);
return width;
}
gint
gitg_gseal_gtk_compat_window_get_height (GdkWindow *window)
{
gint height;
gdk_drawable_get_size (GDK_DRAWABLE (window), NULL, &height);
return height;
}
#endif

View file

@ -1,47 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2009 Thomas H.P. Andersen <phomes@gmail.com>,
* 2009 Javier Jardón <jjardon@gnome.org>
*
* This runtime is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1, or (at your option)
* any later version.
*
* This runtime is distributed in the hope runtime it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* 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 License
* along with this runtime; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef GSEAL_GTK_COMPAT_H
#define GSEAL_GTK_COMPAT_H
#include <gtk/gtk.h>
G_BEGIN_DECLS
#if !GTK_CHECK_VERSION(2, 24, 0)
gint gitg_gseal_gtk_compat_window_get_width (GdkWindow *window);
gint gitg_gseal_gtk_compat_window_get_height (GdkWindow *window);
#define gdk_window_get_width(window) gitg_gseal_gtk_compat_window_get_width(window)
#define gdk_window_get_height(window) gitg_gseal_gtk_compat_window_get_height(window)
#endif /* GTK < 2.24.0 */
#if !GTK_CHECK_VERSION (2, 22, 0)
#define gdk_drag_context_list_targets(context) ((context)->targets)
#endif /* GTK < 2.22.0 */
#if !GTK_CHECK_VERSION (2, 20, 0)
#define gtk_widget_get_mapped(widget) (GTK_WIDGET_MAPPED ((widget)))
#define gtk_widget_get_realized(widget) (GTK_WIDGET_REALIZED ((widget)))
#endif /* GTK < 2.20.0 */
G_END_DECLS
#endif /* GSEAL_GTK_COMPAT_H */
/* ex:ts=8:noet: */

View file

@ -101,8 +101,7 @@ collapsed_lane_new (LaneContainer *container)
static void
free_lanes (GitgLanes *lanes)
{
g_slist_foreach (lanes->priv->lanes, (GFunc)lane_container_free, NULL);
g_slist_free (lanes->priv->lanes);
g_slist_free_full (lanes->priv->lanes, (GDestroyNotify)lane_container_free);
lanes->priv->lanes = NULL;
}
@ -316,8 +315,7 @@ gitg_lanes_reset (GitgLanes *lanes)
free_lanes (lanes);
gitg_color_reset ();
g_slist_foreach (lanes->priv->previous, (GFunc)gitg_revision_unref, NULL);
g_slist_free (lanes->priv->previous);
g_slist_free_full (lanes->priv->previous, (GDestroyNotify)gitg_revision_unref);
lanes->priv->previous = NULL;

View file

@ -327,10 +327,7 @@ gitg_line_parser_constructed (GObject *object)
stream->priv->read_buffer = g_slice_alloc (sizeof (gchar) * (stream->priv->buffer_size + 1));
if (G_OBJECT_CLASS (gitg_line_parser_parent_class)->constructed)
{
G_OBJECT_CLASS (gitg_line_parser_parent_class)->constructed (object);
}
G_OBJECT_CLASS (gitg_line_parser_parent_class)->constructed (object);
}
static void start_read_lines (AsyncData *data);

View file

@ -719,10 +719,7 @@ gitg_repository_constructed (GObject *object)
install_head_monitor (repository);
if (G_OBJECT_CLASS (gitg_repository_parent_class)->constructed)
{
G_OBJECT_CLASS (gitg_repository_parent_class)->constructed (object);
}
G_OBJECT_CLASS (gitg_repository_parent_class)->constructed (object);
}
static void
@ -1140,8 +1137,7 @@ on_loader_update (GitgShell *object,
static void
free_refs (GSList *refs)
{
g_slist_foreach (refs, (GFunc)gitg_ref_free, NULL);
g_slist_free (refs);
g_slist_free_full (refs, (GDestroyNotify)gitg_ref_free);
}
static gboolean

View file

@ -53,8 +53,7 @@ G_DEFINE_BOXED_TYPE (GitgRevision, gitg_revision, gitg_revision_ref, gitg_revisi
static void
free_lanes (GitgRevision *rv)
{
g_slist_foreach (rv->lanes, (GFunc)gitg_lane_free, NULL);
g_slist_free (rv->lanes);
g_slist_free_full (rv->lanes, (GDestroyNotify)gitg_lane_free);
rv->lanes = NULL;
}