+
+DEFUN ("frame-parameter", Fframe_parameter, Sframe_parameter, 2, 2, 0,
+ doc: /* Return FRAME's value for parameter PARAMETER.
+If FRAME is nil, describe the currently selected frame. */)
+ (frame, parameter)
+ Lisp_Object frame, parameter;
+{
+ struct frame *f;
+ Lisp_Object value;
+
+ if (NILP (frame))
+ frame = selected_frame;
+ else
+ CHECK_FRAME (frame);
+ CHECK_SYMBOL (parameter);
+
+ f = XFRAME (frame);
+ value = Qnil;
+
+ if (FRAME_LIVE_P (f))
+ {
+ /* Avoid consing in frequent cases. */
+ if (EQ (parameter, Qname))
+ value = f->name;
+#ifdef HAVE_X_WINDOWS
+ else if (EQ (parameter, Qdisplay) && FRAME_X_P (f))
+ value = XCAR (FRAME_X_DISPLAY_INFO (f)->name_list_element);
+#endif /* HAVE_X_WINDOWS */
+ else if (EQ (parameter, Qbackground_color)
+ || EQ (parameter, Qforeground_color))
+ {
+ value = Fassq (parameter, f->param_alist);
+ if (CONSP (value))
+ {
+ value = XCDR (value);
+ /* Fframe_parameters puts the actual fg/bg color names,
+ even if f->param_alist says otherwise. This is
+ important when param_alist's notion of colors is
+ "unspecified". We need to do the same here. */
+ if (STRINGP (value) && !FRAME_WINDOW_P (f))
+ {
+ const char *color_name;
+ EMACS_INT csz;
+
+ if (EQ (parameter, Qbackground_color))
+ {
+ color_name = SDATA (value);
+ csz = SCHARS (value);
+ if (strncmp (color_name, unspecified_bg, csz) == 0)
+ value = tty_color_name (f, FRAME_BACKGROUND_PIXEL (f));
+ else if (strncmp (color_name, unspecified_fg, csz) == 0)
+ value = tty_color_name (f, FRAME_FOREGROUND_PIXEL (f));
+ }
+ else if (EQ (parameter, Qforeground_color))
+ {
+ color_name = SDATA (value);
+ csz = SCHARS (value);
+ if (strncmp (color_name, unspecified_fg, csz) == 0)
+ value = tty_color_name (f, FRAME_FOREGROUND_PIXEL (f));
+ else if (strncmp (color_name, unspecified_bg, csz) == 0)
+ value = tty_color_name (f, FRAME_BACKGROUND_PIXEL (f));
+ }
+ }
+ }
+ else
+ value = Fcdr (Fassq (parameter, Fframe_parameters (frame)));
+ }
+ else if (EQ (parameter, Qdisplay_type)
+ || EQ (parameter, Qbackground_mode))
+ value = Fcdr (Fassq (parameter, f->param_alist));
+ else
+ value = Fcdr (Fassq (parameter, Fframe_parameters (frame)));
+ }
+
+ return value;
+}
+
+