This allows you to layout glyphs according to some predefined strategy
within a predefined area, e.g. right justified. You can optionally draw a
border round the layout area which can be etched in/out or bevelled in/out.
Layouts can be organised within layouts allowing for arbitrarily complex
structures. My calculations tell me that if you put a border round
sub-layouts you can get a nice table effect (which might interest BillP).
This is based on the stuff Ben wrote up in architecting XEmacs, the bugs
are all my own. This also fixes a whole bunch of bugs in the subwindow
support.
I intend applying this tomorrow morning GMT unless 21.2.20 is imminent.
andy
1999-08-23 Andy Piper <andy(a)xemacs.org>
* event-Xt.c (emacs_Xt_handle_magic_event): use
find_matching_subwindow to check whether the exposure is totally
inside a subwindow, if it is then ignore it.
* glyphs.c (find_matching_subwindow): new function.
* gutter-items.el (update-tab-in-gutter): call add-tab-to-gutter
here if we don't have one.
* toolbar-x.c (x_draw_blank_toolbar_button): use new
x_output_shadows signature.
(x_output_toolbar_button): use new x_output_x_pixmap signature.
* redisplay.h (struct display_box): new structure.
(struct display_glyph_area): ditto.
declare new display_box functions.
* redisplay-x.c (x_output_pixmap): update for new display
box stuff.
(x_bevel_area): update to allow multiple edge styles and border
segments.
(x_output_display_block): update for new display_box stuff and
signatures.
(x_clear_region): ditto.
(x_output_x_pixmap): ditto. adjust offsets rather than clip.
(console_type_create_redisplay_x): declare new console methods.
(x_output_vertical_divider): update for new bevel_area signature.
(x_output_shadows): update to allow selective drawing of edges.
* redisplay-tty.c (tty_output_display_block): do nothing for
layouts.
* redisplay-output.c (redisplay_output_subwindow): convert to use
display_box structure, this allows us to put subwindows anywhere
with any offset, useful for layout glyphs.
(redisplay_output_layout): new function. output a layout and its
sub-glyphs.
(redisplay_output_pixmap): new modular function combining generic
parts of the X and mswindows versions. convert to use display_box
structures.
(redisplay_clear_clipped_region): new function. clear the area a
glyph is going into.
(redisplay_normalize_glyph_area): new function. calculate the
bounds of a display_glyph_area given a display_box.
(redisplay_normalize_display_box): new function. shrink a
display_box to enclose a display_glyph_area.
(redisplay_display_boxes_in_window_p): check whether the input
display_box and display_glyph_area are actually in a window.
(redisplay_calculate_display_boxes): calculate display boxes based
on conventional display_line metrics.
(bevel_modeline): update for new bevel_area signature.
* redisplay-msw.c (mswindows_output_blank): update for new
display_box stuff.
(mswindows_output_string): ditto.
(mswindows_output_dibitmap): ditto.
(mswindows_output_dibitmap_region): ditto.
(mswindows_output_pixmap): ditto.
(mswindows_bevel_area): update to allow multiple edge styles and
border segments.
(mswindows_output_display_block): update for new display_box stuff
and signatures.
(mswindows_clear_region): ditto.
(console_type_create_redisplay_mswindows): declare new console methods.
* lisp.h (edge_style): new enum.
declare display_box and display_glyph_area.
* gutter.c (output_gutter): update for new bevel_area signature.
* glyphs.h (image_instance_type): add layout.
(IMAGE_LAYOUT_MASK): ditto.
(LAYOUT_IMAGE_INSTANCEP): new macro.
(CHECK_LAYOUT_IMAGE_INSTANCE): ditto.
(struct Lisp_Image_Instance): add offsets for layout and the
layout type itself. move mask here also.
(IMAGE_INSTANCE_LAYOUT_CHILDREN): new macro.
(IMAGE_INSTANCE_LAYOUT_BORDER): ditto.
(XIMAGE_INSTANCE_LAYOUT_CHILDREN): ditto.
(XIMAGE_INSTANCE_LAYOUT_BORDER): ditto.
* glyphs.c (mark_image_instance): update for layouts.
(print_image_instance): ditto.
(image_instance_equal): ditto.
(image_instance_hash): ditto.
(allocate_image_instance): initialise offsets for layout.
(decode_image_instance_type): update for layouts.
(encode_image_instance_type): ditto.
(Fimage_instance_height): ditto.
(Fimage_instance_width): ditto.
(allocate_glyph): ditto.
(glyph_width): allow image instances as an argument. update for layouts.
(glyph_height_internal): ditto.
(syms_of_glyphs): add layout symbols.
* glyphs-x.h (struct x_image_instance_data): remove mask entry.
(IMAGE_INSTANCE_X_MASK): update.
* glyphs-x.c (x_label_instantiate): new function. instantiate a
label.
(image_instantiator_format_create_glyphs_x): initialise new layout
glyph type.
* glyphs-widget.c: new layout type.
(check_valid_orientation): new keyword checker for layouts.
(check_valid_justification): ditto.
(check_valid_border): ditto.
(check_valid_glyph_or_image_list): ditto.
(layout_possible_dest_types): new function for layout glyph type.
(layout_normalize): ditto.
(layout_instantiate): ditto.
(syms_of_glyphs_widget): new keywords for layout.
(image_instantiator_format_create_glyphs_widget): initialise the
layout glyph type.
* glyphs-msw.h (struct mswindows_image_instance_data): remove mask
argument.
(IMAGE_INSTANCE_MSWINDOWS_MASK): update.
* glyphs-msw.c: declare layout format.
(image_instantiator_format_create_glyphs_mswindows): initialise it.
* general.c: new symbols for layouts.
* console.h (struct console_methods): new console methods for
outputting pixmaps and strings.
* lwlib-Xm.c (xm_create_label_field): new function for creating labels.
(xm_creation_table): use it.
* lwlib-Xaw.c (xaw_create_label_field): new function for creating labels.
(xaw_creation_table): use it.
--------------------------------------------------------------
Dr Andy Piper
Senior Consultant Architect, BEA Systems Ltd