emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Session management patch, please comment.


From: Jan Djärv
Subject: Re: Session management patch, please comment.
Date: Wed, 20 Feb 2002 21:29:12 +0100

tisdagen den 19 februari 2002 kl 23.43 skrev Kim F. Storm:

"Jan D." <address@hidden> writes:

    + DEFUN ("x-sm-interact-done", Fx_sm_interact_done,

Emacs is executing C code when this happens.  To get into lisp code, a
save-yourself-event is generated and the lisp function bound to the
event executes (handle-save-yourself).

handle-save-yourself then executes functions in the save-yourself-hook
and by calling x-sm-interact-done it finally informs the C code that
it shall send the interaction-done message to the session manager.


What about this approach:

In C, you declare a hook variable emacs-session-save-function.

In Lisp, you bind a save-session-state function to this variable.

When the save_yourself event arrives, the function bound to
emacs-session-save-function is called (with whatever arguments you
think it needs).

I don't quite understand. What purpose does the emacs-session-save-function serve, why not call a lisp function directly? And if one can call lisp functions, why not call the functions in save-session-state-hook from C?

The reason I did it the way presented, is was I think you can't call lisp functions from the X event input handler. Thus an Emacs event is used to get control to the lisp part.

But maybe this can be made an internal event and the hooks can be called from Emacs input loop. I did not know how to do that, I was not sure where such code should go to not mess things up with recursive calls. But if someone knows and can give a pointer I can modify the code.


The save-session-state function runs the save-session-state-hook hooks.

The return value from save-session-state is nil or t - corresponding
to the CANCEL argument of your x-sm-interact-done function.


    +     doc: /* The previous session id Emacs got from session manager.
    + This is nil if Emacs was not started by the session manager.
+ The value of this variable and `x-sm-id' may be the same, depending on how
    + the session manager works.
    + See also `x-sm-id'.*/);
This doc string should explain what the previous session id is good
for.  What does it mean?  Documentation for data should explain its
overall meaning, not just what it looks like and what values are found
when.

Does these really need to be a C-level lisp variables?

Isn't it enough that the previous session id is passed as an argument
to the emacs-session-restore-function and the current session id is an
argument to emacs-session-save-function?

In general, I would suspect that you only need to know either the
previous session id (when doing restore), or the current session id
(when doing save).

If you have saved state in a file with a filename based on the previous id,
you presumably would want remove or move that file, either when doing restore or save session.


If necessary, the restore-session-state function could store it in a
lisp variable for the hooks to access -- or you can rely on the
dynamic binding of the argument to restore-session-state, e.g.

        (defun save-session-state (session-id)  ;; current session-id
        ...)

        (defun restore-session-state (session-id) ;; previous session-id
        ...)

    +   DEFVAR_LISP ("x-sm-cancel-shutdown", &Vx_sm_cancel_shutdown,

With the suggested solution above, this variable could also be declared in lisp
(actually it could be dynamically bound in the save-session-state function)
:

        (defun save-session-state (session-id)
          (let ((cancel-session-shutdown nil))
            (run-hooks 'save-session-state-hook)
            cancel-session-shutdown))


This looks useful, thanks for the hint.

        Jan D.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]