changeset 1009:d496fe2614a6

[gaim-migrate @ 1019] command-line options for the app. not for the applet because most of the time you don't run it from the command line anyway. thanks bmiller committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Fri, 20 Oct 2000 00:35:30 +0000
parents 1b99caffcd98
children 4dca3277ea15
files src/about.c src/aim.c src/gaim.h src/multi.c src/util.c
diffstat 5 files changed, 238 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/about.c	Thu Oct 19 22:34:22 2000 +0000
+++ b/src/about.c	Fri Oct 20 00:35:30 2000 +0000
@@ -121,14 +121,17 @@
 	
 		button = gtk_button_new_with_label("Close");
 
-		if (null == NULL) /* there's a mindtrip */
+		if (null == NULL) {/* there's a mindtrip */
 			gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
         	                                  GTK_SIGNAL_FUNC(destroy_about), GTK_OBJECT(about));
-		else
+			gtk_signal_connect(GTK_OBJECT(about), "destroy",
+					   GTK_SIGNAL_FUNC(destroy_about), GTK_OBJECT(about));
+		} else {
 			gtk_signal_connect(GTK_OBJECT(button), "clicked",
 					   GTK_SIGNAL_FUNC(version_exit), NULL);
-                gtk_signal_connect(GTK_OBJECT(about), "destroy",
-                                   GTK_SIGNAL_FUNC(destroy_about), GTK_OBJECT(about));
+			gtk_signal_connect(GTK_OBJECT(about), "destroy",
+					   GTK_SIGNAL_FUNC(version_exit), NULL);
+		}
  		
  		if (display_options & OPT_DISP_COOL_LOOK)
  			gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
--- a/src/aim.c	Thu Oct 19 22:34:22 2000 +0000
+++ b/src/aim.c	Fri Oct 20 00:35:30 2000 +0000
@@ -53,6 +53,9 @@
 #endif
 #include "locale.h"
 #include "gtkticker.h"
+#ifndef USE_GNOME
+#include <getopt.h>
+#endif
 
 static GtkWidget *name;
 static GtkWidget *pass;
@@ -73,6 +76,7 @@
 char toc_addy[16];
 char *quad_addr = NULL;
 
+
 void cancel_logon(void)
 {
 #ifdef USE_APPLET
@@ -430,8 +434,39 @@
 }
 #endif
 
