# HG changeset patch # User Rob Flynn # Date 1041312176 0 # Node ID 9c31ddae80a111abdd6bc217e5352991739508a2 # Parent d833bacc054fd29a93b030df5ca1a8360c0dc1cf [gaim-migrate @ 4385] I'm commiting this so Robot101 will leave me alone. Here's some session management stuff. Happy Gnome People. committer: Tailor Script diff -r d833bacc054f -r 9c31ddae80a1 configure.ac --- a/configure.ac Tue Dec 31 02:53:41 2002 +0000 +++ b/configure.ac Tue Dec 31 05:22:56 2002 +0000 @@ -122,6 +122,7 @@ AC_ARG_ENABLE(gtkspell, [ --disable-gtkspell compile without GtkSpell automatic spell checking],,enable_gtkspell=yes) AC_ARG_ENABLE(debug, [ --enable-debug compile with debugging support],,enable_debug=no) AC_ARG_ENABLE(screensaver, [ --disable-screensaver compile without X screensaver extension],,enable_xss=yes) +AC_ARG_ENABLE(sm, [ --disable-sm compile without X session management support],,enable_sm=yes) AC_ARG_WITH(krb4, [ --with-krb4=PREFIX Compile Zephyr plugin with Kerberos 4 support],kerberos="$withval",kerberos="no") if test "$enable_debug" = yes ; then @@ -141,9 +142,10 @@ AC_PATH_PROG(gaimpath, gaim) CFLAGS="$CFLAGS $GTK_CFLAGS -DGTK_ENABLE_BROKEN" +AC_PATH_X + dnl Check for XScreenSaver if test "x$enable_xss" = "xyes" ; then - AC_PATH_X old_LIBS="$LIBS" LIBS="$LIBS $GTK_LIBS -L$x_libraries" XSS_LIBS="no" @@ -168,6 +170,23 @@ AC_SUBST(XSS_LIBS) +dnl Check for X session management libs +if test "x$enable_sm" = "xyes"; then + enable_sm=no + AC_CHECK_LIB(SM, SmcSaveYourselfDone, found_sm_lib=true, , [-L$x_libraries -lICE]) + if test "$found_sm_lib" = "true"; then + AC_CHECK_HEADERS(X11/SM/SMlib.h, SM_LIBS="-L$x_libraries -lSM -lICE" enable_sm=yes) + fi +else + SM_LIBS="" + enable_sm=no +fi +AC_SUBST(SM_LIBS) +if test "$enable_sm" = "yes"; then + AC_DEFINE(USE_SM, 1, [Define if we're using X Session Management.]) +fi + + AC_DEFUN(GC_TM_GMTOFF, [AC_REQUIRE([AC_STRUCT_TM])dnl AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff, @@ -410,6 +429,7 @@ echo Build with GtkSpell............: $enable_gtkspell echo echo Use XScreenSaver Extension.... : $enable_xss +echo Use X Session Management...... : $enable_sm echo echo Build with ESD................ : $enable_esd echo Build with NAS................ : $enable_nas diff -r d833bacc054f -r 9c31ddae80a1 configure.in --- a/configure.in Tue Dec 31 02:53:41 2002 +0000 +++ b/configure.in Tue Dec 31 05:22:56 2002 +0000 @@ -142,9 +142,10 @@ AC_PATH_PROG(gaimpath, gaim) CFLAGS="$CFLAGS $GTK_CFLAGS -DGTK_ENABLE_BROKEN" +AC_PATH_X + dnl Check for XScreenSaver if test "x$enable_xss" = "xyes" ; then - AC_PATH_X old_LIBS="$LIBS" LIBS="$LIBS $GTK_LIBS -L$x_libraries" XSS_LIBS="no" @@ -168,6 +169,24 @@ fi AC_SUBST(XSS_LIBS) + +dnl Check for X session management libs +if test "x$enable_sm" = "xyes"; then + enable_sm=no + AC_CHECK_LIB(SM, SmcSaveYourselfDone, found_sm_lib=true, , [-L$x_libraries -lICE]) + if test "$found_sm_lib" = "true"; then + AC_CHECK_HEADERS(X11/SM/SMlib.h, SM_LIBS="-L$x_libraries -lSM -lICE" enable_sm=yes) + fi +else + SM_LIBS="" + enable_sm=no +fi +AC_SUBST(SM_LIBS) +if test "$enable_sm" = "yes"; then + AC_DEFINE(USE_SM, 1, [Define if we're using X Session Management.]) +fi + + AC_DEFUN(GC_TM_GMTOFF, [AC_REQUIRE([AC_STRUCT_TM])dnl AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff, diff -r d833bacc054f -r 9c31ddae80a1 plugins/docklet/docklet.c --- a/plugins/docklet/docklet.c Tue Dec 31 02:53:41 2002 +0000 +++ b/plugins/docklet/docklet.c Tue Dec 31 05:22:56 2002 +0000 @@ -39,17 +39,18 @@ /* types */ enum docklet_status { + offline, + offline_connecting, online, + online_connecting, + online_pending, away, - away_pending, - unread_pending, - connecting, - offline + away_pending }; /* functions */ static gboolean docklet_create(); -static void docklet_update_status(); +static gboolean docklet_update_status(); void gaim_plugin_remove(); /* globals */ @@ -88,12 +89,13 @@ menu = gtk_menu_new(); - if (status == offline) { - entry = gtk_menu_item_new_with_label(_("Auto-login")); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(auto_login), NULL); - gtk_menu_append(GTK_MENU(menu), entry); - } else { - if (status == online) { + switch (status) { + case offline: + case offline_connecting: + break; + case online: + case online_connecting: + case online_pending: { GtkWidget *docklet_awaymenu; GSList *awy = NULL; struct away_message *a = NULL; @@ -111,8 +113,8 @@ awy = g_slist_next(awy); } - entry = gtk_separator_menu_item_new(); - gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); + if (away_messages) + gaim_separator(docklet_awaymenu); entry = gtk_menu_item_new_with_label(_("New...")); g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(create_away_mess), NULL); @@ -121,43 +123,43 @@ entry = gtk_menu_item_new_with_label(_("Away")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), docklet_awaymenu); gtk_menu_append(GTK_MENU(menu), entry); - } else { + } break; + case away: + case away_pending: entry = gtk_menu_item_new_with_label(_("Back")); g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_im_back), NULL); gtk_menu_append(GTK_MENU(menu), entry); - } - - entry = gtk_menu_item_new_with_label(_("Signoff")); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(signoff_all), NULL); - gtk_menu_append(GTK_MENU(menu), entry); + break; } - entry = gtk_separator_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), entry); + switch (status) { + case offline: + case offline_connecting: + entry = gtk_menu_item_new_with_label(_("Auto-login")); + g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(auto_login), NULL); + gtk_menu_append(GTK_MENU(menu), entry); + break; + default: + entry = gtk_menu_item_new_with_label(_("Signoff")); + g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(signoff_all), NULL); + gtk_menu_append(GTK_MENU(menu), entry); + break; + } + + gaim_separator(menu); entry = gtk_check_menu_item_new_with_label(_("Mute Sounds")); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry), mute_sounds); g_signal_connect(G_OBJECT(entry), "toggled", G_CALLBACK(docklet_toggle_mute), NULL); gtk_menu_append(GTK_MENU(menu), entry); - entry = gtk_menu_item_new_with_label(_("Accounts")); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(account_editor), NULL); - gtk_menu_append(GTK_MENU(menu), entry); - - entry = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(show_prefs), NULL); - gtk_menu_append(GTK_MENU(menu), entry); + gaim_new_item_from_pixbuf(menu, _("Accounts..."), "accounts-menu.png", G_CALLBACK(account_editor), NULL, 0, 0, 0); + gaim_new_item_from_stock(menu, _("Preferences..."), GTK_STOCK_PREFERENCES, G_CALLBACK(show_prefs), NULL, 0, 0, 0); - entry = gtk_separator_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), entry); + gaim_separator(menu); - entry = gtk_menu_item_new_with_label(_("About")); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(show_about), NULL); - gtk_menu_append(GTK_MENU(menu), entry); - - entry = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); - g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_quit), NULL); - gtk_menu_append(GTK_MENU(menu), entry); + gaim_new_item_from_pixbuf(menu, _("About Gaim..."), "about_menu.png", G_CALLBACK(show_about), NULL, 0, 0, 0); + gaim_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(do_quit), NULL, 0, 0, 0); gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); @@ -189,23 +191,25 @@ GdkPixbuf *unscaled; switch (status) { + case offline: + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "offline.png", NULL); + break; + case offline_connecting: + case online_connecting: + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "connect.png", NULL); + break; case online: filename = g_build_filename(DATADIR, "pixmaps", "gaim", "online.png", NULL); break; + case online_pending: + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgunread.png", NULL); + break; case away: filename = g_build_filename(DATADIR, "pixmaps", "gaim", "away.png", NULL); break; case away_pending: filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgpend.png", NULL); break; - case unread_pending: - filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgunread.png", NULL); - break; - case connecting: - filename = g_build_filename(DATADIR, "pixmaps", "gaim", "connect.png", NULL); - break; - case offline: - filename = g_build_filename(DATADIR, "pixmaps", "gaim", "offline.png", NULL); } unscaled = gdk_pixbuf_new_from_file(filename, NULL); @@ -226,14 +230,14 @@ g_free(filename); } -static void docklet_update_status() { +static gboolean docklet_update_status() { enum docklet_status oldstatus; oldstatus = status; if (connections) { if (unread_message_queue) { - status = unread_pending; + status = online_pending; } else if (awaymessage) { if (message_queue) { status = away_pending; @@ -241,13 +245,13 @@ status = away; } } else if (connecting_count) { - status = connecting; + status = online_connecting; } else { status = online; } } else { if (connecting_count) { - status = connecting; + status = offline_connecting; } else { status = offline; } @@ -256,6 +260,8 @@ if (status != oldstatus) { docklet_update_icon(); } + + return FALSE; /* for when we're called by the glib idle handler */ } static void docklet_embedded(GtkWidget *widget, void *data) { @@ -314,7 +320,10 @@ } static void gaim_signoff(struct gaim_connection *gc, void *data) { - docklet_update_status(); + /* do this when idle so that if the prpl was connecting + and was cancelled, we register that connecting_count + has returned to 0 */ + g_idle_add(docklet_update_status, NULL); } static void gaim_connecting(struct aim_user *user, void *data) { diff -r d833bacc054f -r 9c31ddae80a1 src/Makefile.am --- a/src/Makefile.am Tue Dec 31 02:53:41 2002 +0000 +++ b/src/Makefile.am Tue Dec 31 05:22:56 2002 +0000 @@ -24,6 +24,7 @@ proxy.c \ prpl.c \ server.c \ + session.c \ socket.c \ sound.c \ util.c @@ -37,7 +38,7 @@ CFLAGS += $(PERL_CFLAGS) $(GTKSPELL_CFLAGS) CFLAGS += -DLOCALEDIR=\"$(datadir)/locale\" -DLIBDIR=\"$(libdir)/gaim/\" $(DEBUG_CFLAGS) -DDATADIR=\"$(datadir)\" -LIBS = @LIBS@ $(GTK_LIBS) $(SOUND_LIBS) $(STATIC_LINK_LIBS) $(PERL_LIBS) $(XSS_LIBS) $(INTLLIBS) $(DEBUG_LIBS) $(GTKSPELL_LIBS) +LIBS = @LIBS@ $(GTK_LIBS) $(SOUND_LIBS) $(STATIC_LINK_LIBS) $(PERL_LIBS) $(XSS_LIBS) $(SM_LIBS) $(INTLLIBS) $(DEBUG_LIBS) $(GTKSPELL_LIBS) EXTRA_DIST = convo.h \ core.h \ diff -r d833bacc054f -r 9c31ddae80a1 src/about.c --- a/src/about.c Tue Dec 31 02:53:41 2002 +0000 +++ b/src/about.c Tue Dec 31 05:22:56 2002 +0000 @@ -188,5 +188,5 @@ /* Let's give'em something to talk about -- woah woah woah */ gtk_widget_show(about); - gtk_window_present(about); + gtk_window_present(GTK_WINDOW(about)); } diff -r d833bacc054f -r 9c31ddae80a1 src/aim.c --- a/src/aim.c Tue Dec 31 02:53:41 2002 +0000 +++ b/src/aim.c Tue Dec 31 05:22:56 2002 +0000 @@ -125,6 +125,11 @@ perl_end(); #endif +#ifdef USE_SM + /* unplug */ + session_end(); +#endif + /* and end it all... */ gtk_main_quit(); } @@ -552,6 +557,7 @@ { int opt_acct = 0, opt_help = 0, opt_version = 0, opt_login = 0, opt_nologin = 0, dologin_ret = -1; char *opt_user_arg = NULL, *opt_login_arg = NULL; + char *opt_session_arg = NULL; #if HAVE_SIGNAL_H int sig_indx; /* for setting up signal catching */ sigset_t sigset; @@ -570,6 +576,7 @@ {"file", required_argument, NULL, 'f'}, {"debug", no_argument, NULL, 'd'}, {"version", no_argument, NULL, 'v'}, + {"session", required_argument, NULL, 's'}, {0, 0, 0, 0} }; @@ -703,7 +710,7 @@ opterr = 1; while ((opt = getopt_long(argc, argv, #ifndef _WIN32 - "adhu:f:vn", + "adhu:f:vns:", #else "adghu:f:vn", #endif @@ -722,6 +729,9 @@ case 'f': opt_rcfile_arg = g_strdup(optarg); break; + case 's': /* use existing session ID */ + opt_session_arg = g_strdup(optarg); + break; case 'v': /* version */ opt_version = 1; break; @@ -806,6 +816,14 @@ ui_main(); #endif +#ifdef USE_SM + session_init(argv[0], opt_session_arg); +#endif + if (opt_session_arg != NULL) { + g_free(opt_session_arg); + opt_session_arg = NULL; + }; + /* set the default username */ if (opt_user_arg != NULL) { set_first_user(opt_user_arg); diff -r d833bacc054f -r 9c31ddae80a1 src/buddy.c --- a/src/buddy.c Tue Dec 31 02:53:41 2002 +0000 +++ b/src/buddy.c Tue Dec 31 05:22:56 2002 +0000 @@ -2487,8 +2487,8 @@ y != blist_pos.y || event->width != blist_pos.width || event->height != blist_pos.height) { - blist_pos.x = x > 0 ? x : 0; - blist_pos.y = y > 0 ? y : 0; + blist_pos.x = x; + blist_pos.y = y; blist_pos.width = event->width; blist_pos.height = event->height; save_prefs(); diff -r d833bacc054f -r 9c31ddae80a1 src/ui.h --- a/src/ui.h Tue Dec 31 02:53:41 2002 +0000 +++ b/src/ui.h Tue Dec 31 05:22:56 2002 +0000 @@ -315,6 +315,9 @@ /* Globals in prpl.c */ extern GtkWidget *protomenu; +/* Globals in session.c */ +extern gboolean session_managed; + /* Globals in sound.c */ extern gboolean mute_sounds; @@ -506,7 +509,6 @@ extern void apply_color_dlg(GtkWidget *, gpointer); extern void destroy_colorsel(GtkWidget *, gpointer); - /* Functions in prpl.c */ extern void register_dialog(); @@ -514,6 +516,10 @@ /* server.c is in desperate need need of a split */ extern int find_queue_total_by_name(char *); +/* Functions in session.c */ +extern void session_init(gchar *, gchar *); +extern void session_end(); + /* Functions in sound.c */ extern void play_sound(int); extern void play_file(char *);