4

Is there a good way (e.g. examining the value of some variable or the existence of some function) for Elisp code to determine whether the current Emacs instance is running as an X11 application?

kjo
  • 3,247
  • 17
  • 48

2 Answers2

5

To quote the documentation:

window-system is a variable defined in `C source code'. Its value is x It is a terminal-local variable; global value is the same.

Documentation: Name of window system through which the selected frame is displayed. The value is a symbol: nil for a termcap frame (a character-only terminal), 'x' for an Emacs frame that is really an X window, 'w32' for an Emacs frame that is a window on MS-Windows display, 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display, 'pc' for a direct-write MS-DOS frame.

So you can test like this:

(if (eq window-system 'x)
   ;; do this in X11
   (blah blah blah)
   ;; otherwise, do this
   (blah blah blah)
   )
PythonNut
  • 10,363
  • 2
  • 30
  • 76
  • You should be using display-graphic-p. –  Feb 12 '15 at 23:09
  • 1
    @lunaryorn not necessarily, please read the comments under the OP. display-graphic-p is not strong enough for this purpose. In this case, the user wants to distinguish X11 and Quartz, both of which support all of the features Emacs can detect with display-*-p predicates. – PythonNut Feb 12 '15 at 23:24
3

You can use the function display-graphics-p:

(display-graphic-p &optional DISPLAY)

Return non-nil if DISPLAY is a graphic display. Graphical displays are those which are capable of displaying several frames and several different fonts at once. This is true for displays that use a window system such as X, and false for text-only terminals. DISPLAY can be a display name, a frame, or nil (meaning the selected frame's display).

Note that use of the variable window-system is not recommended, from the elisp manual:

Do not use window-system and initial-window-system as predicates or boolean flag variables, if you want to write code that works differently on text terminals and graphic displays. That is because window-system is not a good indicator of Emacs capabilities on a given display type. Instead, use display-graphic-p or any of the other display-*-p predicates described in *note Display Feature Testing::.

Lindydancer
  • 6,150
  • 1
  • 15
  • 26
  • 2
    I'd say this is complementary, but sometimes, Emacs feature detection just doesn't support the feature the user is thinking of, in which case you'll have to fall back on more primitive methods. In this case, the user wants to distinguish X11 and Quartz, both of which support all of the features Emacs can detect with display-*-p predicates. – PythonNut Feb 12 '15 at 23:25