Changeset 5928


Ignore:
Timestamp:
May 24, 2008, 11:23:20 PM (14 years ago)
Author:
charles
Message:

(gtk) #942: Option to inhibit / allow hibernation
(gtk) #943: Option to show / hide the tray icon

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEWS

    r5897 r5928  
    77   + Transfers can be dragged to different groups
    88   + Status strings are toggled from the action button (they are no longer clickable)
     9- GTK+
     10   + Add preferences options to inhibit hibernation and to toggle the tray icon
    911
    10121.21 (2008/05/21)
  • trunk/gtk/main.c

    r5913 r5928  
    408408    if( didlock && ( didinit || cf_init( configDir, &err ) ) )
    409409    {
    410         gboolean do_inhibit = FALSE;
    411         guint inhibit_cookie = 0;
    412 
    413410        tr_handle * h = tr_sessionInitFull(
    414411                            configDir,
     
    443440        tr_sessionSetRPCCallback( h, onRPCChanged, cbdata );
    444441
    445         if(( do_inhibit = pref_flag_get( PREF_KEY_INHIBIT_HIBERNATION )))
    446             inhibit_cookie = gtr_inhibit_hibernation( );
    447 
    448442        gtk_main();
    449 
    450         if( do_inhibit && inhibit_cookie )
    451             gtr_uninhibit_hibernation( inhibit_cookie );
    452443    }
    453444    else if( err )
     
    480471    cbdata->minimized  = minimized;
    481472
     473    if( minimized )
     474        pref_flag_set( PREF_KEY_TRAY_ICON_ENABLED, TRUE );
     475
    482476    actions_set_core( cbdata->core );
    483477
     
    500494    winsetup( cbdata, wind );
    501495
    502     /* set up the system tray */
    503     cbdata->icon = tr_icon_new( cbdata->core );
     496    /* set up the icon */
     497    prefschanged( cbdata->core, PREF_KEY_TRAY_ICON_ENABLED, cbdata );
    504498
    505499    /* start model update timer */
     
    896890        tr_sessionSetPeerPort( tr, port );
    897891    }
     892    else if( !strcmp( key, PREF_KEY_TRAY_ICON_ENABLED ) )
     893    {
     894        const int show = pref_flag_get( key );
     895        action_sensitize ( "close", show );
     896        if( show && !cbdata->icon )
     897            cbdata->icon = tr_icon_new( cbdata->core );
     898        else if( !show && cbdata->icon ) {
     899            g_object_unref( cbdata->icon );
     900            cbdata->icon = NULL;
     901        }
     902    }
    898903    else if( !strcmp( key, PREF_KEY_DL_LIMIT_ENABLED ) )
    899904    {
     
    936941    else if( !strcmp( key, PREF_KEY_RPC_ENABLED ) )
    937942    {
    938         g_message( "preferences option not recognized: %s", key );
     943        tr_sessionSetRPCEnabled( tr, pref_flag_get( key ) );
    939944    }
    940945}
  • trunk/gtk/tr-core.c

    r5868 r5928  
    4646#include "util.h"
    4747
     48static void tr_core_set_hibernation_allowed( TrCore * core, gboolean allowed );
     49
    4850struct TrCorePrivate
    4951{
     
    5557    guint              monitor_idle_tag;
    5658#endif
     59    gboolean           inhibit_allowed;
     60    gboolean           have_inhibit_cookie;
     61    guint              inhibit_cookie;
    5762    GtkTreeModel     * model;
    5863    tr_handle        * handle;
     
    474479        tr_sessionSetPeerLimit( tr_core_handle( core ), val );
    475480    }
     481    else if( !strcmp( key, PREF_KEY_ALLOW_HIBERNATION ) )
     482    {
     483        tr_core_set_hibernation_allowed( core, pref_flag_get( key ) );
     484    }
    476485#ifdef HAVE_GIO
    477486    else if( !strcmp( key, PREF_KEY_DIR_WATCH ) ||
     
    565574    prefsChanged( core, PREF_KEY_DIR_WATCH_ENABLED, NULL );
    566575    prefsChanged( core, PREF_KEY_MAX_PEERS_GLOBAL, NULL );
     576    prefsChanged( core, PREF_KEY_ALLOW_HIBERNATION, NULL );
    567577    g_signal_connect( core, "prefs-changed", G_CALLBACK(prefsChanged), NULL );
    568578
     
    891901
    892902/**
     903***  Hibernate
     904**/
     905
     906#ifdef HAVE_DBUS_GLIB
     907
     908static DBusGProxy*
     909get_hibernation_inhibit_proxy( void )
     910{
     911    GError * error = NULL;
     912    DBusGConnection * conn;
     913
     914    conn = dbus_g_bus_get( DBUS_BUS_SESSION, &error );
     915    if( error )
     916    {
     917        g_warning ("DBUS cannot connect : %s", error->message);
     918        g_error_free (error);
     919        return NULL;
     920    }
     921
     922    return dbus_g_proxy_new_for_name (conn,
     923               "org.freedesktop.PowerManagement",
     924               "/org/freedesktop/PowerManagement/Inhibit",
     925               "org.freedesktop.PowerManagement.Inhibit" );
     926}
     927
     928static gboolean
     929gtr_inhibit_hibernation( guint * cookie )
     930{
     931    gboolean success = FALSE;
     932    DBusGProxy * proxy = get_hibernation_inhibit_proxy( );
     933    if( proxy )
     934    {
     935        GError * error = NULL;
     936        const char * application = _( "Transmission Bittorrent Client" );
     937        const char * reason = _( "BitTorrent Activity" );
     938        success = dbus_g_proxy_call( proxy, "Inhibit", &error,
     939                                     G_TYPE_STRING, application,
     940                                     G_TYPE_STRING, reason,
     941                                     G_TYPE_INVALID,
     942                                     G_TYPE_UINT, cookie,
     943                                     G_TYPE_INVALID );
     944        if( success )
     945            tr_inf( _( "Disallowing desktop hibernation" ) );
     946        else {
     947            tr_err( _( "Couldn't disable desktop hibernation: %s" ), error->message );
     948            g_error_free( error );
     949        }
     950
     951        g_object_unref( G_OBJECT( proxy ) );
     952    }
     953
     954    return success != 0;
     955}
     956
     957static void
     958gtr_uninhibit_hibernation( guint inhibit_cookie )
     959{
     960    DBusGProxy * proxy = get_hibernation_inhibit_proxy( );
     961    if( proxy )
     962    {
     963        GError * error = NULL;
     964        gboolean success = dbus_g_proxy_call( proxy, "UnInhibit", &error,
     965                                              G_TYPE_UINT, inhibit_cookie,
     966                                              G_TYPE_INVALID,
     967                                              G_TYPE_INVALID );
     968        if( success )
     969            tr_inf( _( "Allowing desktop hibernation" ) );
     970        else {
     971            g_warning( "Couldn't uninhibit the system from suspending: %s.", error->message );
     972            g_error_free( error );
     973        }
     974
     975        g_object_unref( G_OBJECT( proxy ) );
     976    }
     977}
     978
     979#endif
     980
     981
     982void
     983tr_core_set_hibernation_allowed( TrCore * core, gboolean allowed )
     984{
     985#ifdef HAVE_DBUS_GLIB
     986    g_return_if_fail( core );
     987    g_return_if_fail( core->priv );
     988
     989    core->priv->inhibit_allowed = allowed != 0;
     990
     991    if( allowed && core->priv->have_inhibit_cookie )
     992    {
     993        gtr_uninhibit_hibernation( core->priv->inhibit_cookie );
     994        core->priv->have_inhibit_cookie = FALSE;
     995    }
     996
     997    if( !allowed && !core->priv->have_inhibit_cookie )
     998    {
     999        core->priv->have_inhibit_cookie = gtr_inhibit_hibernation( &core->priv->inhibit_cookie );
     1000        core->priv->have_inhibit_cookie = TRUE;
     1001    }
     1002#endif
     1003}
     1004
     1005/**
    8931006***  Prefs
    8941007**/
  • trunk/gtk/tr-icon.c

    r5476 r5928  
    4848}
    4949
    50 static void
    51 core_destroyed( gpointer data, GObject * core UNUSED )
    52 {
    53     g_source_remove( GPOINTER_TO_UINT( data ) );
    54 }
    55 
    5650static gboolean
    5751refresh_tooltip_cb( gpointer data )
     
    8175}
    8276
     77static void
     78closeTag( gpointer tag )
     79{
     80    g_source_remove( GPOINTER_TO_UINT( tag ) );
     81}
     82
    8383gpointer
    8484tr_icon_new( TrCore * core )
     
    8989    g_signal_connect( icon, "popup-menu", G_CALLBACK( popup ), NULL );
    9090    id = g_timeout_add( UPDATE_INTERVAL, refresh_tooltip_cb, icon );
    91     g_object_weak_ref( G_OBJECT( core ), core_destroyed, GUINT_TO_POINTER( id ) );
    9291    g_object_set_data( G_OBJECT( icon ), "tr-core", core );
     92    g_object_set_data_full( G_OBJECT( icon ), "update-tag", GUINT_TO_POINTER( id ), closeTag );
    9393    return icon;
    9494}
  • trunk/gtk/tr-prefs.c

    r5924 r5928  
    4545
    4646    pref_int_set_default    ( PREF_KEY_PEER_SOCKET_TOS, TR_DEFAULT_PEER_SOCKET_TOS );
    47     pref_flag_set_default   ( PREF_KEY_INHIBIT_HIBERNATION, TRUE );
     47    pref_flag_set_default   ( PREF_KEY_ALLOW_HIBERNATION, TRUE );
    4848    pref_flag_set_default   ( PREF_KEY_BLOCKLIST_ENABLED, TR_DEFAULT_BLOCKLIST_ENABLED );
    4949
     
    5656    pref_flag_set_default   ( PREF_KEY_FILTERBAR, TRUE );
    5757    pref_flag_set_default   ( PREF_KEY_STATUSBAR, TRUE );
     58    pref_flag_set_default   ( PREF_KEY_TRAY_ICON_ENABLED, TRUE );
    5859    pref_string_set_default ( PREF_KEY_STATUSBAR_STATS, "total-ratio" );
    5960
     
    506507
    507508static GtkWidget*
     509desktopPage( GObject * core )
     510{
     511    int row = 0;
     512    const char * s;
     513    GtkWidget * t;
     514    GtkWidget * w;
     515
     516    t = hig_workarea_create( );
     517
     518    hig_workarea_add_section_title (t, &row, _("Options"));
     519
     520        s = _( "Allow desktop _hibernation" );
     521        w = new_check_button( s, PREF_KEY_ALLOW_HIBERNATION, core );
     522        hig_workarea_add_wide_control( t, &row, w );
     523
     524        s = _( "Show tray _icon" );
     525        w = new_check_button( s, PREF_KEY_TRAY_ICON_ENABLED, core );
     526        hig_workarea_add_wide_control( t, &row, w );
     527
     528    hig_workarea_finish( t, &row );
     529    return t;
     530}
     531
     532static GtkWidget*
    508533networkPage( GObject * core, gpointer alive )
    509534{
     
    598623                              networkPage( core, alive ),
    599624                              gtk_label_new (_("Network")) );
     625    gtk_notebook_append_page( GTK_NOTEBOOK( n ),
     626                              desktopPage( core ),
     627                              gtk_label_new (_("Desktop")) );
    600628
    601629    g_signal_connect( d, "response", G_CALLBACK(response_cb), core );
  • trunk/gtk/tr-prefs.h

    r5843 r5928  
    2828#define PREF_KEY_DOWNLOAD_DIR           "default-download-directory"
    2929#define PREF_KEY_OPEN_DIALOG_FOLDER     "open-dialog-folder"
    30 #define PREF_KEY_INHIBIT_HIBERNATION    "inhibit-hibernation"
     30#define PREF_KEY_ALLOW_HIBERNATION      "allow-hibernation"
    3131#define PREF_KEY_DIR_WATCH              "watch-folder"
    3232#define PREF_KEY_DIR_WATCH_ENABLED      "watch-folder-enabled"
     33#define PREF_KEY_TRAY_ICON_ENABLED      "tray-icon-enabled"
    3334#define PREF_KEY_START                  "start-added-torrents"
    3435#define PREF_KEY_TRASH_ORIGINAL         "trash-original-torrent-files"
  • trunk/gtk/util.c

    r5922 r5928  
    449449}
    450450
    451 #ifdef HAVE_DBUS_GLIB
    452 
    453 static DBusGProxy*
    454 get_hibernation_inhibit_proxy( void )
    455 {
    456     GError * error = NULL;
    457     DBusGConnection * conn;
    458 
    459     conn = dbus_g_bus_get( DBUS_BUS_SESSION, &error );
    460     if( error )
    461     {
    462         g_warning ("DBUS cannot connect : %s", error->message);
    463         g_error_free (error);
    464         return NULL;
    465     }
    466 
    467     return dbus_g_proxy_new_for_name (conn,
    468                "org.freedesktop.PowerManagement",
    469                "/org/freedesktop/PowerManagement/Inhibit",
    470                "org.freedesktop.PowerManagement.Inhibit" );
    471 }
    472 #endif
    473 
    474 guint
    475 gtr_inhibit_hibernation( void )
    476 {
    477     guint inhibit_cookie = 0;
    478 #ifdef HAVE_DBUS_GLIB
    479     DBusGProxy * proxy = get_hibernation_inhibit_proxy( );
    480     if( proxy )
    481     {
    482         GError * error = NULL;
    483         const char * application = _( "Transmission Bittorrent Client" );
    484         const char * reason = _( "BitTorrent Activity" );
    485         gboolean success = dbus_g_proxy_call( proxy, "Inhibit", &error,
    486                                               G_TYPE_STRING, application,
    487                                               G_TYPE_STRING, reason,
    488                                               G_TYPE_INVALID,
    489                                               G_TYPE_UINT, &inhibit_cookie,
    490                                               G_TYPE_INVALID );
    491         if( success )
    492             tr_inf( _( "Desktop hibernation disabled while Transmission is running" ) );
    493         else {
    494             tr_err( _( "Couldn't disable desktop hibernation: %s" ), error->message );
    495             g_error_free( error );
    496         }
    497 
    498         g_object_unref( G_OBJECT( proxy ) );
    499     }
    500 #endif
    501     return inhibit_cookie;
    502 }
    503 
    504 void
    505 gtr_uninhibit_hibernation( guint inhibit_cookie )
    506 {
    507 #ifdef HAVE_DBUS_GLIB
    508     DBusGProxy * proxy = get_hibernation_inhibit_proxy( );
    509     if( proxy )
    510     {
    511         GError * error = NULL;
    512         gboolean success = dbus_g_proxy_call( proxy, "UnInhibit", &error,
    513                                               G_TYPE_UINT, inhibit_cookie,
    514                                               G_TYPE_INVALID,
    515                                               G_TYPE_INVALID );
    516         if( !success ) {
    517             g_warning( "Couldn't uninhibit the system from suspending: %s.", error->message );
    518             g_error_free( error );
    519         }
    520 
    521         g_object_unref( G_OBJECT( proxy ) );
    522     }
    523 #endif
    524 }
    525 
    526451#define VALUE_SERVICE_NAME        "com.transmissionbt.Transmission"
    527452#define VALUE_SERVICE_OBJECT_PATH "/com/transmissionbt/Transmission"
  • trunk/gtk/util.h

    r5922 r5928  
    8383void gtr_open_file( const char * path );
    8484
    85 guint gtr_inhibit_hibernation( void );
    86 
    87 void gtr_uninhibit_hibernation( guint );
    88 
    8985gboolean gtr_dbus_add_torrent( const char * filename );
    9086
Note: See TracChangeset for help on using the changeset viewer.