unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Alin Soare <as1789@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Emacs Dev <emacs-devel@gnu.org>
Subject: Re: Fwd: Tabs for console.
Date: Tue, 7 Dec 2010 06:47:33 +0200	[thread overview]
Message-ID: <AANLkTi=YsOqipJgdRO6yP38M0-Jz0hPCeojmfGKpicH9@mail.gmail.com> (raw)
In-Reply-To: <jwvsjyai7lv.fsf-monnier+emacs@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 4670 bytes --]

> > The idea is that I added to struct frame a list of tabs.
>
> Where is it?  In the frame's parameters?  Or is it accessed via a new
> frame-tabs and set-frame-tabs?
>
> struct frame
{
...
    /*
     * an alist  of the form ((alist_tab_parameters))
     */
    Lisp_Object tab_bar_items;
...
}



> In any case, how difficult would it be to generalize your code so the
> tabs can be attached to a window rather than a frame, or even to an
> internal window (i.e. internal windows are those that are somewhere
> along the window tree and hold various actual windows: currently your
> tabs are at the root internal window).
>
>
I did not think about. Not too difficult.



> > A tab is an alist of
>
> > (
> >   (:name "string-name")
> >   (:init-code (lambda () ... code) )
> >   (:activate-code (lambda() ... code) )
> >   (:deactivate-code ... )
> >   (:environment list-of-symbols)
> > )
>
> What's the init-code for?
>

The init code is executed only when the tab is created. In my script it is
used to memorize the current window config into a variable 'sym. The
variable sym must be tab-local during the tab existence.


> I suspect activate is run when you click on the tab and deactivate is
> run when you click on some other tab.
> What's environment and how is it used?
>
>
An environment keeps tab-local variables. For example , every tabmust know
about the window-configuration when it was created , and extract from its
own environment the value of that win config.

No other tab needs to see its own windows config.


> > This is the function that defines a tab. It initialize a symbol sym with
> the
> > value of current-window-config. The symbol 'sym is passed to
> > (make-terminal-frame), that creates the tab.
>
> I don't understand this "symbol sym" business.
>
>

I have just explained. It is not interned in the main obarray, and it is
passed to the environment of the tab.



