diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2012-08-25 12:39:00 +0100 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2012-08-25 12:39:00 +0100 |
commit | 75535446541c62fab468c0f8ed6c94018f0cc070 (patch) | |
tree | c3474db6d36c334af03aae92112929d8f445a127 | |
parent | fb1dcb88fcc1a027da2f8e0ab1020afa1754ff3a (diff) |
fix gtk2 support for new cell renderer and fix error reporting
-rw-r--r-- | src/protocol-constants.h | 3 | ||||
-rw-r--r-- | src/requests.c | 3 | ||||
-rw-r--r-- | src/torrent-cell-renderer.c | 87 | ||||
-rw-r--r-- | src/torrent.c | 2 | ||||
-rw-r--r-- | src/trg-client.c | 2 | ||||
-rw-r--r-- | src/trg-main-window.c | 2 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 73 | ||||
-rw-r--r-- | src/trg-torrent-tree-view.c | 2 |
8 files changed, 135 insertions, 39 deletions
diff --git a/src/protocol-constants.h b/src/protocol-constants.h index 43b68f4..8d1605b 100644 --- a/src/protocol-constants.h +++ b/src/protocol-constants.h @@ -44,7 +44,6 @@ #define FIELD_DOWNLOAD_DIR "downloadDir" #define FIELD_HASH_STRING "hashString" #define FIELD_SWARM_SPEED "swarmSpeed" -#define FIELD_ERROR_STRING "errorString" #define FIELD_NAME "name" #define FIELD_SIZEWHENDONE "sizeWhenDone" #define FIELD_STATUS "status" @@ -68,8 +67,8 @@ #define FIELD_LEFTUNTILDONE "leftUntilDone" #define FIELD_ISFINISHED "isFinished" #define FIELD_ISPRIVATE "isPrivate" -#define FIELD_ERRORSTR "errorString" #define FIELD_ERROR "error" +#define FIELD_ERROR_STRING "errorString" #define FIELD_BANDWIDTH_PRIORITY "bandwidthPriority" #define FIELD_UPLOAD_LIMIT "uploadLimit" #define FIELD_UPLOAD_LIMITED "uploadLimited" diff --git a/src/requests.c b/src/requests.c index 702319f..4e8d27e 100644 --- a/src/requests.c +++ b/src/requests.c @@ -206,7 +206,8 @@ JsonNode *torrent_get(gint64 id) json_array_add_string_element(fields, FIELD_SEED_RATIO_MODE); json_array_add_string_element(fields, FIELD_PEER_LIMIT); json_array_add_string_element(fields, FIELD_ACTIVITY_DATE); - json_array_add_string_element(fields, FIELD_ERRORSTR); + json_array_add_string_element(fields, FIELD_ERROR); + json_array_add_string_element(fields, FIELD_ERROR_STRING); json_array_add_string_element(fields, FIELD_WANTED); json_array_add_string_element(fields, FIELD_PRIORITIES); json_array_add_string_element(fields, FIELD_RECHECK_PROGRESS); diff --git a/src/torrent-cell-renderer.c b/src/torrent-cell-renderer.c index 2efc4cc..c94e175 100644 --- a/src/torrent-cell-renderer.c +++ b/src/torrent-cell-renderer.c @@ -32,7 +32,6 @@ enum P_HAVEVALID, P_HAVEUNCHECKED, P_ERROR, - P_NAME, P_SIZEWHENDONE, P_TOTALSIZE, P_UPLOADED, @@ -56,8 +55,17 @@ enum #define COMPACT_ICON_SIZE GTK_ICON_SIZE_MENU #define FULL_ICON_SIZE GTK_ICON_SIZE_DND -typedef cairo_t GtrDrawable; +#if GTK_CHECK_VERSION( 3, 0, 0 ) +#define FOREGROUND_COLOR_KEY "foreground-rgba" typedef GdkRGBA GtrColor; +typedef cairo_t GtrDrawable; +typedef GtkRequisition GtrRequisition; +#else +#define FOREGROUND_COLOR_KEY "foreground-gdk" +typedef GdkColor GtrColor; +typedef GdkWindow GtrDrawable; +typedef GdkRectangle GtrRequisition; +#endif /*** **** @@ -105,7 +113,6 @@ struct TorrentCellRendererPrivate gdouble metadataPercentComplete; gdouble ratio; guint flags; - const gchar *name; gint64 peersFromUs; gint64 webSeedsToUs; gint64 peersToUs; @@ -385,7 +392,14 @@ gtr_cell_renderer_get_preferred_size( GtkCellRenderer * renderer, 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 @@ -446,9 +460,6 @@ get_size_full( TorrentCellRenderer * cell, GdkPixbuf * icon; struct TorrentCellRendererPrivate * p = cell->priv; - /*const tr_torrent * tor = p->tor; - const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor ); - const tr_info * inf = tr_torrentInfo( tor );*/ GString * gstr_prog = p->gstr1; GString * gstr_stat = p->gstr2; @@ -487,7 +498,11 @@ get_size_full( TorrentCellRenderer * cell, static void 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, @@ -522,19 +537,29 @@ torrent_cell_renderer_get_size( GtkCellRenderer * cell, } } - -#define FOREGROUND_COLOR_KEY "foreground-rgba" - static void -get_text_color( GtkWidget * w, TorrentCellRenderer *r, GtrColor * setme ) +get_text_color( TorrentCellRenderer *r, GtkWidget *widget, GtrColor * setme ) { + struct TorrentCellRendererPrivate *p = r->priv; +#if GTK_CHECK_VERSION( 3,0,0 ) + static const GdkRGBA red = { 1.0, 0, 0, 0 }; - if( r->priv->error ) + if( p->error ) *setme = red; - else if( r->priv->flags & TORRENT_FLAG_PAUSED ) - gtk_style_context_get_color( gtk_widget_get_style_context( w ), GTK_STATE_FLAG_INSENSITIVE, setme ); + else if( p->flags & TORRENT_FLAG_PAUSED ) + gtk_style_context_get_color( gtk_widget_get_style_context( widget ), GTK_STATE_FLAG_INSENSITIVE, setme ); else - gtk_style_context_get_color( gtk_widget_get_style_context( w ), GTK_STATE_FLAG_NORMAL, setme ); + gtk_style_context_get_color( gtk_widget_get_style_context( widget ), GTK_STATE_FLAG_NORMAL, setme ); + +#else + static const GdkColor red = { 0, 65535, 0, 0 }; + if( p->error ) + *setme = red; + else if( p->error & TORRENT_FLAG_PAUSED ) + *setme = gtk_widget_get_style(widget)->text[GTK_STATE_INSENSITIVE]; + else + *setme = gtk_widget_get_style(widget)->text[GTK_STATE_NORMAL]; +#endif } static double @@ -569,17 +594,26 @@ gtr_cell_renderer_render( GtkCellRenderer * renderer, 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 torrent_cell_renderer_render( GtkCellRenderer * cell, - GtrDrawable * window, - GtkWidget * widget, - const GdkRectangle * background_area, - const GdkRectangle * cell_area, - GtkCellRendererState flags ) + 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, +#endif + GtkCellRendererState flags ) { TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell ); @@ -650,9 +684,6 @@ static void torrent_cell_renderer_set_property(GObject * object, case P_ERROR: p->error = g_value_get_int64(v); break; - case P_NAME: - p->name = g_value_get_string(v); - break; case P_RATIO: p->ratio = g_value_get_double(v); break; @@ -738,12 +769,6 @@ torrent_cell_renderer_class_init( TorrentCellRendererClass * klass ) gobject_class->get_property = torrent_cell_renderer_get_property; gobject_class->dispose = torrent_cell_renderer_dispose; - g_object_class_install_property( gobject_class, P_NAME, - g_param_spec_string( "name", NULL, - "name", - "", - G_PARAM_READWRITE ) ); - g_object_class_install_property( gobject_class, P_JSON, g_param_spec_pointer( "json", NULL, "json", @@ -957,7 +982,7 @@ render_compact( TorrentCellRenderer * cell, g_string_truncate( gstr_stat, 0 ); getShortStatusString( gstr_stat, cell ); gtk_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad ); - get_text_color( widget, cell, &text_color ); + get_text_color( cell, widget, &text_color ); fill_area = *background_area; fill_area.x += xpad; @@ -1034,7 +1059,7 @@ render_full( TorrentCellRenderer * cell, g_string_truncate( gstr_stat, 0 ); getStatusString( gstr_stat, cell ); gtk_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad ); - get_text_color( widget, cell, &text_color ); + get_text_color( cell, widget, &text_color ); /* get the idealized cell dimensions */ g_object_set( p->icon_renderer, "pixbuf", icon, NULL ); diff --git a/src/torrent.c b/src/torrent.c index d35be51..e8f8ec9 100644 --- a/src/torrent.c +++ b/src/torrent.c @@ -322,7 +322,7 @@ gint64 torrent_get_done_date(JsonObject * t) const gchar *torrent_get_errorstr(JsonObject * t) { - return json_object_get_string_member(t, FIELD_ERRORSTR); + return json_object_get_string_member(t, FIELD_ERROR_STRING); } gint64 torrent_get_error(JsonObject *t) diff --git a/src/trg-client.c b/src/trg-client.c index 970fb46..0f03abd 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -159,6 +159,8 @@ TrgClient *trg_client_new(void) priv->updateMutex = g_mutex_new(); priv->configMutex = g_mutex_new(); priv->tlsKey = g_private_new(NULL); + priv->seedRatioLimited = FALSE; + priv->seedRatioLimit = 0.00; priv->pool = g_thread_pool_new((GFunc) dispatch_async_threadfunc, tc, DISPATCH_POOL_SIZE, TRUE, NULL); diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 5131a3c..72c5f66 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -2498,6 +2498,8 @@ TrgStateSelector *trg_main_window_get_state_selector(TrgMainWindow * win) return priv->stateSelector; } +/* Couldn't find a way to get the width/height on exit, so save the + * values of this event for when that happens. */ static gboolean trg_main_window_config_event(TrgMainWindow * win, GdkEvent * event, diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index aa8b797..fd5756c 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -106,6 +106,9 @@ struct _TrgMenuBarPrivate { GtkWidget *mb_top_queue; GtkWidget *mb_start_now; GtkWidget *mb_queues_seperator; + GtkWidget *mb_view_classic; + GtkWidget *mb_view_transmission; + GtkWidget *mb_view_transmission_compact; GtkAccelGroup *accel_group; TrgPrefs *prefs; TrgMainWindow *main_window; @@ -326,6 +329,19 @@ trg_menu_bar_accel_add(TrgMenuBar * menu, GtkWidget * item, } +static void view_menu_radio_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) +{ + TrgPrefs *p = TRG_PREFS(data); + const gchar *key = + (gchar *) g_object_get_data(G_OBJECT(w), G_DATAKEY_CONF_KEY); + + if (gtk_check_menu_item_get_active(w)) { + gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "pref-index")); + g_message("active index = %d", index); + trg_prefs_set_int(p, key, index, TRG_PREFS_GLOBAL); + } +} + static void view_menu_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) { TrgPrefs *p = TRG_PREFS(data); @@ -344,7 +360,7 @@ view_menu_bar_toggled_dependency_cb(GtkCheckMenuItem * w, gpointer data) } static void -trg_menu_bar_view_item_update(TrgPrefs * p, gchar * updatedKey, +trg_menu_bar_view_item_update(TrgPrefs * p, const gchar * updatedKey, gpointer data) { gchar *key = @@ -355,8 +371,46 @@ trg_menu_bar_view_item_update(TrgPrefs * p, gchar * updatedKey, TRG_PREFS_GLOBAL)); } -static GtkWidget *trg_menu_bar_view_item_new(TrgPrefs * prefs, gchar * key, - gchar * label, +static void +trg_menu_bar_view_radio_item_update(TrgPrefs * p, const gchar * updatedKey, + gpointer data) +{ + const gchar *key = + (gchar *) g_object_get_data(G_OBJECT(data), G_DATAKEY_CONF_KEY); + gint myIndex = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), "pref-index")); + + if (!g_strcmp0(updatedKey, key)) { + gboolean shouldBeActive = trg_prefs_get_int(p, key, TRG_PREFS_GLOBAL) == myIndex; + if (shouldBeActive != gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(data))) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(data), shouldBeActive); + } +} + +static GtkWidget *trg_menu_bar_view_radio_item_new(TrgPrefs * prefs, + GSList *group, + const gchar * key, + gint index, + const gchar * label) +{ + GtkWidget *w = gtk_radio_menu_item_new_with_label(group, label); + g_object_set_data_full(G_OBJECT(w), G_DATAKEY_CONF_KEY, g_strdup(key), + g_free); + g_object_set_data(G_OBJECT(w), "pref-index", GINT_TO_POINTER(index)); + + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), + trg_prefs_get_int(prefs, key, + TRG_PREFS_GLOBAL) == (gint64)index); + + g_signal_connect(w, "toggled", + G_CALLBACK(view_menu_radio_item_toggled_cb), prefs); + g_signal_connect(prefs, "pref-changed", + G_CALLBACK(trg_menu_bar_view_radio_item_update), w); + + return w; +} + +static GtkWidget *trg_menu_bar_view_item_new(TrgPrefs * prefs, const gchar * key, + const gchar * label, GtkWidget * dependency) { GtkWidget *w = gtk_check_menu_item_new_with_label(label); @@ -390,8 +444,21 @@ static GtkWidget *trg_menu_bar_view_menu_new(TrgMenuBar * mb) GtkWidget *view = gtk_menu_item_new_with_mnemonic(_("_View")); GtkWidget *viewMenu = gtk_menu_new(); + GSList *group; + gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), viewMenu); + priv->mb_view_classic = trg_menu_bar_view_radio_item_new(priv->prefs, NULL, "style", 0, _("Classic")); + gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_classic); + group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (priv->mb_view_classic)); + priv->mb_view_transmission = trg_menu_bar_view_radio_item_new(priv->prefs, group, "style", 1, _("Transmission")); + gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_transmission); + group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (priv->mb_view_transmission)); + priv->mb_view_transmission_compact = trg_menu_bar_view_radio_item_new(priv->prefs, group, "style", 2, _("Transmission Compact")); + gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_transmission_compact); + + priv->mb_view_classic = + priv->mb_view_states = trg_menu_bar_view_item_new(priv->prefs, TRG_PREFS_KEY_SHOW_STATE_SELECTOR, diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c index b2b5ac1..6c6bf36 100644 --- a/src/trg-torrent-tree-view.c +++ b/src/trg-torrent-tree-view.c @@ -191,7 +191,7 @@ static void setup_classic_layout(TrgClient *tc, TrgTorrentTreeView *tv) "connected", TORRENT_COLUMN_PEERS_CONNECTED, NULL); - g_object_set(G_OBJECT(renderer), "client", tv, NULL); + g_object_set(G_OBJECT(renderer), "client", tc, NULL); //gtk_tree_view_column_set_min_width(column, 0); gtk_tree_view_column_set_resizable(column, FALSE); |