mirror of
https://github.com/transmission/transmission
synced 2025-03-04 10:38:13 +00:00
(trunk gtk) #3887: "CPU spikes to 100% on scrolling" -- workaround committed.
The patch avoids use of GtkCellRendererText's "sensitive" property, and instead renders paused torrents' text using the widget's style's color for insensitive text. This approach honors the theme's "insensitive" color setting and uses it to draw insensitive text with no etching or shadowing. The better option is still for Murrine to fix its text shadow issue... but until then, here is a workaround.
This commit is contained in:
parent
9220ad2300
commit
92def6b960
1 changed files with 47 additions and 50 deletions
|
@ -325,7 +325,6 @@ struct TorrentCellRendererPrivate
|
||||||
{
|
{
|
||||||
tr_torrent * tor;
|
tr_torrent * tor;
|
||||||
GtkCellRenderer * text_renderer;
|
GtkCellRenderer * text_renderer;
|
||||||
GtkCellRenderer * text_renderer_err;
|
|
||||||
GtkCellRenderer * progress_renderer;
|
GtkCellRenderer * progress_renderer;
|
||||||
GtkCellRenderer * icon_renderer;
|
GtkCellRenderer * icon_renderer;
|
||||||
int bar_height;
|
int bar_height;
|
||||||
|
@ -364,12 +363,6 @@ get_icon( const tr_torrent * tor, GtkIconSize icon_size, GtkWidget * for_widget
|
||||||
return gtr_get_mime_type_icon( mime_type, icon_size, for_widget );
|
return gtr_get_mime_type_icon( mime_type, icon_size, for_widget );
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkCellRenderer*
|
|
||||||
get_text_renderer( const tr_stat * st, TorrentCellRenderer * r )
|
|
||||||
{
|
|
||||||
return st->error ? r->priv->text_renderer_err : r->priv->text_renderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***
|
/***
|
||||||
****
|
****
|
||||||
***/
|
***/
|
||||||
|
@ -388,7 +381,6 @@ get_size_compact( TorrentCellRenderer * cell,
|
||||||
const char * name;
|
const char * name;
|
||||||
char * status;
|
char * status;
|
||||||
GdkPixbuf * icon;
|
GdkPixbuf * icon;
|
||||||
GtkCellRenderer * text_renderer;
|
|
||||||
|
|
||||||
struct TorrentCellRendererPrivate * p = cell->priv;
|
struct TorrentCellRendererPrivate * p = cell->priv;
|
||||||
const tr_torrent * tor = p->tor;
|
const tr_torrent * tor = p->tor;
|
||||||
|
@ -404,13 +396,12 @@ get_size_compact( TorrentCellRenderer * cell,
|
||||||
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
icon_area.width = w;
|
icon_area.width = w;
|
||||||
icon_area.height = h;
|
icon_area.height = h;
|
||||||
text_renderer = get_text_renderer( st, cell );
|
g_object_set( p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
|
||||||
g_object_set( 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 );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
|
||||||
name_area.width = w;
|
name_area.width = w;
|
||||||
name_area.height = h;
|
name_area.height = h;
|
||||||
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
|
g_object_set( p->text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
stat_area.width = w;
|
stat_area.width = w;
|
||||||
stat_area.height = h;
|
stat_area.height = h;
|
||||||
|
|
||||||
|
@ -447,7 +438,6 @@ get_size_full( TorrentCellRenderer * cell,
|
||||||
char * status;
|
char * status;
|
||||||
char * progress;
|
char * progress;
|
||||||
GdkPixbuf * icon;
|
GdkPixbuf * icon;
|
||||||
GtkCellRenderer * text_renderer;
|
|
||||||
|
|
||||||
struct TorrentCellRendererPrivate * p = cell->priv;
|
struct TorrentCellRendererPrivate * p = cell->priv;
|
||||||
const tr_torrent * tor = p->tor;
|
const tr_torrent * tor = p->tor;
|
||||||
|
@ -465,17 +455,16 @@ get_size_full( TorrentCellRenderer * cell,
|
||||||
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
icon_area.width = w;
|
icon_area.width = w;
|
||||||
icon_area.height = h;
|
icon_area.height = h;
|
||||||
text_renderer = get_text_renderer( st, cell );
|
g_object_set( p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL );
|
||||||
g_object_set( 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 );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
|
||||||
name_area.width = w;
|
name_area.width = w;
|
||||||
name_area.height = h;
|
name_area.height = h;
|
||||||
g_object_set( text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
|
g_object_set( p->text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
prog_area.width = w;
|
prog_area.width = w;
|
||||||
prog_area.height = h;
|
prog_area.height = h;
|
||||||
g_object_set( text_renderer, "text", status, NULL );
|
g_object_set( p->text_renderer, "text", status, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
stat_area.width = w;
|
stat_area.width = w;
|
||||||
stat_area.height = h;
|
stat_area.height = h;
|
||||||
|
|
||||||
|
@ -533,6 +522,19 @@ 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( 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];
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
render_compact( TorrentCellRenderer * cell,
|
render_compact( TorrentCellRenderer * cell,
|
||||||
GdkDrawable * window,
|
GdkDrawable * window,
|
||||||
|
@ -551,7 +553,7 @@ render_compact( TorrentCellRenderer * cell,
|
||||||
const char * name;
|
const char * name;
|
||||||
char * status;
|
char * status;
|
||||||
GdkPixbuf * icon;
|
GdkPixbuf * icon;
|
||||||
GtkCellRenderer * text_renderer;
|
GdkColor text_color;
|
||||||
|
|
||||||
struct TorrentCellRendererPrivate * p = cell->priv;
|
struct TorrentCellRendererPrivate * p = cell->priv;
|
||||||
const tr_torrent * tor = p->tor;
|
const tr_torrent * tor = p->tor;
|
||||||
|
@ -564,6 +566,7 @@ render_compact( TorrentCellRenderer * cell,
|
||||||
name = tr_torrentInfo( tor )->name;
|
name = tr_torrentInfo( tor )->name;
|
||||||
status = getShortStatusString( tor, st, p->upload_speed_KBps, p->download_speed_KBps );
|
status = getShortStatusString( tor, st, p->upload_speed_KBps, p->download_speed_KBps );
|
||||||
gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad );
|
gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad );
|
||||||
|
get_text_color( widget, st, &text_color );
|
||||||
|
|
||||||
fill_area = *background_area;
|
fill_area = *background_area;
|
||||||
fill_area.x += xpad;
|
fill_area.x += xpad;
|
||||||
|
@ -574,11 +577,10 @@ render_compact( TorrentCellRenderer * cell,
|
||||||
|
|
||||||
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
|
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 );
|
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &icon_area.width, NULL );
|
||||||
text_renderer = get_text_renderer( st, cell );
|
g_object_set( p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
|
||||||
g_object_set( 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 );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &name_area.width, NULL );
|
g_object_set( p->text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
|
||||||
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &stat_area.width, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &stat_area.width, NULL );
|
|
||||||
|
|
||||||
icon_area.x = fill_area.x;
|
icon_area.x = fill_area.x;
|
||||||
prog_area.x = fill_area.x + fill_area.width - BAR_WIDTH;
|
prog_area.x = fill_area.x + fill_area.width - BAR_WIDTH;
|
||||||
|
@ -596,10 +598,10 @@ render_compact( TorrentCellRenderer * cell,
|
||||||
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
|
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
|
||||||
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", NULL, "sensitive", sensitive, NULL );
|
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", NULL, "sensitive", sensitive, NULL );
|
||||||
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
|
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
|
||||||
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, "sensitive", sensitive, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
|
g_object_set( p->text_renderer, "text", status, "scale", SMALL_SCALE, "ellipsize", PANGO_ELLIPSIZE_END, "foreground-gdk", &text_color, NULL );
|
||||||
gtk_cell_renderer_render( text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
|
gtk_cell_renderer_render( p->text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
|
||||||
g_object_set( text_renderer, "text", name, "scale", 1.0, NULL );
|
g_object_set( p->text_renderer, "text", name, "scale", 1.0, NULL );
|
||||||
gtk_cell_renderer_render( text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
|
gtk_cell_renderer_render( p->text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
g_free( status );
|
g_free( status );
|
||||||
|
@ -627,7 +629,7 @@ render_full( TorrentCellRenderer * cell,
|
||||||
char * status;
|
char * status;
|
||||||
char * progress;
|
char * progress;
|
||||||
GdkPixbuf * icon;
|
GdkPixbuf * icon;
|
||||||
GtkCellRenderer * text_renderer;
|
GdkColor text_color;
|
||||||
|
|
||||||
struct TorrentCellRendererPrivate * p = cell->priv;
|
struct TorrentCellRendererPrivate * p = cell->priv;
|
||||||
const tr_torrent * tor = p->tor;
|
const tr_torrent * tor = p->tor;
|
||||||
|
@ -642,23 +644,23 @@ render_full( TorrentCellRenderer * cell,
|
||||||
status = getStatusString( tor, st, p->upload_speed_KBps, p->download_speed_KBps );
|
status = getStatusString( tor, st, p->upload_speed_KBps, p->download_speed_KBps );
|
||||||
progress = getProgressString( tor, inf, st );
|
progress = getProgressString( tor, inf, st );
|
||||||
gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad );
|
gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad );
|
||||||
|
get_text_color( widget, st, &text_color );
|
||||||
|
|
||||||
/* get the idealized cell dimensions */
|
/* get the idealized cell dimensions */
|
||||||
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
|
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
|
||||||
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
icon_area.width = w;
|
icon_area.width = w;
|
||||||
icon_area.height = h;
|
icon_area.height = h;
|
||||||
text_renderer = get_text_renderer( st, cell );
|
g_object_set( p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
|
||||||
g_object_set( 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 );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
|
||||||
name_area.width = w;
|
name_area.width = w;
|
||||||
name_area.height = h;
|
name_area.height = h;
|
||||||
g_object_set( text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
|
g_object_set( p->text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
prog_area.width = w;
|
prog_area.width = w;
|
||||||
prog_area.height = h;
|
prog_area.height = h;
|
||||||
g_object_set( text_renderer, "text", status, NULL );
|
g_object_set( p->text_renderer, "text", status, NULL );
|
||||||
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h );
|
||||||
stat_area.width = w;
|
stat_area.width = w;
|
||||||
stat_area.height = h;
|
stat_area.height = h;
|
||||||
|
|
||||||
|
@ -703,14 +705,14 @@ render_full( TorrentCellRenderer * cell,
|
||||||
|
|
||||||
g_object_set( p->icon_renderer, "pixbuf", icon, "sensitive", sensitive, NULL );
|
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 );
|
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
|
||||||
g_object_set( text_renderer, "text", name, "scale", 1.0, "sensitive", sensitive, "ellipsize", PANGO_ELLIPSIZE_END, "weight", PANGO_WEIGHT_BOLD, NULL );
|
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( text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
|
gtk_cell_renderer_render( p->text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
|
||||||
g_object_set( text_renderer, "text", progress, "scale", SMALL_SCALE, "weight", PANGO_WEIGHT_NORMAL, NULL );
|
g_object_set( p->text_renderer, "text", progress, "scale", SMALL_SCALE, "weight", PANGO_WEIGHT_NORMAL, NULL );
|
||||||
gtk_cell_renderer_render( text_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
|
gtk_cell_renderer_render( p->text_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
|
||||||
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", sensitive, NULL );
|
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", sensitive, NULL );
|
||||||
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prct_area, &prct_area, &prct_area, flags );
|
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prct_area, &prct_area, &prct_area, flags );
|
||||||
g_object_set( text_renderer, "text", status, NULL );
|
g_object_set( p->text_renderer, "text", status, NULL );
|
||||||
gtk_cell_renderer_render( text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
|
gtk_cell_renderer_render( p->text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
g_free( status );
|
g_free( status );
|
||||||
|
@ -797,7 +799,6 @@ torrent_cell_renderer_dispose( GObject * o )
|
||||||
if( r && r->priv )
|
if( r && r->priv )
|
||||||
{
|
{
|
||||||
g_object_unref( G_OBJECT( r->priv->text_renderer ) );
|
g_object_unref( G_OBJECT( r->priv->text_renderer ) );
|
||||||
g_object_unref( G_OBJECT( r->priv->text_renderer_err ) );
|
|
||||||
g_object_unref( G_OBJECT( r->priv->progress_renderer ) );
|
g_object_unref( G_OBJECT( r->priv->progress_renderer ) );
|
||||||
g_object_unref( G_OBJECT( r->priv->icon_renderer ) );
|
g_object_unref( G_OBJECT( r->priv->icon_renderer ) );
|
||||||
r->priv = NULL;
|
r->priv = NULL;
|
||||||
|
@ -872,13 +873,9 @@ torrent_cell_renderer_init( GTypeInstance * instance,
|
||||||
p->tor = NULL;
|
p->tor = NULL;
|
||||||
p->text_renderer = gtk_cell_renderer_text_new( );
|
p->text_renderer = gtk_cell_renderer_text_new( );
|
||||||
g_object_set( p->text_renderer, "xpad", 0, "ypad", 0, NULL );
|
g_object_set( p->text_renderer, "xpad", 0, "ypad", 0, NULL );
|
||||||
p->text_renderer_err = gtk_cell_renderer_text_new( );
|
|
||||||
g_object_set( p->text_renderer_err, "xpad", 0, "ypad", 0, NULL );
|
|
||||||
p->progress_renderer = gtk_cell_renderer_progress_new( );
|
p->progress_renderer = gtk_cell_renderer_progress_new( );
|
||||||
p->icon_renderer = gtk_cell_renderer_pixbuf_new( );
|
p->icon_renderer = gtk_cell_renderer_pixbuf_new( );
|
||||||
g_object_set( p->text_renderer_err, "foreground", "red", NULL );
|
|
||||||
gtr_object_ref_sink( p->text_renderer );
|
gtr_object_ref_sink( p->text_renderer );
|
||||||
gtr_object_ref_sink( p->text_renderer_err );
|
|
||||||
gtr_object_ref_sink( p->progress_renderer );
|
gtr_object_ref_sink( p->progress_renderer );
|
||||||
gtr_object_ref_sink( p->icon_renderer );
|
gtr_object_ref_sink( p->icon_renderer );
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue