various gtk cleanups.

This commit is contained in:
Charles Kerr 2007-10-13 03:15:02 +00:00
parent f5e5a5584b
commit 39c8a02497
4 changed files with 111 additions and 158 deletions

View File

@ -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 );
}

View File

@ -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"))

View File

@ -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 ),

View File

@ -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;