> > ;; this is a definition of a tab as a window configuration
> > (defun make-wc-tab (parms)
> >   ;; save curent win config
> >   (setq sym (make-symbol "winconfig"))
>
> Here, you're setting a global variable, which is wrong.  It's also very
> unclear why you want a symbol here.
>

It is not global. It is not interned, and it becomes tab-local.



> >   (set sym  (current-window-configuration))
> >   ;; make a tab that keeps a window configuration. When it is created,
> >   ;; it memorizes the current win config. When it is activated, it
> >   ;; restores the memorized win config
> >   (make-terminal-frame
> >    (list '(tab . t)
> >      '(tab:name . "WinC")
> >      '(tab:activate
> >        .
> >        (lambda ()
> >          (set-window-configuration
> >           (eval (cdr (assoc 'tab:env (frame-parameters) ) ) ) ) ) )
>
> `eval' is bad.  Stay very far away from it.
>
> >      ;; save the current win config into the tab environment
> >      (cons 'tab:env sym) ) ) )
>
> How do "tab:activate" and friends relate to the
> previous :activate-code thingies?
>


Via tab-local variables.

In this moment I added code to modify the environment of a tab only via the
initialization of the tab with make-terminal-frame, but I can add a function
to operate on tab-local variables even after the creation of a tab.

For example, I did not add the tab:init code to tab's alist, because it is
runned only to creation, in make-tab, before calling make-terminal-frame.

But if I want to be able to re-initialize a tab, then a function to operate
on tab's environment is required.


>
> I don't understand the above call to `make-terminal-frame': does it
> create a new frame, or just a new tab?  If the first, then I don't
> understand how it works, and if the second, it's wrong because adding
> a tab should have nothing to do with frame creation.
>

The fact that make-tab calls directly make-terminal-frame is just a legacy
of the old code, when a tab used to be just a frame.

Imagine that emacs had lexical binding. Then we woud not need a tab
environment, because that environment would be included insode the
evaluation process, when the closure that represents the tab is initialized.
But because emacs is not able of closures, I need a tab environment, to be
able to communicate between the

(:init-code (lambda () ... code) )
(:activate-code (lambda() ... code) )
(:deactivate-code ... )

of the same tab,

Note that inside my implementation of make-tab, the variable 'winconfig has
a different value for every tab. When :activatecode is called ,

> (lambda ()
>          (set-window-configuration
>           (eval (cdr (assoc 'tab:env (frame-parameters) )

(cdr (assoc 'tab:env (frame-parameters) )  returns the variable 'winconfig,
id est sym.

[-- Attachment #2: Type: text/html, Size: 6868 bytes --]

  parent reply	other threads:[~2010-12-07  4:47 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <AANLkTim8zuFRh2L81g9KgtDon=U5Mvr+QO+HWGE1nqXP@mail.gmail.com>
2010-10-27 16:39 ` Fwd: Tabs for console Alin Soare
2010-11-08 19:22   ` Stefan Monnier
2010-11-08 19:51     ` Alin Soare
     [not found]       ` <AANLkTim8BoGpECQUUNfPidbn2k_HP77sykR=HYqw9BOE@mail.gmail.com>
     [not found]         ` <AANLkTinPBfV8OC7d9qOBWGW6130D2nXjg+=Nv2rKqMr1@mail.gmail.com>
     [not found]           ` <jwvhbewqnjj.fsf-monnier+emacs@gnu.org>
2010-12-02 22:43             ` Alin Soare
2010-12-02 22:45               ` Alin Soare
2010-12-03  8:19                 ` martin rudalics
2010-12-03  9:37                 ` Andreas Schwab
2010-12-04 21:48                   ` Alin Soare
2010-12-03  9:52                 ` Andreas Schwab
2010-12-03 11:11                   ` Alin Soare
2010-12-03 12:29                     ` Dimitri Fontaine
2010-12-04 21:42                       ` Alin Soare
2010-12-04 21:55                       ` Alin Soare
2011-03-11  8:52       ` A Soare
     [not found]     ` <AANLkTikwua2bfyvJkt+sn2vR_CzTZA6Hs0Lw=NJSVwT4@mail.gmail.com>
     [not found]       ` <jwvd3peoig0.fsf-monnier+emacs@gnu.org>
     [not found]         ` <AANLkTikPRKbvq0mg2X1Huio1z5sF3UvF6+cpT10mH-H-@mail.gmail.com>
     [not found]           ` <jwvzksilkfd.fsf-monnier+emacs@gnu.org>
     [not found]             ` <AANLkTi=MiubmGJ_Gk9OVzHY7uc+DOkHHpj5Ht+j7uNx8@mail.gmail.com>
     [not found]               ` <jwvtyiqk2al.fsf-monnier+emacs@gnu.org>
     [not found]                 ` <AANLkTi=0g00xn2P_yKE0gGkH-ZaZSvz+8yY=yy2=-6W=@mail.gmail.com>
     [not found]                   ` <jwvsjyai7lv.fsf-monnier+emacs@gnu.org>
2010-12-07  4:47                     ` Alin Soare [this message]
2010-12-07  4:50                       ` Fwd: " Alin Soare
2010-12-07 17:06                       ` Stefan Monnier
2010-12-08  8:14                         ` Alin Soare
     [not found]                           ` <AANLkTikaXr_4bVR2_v7HVFfPB93Sw10e63cKqTRwOunS@mail.gmail.com>
2010-12-08 11:16                             ` Alin Soare
2010-12-09  4:29                           ` Fwd: " Stefan Monnier
2010-12-09  8:26                             ` Alin Soare
2010-12-10  3:35                               ` Stefan Monnier
2010-12-10  8:15                                 ` Alin Soare
2010-12-10 20:13                                   ` Stefan Monnier
2010-12-10 21:09                                     ` Alin Soare
2010-12-10 21:23                                       ` Davis Herring
2010-12-10 21:34                                         ` Alin Soare
2010-12-12 20:02                                           ` Alin Soare
2010-12-13 17:23                                             ` Stefan Monnier
2010-12-13 21:01                                               ` Alin Soare
2010-12-14 15:25                                 ` Alin Soare
2010-10-27 20:34 ` Alin Soare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='AANLkTi=YsOqipJgdRO6yP38M0-Jz0hPCeojmfGKpicH9@mail.gmail.com' \
    --to=as1789@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).