(trunk gtk) #4320 "Port GTK client to GTK 3." -- transmission-gtk now compiles cleanly & runs on GTK 3.

This commit is contained in:
Jordan Lee 2011-07-26 01:02:32 +00:00
parent b14c44a3a6
commit ee20cc2b24
2 changed files with 147 additions and 86 deletions

View File

@ -370,17 +370,36 @@ get_icon( const tr_torrent * tor, GtkIconSize icon_size, GtkWidget * for_widget
****
***/
static void
gtr_cell_renderer_get_preferred_size( GtkCellRenderer * renderer,
GtkWidget * widget,
GtkRequisition * minimum_size,
GtkRequisition * natural_size )
{
#if GTK_CHECK_VERSION( 3,0,0 )
gtk_cell_renderer_get_preferred_size( renderer, widget, minimum_size, natural_size );
#else
GtkRequisition r;
gtk_cell_renderer_get_size( renderer, widget, NULL, NULL, NULL, &r.width, &r.height );
if( minimum_size ) *minimum_size = r;
if( natural_size ) *natural_size = r;
#endif
}
static void
get_size_compact( TorrentCellRenderer * cell,
GtkWidget * widget,
gint * width,
gint * height )
{
int w, h;
int xpad, ypad;
GdkRectangle icon_area;
GdkRectangle name_area;
GdkRectangle stat_area;
GtkRequisition icon_size;
GtkRequisition name_size;
GtkRequisition stat_size;
const char * name;
GdkPixbuf * icon;
@ -397,17 +416,11 @@ get_size_compact( TorrentCellRenderer * cell,
/* get the idealized cell dimensions */
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
icon_area.width = w;
icon_area.height = h;
gtr_cell_renderer_get_preferred_size( p->icon_renderer, widget, NULL, &icon_size );
g_object_set( p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
name_area.width = w;
name_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &name_size );
g_object_set( p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
stat_area.width = w;
stat_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &stat_size );
/**
*** LAYOUT
@ -415,9 +428,9 @@ get_size_compact( TorrentCellRenderer * cell,
#define BAR_WIDTH 50
if( width != NULL )
*width = xpad * 2 + icon_area.width + GUI_PAD + name_area.width + GUI_PAD + BAR_WIDTH + GUI_PAD + stat_area.width;
*width = xpad * 2 + icon_size.width + GUI_PAD + name_size.width + GUI_PAD + BAR_WIDTH + GUI_PAD + stat_size.width;
if( height != NULL )
*height = ypad * 2 + MAX( name_area.height, p->bar_height );
*height = ypad * 2 + MAX( name_size.height, p->bar_height );
/* cleanup */
g_object_unref( icon );
@ -431,12 +444,11 @@ get_size_full( TorrentCellRenderer * cell,
gint * width,
gint * height )
{
int w, h;
int xpad, ypad;
GdkRectangle icon_area;
GdkRectangle name_area;
GdkRectangle stat_area;
GdkRectangle prog_area;
GtkRequisition icon_size;
GtkRequisition name_size;
GtkRequisition stat_size;
GtkRequisition prog_size;
const char * name;
GdkPixbuf * icon;
@ -457,30 +469,22 @@ get_size_full( TorrentCellRenderer * cell,
/* get the idealized cell dimensions */
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
icon_area.width = w;
icon_area.height = h;
gtr_cell_renderer_get_preferred_size( p->icon_renderer, widget, NULL, &icon_size );
g_object_set( p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
name_area.width = w;
name_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &name_size );
g_object_set( p->text_renderer, "text", gstr_prog->str, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
prog_area.width = w;
prog_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &prog_size );
g_object_set( p->text_renderer, "text", gstr_stat->str, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
stat_area.width = w;
stat_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &stat_size );
/**
*** LAYOUT
**/
if( width != NULL )
*width = xpad * 2 + icon_area.width + GUI_PAD + MAX3( name_area.width, prog_area.width, stat_area.width );
*width = xpad * 2 + icon_size.width + GUI_PAD + MAX3( name_size.width, prog_size.width, stat_size.width );
if( height != NULL )
*height = ypad * 2 + name_area.height + prog_area.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_area.height;
*height = ypad * 2 + name_size.height + prog_size.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_size.height;
/* cleanup */
g_object_unref( icon );
@ -488,13 +492,17 @@ get_size_full( TorrentCellRenderer * cell,
static void
torrent_cell_renderer_get_size( GtkCellRenderer * cell,
GtkWidget * widget,
GdkRectangle * cell_area,
gint * x_offset,
gint * y_offset,
gint * width,
gint * height )
torrent_cell_renderer_get_size( GtkCellRenderer * cell,
GtkWidget * widget,
#if GTK_CHECK_VERSION( 3,0,0 )
const GdkRectangle * cell_area,
#else
GdkRectangle * cell_area,
#endif
gint * x_offset,
gint * y_offset,
gint * width,
gint * height )
{
TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell );
@ -525,19 +533,41 @@ torrent_cell_renderer_get_size( GtkCellRenderer * cell,
}
}
static void
get_text_color( GtkWidget * w, const tr_stat * st, GdkColor * setme )
{
static const GdkColor red = { 0, 65535, 0, 0 };
#if GTK_CHECK_VERSION( 3,0,0 )
typedef GdkRGBA GtrColor;
#define FOREGROUND_COLOR_KEY "foreground-rgba"
#else
typedef GdkColor GtrColor;
#define FOREGROUND_COLOR_KEY "foreground-gdk"
#endif
static void
get_text_color( GtkWidget * w, const tr_stat * st, GtrColor * setme )
{
#if GTK_CHECK_VERSION( 3,0,0 )
static const GdkRGBA red = { 1.0, 0, 0, 0 };
if( st->error )
*setme = red;
else if( st->activity == TR_STATUS_STOPPED )
gtk_style_context_get_color( gtk_widget_get_style_context( w ), GTK_STATE_FLAG_INSENSITIVE, setme );
else
gtk_style_context_get_color( gtk_widget_get_style_context( w ), GTK_STATE_FLAG_NORMAL, setme );
#else
static const GdkColor red = { 0, 65535, 0, 0 };
if( st->error )
*setme = red;
else if( st->activity == TR_STATUS_STOPPED )
*setme = gtk_widget_get_style(w)->text[GTK_STATE_INSENSITIVE];
else
*setme = gtk_widget_get_style(w)->text[GTK_STATE_NORMAL];
#endif
}
static double
get_percent_done( const tr_torrent * tor, const tr_stat * st, bool * seed )
{
@ -557,16 +587,36 @@ get_percent_done( const tr_torrent * tor, const tr_stat * st, bool * seed )
return d;
}
#if GTK_CHECK_VERSION( 3,0,0 )
typedef cairo_t GtrDrawable;
#else
typedef GdkDrawable GtrDrawable;
#endif
static void
gtr_cell_renderer_render( GtkCellRenderer * renderer,
GtrDrawable * drawable,
GtkWidget * widget,
const GdkRectangle * area,
GtkCellRendererState flags)
{
#if GTK_CHECK_VERSION( 3,0,0 )
gtk_cell_renderer_render( renderer, drawable, widget, area, area, flags );
#else
gtk_cell_renderer_render( renderer, drawable, widget, area, area, area, flags );
#endif
}
static void
render_compact( TorrentCellRenderer * cell,
GdkDrawable * window,
GtrDrawable * window,
GtkWidget * widget,
GdkRectangle * background_area,
GdkRectangle * cell_area UNUSED,
GdkRectangle * expose_area UNUSED,
const GdkRectangle * background_area,
const GdkRectangle * cell_area UNUSED,
GtkCellRendererState flags )
{
int xpad, ypad;
GtkRequisition size;
GdkRectangle icon_area;
GdkRectangle name_area;
GdkRectangle stat_area;
@ -574,7 +624,7 @@ render_compact( TorrentCellRenderer * cell,
GdkRectangle fill_area;
const char * name;
GdkPixbuf * icon;
GdkColor text_color;
GtrColor text_color;
bool seed;
struct TorrentCellRendererPrivate * p = cell->priv;
@ -600,11 +650,14 @@ render_compact( TorrentCellRenderer * cell,
icon_area = name_area = stat_area = prog_area = fill_area;
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &icon_area.width, NULL );
gtr_cell_renderer_get_preferred_size( p->icon_renderer, widget, NULL, &size );
icon_area.width = size.width;
g_object_set( p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &name_area.width, NULL );
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &size );
name_area.width = size.width;
g_object_set( p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &stat_area.width, NULL );
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &size );
stat_area.width = size.width;
icon_area.x = fill_area.x;
prog_area.x = fill_area.x + fill_area.width - BAR_WIDTH;
@ -619,7 +672,7 @@ render_compact( TorrentCellRenderer * cell,
**/
g_object_set( p->icon_renderer, "pixbuf", icon, "sensitive", sensitive, NULL );
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
gtr_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, flags );
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", NULL, "sensitive", sensitive,
#if GTK_CHECK_VERSION( 3,0,0 )
"inverted", seed,
@ -627,11 +680,11 @@ render_compact( TorrentCellRenderer * cell,
"orientation", (seed ? GTK_PROGRESS_RIGHT_TO_LEFT : GTK_PROGRESS_LEFT_TO_RIGHT),
#endif
NULL );
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
g_object_set( p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, "ellipsize", PANGO_ELLIPSIZE_END, "foreground-gdk", &text_color, NULL );
gtk_cell_renderer_render( p->text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
gtr_cell_renderer_render( p->progress_renderer, window, widget, &prog_area, flags );
g_object_set( p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, "ellipsize", PANGO_ELLIPSIZE_END, FOREGROUND_COLOR_KEY, &text_color, NULL );
gtr_cell_renderer_render( p->text_renderer, window, widget, &stat_area, flags );
g_object_set( p->text_renderer, "text", name, "scale", 1.0, NULL );
gtk_cell_renderer_render( p->text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
gtr_cell_renderer_render( p->text_renderer, window, widget, &name_area, flags );
/* cleanup */
g_object_unref( icon );
@ -639,15 +692,14 @@ render_compact( TorrentCellRenderer * cell,
static void
render_full( TorrentCellRenderer * cell,
GdkDrawable * window,
GtrDrawable * window,
GtkWidget * widget,
GdkRectangle * background_area,
GdkRectangle * cell_area UNUSED,
GdkRectangle * expose_area UNUSED,
const GdkRectangle * background_area,
const GdkRectangle * cell_area UNUSED,
GtkCellRendererState flags )
{
int w, h;
int xpad, ypad;
GtkRequisition size;
GdkRectangle fill_area;
GdkRectangle icon_area;
GdkRectangle name_area;
@ -656,7 +708,7 @@ render_full( TorrentCellRenderer * cell,
GdkRectangle prct_area;
const char * name;
GdkPixbuf * icon;
GdkColor text_color;
GtrColor text_color;
bool seed;
struct TorrentCellRendererPrivate * p = cell->priv;
@ -680,21 +732,21 @@ render_full( TorrentCellRenderer * cell,
/* get the idealized cell dimensions */
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
icon_area.width = w;
icon_area.height = h;
gtr_cell_renderer_get_preferred_size( p->icon_renderer, widget, NULL, &size );
icon_area.width = size.width;
icon_area.height = size.height;
g_object_set( p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
name_area.width = w;
name_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &size );
name_area.width = size.width;
name_area.height = size.height;
g_object_set( p->text_renderer, "text", gstr_prog->str, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
prog_area.width = w;
prog_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &size );
prog_area.width = size.width;
prog_area.height = size.height;
g_object_set( p->text_renderer, "text", gstr_stat->str, NULL );
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
stat_area.width = w;
stat_area.height = h;
gtr_cell_renderer_get_preferred_size( p->text_renderer, widget, NULL, &size );
stat_area.width = size.width;
stat_area.height = size.height;
/**
*** LAYOUT
@ -736,11 +788,11 @@ render_full( TorrentCellRenderer * cell,
**/
g_object_set( p->icon_renderer, "pixbuf", icon, "sensitive", sensitive, NULL );
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
g_object_set( p->text_renderer, "text", name, "scale", 1.0, "foreground-gdk", &text_color, "ellipsize", PANGO_ELLIPSIZE_END, "weight", PANGO_WEIGHT_BOLD, NULL );
gtk_cell_renderer_render( p->text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
gtr_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, flags );
g_object_set( p->text_renderer, "text", name, "scale", 1.0, FOREGROUND_COLOR_KEY, &text_color, "ellipsize", PANGO_ELLIPSIZE_END, "weight", PANGO_WEIGHT_BOLD, NULL );
gtr_cell_renderer_render( p->text_renderer, window, widget, &name_area, flags );
g_object_set( p->text_renderer, "text", gstr_prog->str, "scale", SMALL_SCALE, "weight", PANGO_WEIGHT_NORMAL, NULL );
gtk_cell_renderer_render( p->text_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
gtr_cell_renderer_render( p->text_renderer, window, widget, &prog_area, flags );
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", sensitive,
#if GTK_CHECK_VERSION( 3,0,0 )
"inverted", seed,
@ -748,9 +800,9 @@ render_full( TorrentCellRenderer * cell,
"orientation", (seed ? GTK_PROGRESS_RIGHT_TO_LEFT : GTK_PROGRESS_LEFT_TO_RIGHT),
#endif
NULL );
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prct_area, &prct_area, &prct_area, flags );
gtr_cell_renderer_render( p->progress_renderer, window, widget, &prct_area, flags );
g_object_set( p->text_renderer, "text", gstr_stat->str, NULL );
gtk_cell_renderer_render( p->text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
gtr_cell_renderer_render( p->text_renderer, window, widget, &stat_area, flags );
/* cleanup */
g_object_unref( icon );
@ -758,11 +810,16 @@ render_full( TorrentCellRenderer * cell,
static void
torrent_cell_renderer_render( GtkCellRenderer * cell,
GdkDrawable * window,
GtrDrawable * window,
GtkWidget * widget,
#if GTK_CHECK_VERSION( 3,0,0 )
const GdkRectangle * background_area,
const GdkRectangle * cell_area,
#else
GdkRectangle * background_area,
GdkRectangle * cell_area,
GdkRectangle * expose_area,
GdkRectangle * expose_area UNUSED,
#endif
GtkCellRendererState flags )
{
TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell );
@ -776,9 +833,9 @@ torrent_cell_renderer_render( GtkCellRenderer * cell,
{
struct TorrentCellRendererPrivate * p = self->priv;
if( p->compact )
render_compact( self, window, widget, background_area, cell_area, expose_area, flags );
render_compact( self, window, widget, background_area, cell_area, flags );
else
render_full( self, window, widget, background_area, cell_area, expose_area, flags );
render_full( self, window, widget, background_area, cell_area, flags );
}
#ifdef TEST_RTL

View File

@ -171,7 +171,11 @@ prefsChanged( TrCore * core UNUSED,
/* since the cell size has changed, we need gtktreeview to revalidate
* its fixed-height mode values. Unfortunately there's not an API call
* for that, but it *does* revalidate when it thinks the style's been tweaked */
#if GTK_CHECK_VERSION( 3,0,0 )
g_signal_emit_by_name( p->view, "style-updated", NULL, NULL );
#else
g_signal_emit_by_name( p->view, "style-set", NULL, NULL );
#endif
}
else if( !strcmp( key, PREF_KEY_STATUSBAR ) )
{