void picture_fit_to_window () { gdouble width, height, ww, wh; gdouble factor; if (animated) return; width = gdk_pixbuf_get_width (orig_pb); height = gdk_pixbuf_get_height (orig_pb); ww = gdk_window_get_width (gtk_viewport_get_view_window (GTK_VIEWPORT (viewport))); wh = gdk_window_get_height (gtk_viewport_get_view_window (GTK_VIEWPORT (viewport))); factor = MIN (ww / width, wh / height); if (factor < 1.0) { GdkPixbuf *pb = gdk_pixbuf_scale_simple (g_object_ref (orig_pb), width * factor, height * factor, GDK_INTERP_HYPER); if (pb) gtk_image_set_from_pixbuf (GTK_IMAGE (picture), pb); } }
static gboolean lyric_show_viewport_expose(GtkWidget *widget,GdkEventExpose *event) { LyricShowViewport *lsv; lsv = LYRIC_SHOW_VIEWPORT(widget); GdkWindow *view = gtk_viewport_get_view_window(GTK_VIEWPORT(widget)); #if 1 ///必须启用否则widget大小变化时view上的东西不会被自动清除,界面混乱 gint view_width,view_height; view_width = gdk_window_get_width(view); view_height = gdk_window_get_height(view); gtk_paint_flat_box(widget->style, view, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, widget, NULL, 0,0, view_width, view_height); #endif GTK_WIDGET_CLASS(lyric_show_viewport_parent_class)->expose_event(widget,event); /// g_warning("is_pressed:%d",lsv->priv->is_pressed); if(lsv->priv->is_pressed) { gtk_paint_hline(widget->style, gtk_viewport_get_bin_window(GTK_VIEWPORT(widget)), GTK_STATE_NORMAL, NULL, widget, NULL, 0,widget->allocation.width, lsv->priv->pos+lsv->priv->pressed_pos+widget->allocation.height/2.0); } return FALSE; }