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 <f2...@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. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits