2 * This file Copyright (C) 2007-2010 Mnemosyne LLC
4 * This file is licensed by the GPL version 2. Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
10 * $Id: actions.c 11263 2010-09-24 15:22:53Z charles $
15 #include <glib/gi18n.h>
18 #include <libtransmission/transmission.h>
25 #include "icon-lock.h"
26 #include "icon-logo-24.h"
27 #include "icon-logo-48.h"
28 #include "icon-ratio.h"
29 #include "icon-turtle.h"
30 #include "icon-utilities.h"
32 #define UNUSED G_GNUC_UNUSED
34 static TrCore
* myCore
= NULL
;
36 static GtkActionGroup
* myGroup
= NULL
;
39 action_cb( GtkAction
* a
,
42 doAction ( gtk_action_get_name( a
), user_data
);
45 #if !GTK_CHECK_VERSION( 2, 8, 0 )
46 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
49 #if !GTK_CHECK_VERSION( 2, 10, 0 )
50 #define GTK_STOCK_SELECT_ALL NULL
53 static GtkRadioActionEntry sort_radio_entries
[] =
55 { "sort-by-activity", NULL
, N_( "Sort by _Activity" ), NULL
, NULL
, 0 },
56 { "sort-by-name", NULL
, N_( "Sort by _Name" ), NULL
, NULL
, 1 },
57 { "sort-by-progress", NULL
, N_( "Sort by _Progress" ), NULL
, NULL
, 2 },
58 { "sort-by-ratio", NULL
, N_( "Sort by Rati_o" ), NULL
, NULL
, 3 },
59 { "sort-by-state", NULL
, N_( "Sort by Stat_e" ), NULL
, NULL
, 4 },
60 { "sort-by-age", NULL
, N_( "Sort by A_ge" ), NULL
, NULL
, 5 },
61 { "sort-by-time-left", NULL
, N_( "Sort by Time _Left" ), NULL
, NULL
, 6 },
62 { "sort-by-size", NULL
, N_( "Sort by Si_ze" ), NULL
, NULL
, 7 }
66 sort_changed_cb( GtkAction
* action UNUSED
,
67 GtkRadioAction
* current
,
68 gpointer user_data UNUSED
)
70 const char * key
= PREF_KEY_SORT_MODE
;
71 const int i
= gtk_radio_action_get_current_value( current
);
72 const char * val
= sort_radio_entries
[i
].name
;
74 tr_core_set_pref( myCore
, key
, val
);
77 static GtkToggleActionEntry show_toggle_entries
[] =
79 { "toggle-main-window", NULL
, N_( "_Show Transmission" ), NULL
, NULL
, G_CALLBACK( action_cb
), TRUE
},
80 { "toggle-message-log", NULL
, N_( "Message _Log" ), NULL
, NULL
, G_CALLBACK( action_cb
), FALSE
}
84 toggle_pref_cb( GtkToggleAction
* action
,
85 gpointer user_data UNUSED
)
87 const char * key
= gtk_action_get_name( GTK_ACTION( action
) );
88 const gboolean val
= gtk_toggle_action_get_active( action
);
90 tr_core_set_pref_bool( myCore
, key
, val
);
93 static GtkToggleActionEntry pref_toggle_entries
[] =
95 { "alt-speed-enabled", NULL
, N_( "Enable Temporary Speed _Limits" ), NULL
, NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
},
96 { "compact-view", NULL
, N_( "_Compact View" ), "<alt>C", NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
},
97 { "sort-reversed", NULL
, N_( "Re_verse Sort Order" ), NULL
, NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
},
98 { "show-filterbar", NULL
, N_( "_Filterbar" ), NULL
, NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
},
99 { "show-statusbar", NULL
, N_( "_Statusbar" ), NULL
, NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
},
100 { "show-toolbar", NULL
, N_( "_Toolbar" ), NULL
, NULL
, G_CALLBACK( toggle_pref_cb
), FALSE
}
103 static GtkActionEntry entries
[] =
105 { "file-menu", NULL
, N_( "_File" ), NULL
, NULL
, NULL
},
106 { "torrent-menu", NULL
, N_( "_Torrent" ), NULL
, NULL
, NULL
},
107 { "view-menu", NULL
, N_( "_View" ), NULL
, NULL
, NULL
},
108 { "sort-menu", NULL
, N_( "_Sort Torrents By" ), NULL
, NULL
, NULL
},
109 { "edit-menu", NULL
, N_( "_Edit" ), NULL
, NULL
, NULL
},
110 { "help-menu", NULL
, N_( "_Help" ), NULL
, NULL
, NULL
},
111 { "copy-magnet-link-to-clipboard", GTK_STOCK_COPY
, N_("Copy _Magnet Link to Clipboard" ), "<control>M", NULL
, G_CALLBACK( action_cb
) },
112 { "add-torrent-from-url", GTK_STOCK_ADD
, N_("Add _URL..." ), NULL
, N_( "Add URL..." ), G_CALLBACK( action_cb
) },
113 { "add-torrent-toolbar", GTK_STOCK_ADD
, NULL
, NULL
, N_( "Add a torrent" ), G_CALLBACK( action_cb
) },
114 { "add-torrent-menu", GTK_STOCK_ADD
, N_( "_Add File..." ), "<control>D", N_( "Add a torrent" ), G_CALLBACK( action_cb
) },
115 { "start-torrent", GTK_STOCK_MEDIA_PLAY
, N_( "_Start" ), "<control>S", N_( "Start torrent" ), G_CALLBACK( action_cb
) },
116 { "show-stats", NULL
, N_( "_Statistics" ), NULL
, NULL
, G_CALLBACK( action_cb
) },
117 { "donate", NULL
, N_( "_Donate" ), NULL
, NULL
, G_CALLBACK( action_cb
) },
118 { "verify-torrent", NULL
, N_( "_Verify Local Data" ), "<control>V", NULL
, G_CALLBACK( action_cb
) },
119 { "pause-torrent", GTK_STOCK_MEDIA_PAUSE
, N_( "_Pause" ), "<control>P", N_( "Pause torrent" ), G_CALLBACK( action_cb
) },
120 { "pause-all-torrents", GTK_STOCK_MEDIA_PAUSE
, N_( "_Pause All" ), NULL
, N_( "Pause all torrents" ), G_CALLBACK( action_cb
) },
121 { "start-all-torrents", GTK_STOCK_MEDIA_PLAY
, N_( "_Start All" ), NULL
, N_( "Start all torrents" ), G_CALLBACK( action_cb
) },
122 { "relocate-torrent", NULL
, N_("Set _Location..." ), NULL
, NULL
, G_CALLBACK( action_cb
) },
123 { "remove-torrent", GTK_STOCK_REMOVE
, NULL
, "Delete", N_( "Remove torrent" ), G_CALLBACK( action_cb
) },
124 { "delete-torrent", GTK_STOCK_DELETE
, N_( "_Delete Files and Remove" ), "<shift>Delete", NULL
, G_CALLBACK( action_cb
) },
125 { "new-torrent", GTK_STOCK_NEW
, N_( "_New..." ), NULL
, N_( "Create a torrent" ), G_CALLBACK( action_cb
) },
126 { "quit", GTK_STOCK_QUIT
, N_( "_Quit" ), NULL
, NULL
, G_CALLBACK( action_cb
) },
127 { "select-all", GTK_STOCK_SELECT_ALL
, N_( "Select _All" ), "<control>A", NULL
, G_CALLBACK( action_cb
) },
128 { "deselect-all", NULL
, N_( "Dese_lect All" ), "<shift><control>A", NULL
, G_CALLBACK( action_cb
) },
129 { "edit-preferences", GTK_STOCK_PREFERENCES
, NULL
, NULL
, NULL
, G_CALLBACK( action_cb
) },
130 { "show-torrent-properties", GTK_STOCK_PROPERTIES
, NULL
, "<alt>Return", N_( "Torrent properties" ), G_CALLBACK( action_cb
) },
131 { "open-torrent-folder", GTK_STOCK_OPEN
, N_( "_Open Folder" ), NULL
, NULL
, G_CALLBACK( action_cb
) },
132 { "show-about-dialog", GTK_STOCK_ABOUT
, NULL
, NULL
, NULL
, G_CALLBACK( action_cb
) },
133 { "help", GTK_STOCK_HELP
, N_( "_Contents" ), "F1", NULL
, G_CALLBACK( action_cb
) },
134 { "update-tracker", GTK_STOCK_NETWORK
, N_( "Ask Tracker for _More Peers" ), NULL
, NULL
, G_CALLBACK( action_cb
) },
144 static const BuiltinIconInfo my_fallback_icons
[] =
146 { tr_icon_logo_48
, WINDOW_ICON
},
147 { tr_icon_logo_24
, TRAY_ICON
},
148 { tr_icon_logo_48
, NOTIFICATION_ICON
},
149 { tr_icon_lock
, "transmission-lock" },
150 { utilities_icon
, "utilities" },
151 { blue_turtle
, "alt-speed-on" },
152 { grey_turtle
, "alt-speed-off" },
153 { ratio_icon
, "ratio" }
157 register_my_icons( void )
160 const int n
= G_N_ELEMENTS( my_fallback_icons
);
161 GtkIconFactory
* factory
= gtk_icon_factory_new( );
162 GtkIconTheme
* theme
= gtk_icon_theme_get_default( );
164 gtk_icon_factory_add_default( factory
);
166 for( i
= 0; i
< n
; ++i
)
168 const char * name
= my_fallback_icons
[i
].name
;
170 if( !gtk_icon_theme_has_icon( theme
, name
) )
174 GtkIconSet
* icon_set
;
177 gdk_pixbuf_new_from_inline( -1, my_fallback_icons
[i
].raw
,
180 width
= gdk_pixbuf_get_width( p
);
181 icon_set
= gtk_icon_set_new_from_pixbuf( p
);
182 gtk_icon_theme_add_builtin_icon( name
, width
, p
);
183 gtk_icon_factory_add( factory
, name
, icon_set
);
186 gtk_icon_set_unref( icon_set
);
190 g_object_unref ( G_OBJECT ( factory
) );
193 static GtkUIManager
* myUIManager
= NULL
;
196 actions_set_core( TrCore
* core
)
202 actions_init( GtkUIManager
* ui_manager
,
203 gpointer callback_user_data
)
208 const int n_entries
= G_N_ELEMENTS( entries
);
209 GtkActionGroup
* action_group
;
211 myUIManager
= ui_manager
;
213 register_my_icons( );
215 action_group
= myGroup
= gtk_action_group_new( "Actions" );
216 gtk_action_group_set_translation_domain( action_group
, NULL
);
219 match
= pref_string_get( PREF_KEY_SORT_MODE
);
220 for( i
= 0, n
= G_N_ELEMENTS( sort_radio_entries
), active
= -1;
221 active
== -1 && i
< n
; ++i
)
222 if( !strcmp( sort_radio_entries
[i
].name
, match
) )
225 gtk_action_group_add_radio_actions( action_group
,
227 G_N_ELEMENTS( sort_radio_entries
),
229 G_CALLBACK( sort_changed_cb
),
232 gtk_action_group_add_toggle_actions( action_group
,
234 G_N_ELEMENTS( show_toggle_entries
),
235 callback_user_data
);
237 for( i
= 0, n
= G_N_ELEMENTS( pref_toggle_entries
); i
< n
; ++i
)
238 pref_toggle_entries
[i
].is_active
=
239 pref_flag_get( pref_toggle_entries
[i
].name
);
241 gtk_action_group_add_toggle_actions( action_group
,
243 G_N_ELEMENTS( pref_toggle_entries
),
244 callback_user_data
);
246 gtk_action_group_add_actions( action_group
,
248 callback_user_data
);
250 gtk_ui_manager_insert_action_group( ui_manager
, action_group
, 0 );
251 g_object_unref ( G_OBJECT( action_group
) );
258 static GHashTable
* key_to_action
= NULL
;
261 ensure_action_map_loaded( GtkUIManager
* uim
)
265 if( key_to_action
!= NULL
)
269 g_hash_table_new_full( g_str_hash
, g_str_equal
, g_free
, NULL
);
271 for( l
= gtk_ui_manager_get_action_groups( uim
); l
!= NULL
;
274 GtkActionGroup
* action_group
= GTK_ACTION_GROUP( l
->data
);
275 GList
* ait
, *actions
= gtk_action_group_list_actions(
277 for( ait
= actions
; ait
!= NULL
; ait
= ait
->next
)
279 GtkAction
* action
= GTK_ACTION( ait
->data
);
280 const char * name
= gtk_action_get_name( action
);
281 g_hash_table_insert( key_to_action
, g_strdup( name
), action
);
283 g_list_free( actions
);
288 get_action( const char* name
)
290 ensure_action_map_loaded( myUIManager
);
291 return ( GtkAction
* ) g_hash_table_lookup( key_to_action
, name
);
295 action_activate( const char * name
)
297 GtkAction
* action
= get_action( name
);
299 g_assert( action
!= NULL
);
300 gtk_action_activate( action
);
304 action_sensitize( const char * name
,
307 GtkAction
* action
= get_action( name
);
309 g_assert( action
!= NULL
);
310 g_object_set( action
, "sensitive", b
, NULL
);
314 action_set_important( const char * name
, gboolean b
)
316 GtkAction
* action
= get_action( name
);
318 g_assert( action
!= NULL
);
319 g_object_set( action
, "is-important", b
, NULL
);
323 action_toggle( const char * name
,
326 GtkAction
* action
= get_action( name
);
328 gtk_toggle_action_set_active( GTK_TOGGLE_ACTION( action
), b
);
332 action_get_widget( const char * path
)
334 return gtk_ui_manager_get_widget( myUIManager
, path
);