unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* feature request: efficient support for dynamic GNU Screen window titles
@ 2007-04-28 18:45 Trent Buck
  0 siblings, 0 replies; 3+ messages in thread
From: Trent Buck @ 2007-04-28 18:45 UTC (permalink / raw)
  To: bug-gnu-emacs; +Cc: trentbuck


[-- Attachment #1.1: Type: text/plain, Size: 2296 bytes --]

[I'm currently using CVS GNU Emacs; I'm not using emacs-pretest-bug
because it's not release critical.  I hope that's the Right Thing.]

I use GNU Screen as both a window system and a window manager.  Screen
allows client windows to change their window title by emitting a
specially crafted escape sequence, like so:

  (send-string-to-terminal
   (concat "\ek"
           (format-mode-line frame-title-format)
           "\e\\"))

I found that the following can be used to update the window title:

  (when (and (null window-system)
             (string-match "\\`screen" (getenv "TERM")))
    (add-hook 'post-command-hook
      (lambda ()
        (send-string-to-terminal
         (concat "\ek"
                 (format-mode-line frame-title-format)
                 "\e\\")))))

Unfortunately, this means that every time ANY command is run, Emacs
prints a string to the controlling terminal.  For example, with the
above hook in place, copying a paragraph of text from another Screen
window into Emacs' window is significantly slower and produces lots of
flicker.  On my 1.6GHz Sempron system, it's UNUSABLY slow.

From [0] and [1], it appears that there is no more appropriate hook.
The analogous code for setting the X window title is implemented in C,
in xdisp.c (x_consider_frame_title).

Is it possible to implement efficient updating of the Screen window
title in lisp (i.e. in my .emacs)?  If not, the C core will need
patching to support this (right?), and I don't speak C.

PS: I also tried using the :eval feature:

  (setq frame-title-format
        '(:eval (progn (shell-command "touch /tmp/zappo")
                       (send-string-to-terminal
                        (concat "\ek"
                                (format-mode-line "%b")
                                "\e\\"))
                       "%b")))

...but this didn't seem to have any effect whatsoever, possibly
because frame-title-format is currently only used when Emacs is
compiled with X support (#ifdef HAVE_WINDOW_SYSTEM).  (The
shell-command form is a kludgy way of determining if the form is ever
evaluated.)

[0] http://lists.gnu.org/archive/html/emacs-devel/2006-03/msg00909.html
[1] http://groups.google.com/group/gnu.emacs.bug/msg/d578877c3a084d84

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

[-- Attachment #2: Type: text/plain, Size: 149 bytes --]

_______________________________________________
bug-gnu-emacs mailing list
bug-gnu-emacs@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-gnu-emacs

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: feature request: efficient support for dynamic GNU Screen window titles
       [not found] <mailman.2697.1177883376.7795.bug-gnu-emacs@gnu.org>
@ 2007-04-30  0:04 ` Miles Bader
  2007-04-30  5:45   ` Trent Buck
  0 siblings, 1 reply; 3+ messages in thread
From: Miles Bader @ 2007-04-30  0:04 UTC (permalink / raw)
  To: trentbuck; +Cc: bug-gnu-emacs

"Trent Buck" <trentbuck@gmail.com> writes:
> Unfortunately, this means that every time ANY command is run, Emacs
> prints a string to the controlling terminal.  For example, with the
> above hook in place, copying a paragraph of text from another Screen
> window into Emacs' window is significantly slower and produces lots of
> flicker.  On my 1.6GHz Sempron system, it's UNUSABLY slow.

Of course it would be nice to have a more elegant method, but I suspect
your method could be sped up a lot by keeping track of the last string
you sent to the terminal, and only sending again when it changes.

E.g.:

    (defvar last-sent-frame-title nil)
    (when (and (null window-system)
          (string-match "\\`screen" (getenv "TERM")))
      (add-hook 'post-command-hook
        (lambda ()
          (let ((title (format-mode-line frame-title-format)))
            (unless (equal title last-sent-frame-title)
              (send-string-to-terminal (concat "\ek" title "\e\\"))
              (setq last-sent-frame-title title))))))

This still incurs the overhead of `format-mode-line', but at least it
avoids the actual I/O (which I expect is the main cause of slowness).

-Miles

-- 
We are all lying in the gutter, but some of us are looking at the stars.
-Oscar Wilde

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: feature request: efficient support for dynamic GNU Screen window titles
  2007-04-30  0:04 ` feature request: efficient support for dynamic GNU Screen window titles Miles Bader
@ 2007-04-30  5:45   ` Trent Buck
  0 siblings, 0 replies; 3+ messages in thread
From: Trent Buck @ 2007-04-30  5:45 UTC (permalink / raw)
  To: Miles Bader; +Cc: bug-gnu-emacs


[-- Attachment #1.1: Type: text/plain, Size: 1632 bytes --]

On Mon, Apr 30, 2007 at 09:04:38AM +0900, Miles Bader wrote:
> "Trent Buck" <trentbuck@gmail.com> writes:
> > Unfortunately, this means that every time ANY command is run,
> > Emacs prints a string to the controlling terminal.  For example,
> > with the above hook in place, copying a paragraph of text from
> > another Screen window into Emacs' window is significantly slower
> > and produces lots of flicker.  On my 1.6GHz Sempron system, it's
> > UNUSABLY slow.
> 
> Of course it would be nice to have a more elegant method, but I
> suspect your method could be sped up a lot by keeping track of the
> last string you sent to the terminal, and only sending again when it
> changes.
> 
> E.g.:
> 
>     (defvar last-sent-frame-title nil)
>     (when (and (null window-system)
>           (string-match "\\`screen" (getenv "TERM")))
>       (add-hook 'post-command-hook
>         (lambda ()
>           (let ((title (format-mode-line frame-title-format)))
>             (unless (equal title last-sent-frame-title)
>               (send-string-to-terminal (concat "\ek" title "\e\\"))
>               (setq last-sent-frame-title title))))))
> 
> This still incurs the overhead of `format-mode-line', but at least
> it avoids the actual I/O (which I expect is the main cause of
> slowness).

Ah, thank you, this is much better.  I tried timing a sample pasting
of 4096 characters, and the results were:

    No hook:   3 seconds
    New hook:  3 seconds
    Old hook: 21 seconds

...so I'll use this pragmatic version, inelegance of postcommand-hook
be damned.
-- 
Trent Buck, Student Errant

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

[-- Attachment #2: Type: text/plain, Size: 149 bytes --]

_______________________________________________
bug-gnu-emacs mailing list
bug-gnu-emacs@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-gnu-emacs

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-04-30  5:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.2697.1177883376.7795.bug-gnu-emacs@gnu.org>
2007-04-30  0:04 ` feature request: efficient support for dynamic GNU Screen window titles Miles Bader
2007-04-30  5:45   ` Trent Buck
2007-04-28 18:45 Trent Buck

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).