+
 int main(int argc, char *argv[])
 {
+	char opt, i;
+	int opt_acct = 0, opt_help = 0, opt_version = 0,
+	    opt_user = 0, opt_login = 0, do_login_ret = -1;
+	char *opt_user_arg = NULL, *opt_login_arg = NULL;
+
+#ifdef USE_GNOME
+	poptContext popt_context;
+	struct poptOption popt_options[] =
+	{
+		{"acct",    'a', POPT_ARG_NONE,   &opt_acct,     'a', 
+		 "Display account editor window", NULL},
+		{"login",   'l', POPT_ARG_STRING,   NULL,        'l',
+		 "Automatically login (optional argument NAME specifies account(s) to use)", "[NAME]"},
+		{"user",    'u', POPT_ARG_STRING, &opt_user_arg, 'u',
+		 "Use account NAME", "NAME"},
+		{0, 0, 0, 0, 0, 0, 0}
+	};
+#else
+	struct option long_options[] = 
+	{
+		{"acct",    no_argument,	 NULL, 'a'},
+		{"help",    no_argument,	 NULL, 'h'},
+		{"login",   optional_argument, NULL, 'l'},
+		{"user",    required_argument, NULL, 'u'}, 
+		{"version", no_argument,	 NULL, 'v'},
+		{0, 0, 0, 0}
+	};
+#endif /* USE_GNOME */
+
+
 #ifdef ENABLE_NLS
 	bindtextdomain(PACKAGE, LOCALEDIR);
 	textdomain(PACKAGE);
@@ -442,7 +477,84 @@
 	/* signal(SIGSEGV, sighandler); */
 #endif
 
-	if (argc > 1 && !strcmp(argv[1], "--version")) {
+
+#ifdef USE_APPLET
+        init_applet_mgr(argc, argv);
+#elif defined USE_GNOME
+	for (i = 0; i < argc; i++) {
+		/* --login option */
+		if (strstr (argv[i], "--l") == argv[i]) { 
+			char *equals;
+			opt_login = 1;
+			if ((equals = strchr(argv[i], '=')) != NULL) {
+				/* --login=NAME */
+				opt_login_arg = g_strdup (equals+1);
+			} else if (i+1 < argc && argv[i+1][0] != '-') { 
+				/* --login NAME */
+				opt_login_arg = g_strdup (argv[i+1]);
+				strcpy (argv[i+1], " ");
+			}
+			strcpy (argv[i], " ");
+		}
+		/* -l option */
+		else if (strstr (argv[i], "-l") == argv[i]) {
+			opt_login = 1;
+			if (strlen (argv[i]) > 2) {
+				/* -lNAME */
+				opt_login_arg = g_strdup (argv[i]+2);
+			} else if (i+1 < argc && argv[i+1][0] != '-') {
+				/* -l NAME */
+				opt_login_arg = g_strdup (argv[i+1]);
+				strcpy (argv[i+1], " ");
+			}
+			strcpy (argv[i], " ");
+		}
+	}	
+
+        gnome_init_with_popt_table(PACKAGE,VERSION,argc,argv,
+				   popt_options,0,NULL);
+#else
+        gtk_init(&argc, &argv);
+
+	/* scan command-line options */
+	opterr = 1;
+	while ((opt = getopt_long (argc, argv, /*"ahl::u:v"*/"ahl::u:v",
+				   long_options, NULL)) != -1) {
+		switch (opt) {
+		case 'u': /* set user */
+			opt_user = 1;
+			opt_user_arg = g_strdup (optarg);
+			break;
+		case 'l':
+			opt_login = 1;
+			opt_login_arg = g_strdup (optarg);
+			break;
+		case 'a': /* account editor */
+			opt_acct = 1;
+			break;
+		case 'v': /* version */
+			opt_version = 1;
+			break;
+		case 'h': /* help */
+			opt_help = 1;
+			break;
+		case '?':
+		default:
+			show_usage(1, argv[0]);
+			return 0;
+			break;
+		}
+	}
+
+#endif /* USE_GNOME */
+
+	/* show help message */
+	if (opt_help) {
+		show_usage(0, argv[0]);
+		return 0;
+	}
+	/* show version window */
+	if (opt_version) {
 		gtk_init(&argc, &argv);
 		set_defaults(FALSE); /* needed for open_url_nw */
 		load_prefs();
@@ -451,17 +563,19 @@
 		return 0;
 	}
 
-#ifdef USE_APPLET
-        init_applet_mgr(argc, argv);
-#elif defined USE_GNOME
-        gnome_init(PACKAGE,VERSION,argc,argv);
-#else
-        gtk_init(&argc, &argv);
-#endif /* USE_GNOME */
 
         set_defaults(FALSE);
         load_prefs();
 
+	/* set the default username */
+	if (opt_user_arg != NULL) {
+		set_first_user (opt_user_arg);
+#ifndef USE_GNOME
+		g_free (opt_user_arg);
+		opt_user_arg = NULL;
+#endif /* USE_GNOME */
+	}
+
 	if (general_options & OPT_GEN_DEBUG)
 		show_debug(NULL);
 
@@ -471,9 +585,19 @@
 	perl_init();
 	perl_autoload();
 #endif
+	static_proto_init();
 
-	static_proto_init();
-	auto_login();
+	/* deal with --login */
+	if (opt_login) {
+		do_login_ret = do_auto_login (opt_login_arg);
+		if (opt_login_arg != NULL) {
+			g_free (opt_login_arg);
+			opt_login_arg = NULL;
+		}
+	}
+
+	if (!opt_acct)
+		auto_login();
 
 #ifdef USE_APPLET
 	applet_widget_register_callback(APPLET_WIDGET(applet),
@@ -499,7 +623,10 @@
 	applet_widget_gtk_main();
 #else
 
-        show_login();
+	if (opt_acct) {
+		account_editor (NULL, NULL);
+	} else if (do_login_ret == -1)
+		show_login();
         gtk_main();
         
 #endif /* USE_APPLET */
--- a/src/gaim.h	Thu Oct 19 22:34:22 2000 +0000
+++ b/src/gaim.h	Fri Oct 20 00:35:30 2000 +0000
@@ -625,6 +625,9 @@
 extern void translate_blt (FILE *, char *);
 extern char *stylize(gchar *, int);
 extern int set_dispstyle (int);
+extern void show_usage (int, char *);
+extern void set_first_user (char *);
+extern int do_auto_login (char *);
 
 /* Functions in server.c */
 /* input to serv */
--- a/src/multi.c	Thu Oct 19 22:34:22 2000 +0000
+++ b/src/multi.c	Fri Oct 20 00:35:30 2000 +0000
@@ -96,11 +96,15 @@
 		gtk_widget_destroy(acctedit);
 	}
 	acctedit = NULL;
+	if (d == NULL && blist == NULL)
+		exit(0);
 }
 
 static gint acctedit_close(GtkWidget *w, gpointer d)
 {
 	gtk_widget_destroy(acctedit);
+	if (d == NULL && blist == NULL)
+		exit(0);
 	return FALSE;
 }
 
@@ -559,7 +563,7 @@
 	gtk_container_border_width(GTK_CONTAINER(acctedit), 10);
 	gtk_widget_set_usize(acctedit, -1, 200);
 	gtk_signal_connect(GTK_OBJECT(acctedit), "destroy",
-			   GTK_SIGNAL_FUNC(delete_acctedit), NULL);
+			   GTK_SIGNAL_FUNC(delete_acctedit), W);
 
 	frame = gtk_frame_new(_("Account Editor"));
 	gtk_container_add(GTK_CONTAINER(acctedit), frame);
