various gtk cleanups.
This commit is contained in:
parent
f5e5a5584b
commit
39c8a02497
147
gtk/conf.c
147
gtk/conf.c
|
@ -22,14 +22,14 @@
|
|||
* DEALINGS IN THE SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
@ -38,32 +38,30 @@
|
|||
#include <glib/gstdio.h>
|
||||
|
||||
#include <libtransmission/transmission.h>
|
||||
#include <libtransmission/bencode.h>
|
||||
|
||||
#include "conf.h"
|
||||
#include "util.h"
|
||||
|
||||
#define CONF_SUBDIR "gtk"
|
||||
#define FILE_SOCKET "socket"
|
||||
|
||||
static char *gl_confdir = NULL;
|
||||
static char *gl_lockpath = NULL;
|
||||
|
||||
static char * gl_confdir = NULL;
|
||||
static char * gl_lockpath = NULL;
|
||||
|
||||
/* errstr may be NULL, this might be called before GTK is initialized */
|
||||
gboolean
|
||||
cf_init(const char *dir, char **errstr) {
|
||||
if(NULL != errstr)
|
||||
*errstr = NULL;
|
||||
gl_confdir = g_build_filename(dir, CONF_SUBDIR, NULL);
|
||||
cf_init(const char *dir, char **errstr)
|
||||
{
|
||||
if( errstr != NULL )
|
||||
*errstr = NULL;
|
||||
|
||||
if(mkdir_p(gl_confdir, 0755 ))
|
||||
return TRUE;
|
||||
gl_confdir = g_build_filename( dir, "gtk", NULL );
|
||||
|
||||
if(NULL != errstr)
|
||||
*errstr = g_strdup_printf(_("Failed to create the directory %s:\n%s"),
|
||||
gl_confdir, strerror(errno));
|
||||
return FALSE;
|
||||
if( mkdir_p(gl_confdir, 0755 ) )
|
||||
return TRUE;
|
||||
|
||||
if( errstr != NULL )
|
||||
*errstr = g_strdup_printf( _("Failed to create the directory %s:\n%s"),
|
||||
gl_confdir, g_strerror(errno) );
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/***
|
||||
|
@ -74,50 +72,53 @@ cf_init(const char *dir, char **errstr) {
|
|||
|
||||
/* errstr may be NULL, this might be called before GTK is initialized */
|
||||
static int
|
||||
lockfile(const char *file, char **errstr) {
|
||||
int fd, savederr;
|
||||
struct flock lk;
|
||||
lockfile(const char *file, char **errstr)
|
||||
{
|
||||
int fd;
|
||||
struct flock lk;
|
||||
|
||||
if(NULL != errstr)
|
||||
*errstr = NULL;
|
||||
if( errstr )
|
||||
*errstr = NULL;
|
||||
|
||||
if(0 > (fd = open(file, O_RDWR | O_CREAT, 0666))) {
|
||||
savederr = errno;
|
||||
if(NULL != errstr)
|
||||
*errstr = g_strdup_printf(_("Failed to open the file %s for writing:\n%s"),
|
||||
file, strerror(errno));
|
||||
errno = savederr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&lk, 0, sizeof(lk));
|
||||
lk.l_start = 0;
|
||||
lk.l_len = 0;
|
||||
lk.l_type = F_WRLCK;
|
||||
lk.l_whence = SEEK_SET;
|
||||
if(-1 == fcntl(fd, F_SETLK, &lk)) {
|
||||
savederr = errno;
|
||||
if(NULL != errstr) {
|
||||
if(EAGAIN == errno)
|
||||
*errstr = g_strdup_printf(_("Another copy of %s is already running."),
|
||||
g_get_application_name());
|
||||
else
|
||||
*errstr = g_strdup_printf(_("Failed to lock the file %s:\n%s"),
|
||||
file, strerror(errno));
|
||||
fd = open( file, O_RDWR | O_CREAT, 0666 );
|
||||
if( fd < 0 )
|
||||
{
|
||||
const int savederr = errno;
|
||||
if( errstr )
|
||||
*errstr = g_strdup_printf(
|
||||
_("Failed to open the file %s for writing:\n%s"),
|
||||
file, g_strerror( errno ) );
|
||||
errno = savederr;
|
||||
return -1;
|
||||
}
|
||||
close(fd);
|
||||
errno = savederr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fd;
|
||||
memset( &lk, 0, sizeof( lk ) );
|
||||
lk.l_start = 0;
|
||||
lk.l_len = 0;
|
||||
lk.l_type = F_WRLCK;
|
||||
lk.l_whence = SEEK_SET;
|
||||
if( -1 == fcntl( fd, F_SETLK, &lk ) )
|
||||
{
|
||||
const int savederr = errno;
|
||||
if( errstr )
|
||||
*errstr = ( errno == EAGAIN )
|
||||
? g_strdup_printf( _( "Another copy of %s is already running." ),
|
||||
g_get_application_name( ) )
|
||||
: g_strdup_printf( _( "Failed to lock the file %s:\n%s" ),
|
||||
file, g_strerror( errno ) );
|
||||
close( fd );
|
||||
errno = savederr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
static char*
|
||||
getLockFilename( void )
|
||||
{
|
||||
return g_build_filename( tr_getPrefsDirectory(),
|
||||
CONF_SUBDIR, "lock", NULL );
|
||||
assert( gl_confdir != NULL );
|
||||
return g_build_filename( gl_confdir, "lock", NULL );
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -142,7 +143,8 @@ cf_lock( char ** errstr )
|
|||
char*
|
||||
cf_sockname( void )
|
||||
{
|
||||
return g_build_filename( gl_confdir, FILE_SOCKET, NULL );
|
||||
assert( gl_confdir != NULL );
|
||||
return g_build_filename( gl_confdir, "socket", NULL );
|
||||
}
|
||||
|
||||
/***
|
||||
|
@ -156,8 +158,8 @@ cf_sockname( void )
|
|||
static char*
|
||||
getPrefsFilename( void )
|
||||
{
|
||||
return g_build_filename( tr_getPrefsDirectory(),
|
||||
CONF_SUBDIR, "prefs.ini", NULL );
|
||||
assert( gl_confdir != NULL );
|
||||
return g_build_filename( gl_confdir, "prefs.ini", NULL );
|
||||
}
|
||||
|
||||
static GKeyFile*
|
||||
|
@ -177,52 +179,43 @@ getPrefsKeyFile( void )
|
|||
}
|
||||
|
||||
int
|
||||
pref_int_get( const char * key )
|
||||
{
|
||||
pref_int_get( const char * key ) {
|
||||
return g_key_file_get_integer( getPrefsKeyFile( ), GROUP, key, NULL );
|
||||
}
|
||||
void
|
||||
pref_int_set( const char * key, int value )
|
||||
{
|
||||
pref_int_set( const char * key, int value ) {
|
||||
g_key_file_set_integer( getPrefsKeyFile( ), GROUP, key, value );
|
||||
}
|
||||
void
|
||||
pref_int_set_default( const char * key, int value )
|
||||
{
|
||||
pref_int_set_default( const char * key, int value ) {
|
||||
if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) )
|
||||
pref_int_set( key, value );
|
||||
}
|
||||
|
||||
gboolean
|
||||
pref_flag_get ( const char * key )
|
||||
{
|
||||
pref_flag_get ( const char * key ) {
|
||||
return g_key_file_get_boolean( getPrefsKeyFile( ), GROUP, key, NULL );
|
||||
}
|
||||
void
|
||||
pref_flag_set( const char * key, gboolean value )
|
||||
{
|
||||
pref_flag_set( const char * key, gboolean value ) {
|
||||
g_key_file_set_boolean( getPrefsKeyFile( ), GROUP, key, value );
|
||||
}
|
||||
void
|
||||
pref_flag_set_default( const char * key, gboolean value )
|
||||
{
|
||||
pref_flag_set_default( const char * key, gboolean value ) {
|
||||
if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) )
|
||||
pref_flag_set( key, value );
|
||||
}
|
||||
|
||||
char*
|
||||
pref_string_get( const char * key )
|
||||
{
|
||||
pref_string_get( const char * key ) {
|
||||
return g_key_file_get_string( getPrefsKeyFile( ), GROUP, key, NULL );
|
||||
}
|
||||
void
|
||||
pref_string_set( const char * key, const char * value )
|
||||
{
|
||||
pref_string_set( const char * key, const char * value ) {
|
||||
g_key_file_set_string( getPrefsKeyFile( ), GROUP, key, value );
|
||||
}
|
||||
void
|
||||
pref_string_set_default( const char * key, const char * value )
|
||||
{
|
||||
pref_string_set_default( const char * key, const char * value ) {
|
||||
if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) )
|
||||
pref_string_set( key, value );
|
||||
}
|
||||
|
|
74
gtk/main.c
74
gtk/main.c
|
@ -149,7 +149,7 @@ coreprompt( TrCore *, GList *, enum tr_torrent_action, gboolean, gpointer );
|
|||
static void
|
||||
corepromptdata( TrCore *, uint8_t *, size_t, gboolean, gpointer );
|
||||
static void
|
||||
readinitialprefs( struct cbdata * cbdata );
|
||||
initializeFromPrefs( struct cbdata * cbdata );
|
||||
static void
|
||||
prefschanged( TrCore * core, const char * key, gpointer data );
|
||||
static void
|
||||
|
@ -222,8 +222,10 @@ main( int argc, char ** argv )
|
|||
gboolean startpaused = FALSE;
|
||||
char * domain = "transmission";
|
||||
GOptionEntry entries[] = {
|
||||
{ "paused", 'p', 0, G_OPTION_ARG_NONE, &startpaused, _("Start with all torrents paused"), NULL },
|
||||
{ "quit", 'q', 0, G_OPTION_ARG_NONE, &sendquit, _( "Request that the running instance quit"), NULL },
|
||||
{ "paused", 'p', 0, G_OPTION_ARG_NONE, &startpaused,
|
||||
_("Start with all torrents paused"), NULL },
|
||||
{ "quit", 'q', 0, G_OPTION_ARG_NONE, &sendquit,
|
||||
_( "Request that the running instance quit"), NULL },
|
||||
{ NULL, 0, 0, 0, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -243,13 +245,8 @@ main( int argc, char ** argv )
|
|||
|
||||
argfiles = checkfilenames( argc-1, argv+1 );
|
||||
didinit = cf_init( tr_getPrefsDirectory(), NULL );
|
||||
didlock = FALSE;
|
||||
if( didinit )
|
||||
{
|
||||
/* maybe send remote commands, also try cf_lock() */
|
||||
didlock = sendremote( argfiles, sendquit );
|
||||
}
|
||||
setupsighandlers(); /* set up handlers for fatal signals */
|
||||
didlock = didinit && sendremote( argfiles, sendquit );
|
||||
setupsighandlers( ); /* set up handlers for fatal signals */
|
||||
|
||||
if( ( didinit || cf_init( tr_getPrefsDirectory(), &err ) ) &&
|
||||
( didlock || cf_lock( &err ) ) )
|
||||
|
@ -280,28 +277,15 @@ main( int argc, char ** argv )
|
|||
static gboolean
|
||||
sendremote( GList * files, gboolean sendquit )
|
||||
{
|
||||
gboolean didlock;
|
||||
const gboolean didlock = cf_lock( NULL );
|
||||
|
||||
didlock = cf_lock( NULL );
|
||||
|
||||
if( NULL != files )
|
||||
{
|
||||
/* send files if there's another instance, otherwise start normally */
|
||||
if( !didlock )
|
||||
{
|
||||
exit( ipc_sendfiles_blocking( files ) ? 0 : 1 );
|
||||
}
|
||||
}
|
||||
/* send files if there's another instance, otherwise start normally */
|
||||
if( !didlock && files )
|
||||
exit( ipc_sendfiles_blocking( files ) ? 0 : 1 );
|
||||
|
||||
/* either send a quit message or exit if no other instance */
|
||||
if( sendquit )
|
||||
{
|
||||
/* either send a quit message or exit if no other instance */
|
||||
if( !didlock )
|
||||
{
|
||||
exit( ipc_sendquit_blocking() ? 0 : 1 );
|
||||
}
|
||||
exit( 0 );
|
||||
}
|
||||
exit( didlock ? 0 : !ipc_sendquit_blocking() );
|
||||
|
||||
return didlock;
|
||||
}
|
||||
|
@ -334,7 +318,7 @@ appsetup( TrWindow * wind, GList * args,
|
|||
G_CALLBACK( prefschanged ), cbdata );
|
||||
|
||||
/* apply a few prefs */
|
||||
readinitialprefs( cbdata );
|
||||
initializeFromPrefs( cbdata );
|
||||
|
||||
/* add torrents from command-line and saved state */
|
||||
tr_core_load( cbdata->core, paused );
|
||||
|
@ -361,9 +345,9 @@ appsetup( TrWindow * wind, GList * args,
|
|||
}
|
||||
|
||||
static gboolean
|
||||
winclose( GtkWidget * widget UNUSED, GdkEvent * event UNUSED, gpointer gdata )
|
||||
winclose( GtkWidget * w UNUSED, GdkEvent * event UNUSED, gpointer gdata )
|
||||
{
|
||||
struct cbdata * cbdata = (struct cbdata *) gdata;
|
||||
struct cbdata * cbdata = gdata;
|
||||
|
||||
if( cbdata->icon != NULL )
|
||||
gtk_widget_hide( GTK_WIDGET( cbdata->wind ) );
|
||||
|
@ -405,7 +389,7 @@ winsetup( struct cbdata * cbdata, TrWindow * wind )
|
|||
static void
|
||||
makeicon( struct cbdata * cbdata )
|
||||
{
|
||||
if( NULL == cbdata->icon )
|
||||
if( cbdata->icon == NULL )
|
||||
cbdata->icon = tr_icon_new( );
|
||||
}
|
||||
|
||||
|
@ -516,8 +500,8 @@ gotdrag( GtkWidget * widget UNUSED,
|
|||
char *targ = gdk_atom_name(sel->target);
|
||||
char *type = gdk_atom_name(sel->type);
|
||||
|
||||
fprintf(stderr, "dropped file: sel=%s targ=%s type=%s fmt=%i len=%i\n",
|
||||
sele, targ, type, sel->format, sel->length);
|
||||
g_message( "dropped file: sel=%s targ=%s type=%s fmt=%i len=%i",
|
||||
sele, targ, type, sel->format, sel->length );
|
||||
g_free(sele);
|
||||
g_free(targ);
|
||||
g_free(type);
|
||||
|
@ -531,7 +515,6 @@ gotdrag( GtkWidget * widget UNUSED,
|
|||
if( ( sel->format == 8 ) &&
|
||||
( sel->selection == gdk_atom_intern( "XdndSelection", FALSE ) ) )
|
||||
{
|
||||
/* split file list on carriage returns and linefeeds */
|
||||
int i;
|
||||
char * str = g_strndup( (char*)sel->data, sel->length );
|
||||
gchar ** files = g_strsplit_set( str, "\r\n", -1 );
|
||||
|
@ -600,7 +583,7 @@ setupdrag(GtkWidget *widget, struct cbdata *data) {
|
|||
}
|
||||
|
||||
static void
|
||||
coreerr( TrCore * core SHUTUP, enum tr_core_err code, const char * msg,
|
||||
coreerr( TrCore * core UNUSED, enum tr_core_err code, const char * msg,
|
||||
gpointer gdata )
|
||||
{
|
||||
struct cbdata * cbdata = gdata;
|
||||
|
@ -654,7 +637,7 @@ corepromptdata( TrCore * core, uint8_t * data, size_t size,
|
|||
}
|
||||
|
||||
static void
|
||||
readinitialprefs( struct cbdata * cbdata )
|
||||
initializeFromPrefs( struct cbdata * cbdata )
|
||||
{
|
||||
size_t i;
|
||||
const char * keys[] =
|
||||
|
@ -771,7 +754,7 @@ updatemodel(gpointer gdata) {
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* returns a GList containing a GtkTreeRowReference to each selected row */
|
||||
/* returns a GList of GtkTreeRowReferences to each selected row */
|
||||
static GList *
|
||||
getselection( struct cbdata * cbdata )
|
||||
{
|
||||
|
@ -800,10 +783,10 @@ about ( void )
|
|||
{
|
||||
GtkWidget * w = gtk_about_dialog_new ();
|
||||
GtkAboutDialog * a = GTK_ABOUT_DIALOG (w);
|
||||
const char *authors[] = { "Charles Kerr (Back-end; GTK+)",
|
||||
"Mitchell Livingston (Back-end; OS X)",
|
||||
"Eric Petit (Back-end; OS X)",
|
||||
"Josh Elsasser (Daemon; Back-end; GTK+)",
|
||||
const char *authors[] = { "Charles Kerr (Backend; GTK+)",
|
||||
"Mitchell Livingston (Backend; OS X)",
|
||||
"Eric Petit (Backend; OS X)",
|
||||
"Josh Elsasser (Daemon; Backend; GTK+)",
|
||||
"Bryan Varner (BeOS)",
|
||||
NULL };
|
||||
gtk_about_dialog_set_version (a, LONG_VERSION_STRING );
|
||||
|
@ -812,7 +795,7 @@ about ( void )
|
|||
gtk_about_dialog_set_wrap_license (a, TRUE);
|
||||
#endif
|
||||
gtk_about_dialog_set_logo_icon_name( a, "transmission-logo" );
|
||||
gtk_about_dialog_set_comments( a, _("A fast and intuitive BitTorrent client") );
|
||||
gtk_about_dialog_set_comments( a, _("A fast, easy BitTorrent client") );
|
||||
gtk_about_dialog_set_website( a, "http://transmission.m0k.org/" );
|
||||
gtk_about_dialog_set_copyright( a, _("Copyright 2005-2007 The Transmission Project") );
|
||||
gtk_about_dialog_set_authors( a, authors );
|
||||
|
@ -930,7 +913,8 @@ doAction ( const char * action_name, gpointer user_data )
|
|||
}
|
||||
else if (!strcmp (action_name, "create-torrent"))
|
||||
{
|
||||
GtkWidget * w = make_meta_ui( GTK_WINDOW( data->wind ), tr_core_handle( data->core ) );
|
||||
GtkWidget * w = make_meta_ui( GTK_WINDOW( data->wind ),
|
||||
tr_core_handle( data->core ) );
|
||||
gtk_widget_show_all( w );
|
||||
}
|
||||
else if (!strcmp (action_name, "remove-torrent"))
|
||||
|
|
|
@ -61,21 +61,9 @@ get_private_data( TrWindow * w )
|
|||
****
|
||||
***/
|
||||
|
||||
/* kludge to have the progress bars notice theme changes */
|
||||
static void
|
||||
stylekludge( GObject * obj, GParamSpec * spec, gpointer data )
|
||||
{
|
||||
if( 0 == strcmp( "style", spec->name ) )
|
||||
{
|
||||
tr_cell_renderer_progress_reset_style(
|
||||
TR_CELL_RENDERER_PROGRESS( data ) );
|
||||
gtk_widget_queue_draw( GTK_WIDGET( obj ) );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
formatname( GtkTreeViewColumn * col SHUTUP, GtkCellRenderer * rend,
|
||||
GtkTreeModel * model, GtkTreeIter * iter, gpointer data SHUTUP )
|
||||
formatname( GtkTreeViewColumn * col UNUSED, GtkCellRenderer * rend,
|
||||
GtkTreeModel * model, GtkTreeIter * iter, gpointer data UNUSED )
|
||||
{
|
||||
TrTorrent * gtor;
|
||||
char * name, * mb, * str, * top, * bottom;
|
||||
|
@ -127,8 +115,8 @@ formatname( GtkTreeViewColumn * col SHUTUP, GtkCellRenderer * rend,
|
|||
}
|
||||
|
||||
static void
|
||||
formatprog( GtkTreeViewColumn * col SHUTUP, GtkCellRenderer * rend,
|
||||
GtkTreeModel * model, GtkTreeIter * iter, gpointer data SHUTUP )
|
||||
formatprog( GtkTreeViewColumn * col UNUSED, GtkCellRenderer * rend,
|
||||
GtkTreeModel * model, GtkTreeIter * iter, gpointer data UNUSED )
|
||||
{
|
||||
char * dlstr, * ulstr, * str, * marked;
|
||||
gfloat prog, dl, ul;
|
||||
|
@ -213,10 +201,6 @@ makeview( PrivateData * p )
|
|||
gtk_tree_view_column_set_sort_column_id( col, MC_PROG_D );
|
||||
gtk_tree_view_append_column( GTK_TREE_VIEW( view ), col );
|
||||
|
||||
/* XXX this shouldn't be necessary */
|
||||
g_signal_connect( view, "notify::style",
|
||||
G_CALLBACK( stylekludge ), progrend );
|
||||
|
||||
gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( view ), TRUE );
|
||||
sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) );
|
||||
gtk_tree_selection_set_mode( GTK_TREE_SELECTION( sel ),
|
||||
|
|
24
gtk/util.c
24
gtk/util.c
|
@ -169,17 +169,12 @@ mkdir_p(const char *name, mode_t mode)
|
|||
}
|
||||
|
||||
GList *
|
||||
dupstrlist( GList * list )
|
||||
dupstrlist( GList * l )
|
||||
{
|
||||
GList * ii, * ret;
|
||||
|
||||
ret = NULL;
|
||||
for( ii = g_list_first( list ); NULL != ii; ii = ii->next )
|
||||
{
|
||||
ret = g_list_append( ret, g_strdup( ii->data ) );
|
||||
}
|
||||
|
||||
return ret;
|
||||
GList * ret = NULL;
|
||||
for( ; l!=NULL; l=l->next )
|
||||
ret = g_list_prepend( ret, g_strdup( l->data ) );
|
||||
return g_list_reverse( ret );
|
||||
}
|
||||
|
||||
char *
|
||||
|
@ -206,10 +201,9 @@ char *
|
|||
urldecode(const char *str, int len) {
|
||||
int ii, jj;
|
||||
char *ret;
|
||||
char buf[3];
|
||||
|
||||
if(0 >= len)
|
||||
len = strlen(str);
|
||||
if( len <= 0 )
|
||||
len = strlen( str );
|
||||
|
||||
for(ii = jj = 0; ii < len; ii++, jj++)
|
||||
if('%' == str[ii])
|
||||
|
@ -217,13 +211,11 @@ urldecode(const char *str, int len) {
|
|||
|
||||
ret = g_new(char, jj + 1);
|
||||
|
||||
buf[2] = '\0';
|
||||
for(ii = jj = 0; ii < len; ii++, jj++) {
|
||||
switch(str[ii]) {
|
||||
case '%':
|
||||
if(ii + 2 < len) {
|
||||
buf[0] = str[ii+1];
|
||||
buf[1] = str[ii+2];
|
||||
char buf[3] = { str[ii+1], str[ii+2], '\0' };
|
||||
ret[jj] = g_ascii_strtoull(buf, NULL, 16);
|
||||
}
|
||||
ii += 2;
|
||||
|
|
Loading…
Reference in New Issue