[Xfce4-commits] [apps/xfce4-terminal] 01/01: Implement background image support
noreply at xfce.org
noreply at xfce.org
Tue Sep 20 14:06:19 CEST 2016
This is an automated email from the git hooks/post-receive script.
f2404 pushed a commit to branch master
in repository apps/xfce4-terminal.
commit fb0409e56c9cf305e7ad89f8f76a5a90e6017799
Author: Igor <f2404 at yandex.ru>
Date: Tue Sep 20 15:05:42 2016 +0300
Implement background image support
Fixes https://bugzilla.xfce.org/show_bug.cgi?id=12845
---
terminal/terminal-image-loader.c | 43 +--------
terminal/terminal-screen.c | 182 ++++++++++++++++++---------------------
2 files changed, 88 insertions(+), 137 deletions(-)
diff --git a/terminal/terminal-image-loader.c b/terminal/terminal-image-loader.c
index f03d4bd..4f1500c 100644
--- a/terminal/terminal-image-loader.c
+++ b/terminal/terminal-image-loader.c
@@ -29,8 +29,6 @@
static void terminal_image_loader_finalize (GObject *object);
static void terminal_image_loader_check (TerminalImageLoader *loader);
-static void terminal_image_loader_pixbuf_destroyed (gpointer data,
- GObject *pixbuf);
static void terminal_image_loader_tile (TerminalImageLoader *loader,
GdkPixbuf *target,
gint width,
@@ -101,8 +99,8 @@ terminal_image_loader_finalize (GObject *object)
{
TerminalImageLoader *loader = TERMINAL_IMAGE_LOADER (object);
- terminal_assert (loader->cache == NULL);
- terminal_assert (loader->cache_invalid == NULL);
+ g_slist_free_full (loader->cache, g_object_unref);
+ g_slist_free_full (loader->cache_invalid, g_object_unref);
g_object_unref (G_OBJECT (loader->preferences));
@@ -179,38 +177,6 @@ terminal_image_loader_check (TerminalImageLoader *loader)
static void
-terminal_image_loader_pixbuf_destroyed (gpointer data,
- GObject *pixbuf)
-{
- TerminalImageLoader *loader = TERMINAL_IMAGE_LOADER (data);
- GSList *lp;
-
- for (lp = loader->cache; lp != NULL; lp = lp->next)
- if (lp->data == pixbuf)
- {
- loader->cache = g_slist_delete_link (loader->cache, lp);
- g_object_unref (G_OBJECT (loader));
- return;
- }
-
- for (lp = loader->cache_invalid; lp != NULL; lp = lp->next)
- if (lp->data == pixbuf)
- {
- loader->cache_invalid = g_slist_delete_link (loader->cache_invalid, lp);
- g_object_unref (G_OBJECT (loader));
- return;
- }
-
-#ifdef G_ENABLE_DEBUG
- g_warning ("Pixbuf %p was freed from loader cache %p, "
- "this should not happend", pixbuf, loader);
- terminal_assert_not_reached ();
-#endif
-}
-
-
-
-static void
terminal_image_loader_tile (TerminalImageLoader *loader,
GdkPixbuf *target,
gint width,
@@ -537,11 +503,8 @@ terminal_image_loader_load (TerminalImageLoader *loader,
terminal_image_loader_saturate (loader, pixbuf);
loader->cache = g_slist_prepend (loader->cache, pixbuf);
- g_object_weak_ref (G_OBJECT (pixbuf), terminal_image_loader_pixbuf_destroyed,
- g_object_ref (G_OBJECT (loader)));
- return pixbuf;
+ return g_object_ref (G_OBJECT (pixbuf));
}
-
diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c
index 1a30217..1c22b84 100644
--- a/terminal/terminal-screen.c
+++ b/terminal/terminal-screen.c
@@ -92,6 +92,9 @@ static void terminal_screen_set_property (GObject
GParamSpec *pspec);
static void terminal_screen_realize (GtkWidget *widget);
static void terminal_screen_unrealize (GtkWidget *widget);
+static gboolean terminal_screen_draw (GtkWidget *widget,
+ cairo_t *cr,
+ gpointer user_data);
static void terminal_screen_preferences_changed (TerminalPreferences *preferences,
GParamSpec *pspec,
TerminalScreen *screen);
@@ -103,7 +106,6 @@ static gchar *terminal_screen_parse_title (TerminalScreen
const gchar *title);
static gchar **terminal_screen_get_child_environment (TerminalScreen *screen);
static void terminal_screen_update_background (TerminalScreen *screen);
-static void terminal_screen_update_background_fast (TerminalScreen *screen);
static void terminal_screen_update_binding_backspace (TerminalScreen *screen);
static void terminal_screen_update_binding_delete (TerminalScreen *screen);
static void terminal_screen_update_encoding (TerminalScreen *screen);
@@ -135,8 +137,6 @@ static void terminal_screen_vte_resize_window (VteTerminal
TerminalScreen *screen);
static void terminal_screen_vte_window_contents_changed (TerminalScreen *screen);
static void terminal_screen_vte_window_contents_resized (TerminalScreen *screen);
-static gboolean terminal_screen_timer_background (gpointer user_data);
-static void terminal_screen_timer_background_destroy (gpointer user_data);
static void terminal_screen_update_label_orientation (TerminalScreen *screen);
static gchar *terminal_screen_zoom_font (TerminalScreen *screen,
gchar *font_name,
@@ -155,6 +155,7 @@ struct _TerminalScreen
{
GtkHBox parent_instance;
TerminalPreferences *preferences;
+ TerminalImageLoader *loader;
GtkWidget *terminal;
GtkWidget *scrollbar;
GtkWidget *tab_label;
@@ -163,8 +164,6 @@ struct _TerminalScreen
guint session_id;
- gulong background_signal_id;
-
GPid pid;
gchar *working_directory;
@@ -173,8 +172,6 @@ struct _TerminalScreen
guint hold : 1;
- guint background_timer_id;
-
guint activity_timeout_id;
time_t activity_resize_time;
};
@@ -255,6 +252,7 @@ terminal_screen_class_init (TerminalScreenClass *klass)
static void
terminal_screen_init (TerminalScreen *screen)
{
+ screen->loader = NULL;
screen->working_directory = g_get_current_dir ();
screen->session_id = ++screen_last_session_id;
@@ -271,6 +269,8 @@ terminal_screen_init (TerminalScreen *screen)
G_CALLBACK (terminal_screen_vte_window_title_changed), screen);
g_signal_connect (G_OBJECT (screen->terminal), "resize-window",
G_CALLBACK (terminal_screen_vte_resize_window), screen);
+ g_signal_connect (G_OBJECT (screen->terminal), "draw",
+ G_CALLBACK (terminal_screen_draw), screen);
gtk_box_pack_start (GTK_BOX (screen), screen->terminal, TRUE, TRUE, 0);
screen->scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL,
@@ -297,7 +297,7 @@ terminal_screen_init (TerminalScreen *screen)
terminal_screen_update_scrolling_on_output (screen);
terminal_screen_update_scrolling_on_keystroke (screen);
terminal_screen_update_word_chars (screen);
- terminal_screen_timer_background (screen);
+ terminal_screen_update_background (screen);
terminal_screen_update_colors (screen);
/* last, connect contents-changed to avoid a race with updates above */
@@ -320,14 +320,14 @@ terminal_screen_finalize (GObject *object)
if (screen->activity_timeout_id != 0)
g_source_remove (screen->activity_timeout_id);
- if (screen->background_timer_id != 0)
- g_source_remove (screen->background_timer_id);
-
/* detach from preferences */
g_signal_handlers_disconnect_by_func (screen->preferences,
G_CALLBACK (terminal_screen_preferences_changed), screen);
g_object_unref (G_OBJECT (screen->preferences));
+ if (screen->loader != NULL)
+ g_object_unref (G_OBJECT (screen->loader));
+
g_strfreev (screen->custom_command);
g_free (screen->working_directory);
g_free (screen->custom_title);
@@ -454,6 +454,63 @@ terminal_screen_unrealize (GtkWidget *widget)
+static gboolean
+terminal_screen_draw (GtkWidget *widget,
+ cairo_t *cr,
+ gpointer user_data)
+{
+ TerminalScreen *screen = TERMINAL_SCREEN (user_data);
+ TerminalBackground background_mode;
+ GdkPixbuf *image;
+ gint width, height;
+ cairo_surface_t *surface;
+ cairo_t *ctx;
+
+ terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), FALSE);
+ terminal_return_val_if_fail (VTE_IS_TERMINAL (screen->terminal), FALSE);
+
+ g_object_get (G_OBJECT (screen->preferences), "background-mode", &background_mode, NULL);
+
+ if (G_LIKELY (background_mode != TERMINAL_BACKGROUND_IMAGE))
+ return FALSE;
+
+ width = gtk_widget_get_allocated_width (screen->terminal);
+ height = gtk_widget_get_allocated_height (screen->terminal);
+
+ if (screen->loader == NULL)
+ screen->loader = terminal_image_loader_get ();
+ image = terminal_image_loader_load (screen->loader, width, height);
+
+ if (G_UNLIKELY (image == NULL))
+ return FALSE;
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (screen->terminal),
+ G_CALLBACK (terminal_screen_draw), screen);
+
+ cairo_save (cr);
+
+ gdk_cairo_set_source_pixbuf (cr, image, 0, 0);
+ cairo_paint (cr);
+ g_object_unref (G_OBJECT (image));
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ ctx = cairo_create (surface);
+ gtk_widget_draw (screen->terminal, ctx);
+ cairo_set_source_surface (cr, surface, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (ctx);
+ cairo_surface_destroy (surface);
+
+ cairo_restore (cr);
+
+ g_signal_connect (G_OBJECT (screen->terminal), "draw",
+ G_CALLBACK (terminal_screen_draw), screen);
+
+ return TRUE;
+}
+
+
+
static void
terminal_screen_preferences_changed (TerminalPreferences *preferences,
GParamSpec *pspec,
@@ -747,27 +804,28 @@ terminal_screen_get_child_environment (TerminalScreen *screen)
static void
-terminal_screen_update_background_fast (TerminalScreen *screen)
+terminal_screen_update_background (TerminalScreen *screen)
{
- if (G_UNLIKELY (screen->background_timer_id == 0))
- {
- screen->background_timer_id =
- gdk_threads_add_idle_full (G_PRIORITY_LOW, terminal_screen_timer_background,
- screen, terminal_screen_timer_background_destroy);
- }
-}
+ TerminalBackground background_mode;
+ gdouble background_darkness;
+ terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), FALSE);
+ terminal_return_val_if_fail (VTE_IS_TERMINAL (screen->terminal), FALSE);
+ g_object_get (G_OBJECT (screen->preferences), "background-mode", &background_mode, NULL);
-static void
-terminal_screen_update_background (TerminalScreen *screen)
-{
- if (G_UNLIKELY (screen->background_timer_id != 0))
- g_source_remove (screen->background_timer_id);
+ if (G_UNLIKELY (background_mode == TERMINAL_BACKGROUND_IMAGE ||
+ background_mode == TERMINAL_BACKGROUND_TRANSPARENT))
+ {
+ g_object_get (G_OBJECT (screen->preferences), "background-darkness", &background_darkness, NULL);
+ }
+ else
+ background_darkness = 1.0;
+
+ screen->background_color.alpha = background_darkness;
+ vte_terminal_set_color_background (VTE_TERMINAL (screen->terminal), &screen->background_color);
- screen->background_timer_id =
- gdk_threads_add_timeout_full (G_PRIORITY_LOW, 250, terminal_screen_timer_background,
- screen, terminal_screen_timer_background_destroy);
+ gtk_widget_queue_draw (GTK_WIDGET (screen));
}
@@ -1349,76 +1407,6 @@ terminal_screen_vte_window_contents_resized (TerminalScreen *screen)
-static gboolean
-terminal_screen_timer_background (gpointer user_data)
-{
- TerminalScreen *screen = TERMINAL_SCREEN (user_data);
- TerminalImageLoader *loader;
- TerminalBackground background_mode;
- GdkPixbuf *image;
- gdouble background_darkness;
-
- terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), FALSE);
- terminal_return_val_if_fail (VTE_IS_TERMINAL (screen->terminal), FALSE);
-
- g_object_get (G_OBJECT (screen->preferences), "background-mode", &background_mode, NULL);
-
- if (G_UNLIKELY (background_mode == TERMINAL_BACKGROUND_IMAGE))
- {
- loader = terminal_image_loader_get ();
- image = terminal_image_loader_load (loader,
- gtk_widget_get_allocated_width (screen->terminal),
- gtk_widget_get_allocated_height (screen->terminal));
- //vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), image);
- if (G_LIKELY (image != NULL))
- g_object_unref (G_OBJECT (image));
- g_object_unref (G_OBJECT (loader));
-
- /* refresh background on size changes */
- if (screen->background_signal_id == 0)
- {
- screen->background_signal_id =
- g_signal_connect_swapped (G_OBJECT (screen->terminal), "size-allocate",
- G_CALLBACK (terminal_screen_update_background_fast), screen);
- }
- }
- else
- {
- /* stop updating on size changes */
- if (screen->background_signal_id != 0)
- {
- g_signal_handler_disconnect (G_OBJECT (screen->terminal), screen->background_signal_id);
- screen->background_signal_id = 0;
- }
-
- /* WARNING: the causes a resize too! */
- //vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), NULL);
- }
-
- if (G_UNLIKELY (background_mode == TERMINAL_BACKGROUND_IMAGE
- || background_mode == TERMINAL_BACKGROUND_TRANSPARENT))
- {
- g_object_get (G_OBJECT (screen->preferences), "background-darkness", &background_darkness, NULL);
- }
- else
- background_darkness = 1.0;
-
- screen->background_color.alpha = background_darkness;
- vte_terminal_set_color_background (VTE_TERMINAL (screen->terminal), &screen->background_color);
-
- return FALSE;
-}
-
-
-
-static void
-terminal_screen_timer_background_destroy (gpointer user_data)
-{
- TERMINAL_SCREEN (user_data)->background_timer_id = 0;
-}
-
-
-
static void
terminal_screen_update_label_orientation (TerminalScreen *screen)
{
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list