(nbuttons)
Lisp_Object nbuttons;
{
+ int n;
+
CHECK_NUMBER (nbuttons, 0);
- mouse_setup_buttons (XINT (nbuttons));
+ n = XINT (nbuttons);
+ if (n < 2 || n > 3)
+ Fsignal (Qargs_out_of_range,
+ Fcons (build_string ("only 2 or 3 mouse buttons are supported"),
+ Fcons (nbuttons, Qnil)));
+ mouse_setup_buttons (n);
return Qnil;
}
*rows = ScreenRows ();
*cols = ScreenCols ();
+ /* Update Emacs' notion of screen dimensions. */
+ screen_size_X = *cols;
+ screen_size_Y = *rows;
+ screen_size = *cols * *rows;
+
#if __DJGPP__ > 1
/* If the dimensions changed, the mouse highlight info is invalid. */
if (current_rows != *rows || current_cols != *cols)
IT_set_face (int face)
{
struct frame *sf = SELECTED_FRAME();
- struct face *fp = FACE_FROM_ID (sf, face);
- unsigned long fg, bg;
+ struct face *fp = FACE_FROM_ID (sf, face);
+ struct face *dfp = FACE_FROM_ID (sf, DEFAULT_FACE_ID);
+ unsigned long fg, bg, dflt_fg, dflt_bg;
if (!fp)
{
- fp = FACE_FROM_ID (sf, DEFAULT_FACE_ID);
+ fp = dfp;
/* The default face for the frame should always be realized and
cached. */
if (!fp)
screen_face = face;
fg = fp->foreground;
bg = fp->background;
+ dflt_fg = dfp->foreground;
+ dflt_bg = dfp->background;
/* Don't use invalid colors. In particular, FACE_TTY_DEFAULT_*
colors mean use the colors of the default face, except that if
/* Make sure highlighted lines really stand out, come what may. */
if ((highlight || fp->tty_reverse_p)
- && (fg == FRAME_FOREGROUND_PIXEL (sf)
- && bg == FRAME_BACKGROUND_PIXEL (sf)))
+ && (fg == dflt_fg && bg == dflt_bg))
{
unsigned long tem = fg;
fg = bg;
bg = tem;
}
+ /* If the user requested inverse video, obey. */
+ if (inverse_video)
+ {
+ unsigned long tem2 = fg;
+
+ fg = bg;
+ bg = tem2;
+ }
if (termscript)
fprintf (termscript, "<FACE %d%s: %d/%d[FG:%d/BG:%d]>", face,
highlight ? "H" : "", fp->foreground, fp->background, fg, bg);
register GLYPH g = GLYPH_FROM_CHAR_GLYPH (*str);
int glyph_not_in_table = 0;
+ /* If g is negative, it means we have a multibyte character
+ in *str. That's what GLYPH_FROM_CHAR_GLYPH returns for
+ multibyte characters. */
if (g < 0 || g >= tlen)
{
/* This glyph doesn't have an entry in Vglyph_table. */
/* If the face of this glyph is different from the current
screen face, update the screen attribute byte. */
- cf = FAST_GLYPH_FACE (g);
+ cf = str->face_id;
if (cf != screen_face)
IT_set_face (cf); /* handles invalid faces gracefully */
}
else if (line_start_position > 0)
best_row = row;
+
+ /* Don't overstep the last matrix row, lest we get into the
+ never-never land... */
+ if (row->y + 1 >= yb)
+ break;
++row;
}
IT_note_mouse_highlight (struct frame *f, int x, int y)
{
struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
- int portion;
+ int portion = -1;
Lisp_Object window;
struct window *w;
&& (XFASTINT (w->last_overlay_modified)
== BUF_OVERLAY_MODIFF (XBUFFER (w->buffer))))
{
- int pos, i, area;
+ int pos, i;
struct glyph_row *row;
struct glyph *glyph;
+ int nrows = w->current_matrix->nrows;
/* Find the glyph under X/Y. */
glyph = NULL;
- if (y < w->current_matrix->nrows)
+ if (y >= 0 && y < nrows)
{
row = MATRIX_ROW (w->current_matrix, y);
- if (row->enabled_p
+ /* Give up if some row before the one we are looking for is
+ not enabled. */
+ for (i = 0; i <= y; i++)
+ if (!MATRIX_ROW (w->current_matrix, i)->enabled_p)
+ break;
+ if (i > y /* all rows upto and including the one at Y are enabled */
&& row->displays_text_p
&& x < window_box_width (w, TEXT_AREA))
{
(frame)
Lisp_Object frame;
{
- int reverse;
struct frame *f;
CHECK_FRAME (frame, 0);
f= XFRAME (frame);
- reverse = EQ (Fcdr (Fassq (intern ("reverse"), f->param_alist)), Qt);
- initial_screen_colors[0]
- = reverse ? FRAME_BACKGROUND_PIXEL (f) : FRAME_FOREGROUND_PIXEL (f);
- initial_screen_colors[1]
- = reverse ? FRAME_FOREGROUND_PIXEL (f) : FRAME_BACKGROUND_PIXEL (f);
+ initial_screen_colors[0] = FRAME_FOREGROUND_PIXEL (f);
+ initial_screen_colors[1] = FRAME_BACKGROUND_PIXEL (f);
}
void
int reverse = EQ (Fcdr (Fassq (Qreverse, f->param_alist)), Qt);
int was_reverse = reverse;
int redraw = 0, fg_set = 0, bg_set = 0;
+ int need_to_reverse;
unsigned long orig_fg;
unsigned long orig_bg;
+ Lisp_Object frame_bg, frame_fg;
+ extern Lisp_Object Qdefault, QCforeground, QCbackground;
/* If we are creating a new frame, begin with the original screen colors
used for the initial frame. */
}
orig_fg = FRAME_FOREGROUND_PIXEL (f);
orig_bg = FRAME_BACKGROUND_PIXEL (f);
+ frame_fg = Fcdr (Fassq (Qforeground_color, f->param_alist));
+ frame_bg = Fcdr (Fassq (Qbackground_color, f->param_alist));
+ /* frame_fg and frame_bg could be nil if, for example,
+ f->param_alist is nil, e.g. if we are called from
+ Fmake_terminal_frame. */
+ if (NILP (frame_fg))
+ frame_fg = build_string (unspecified_fg);
+ if (NILP (frame_bg))
+ frame_bg = build_string (unspecified_bg);
/* Extract parm names and values into those vectors. */
i = 0;
if (EQ (prop, Qreverse))
reverse = EQ (val, Qt);
}
-
- if (termscript && reverse && !was_reverse)
+
+ need_to_reverse = reverse && !was_reverse;
+ if (termscript && need_to_reverse)
fprintf (termscript, "<INVERSE-VIDEO>\n");
/* Now process the alist elements in reverse of specified order. */
for (i--; i >= 0; i--)
{
- extern Lisp_Object Qdefault, QCforeground, QCbackground;
Lisp_Object prop, val;
Lisp_Object frame;
if (EQ (prop, Qforeground_color))
{
- unsigned long new_color = load_color (f, NULL, val, reverse
+ unsigned long new_color = load_color (f, NULL, val, need_to_reverse
? LFACE_BACKGROUND_INDEX
: LFACE_FOREGROUND_INDEX);
if (new_color != FACE_TTY_DEFAULT_COLOR
&& new_color != FACE_TTY_DEFAULT_FG_COLOR
&& new_color != FACE_TTY_DEFAULT_BG_COLOR)
{
+ FRAME_FOREGROUND_PIXEL (f) = new_color;
/* Make sure the foreground of the default face for this
frame is changed as well. */
XSETFRAME (frame, f);
- if (reverse)
+ if (need_to_reverse)
{
- FRAME_BACKGROUND_PIXEL (f) = new_color;
Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
val, frame);
+ prop = Qbackground_color;
}
else
{
- FRAME_FOREGROUND_PIXEL (f) = new_color;
Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
val, frame);
}
}
else if (EQ (prop, Qbackground_color))
{
- unsigned long new_color = load_color (f, NULL, val, reverse
+ unsigned long new_color = load_color (f, NULL, val, need_to_reverse
? LFACE_FOREGROUND_INDEX
: LFACE_BACKGROUND_INDEX);
if (new_color != FACE_TTY_DEFAULT_COLOR
&& new_color != FACE_TTY_DEFAULT_FG_COLOR
&& new_color != FACE_TTY_DEFAULT_BG_COLOR)
{
+ FRAME_BACKGROUND_PIXEL (f) = new_color;
/* Make sure the background of the default face for this
frame is changed as well. */
XSETFRAME (frame, f);
- if (reverse)
+ if (need_to_reverse)
{
- FRAME_FOREGROUND_PIXEL (f) = new_color;
Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
val, frame);
+ prop = Qforeground_color;
}
else
{
- FRAME_BACKGROUND_PIXEL (f) = new_color;
Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
val, frame);
}
/* If they specified "reverse", but not the colors, we need to swap
the current frame colors. */
- if (reverse && !was_reverse)
+ if (need_to_reverse)
{
Lisp_Object frame;
if (!fg_set)
{
- FRAME_BACKGROUND_PIXEL (f) = orig_fg;
XSETFRAME (frame, f);
Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
- tty_color_name (orig_fg), frame);
+ tty_color_name (f, orig_fg),
+ frame);
+ store_frame_param (f, Qbackground_color, frame_fg);
redraw = 1;
}
if (!bg_set)
{
- FRAME_FOREGROUND_PIXEL (f) = orig_bg;
XSETFRAME (frame, f);
Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
- tty_color_name (orig_bg), frame);
+ tty_color_name (f, orig_bg),
+ frame);
+ store_frame_param (f, Qforeground_color, frame_bg);
redraw = 1;
}
}