Mercurial > hg > xemacs-beta
diff src/faces.c @ 5080:5502045ec510
The background-placement face property.
-------------------- ChangeLog entries follow: --------------------
lisp/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* cl-macs.el (face-background-placement): New defsetf.
* cus-face.el (custom-face-attributes):
* faces.el (face-interactive):
* faces.el (set-face-property):
* faces.el (face-equal):
* faces.el (init-other-random-faces): Update.
* faces.el (face-background-placement):
* faces.el (set-face-background-placement):
* faces.el (face-background-placement-instance):
* faces.el (face-background-placement-instance-p):
* frame.el (set-frame-background-placement):
* frame.el (frame-background-placement):
* frame.el (frame-background-placement-instance):
* objects.el (make-face-background-placement-specifier): New.
man/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* xemacs/custom.texi (Faces): Document it.
src/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* console-x-impl.h (struct x_frame): Add new slots x and y.
* console-x-impl.h (FRAME_X_X, FRAME_X_Y): New slot accessors.
* console-gtk-impl.h: Fake something similar for potential port.
* frame-x.c (x_get_frame_text_position): New function.
* frame-x.c (x_init_frame_3): Use it.
* event-Xt.c (emacs_Xt_handle_magic_event): Eat spurious
ConfigureNotify events, get the frame position and mark frame
faces changed.
* objects-impl.h: The face_background_placement_specifier
structure and its accessors.
* objects.c: New symbols Qabsolute and Qrelative.
* objects.c (face_background_placement_create):
* objects.c (face_background_placement_mark):
* objects.c (face_background_placement_instantiate):
* objects.c (face_background_placement_validate):
* objects.c (face_background_placement_after_change):
* objects.c (set_face_background_placement_attached_to): New.
* objects.h (set_face_background_palcement_attached_to): Declare
the one above.
* objects.c (syms_of_objects):
* objects.c (specifier_type_create_objects):
* objects.c (reinit_specifier_type_create_objects):
* objects.c (reinit_vars_of_objects): Update for the modifications
above.
* console-xlike-inc.h (XLIKE_GC_TS_X_ORIGIN, XLIKE_GC_TS_X_ORIGIN):
New X11/Gtk compatibility macros.
* redisplay-xlike-inc.c (XLIKE_get_gc): Add a background placement
argument and handle it.
* gtk-glue.c (face_to_gc):
* redisplay-xlike-inc.c (XLIKE_output_string):
* redisplay-xlike-inc.c (XLIKE_output_pixmap):
* redisplay-xlike-inc.c (XLIKE_output_blank):
* redisplay-xlike-inc.c (XLIKE_output_horizontal_line):
* redisplay-xlike-inc.c (XLIKE_output_eol_cursor): Update
accordingly.
* console-impl.h (struct console_methods): Add a background
placement (Lisp_Object) argument to the clear_region method.
* console-stream.c (stream_clear_region):
* redisplay-tty.c (tty_clear_region):
* redisplay-msw.c (mswindows_clear_region):
* redisplay-xlike-inc.c (XLIKE_clear_region): Update accordingly.
* redisplay-output.c (redisplay_clear_region): Handle the
background placement property and update the call to the
clear_region method.
* faces.h (struct Lisp_Face):
* faces.h (struct face_cachel): Add a background placement slot.
* faces.h (WINDOW_FACE_CACHEL_BACKGROUND_PLACEMENT): New accessor.
* faces.c (mark_face):
* faces.c (face_equal):
* faces.c (face_getprop):
* faces.c (face_putprop):
* faces.c (face_remprop):
* faces.c (face_plist):
* faces.c (reset_face):
* faces.c (mark_face_cachels):
* faces.c (update_face_cachel_data):
* faces.c (merge_face_cachel_data):
* faces.c (reset_face_cachel):
* faces.c (Fmake_face):
* faces.c (Fcopy_face): Handle the background placement property.
* faces.c (syms_of_faces):
* faces.c (vars_of_faces):
* faces.c (complex_vars_of_faces): Update accordingly.
author | Didier Verna <didier@lrde.epita.fr> |
---|---|
date | Thu, 25 Feb 2010 16:19:01 +0100 |
parents | 07dcc7000bbf |
children | 7be849cb8828 |
line wrap: on
line diff
--- a/src/faces.c Thu Feb 25 06:14:50 2010 -0600 +++ b/src/faces.c Thu Feb 25 16:19:01 2010 +0100 @@ -3,6 +3,7 @@ Copyright (C) 1995 Board of Trustees, University of Illinois. Copyright (C) 1995, 1996, 2001, 2002, 2005, 2010 Ben Wing. Copyright (C) 1995 Sun Microsystems, Inc. + Copyright (C) 2010 Didier Verna This file is part of XEmacs. @@ -42,7 +43,7 @@ Lisp_Object Qfacep; Lisp_Object Qforeground, Qbackground, Qdisplay_table; -Lisp_Object Qbackground_pixmap, Qunderline, Qdim; +Lisp_Object Qbackground_pixmap, Qbackground_placement, Qunderline, Qdim; Lisp_Object Qblinking, Qstrikethru; Lisp_Object Qinit_face_from_resources; @@ -111,6 +112,7 @@ mark_object (face->font); mark_object (face->display_table); mark_object (face->background_pixmap); + mark_object (face->background_placement); mark_object (face->underline); mark_object (face->strikethru); mark_object (face->highlight); @@ -162,6 +164,9 @@ internal_equal (f1->font, f2->font, depth) && internal_equal (f1->display_table, f2->display_table, depth) && internal_equal (f1->background_pixmap, f2->background_pixmap, depth) && + internal_equal (f1->background_placement, + f2->background_placement, + depth) && internal_equal (f1->underline, f2->underline, depth) && internal_equal (f1->strikethru, f2->strikethru, depth) && internal_equal (f1->highlight, f2->highlight, depth) && @@ -192,18 +197,19 @@ Lisp_Face *f = XFACE (obj); return - (EQ (prop, Qforeground) ? f->foreground : - EQ (prop, Qbackground) ? f->background : - EQ (prop, Qfont) ? f->font : - EQ (prop, Qdisplay_table) ? f->display_table : - EQ (prop, Qbackground_pixmap) ? f->background_pixmap : - EQ (prop, Qunderline) ? f->underline : - EQ (prop, Qstrikethru) ? f->strikethru : - EQ (prop, Qhighlight) ? f->highlight : - EQ (prop, Qdim) ? f->dim : - EQ (prop, Qblinking) ? f->blinking : - EQ (prop, Qreverse) ? f->reverse : - EQ (prop, Qdoc_string) ? f->doc_string : + (EQ (prop, Qforeground) ? f->foreground : + EQ (prop, Qbackground) ? f->background : + EQ (prop, Qfont) ? f->font : + EQ (prop, Qdisplay_table) ? f->display_table : + EQ (prop, Qbackground_pixmap) ? f->background_pixmap : + EQ (prop, Qbackground_placement) ? f->background_placement : + EQ (prop, Qunderline) ? f->underline : + EQ (prop, Qstrikethru) ? f->strikethru : + EQ (prop, Qhighlight) ? f->highlight : + EQ (prop, Qdim) ? f->dim : + EQ (prop, Qblinking) ? f->blinking : + EQ (prop, Qreverse) ? f->reverse : + EQ (prop, Qdoc_string) ? f->doc_string : external_plist_get (&f->plist, prop, 0, ERROR_ME)); } @@ -212,16 +218,17 @@ { Lisp_Face *f = XFACE (obj); - if (EQ (prop, Qforeground) || - EQ (prop, Qbackground) || - EQ (prop, Qfont) || - EQ (prop, Qdisplay_table) || - EQ (prop, Qbackground_pixmap) || - EQ (prop, Qunderline) || - EQ (prop, Qstrikethru) || - EQ (prop, Qhighlight) || - EQ (prop, Qdim) || - EQ (prop, Qblinking) || + if (EQ (prop, Qforeground) || + EQ (prop, Qbackground) || + EQ (prop, Qfont) || + EQ (prop, Qdisplay_table) || + EQ (prop, Qbackground_pixmap) || + EQ (prop, Qbackground_placement) || + EQ (prop, Qunderline) || + EQ (prop, Qstrikethru) || + EQ (prop, Qhighlight) || + EQ (prop, Qdim) || + EQ (prop, Qblinking) || EQ (prop, Qreverse)) return 0; @@ -242,16 +249,17 @@ { Lisp_Face *f = XFACE (obj); - if (EQ (prop, Qforeground) || - EQ (prop, Qbackground) || - EQ (prop, Qfont) || - EQ (prop, Qdisplay_table) || - EQ (prop, Qbackground_pixmap) || - EQ (prop, Qunderline) || - EQ (prop, Qstrikethru) || - EQ (prop, Qhighlight) || - EQ (prop, Qdim) || - EQ (prop, Qblinking) || + if (EQ (prop, Qforeground) || + EQ (prop, Qbackground) || + EQ (prop, Qfont) || + EQ (prop, Qdisplay_table) || + EQ (prop, Qbackground_pixmap) || + EQ (prop, Qbackground_placement) || + EQ (prop, Qunderline) || + EQ (prop, Qstrikethru) || + EQ (prop, Qhighlight) || + EQ (prop, Qdim) || + EQ (prop, Qblinking) || EQ (prop, Qreverse)) return -1; @@ -270,17 +278,18 @@ Lisp_Face *face = XFACE (obj); Lisp_Object result = face->plist; - result = cons3 (Qreverse, face->reverse, result); - result = cons3 (Qblinking, face->blinking, result); - result = cons3 (Qdim, face->dim, result); - result = cons3 (Qhighlight, face->highlight, result); - result = cons3 (Qstrikethru, face->strikethru, result); - result = cons3 (Qunderline, face->underline, result); - result = cons3 (Qbackground_pixmap, face->background_pixmap, result); - result = cons3 (Qdisplay_table, face->display_table, result); - result = cons3 (Qfont, face->font, result); - result = cons3 (Qbackground, face->background, result); - result = cons3 (Qforeground, face->foreground, result); + result = cons3 (Qreverse, face->reverse, result); + result = cons3 (Qblinking, face->blinking, result); + result = cons3 (Qdim, face->dim, result); + result = cons3 (Qhighlight, face->highlight, result); + result = cons3 (Qstrikethru, face->strikethru, result); + result = cons3 (Qunderline, face->underline, result); + result = cons3 (Qbackground_placement, face->background_placement, result); + result = cons3 (Qbackground_pixmap, face->background_pixmap, result); + result = cons3 (Qdisplay_table, face->display_table, result); + result = cons3 (Qfont, face->font, result); + result = cons3 (Qbackground, face->background, result); + result = cons3 (Qforeground, face->foreground, result); return result; } @@ -293,6 +302,7 @@ { XD_LISP_OBJECT, offsetof (Lisp_Face, font) }, { XD_LISP_OBJECT, offsetof (Lisp_Face, display_table) }, { XD_LISP_OBJECT, offsetof (Lisp_Face, background_pixmap) }, + { XD_LISP_OBJECT, offsetof (Lisp_Face, background_placement) }, { XD_LISP_OBJECT, offsetof (Lisp_Face, underline) }, { XD_LISP_OBJECT, offsetof (Lisp_Face, strikethru) }, { XD_LISP_OBJECT, offsetof (Lisp_Face, highlight) }, @@ -386,6 +396,7 @@ f->font = Qnil; f->display_table = Qnil; f->background_pixmap = Qnil; + f->background_placement = Qnil; f->underline = Qnil; f->strikethru = Qnil; f->highlight = Qnil; @@ -845,6 +856,8 @@ set_font_attached_to (f->font, face, Qfont); f->background_pixmap = Fmake_specifier (Qimage); set_image_attached_to (f->background_pixmap, face, Qbackground_pixmap); + f->background_placement = Fmake_specifier (Qface_background_placement); + set_face_background_placement_attached_to (f->background_placement, face); f->display_table = Fmake_specifier (Qdisplay_table); f->underline = Fmake_specifier (Qface_boolean); set_face_boolean_attached_to (f->underline, face, Qunderline); @@ -873,6 +886,9 @@ set_specifier_fallback (f->background_pixmap, Fget (Vdefault_face, Qbackground_pixmap, Qunbound)); + set_specifier_fallback (f->background_placement, + Fget (Vdefault_face, Qbackground_placement, + Qunbound)); set_specifier_fallback (f->display_table, Fget (Vdefault_face, Qdisplay_table, Qunbound)); set_specifier_fallback (f->underline, @@ -1067,6 +1083,7 @@ mark_object (cachel->background); mark_object (cachel->display_table); mark_object (cachel->background_pixmap); + mark_object (cachel->background_placement); } } @@ -1423,6 +1440,9 @@ FROB (background_pixmap); MAYBE_UNFROB_BACKGROUND_PIXMAP; } + + FROB (background_placement); + #undef FROB #undef MAYBE_UNFROB_BACKGROUND_PIXMAP @@ -1486,6 +1506,7 @@ FROB (background); FROB (display_table); FROB (background_pixmap); + FROB (background_placement); FROB (underline); FROB (strikethru); FROB (highlight); @@ -1536,6 +1557,7 @@ } cachel->display_table = Qunbound; cachel->background_pixmap = Qunbound; + cachel->background_placement = Qunbound; FACE_CACHEL_FONT_SPECIFIED (cachel)->size = sizeof(cachel->font_specified); FACE_CACHEL_FONT_UPDATED (cachel)->size = sizeof(cachel->font_updated); } @@ -1901,8 +1923,8 @@ /* If the locale could affect the frame value, then call update_EmacsFrames just in case. */ if (default_face && - (EQ (property, Qforeground) || - EQ (property, Qbackground) || + (EQ (property, Qforeground) || + EQ (property, Qbackground) || EQ (property, Qfont))) update_EmacsFrames (locale, property); @@ -1996,6 +2018,7 @@ COPY_PROPERTY (font); COPY_PROPERTY (display_table); COPY_PROPERTY (background_pixmap); + COPY_PROPERTY (background_placement); COPY_PROPERTY (underline); COPY_PROPERTY (strikethru); COPY_PROPERTY (highlight); @@ -2126,6 +2149,7 @@ /* Qfont defined in general.c */ DEFSYMBOL (Qdisplay_table); DEFSYMBOL (Qbackground_pixmap); + DEFSYMBOL (Qbackground_placement); DEFSYMBOL (Qunderline); DEFSYMBOL (Qstrikethru); /* Qhighlight, Qreverse defined in general.c */ @@ -2199,6 +2223,7 @@ syms[n++] = Qfont; syms[n++] = Qdisplay_table; syms[n++] = Qbackground_pixmap; + syms[n++] = Qbackground_placement; syms[n++] = Qunderline; syms[n++] = Qstrikethru; syms[n++] = Qhighlight; @@ -2517,6 +2542,9 @@ set_specifier_fallback (Fget (Vmodeline_face, Qbackground_pixmap, Qnil), Fget (Vgui_element_face, Qbackground_pixmap, Qunbound)); + set_specifier_fallback (Fget (Vmodeline_face, Qbackground_placement, Qnil), + Fget (Vgui_element_face, Qbackground_placement, + Qunbound)); /* toolbar is another gui element */ Vtoolbar_face = Fmake_face (Qtoolbar, @@ -2529,6 +2557,9 @@ set_specifier_fallback (Fget (Vtoolbar_face, Qbackground_pixmap, Qnil), Fget (Vgui_element_face, Qbackground_pixmap, Qunbound)); + set_specifier_fallback (Fget (Vtoolbar_face, Qbackground_placement, Qnil), + Fget (Vgui_element_face, Qbackground_placement, + Qunbound)); /* vertical divider is another gui element */ Vvertical_divider_face = Fmake_face (Qvertical_divider, @@ -2543,6 +2574,10 @@ Qunbound), Fget (Vgui_element_face, Qbackground_pixmap, Qunbound)); + set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground_placement, + Qnil), + Fget (Vgui_element_face, Qbackground_placement, + Qunbound)); /* widget is another gui element */ Vwidget_face = Fmake_face (Qwidget,