Search code examples
linuxemacslispelispdot-emacs

Change Emacs window appearance when it loses focus


When I program I use two screens with Emacs on both with two buffers split in each window totaling 4 open source files on screen at any one time.

I switch between buffers with C-x b and between Windows with Alt-TAB. I change the appearance of buffers when I switch between them by defining different faces for mode-line and mode-line-inactive. But how do I inactivate a buffer when I switch from the Emacs window completely to another Emacs window via Alt-TAB?

It's probably also relevant that I'm using Emacs 23.2.1 on Ubuntu 11.04 with Gnome 2.32.1.

PS: The question How to automatically save files on lose focus in Emacs is after a different goal but with the same original event of "window losing focus".


Solution

  • It may depend on your window manager and how it manages multiple windows, or frames, in emacs parlance. The code below works like a champ in fvwm but not always in gnome.

    I map a keystroke, C-o, to go between frames, this helps when you want to go to the other frame but an alt-tab would take you through a number of superfluous apps on the way.

    If you're running a single instance of emacs with two frames you could use something like the following:

    (defun pgr-previous-frame ()
      "go to the previous frame"
      (interactive)
      (pgr-switch-frame (previous-frame)))
    
    (defun pgr-next-frame ()
      "go to the next frame"
      (interactive)
      (pgr-switch-frame (next-frame)))
    
    (defun pgr-switch-frame (frame)
      "go to the specified frame and raise it"
      ;; reset the frame properties here
      (select-frame frame)     
      (raise-frame frame)
      ;;change the display in some manner here
      )
    

    You could also try adding some advice to raise-frame and lower-frame haven't tried it but it's worth a try.