[Xfce4-commits] <parole:bluesabre/gtk3> Start reimplementing gst-logo

Sean Davis noreply at xfce.org
Tue Aug 20 04:52:01 CEST 2013


Updating branch refs/heads/bluesabre/gtk3
         to 5698714a4e4235fa457dcc349487945b8bf93773 (commit)
       from b285c76bcac9b894c871716f8ee2b9144cd2b7b6 (commit)

commit 5698714a4e4235fa457dcc349487945b8bf93773
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Mon Aug 19 22:50:52 2013 -0400

    Start reimplementing gst-logo

 src/parole-player.c |  127 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 127 insertions(+)

diff --git a/src/parole-player.c b/src/parole-player.c
index 0a5a604..ab6f403 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -121,6 +121,9 @@ static gboolean            parole_audiobox_expose_event (GtkWidget *w, GdkEventE
 /*
  * GtkBuilder Callbacks
  */
+void on_content_area_size_allocate (GtkWidget *widget, GtkAllocation *allocation, ParolePlayer *player);
+
+ 
 gboolean        parole_player_configure_event_cb        (GtkWidget *widget, 
 							 GdkEventConfigure *ev, 
 							 ParolePlayer *player);
@@ -335,6 +338,8 @@ struct ParolePlayerPrivate
     GtkWidget		*control; /* contains all play button*/
     GtkWidget		*fullscreen_button;
     GtkWidget		*fullscreen_image;
+    GdkPixbuf       *logo;
+    gboolean        scale_logo;
     
     GtkWidget		*hbox_infobar;
     GtkWidget		*infobar;
@@ -2756,6 +2761,122 @@ parole_audiobox_expose_event (GtkWidget *w, GdkEventExpose *ev, ParolePlayer *pl
     return FALSE;
 }
 
+void
+on_content_area_size_allocate (GtkWidget *widget, GtkAllocation *allocation, ParolePlayer *player)
+{
+    g_print("size allocate\n");
+    g_return_if_fail (allocation != NULL);
+    
+    gtk_widget_set_allocation(widget, allocation);
+
+    if ( gtk_widget_get_realized (widget) )
+    {	
+	player->priv->scale_logo = TRUE;
+	
+	gtk_widget_queue_draw (widget);
+	}
+}
+
+static void
+parole_draw_logo (ParolePlayer *player)
+{
+    static GdkPixbuf *pix = NULL;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    cairo_region_t *region;
+    GdkRGBA *color;
+    cairo_t *cr;
+#else
+    GdkRegion *region;
+#endif
+    GdkRectangle rect;
+    GtkWidget *widget;
+    GtkAllocation *allocation = g_new0 (GtkAllocation, 1);
+
+    widget = GTK_WIDGET (player->priv->eventbox_output);
+
+    if ( !gtk_widget_get_window(widget) )
+	return;
+
+    rect.x = 0;
+    rect.y = 0;
+    
+    gtk_widget_get_allocation(widget, allocation);
+    rect.width = allocation->width;
+    rect.height = allocation->height;
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+    region = cairo_region_create_rectangle(&rect);
+#else
+    region = gdk_region_rectangle (&rect);
+#endif
+    
+    gdk_window_begin_paint_region (gtk_widget_get_window(widget),
+				   region);
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+    cairo_region_destroy (region);
+
+    GdkWindow *window;
+    cairo_surface_t *target;
+
+    window = gtk_widget_get_window (widget);
+
+    //target = cairo_get_group_target (cr);
+    
+    /* Clear to parent-relative pixmap
+    * We need to use direct X access here because GDK doesn't know about
+    * the parent relative pixmap. */
+    //cairo_surface_flush (target);
+
+    XClearArea (GDK_WINDOW_XDISPLAY (window),
+                GDK_WINDOW_XID (window),
+                0, 0,
+                allocation->width, allocation->height,
+                False);/*
+    cairo_surface_mark_dirty_rectangle (target,
+                                        0, 0,
+                                        allocation->width, allocation->height);*/
+#else
+    gdk_region_destroy (region);
+    
+    gdk_window_clear_area (gtk_widget_get_window(widget),
+			   0, 0,
+			   allocation->width,
+			   allocation->height);
+#endif
+
+    if (player->priv->scale_logo)
+    {
+	if (pix)
+	    g_object_unref (pix);
+	pix = gdk_pixbuf_scale_simple (player->priv->logo,
+				       allocation->width,
+				       allocation->height,
+				       GDK_INTERP_BILINEAR);
+	player->priv->scale_logo = FALSE;
+    }
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+    cr = gdk_cairo_create (gtk_widget_get_window(widget));
+    gdk_cairo_set_source_pixbuf (cr, pix, 0, 0);
+    cairo_paint (cr);
+    cairo_destroy (cr);
+#else
+    gdk_draw_pixbuf (GDK_DRAWABLE (gtk_widget_get_window(widget)),
+		     gtk_widget_get_style(widget)->fg_gc[0],
+		     pix,
+		     0, 0, 0, 0,
+		     allocation->width,
+		     allocation->height,
+		     GDK_RGB_DITHER_NONE,
+		     0, 0);
+#endif
+
+    gdk_window_end_paint (gtk_widget_get_window(GTK_WIDGET (player->priv->eventbox_output)));
+    
+    g_free(allocation);
+}
+
 gboolean
 parole_player_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, ParolePlayer *player)
 {
@@ -2770,6 +2891,8 @@ parole_player_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, Paro
 		      NULL);
     }
     
+    parole_draw_logo(player);
+    
     return FALSE;
 }
 
@@ -2913,6 +3036,7 @@ parole_player_init (ParolePlayer *player)
     g_setenv("PULSE_PROP_media.role", "video", TRUE);
     
     player->priv = PAROLE_PLAYER_GET_PRIVATE (player);
+    player->priv->scale_logo = TRUE;
 
     player->priv->client_id = NULL;
     player->priv->sm_client = NULL;
@@ -3074,6 +3198,7 @@ parole_player_init (ParolePlayer *player)
     player->priv->fullscreen_button = GTK_WIDGET (gtk_builder_get_object (builder, "media_fullscreen"));
     player->priv->fullscreen_image = GTK_WIDGET (gtk_builder_get_object (builder, "image_media_fullscreen"));
     player->priv->eventbox_output = GTK_WIDGET (gtk_builder_get_object (builder, "content_area"));
+    player->priv->logo = gdk_pixbuf_new_from_file (g_strdup_printf ("%s/parole.png", PIXMAPS_DIR), NULL);
     
     hpaned = GTK_WIDGET (gtk_builder_get_object (builder, "hpaned"));
     gtk_widget_style_get (hpaned, "handle-size", &player->priv->handle_width, NULL);
@@ -3123,6 +3248,8 @@ parole_player_init (ParolePlayer *player)
 	gtk_widget_set_no_show_all (player->priv->infobar, TRUE);
 
 	content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (player->priv->infobar));
+	g_signal_connect (content_area, "size-allocate",
+		      G_CALLBACK (on_content_area_size_allocate), player);
 	// GtkWidget *audiotrack_box, *audiotrack_label, *subtitle_box, *subtitle_label;
 	audiotrack_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
 	audiotrack_label = gtk_label_new(_("Audio Track:"));


More information about the Xfce4-commits mailing list