diff src/libeggsmclient/README @ 4315:c942eaef7bc6

Implement session management.
author Ivan N. Zlatev <contact@i-nz.net>
date Mon, 03 Mar 2008 18:42:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/libeggsmclient/README	Mon Mar 03 18:42:36 2008 +0000
@@ -0,0 +1,245 @@
+This is a draft of a replacement for GnomeClient. See also
+http://live.gnome.org/SessionManagement and
+http://bugzilla.gnome.org/show_bug.cgi?id=79285.
+
+The eventual target of this code is gtk, gdk, glib, or some
+combination of them. Having it entirely in gtk/gdk may not be the best
+option, because non-GUI apps like beagled want a chance to exit
+cleanly when the session ends too. OTOH, making glib depend on libSM
+would obviously suck. Using dlopen may be a good solution.
+
+EggDesktopItem is proposed gtk-level rewrite of GnomeDesktopItem. See
+http://bugzilla.gnome.org/show_bug.cgi?id=415070
+
+
+Building your app with EggSMClient
+----------------------------------
+
+If you are using libgnomeui:
+
+	Link to libeggsmclient-gnome.la, #include
+	"eggsmclient-libgnomeui.h" in your main .c file (and
+	"eggsmclient.h" elsewhere).
+
+If you are using plain gtk:
+
+	Link to libeggsmclient.la, and #include "eggsmclient.h".
+
+If you are building on Windows:
+
+	You need to make sure to link your application as a Windows
+        GUI binary. (If using GNU tools, use "-mwindows".) If you
+        build it as a console binary, Windows won't send it the
+        WM_QUERYENDSESSION (quit_requested) and WM_ENDSESSION (quit)
+        messages.
+
+	You need to call g_thread_null(NULL) to initialize threads.
+
+
+Using EggSMClient
+-----------------
+
+Initialization with libgnomeui and GnomeProgram:
+
+	Change the gnome_program_new() invocation to use
+	EGG_SM_CLIENT_LIBGNOMEUI_MODULE instead of LIBGNOMEUI_MODULE.
+	If you haven't yet switched from popt to GOption for option
+	parsing, you have to do that now.
+
+	You should also add an EGG_SM_CLIENT_PARAM_DESKTOP_FILE
+	parameter to the gnome_program_new() invocation, and pass it
+	the path to your application's installed .desktop file. (This
+	will be used for some SM-related purposes and will also be
+	used to initialize your application's localized name and
+	default window icon. If you are currently calling
+	g_set_application_name(), gtk_window_set_default_icon(), or
+	gtk_window_set_default_icon_name(), you can remove those
+	calls.)
+
+	If you only want to use the logout notification/cancellation
+	API, and don't want to participate in session saving, you can
+	pass the EGGSMCLIENT_PARAM_MODE parameter as well, with the
+	value EGG_SM_CLIENT_MODE_NO_RESTART.
+
+Initialization with plain gtk:
+
+	Add the GOptionGroup returned by
+        egg_sm_client_get_option_group() to your GOptionContext when
+        parsing command line arguments. (If you were previously just
+        using gtk_init() or the like, you will have to create your own
+        option context now and also add the group returned by
+        gtk_get_option_group() to it. See egg-session-end.c for an
+        example.)
+
+	You should also call egg_set_desktop_file() (in
+	"eggdesktopfile.h"), passing it the path to your application's
+	installed .desktop file. (This will be used for some
+	SM-related purposes and will also be used to initialize your
+	application's localized name and default window icon. If you
+	are currently calling g_set_application_name(),
+	gtk_window_set_default_icon(), or
+	gtk_window_set_default_icon_name(), you can remove those
+	calls.)
+
+	If you only want to use the logout notification/cancellation
+	API, and don't want to participate in session saving, you can
+	call egg_sm_client_set_mode(EGG_SM_CLIENT_MODE_NO_RESTART).
+
+After parsing the command-line arguments, call
+egg_sm_client_get() to get the EggSMClient object.
+
+Use egg_sm_client_is_resumed() on the EggSMClient to see if you need
+to resume a saved state, and egg_sm_client_get_state_file() to find
+that saved state.
+
+Connect to the client's "save_state" signal if you want to be able to
+save your state and be resumed in future sessions. Connect to
+"quit_requested" if you want to get a chance to save files before
+shutdown (and/or cancel shutting down).
+
+See the gtk-doc comments in eggsmclient.c for more details.
+
+
+Notes on porting from GnomeClient or raw libSM
+----------------------------------------------
+
+There's no way to manually set most of the XSMP properties using
+EggSMClient (and no need to). Program, ProcessID, and UserID are set
+automatically. RestartCommand and CloneCommand are set from the
+.desktop file (or from a call to egg_sm_client_set_restart_command),
+and DiscardCommand is set automatically as needed after save_state is
+emitted.
+
+RestartStyleHint is set automatically based on a few things:
+
+	- SmRestartNever if you set the mode to
+          EGG_SM_CLIENT_MODE_NO_RESTART
+
+	- SmRestartImmediately if you initialize with a desktop file
+	  containing the entry "X-GNOME-AutoRestart=true"
+
+	- SmRestartIfRunning if you initialize with no desktop_file,
+	  or with a desktop_file that doesn't set
+	  "X-GNOME-AutoRestart=true". (This is the normal case.)
+
+There's no way to set the restart style hint to SmRestartAnyway
+("restart the client in the resumed session even if it wasn't running
+in the saved session"). FDO Autostart is a much better solution for
+that class of program. If your program is configured to do autostart,
+you don't need to also register for XSMP restart (unless you want to
+have it save and resume its state as well).
+
+CurrentDirectory and Environment are never set. GnomeClient sets
+CurrentDirectory, but KDE doesn't restore either of those properties
+when resuming a saved session, so it's better for apps to not depend
+on them. (If the application must have its working directory restored,
+it can just save and restore it itself.)
+
+(There probably needs to be a way to set _GSM_Priority, for
+compatibility with the current gnome-session; this will probably be
+done via another .desktop key.)
+
+The "save_yourself" signal/callback is split into two signals in
+EggSMClient: save_state and quit_requested. Most GnomeClient-based
+apps only implement the state-saving functionality currently, so they
+would only connect to "save_state" in EggSMClient, not
+"quit_requested".
+
+When saving state, EggSMClient provides you with a GKeyFile to store
+data in. If you write any data to the key file, EggSMClient will save
+it to disk and set an XSMP DiscardCommand to make sure that the
+session manager deletes it when it is no longer needed. If you can
+record your entire state on the command line, you can use
+egg_sm_client_set_restart_command() instead, to set the command that
+will be used to restart the app.
+
+If you implement the "quit_requested" side of the functionality as
+well, you don't need to "request interaction" like in
+GnomeClient/libSM. You can just start interacting with the user right
+away when the signal is emitted. Note that the argument to
+egg_sm_client_will_quit() is TRUE if you're willing to quit, and FALSE
+if not, which is the opposite of gnome_interaction_key_return() /
+SmcInteractDone().
+
+quit_requested is only for saving user files and preparing to quit. DO
+NOT save the current state from the quit_requested signal. If the user
+chooses the "save current session" option when logging out,
+EggSMClient will emit quit_requested, let you deal with all of that,
+and *then* after you're done, it will emit save_state to give you a
+chance to deal with saving the state as well.
+
+There are a bunch of other bits of GnomeClient API with no analogs:
+
+	- GNOME_CLIENT_IS_CONNECTED - Is this really ever needed?
+
+	- gnome_client_request_phase_2 - This is only needed by window
+          managers... if someone really wanted it, it could be added
+          as an EggSMClientXSMP-specific call. (You'd just call it
+          once, at startup time, to register the fact that you were a
+          phase2 client, and then when EggSMClientXSMP got a
+          SaveYourself, it would automatically respond with a
+          SaveYourselfPhase2Request, and it wouldn't emit the
+          quit_requested/save_state signals until phase 2.)
+
+	- gnome_client_request_save - Shutdown saves are now done via
+	  egg_sm_client_end_session. There is no way to request a
+	  non-shutdown save, either for yourself, or for the whole
+	  session. (Requesting a local SaveYourself for yourself won't
+	  actually have any effect under most session managers, and
+	  requesting it for the whole session is something that only a
+	  program directly associated with the session manager ought
+	  to do, so there doesn't seem to be a need for a public API
+	  for this.)
+
+	- gnome_client_flush - In most cases this is a no-op. Where
+          it's not, EggSMClientXSMP should do it automatically
+          whenever you change anything. (FIXME!)
+
+	- gnome_client_get_id - Why would you need to know?
+
+
+More notes
+----------
+
+Assuming you provide a .desktop file to gnome_program_init() or
+egg_set_desktop_file(), the state file that gets saved when you save
+the application state will actually be a copy of that .desktop file,
+with the state information appended to the end, and the Exec key
+adjusted to include "--sm-client-state-file %k" (where "%k" means "the
+path to this .desktop file"). So if you want to, you can move the
+state file out of ~/.config/session-state/ and use it directly as a
+launcher to restart the application with that saved state.
+
+Set EGG_SM_CLIENT_DEBUG=1 to debug
+
+Example code:
+
+	- egg-session-end.c: A replacement for gnome-session-save.
+	  (Well, actually only for "gnome-session-save --kill".)
+	  Yes, the --reboot and --shutdown arguments are only there to
+	  tease you.
+
+	- logout-test.c: Sits around waiting for you to try to log
+          out, and then asks "are you sure", to test
+          quit_requested/will_quit handling.
+
+	- gedit.diff: A patch to SVN gedit to make it use EggSMClient
+          instead of GnomeClient.
+
+Non-functional backends:
+
+	- OS X: eggsmclient-osx.c is not quite a proof-of-concept.
+          It's more of a handwave-of-concept. I don't have a working
+          OS X machine at the moment, so I can't test/finish this.
+
+	  See http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/BootProcess.html#//apple_ref/doc/uid/20002130-114618
+	  and other URLs linked from it for more info on the OS X
+	  logout process.
+
+	- D-Bus: There are a few references in the code to a
+          non-existent D-Bus session management client. The idea is
+          that once we have a session manager that implements that,
+          EggSMClient will pick between the (sane) D-Bus and (nasty)
+          XSMP backends at runtime depending on what session manager
+          is running. Or in special environments, it could be compiled
+          with just XSMP or just D-Bus.