@@ -594,7 +598,7 @@
 
 	button = picture_button(acctedit, _("Close"), gnome_close_xpm);
 	gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
-	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(acctedit_close), NULL);
+	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(acctedit_close), W);
 
 	gtk_widget_show(acctedit);
 }
--- a/src/util.c	Thu Oct 19 22:34:22 2000 +0000
+++ b/src/util.c	Fri Oct 20 00:35:30 2000 +0000
@@ -1180,3 +1180,87 @@
 	}
 	return dispstyle;
 }
+
+
+void show_usage (int mode, char *name)
+{
+	switch (mode) {
+	case 0: /* full help text */
+	  printf ("Usage: %s [OPTION]...\n\n"
+		  "  -a, --acct          display account editor window\n"
+		  "  -l, --login[=NAME]  automatically login (optional argument NAME specifies\n"
+		  "                      account(s) to use)\n"
+		  "  -u, --user=NAME     use account NAME\n"
+		  "  -v, --version       display version information window\n"
+		  "  -h, --help          display this help and exit\n", name);
+	  break;
+	case 1: /* short message */
+	  printf ("Try `%s -h' for more information.\n", name);
+	  break;
+	}
+}
+
+
+void set_first_user (char *name)
+{
+	struct aim_user *u;
+
+	u = find_user (name);
+
+	if (!u) { /* new user */
+		u = g_new0(struct aim_user, 1);
+		g_snprintf(u->username, sizeof(u->username), "%s", name);
+		u->protocol = 0 /* PROTO_TOC */;
+		aim_users = g_list_prepend (aim_users, u);
+	} else { /* user already exists */
+		aim_users = g_list_remove (aim_users, u);
+		aim_users = g_list_prepend (aim_users, u);
+	}
+	save_prefs();
+}
+
+
+/* <name> is a comma-separated list of names, or NULL
+   if NULL and there is at least one user defined in .gaimrc, try to login.
+   if not NULL, parse <name> into separate strings, look up each one in 
+   .gaimrc and, if it's there, try to login.
+   returns:  0 if successful
+            -1 if no user was found that had a saved password
+*/
+int do_auto_login (char *name)
+{
+	struct aim_user *u;
+	char **names, **n, *first = NULL;
+	int retval = -1;
+
+	if (name != NULL) { /* list of names given */
+		names = g_strsplit (name, ",", 32);
+		for (n = names; *n != NULL; n++) {
+			printf ("user %s...\n", *n);
+			u = find_user(*n);
+			if (u) { /* found a user */
+				if (first == NULL)
+					first = g_strdup (*n);
+				if (u->options & OPT_USR_REM_PASS) {
+					printf ("got user %s\n", *n);
+					retval = 0;
+					serv_login(u);
+				}
+			}
+		}
+		/* make the first user listed the default */
+		if (first != NULL)
+			set_first_user (first);
+		g_strfreev (names);
+		g_free (first);
+	} else { /* no name given, use default */
+		u = (struct aim_user *)aim_users->data;
+		if (u->options & OPT_USR_REM_PASS) {
+			retval = 0;
+			serv_login(u);
+		}
+	}
+
+	return retval;
+}
+