annotate src/glyphs-widget.c @ 1318:b531bf8658e9

[xemacs-hg @ 2003-02-21 06:56:46 by ben] redisplay fixes et al. PROBLEMS: Add comment about Cygwin, unexec and sysmalloc. Move some non-general stuff out of general. Make a section for x86. configure.in: Add check for broken alloca in funcalls. mule/mule-cmds.el: Alias file-name to native not vice-versa. Do set EOL of native but not of process output to fix various problems and be consistent with code-init.el. code-cmds.el: Return a name not a coding system. code-init.el: Reindent. Remove `file-name' since it should always be the same as native. unicode.el: Rename to load-unicode-mapping-table as suggested by the anonymous (but rather Turnbullian) comment in unicode.c. xemacs.dsp: Add /k to default build. alloc.c: Make gc_currently_forbidden static. config.h.in, lisp.h: Move some stuff to lisp.h. console-gtk.h, console-impl.h, console-msw.h, console-x.h, event-Xt.c, event-msw.c, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-x.c, gtk-xemacs.c: Remove duplicated code to redraw exposed area. Add deadbox method needed by the generalized redraw code. Defer redrawing if already in redisplay. frame-msw.c, event-stream.c, frame.c: Add comments about calling Lisp. debug.c, general-slots.h: Move generalish symbols to general-slots.h. doprnt.c: reindent. lisp.h, dynarr.c: Add debug code for locking a dynarr to catch invalid mods. Use in redisplay.c. eval.c: file-coding.c: Define file-name as alias for native not vice-versa. frame-gtk.c, frame-x.c: Move Qwindow_id to general-slots. dialog-msw.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, gui.c, gui.h, menubar-msw.c, menubar.c: Ensure that various glyph functions that eval within redisplay protect the evals. Same for calls to internal_equal(). Modify various functions, e.g. gui_item_*(), to protect evals within redisplay, taking an in_redisplay parameter if it's possible for them to be called both inside and outside of redisplay. gutter.c: Defer specifier-changed updating till after redisplay, if necessary, since we need to enter redisplay to do it. gutter.c: Do nothing if in redisplay. lisp.h: Add version of alloca() for use in function calls. lisp.h: Add XCAD[D+]R up to 6 D's, and aliases X1ST, X2ND, etc. frame.c, frame.h, redisplay.c, redisplay.h, signal.c, toolbar.c: Redo critical-section code and move from frame.c to redisplay.c. Require that every place inside of redisplay catch errors itself, not at the edge of the critical section (thereby bypassing the rest of redisplay and leaving things in an inconsistent state). Introduce separate means of holding frame-size changes without entering a complete critical section. Introduce "post-redisplay" methods for deferring things till after redisplay. Abort if we enter redisplay reentrantly. Disable all quit checking in redisplay since it's too dangerous. Ensure that all calls to QUIT trigger an abort if unprotected. redisplay.c, scrollbar-gtk.c, scrollbar-x.c, scrollbar.c: Create enter/exit_redisplay_critical_section_maybe() for code that needs to ensure it's in a critical section but doesn't interfere with an existing critical section. sysdep.c: Use _wexecve() when under Windows NT for Unicode correctness. text.c, text.h: Add new_dfc() functions, which return an alloca()ed value rather than requiring an lvalue. (Not really used yet; used in another workspace, to come.) Add some macros for SIZED_EXTERNAL. Update the encoding aliases after involved scrutinization of the X manual. unicode.c: Answer the anonymous but suspiciously Turnbullian questions. Rename parse-unicode-translation-table to load-unicode-mapping-table, as suggested.
author ben
date Fri, 21 Feb 2003 06:57:21 +0000
parents 9d75b4fe084c
children 7473844a83d3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Widget-specific glyph objects.
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
2 Copyright (C) 1998, 1999, 2000, 2002 Andy Piper.
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
3 Copyright (C) 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* written by Andy Piper <andy@xemacs.org> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 #include "lisp.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
28
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
29 #include "bytecode.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 866
diff changeset
31 #include "device-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "faces.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
33 #include "frame.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "glyphs.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
35 #include "gui.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
36 #include "insdel.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
37 #include "lstream.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "objects.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
39 #include "opaque.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 DEFINE_IMAGE_INSTANTIATOR_FORMAT (button);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 DEFINE_IMAGE_INSTANTIATOR_FORMAT (combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 Lisp_Object Qcombo_box;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 DEFINE_IMAGE_INSTANTIATOR_FORMAT (edit_field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 Lisp_Object Qedit_field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 DEFINE_IMAGE_INSTANTIATOR_FORMAT (scrollbar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 Lisp_Object Qscrollbar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 DEFINE_IMAGE_INSTANTIATOR_FORMAT (widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 DEFINE_IMAGE_INSTANTIATOR_FORMAT (label);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Lisp_Object Qlabel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 DEFINE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 Lisp_Object Qprogress_gauge;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tree_view);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Lisp_Object Qtree_view;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tab_control);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object Qtab_control;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 DEFINE_IMAGE_INSTANTIATOR_FORMAT (layout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 Lisp_Object Qlayout;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
60 DEFINE_IMAGE_INSTANTIATOR_FORMAT (native_layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
61 Lisp_Object Qnative_layout;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
64 Lisp_Object Qmake_glyph;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
65 Lisp_Object Vwidget_border_width;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
66
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
67 static int widget_border_width (Lisp_Object domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
68 static int widget_spacing (Lisp_Object domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
69 static void widget_query_string_geometry (Lisp_Object string, Lisp_Object face,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
70 int *width, int *height, Lisp_Object domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
1068
9d75b4fe084c [xemacs-hg @ 2002-10-24 14:19:25 by youngs]
youngs
parents: 1065
diff changeset
72 #define BORDER_FIDDLE_FACTOR 10
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 int debug_widget_instances;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 /* TODO:
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
78 - tooltips for controls, especially buttons.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
79 - keyboard traversal.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
80 - lisp configurable layout.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
83 /* In MS-Windows normal windows work in pixels, dialog boxes work in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 dialog box units. Why? sigh. We could reuse the metrics for dialogs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 if this were not the case. As it is we have to position things
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 pixel wise. I'm not even sure that X has this problem at least for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 buttons in groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 widget_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 return IMAGE_WIDGET_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
95 check_valid_instantiator (Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 Lisp_Object glyph = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 if (SYMBOLP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 glyph = XSYMBOL (data)->value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
101 if (!CONSP (glyph) && !VECTORP (glyph))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
102 invalid_argument ("instantiator item must be a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 check_valid_orientation (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 if (!EQ (data, Qhorizontal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 !EQ (data, Qvertical))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
111 invalid_constant ("unknown orientation for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
115 check_valid_tab_orientation (Lisp_Object data)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
116 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
117 if (!EQ (data, Qtop)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
118 &&
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
119 !EQ (data, Qbottom)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
120 &&
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
121 !EQ (data, Qleft)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
122 &&
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
123 !EQ (data, Qright))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
124 invalid_constant ("unknown orientation for tab control", data);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
125 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
126
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
127 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 check_valid_justification (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
130 if (!EQ (data, Qleft)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
131 &&
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
132 !EQ (data, Qright)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
133 &&
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
134 !EQ (data, Qtop)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
135 &&
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
136 !EQ (data, Qbottom)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
137 &&
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
138 !EQ (data, Qcenter))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
139 invalid_constant ("unknown justification for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 check_valid_border (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 if (!EQ (data, Qt) && !EQ (data, Qetched_in) && !EQ (data, Qetched_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 && !EQ (data, Qbevel_in) && !EQ (data, Qbevel_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 && !GLYPHP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
148 invalid_argument ("unknown border style for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 check_valid_anything (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 check_valid_callback (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 if (!SYMBOLP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 && !COMPILED_FUNCTIONP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 && !CONSP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
163 invalid_argument (":callback must be a function or expression", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
168 check_valid_int_or_function (Lisp_Object data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
169 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
170 if (!INTP (data) && !CONSP (data) && !SYMBOLP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171 invalid_argument ("must be an integer or expresssion", data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 check_valid_symbol (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 CHECK_SYMBOL (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 check_valid_string_or_vector (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 if (!STRINGP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 invalid_argument (":descriptor must be a string or a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
187 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
188 check_valid_item_list (Lisp_Object items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 CHECK_LIST (items);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 EXTERNAL_LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 if (STRINGP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 CHECK_STRING (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 else if (VECTORP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 gui_parse_item_keywords (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 else if (LISTP (XCAR (rest)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 check_valid_item_list (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
202 invalid_argument ("Items must be vectors, lists or strings", items);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
207 check_valid_instantiator_list (Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 CHECK_LIST (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 EXTERNAL_LIST_LOOP (rest, data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
214 check_valid_instantiator (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 glyph_instantiator_to_glyph (Lisp_Object sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 /* This function calls lisp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 Lisp_Object glyph = sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 struct gcpro gcpro1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
224
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 GCPRO1 (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 /* if we have a symbol get at the actual data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 if (SYMBOLP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 glyph = XSYMBOL (glyph)->value;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
229
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 if (CONSP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 glyph = Feval (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 /* Be really helpful to the user. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 if (VECTORP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
236 glyph = call1 (Qmake_glyph, glyph);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 RETURN_UNGCPRO (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
243 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 substitute_keyword_value (Lisp_Object inst, Lisp_Object key, Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 for (i = 0; i < XVECTOR_LENGTH (inst); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 if (EQ (key, XVECTOR_DATA (inst)[i]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 XVECTOR_DATA (inst)[i+1] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
258 /* Determine the border with of the widget. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
259 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
260 widget_border_width (Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
261 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
262 /* #### FIXME -- need to use specifiers (Vwidget_border_width) for
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
263 some portion of this. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
264 if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
265 widget_border_width))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
266 return DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
267 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
268 return DEFAULT_WIDGET_BORDER_WIDTH;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
269 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
270
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
271 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
272 widget_instance_border_width (Lisp_Image_Instance* ii)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
273 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
274 return widget_border_width (IMAGE_INSTANCE_DOMAIN (ii));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
275 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
276
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
277 /* #### Its not clear to me what the value of logical_unit_height should
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
278 be, or whether it should even depend on the current
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
279 image_instance. It really should probably only depend on the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
280 default widget face and the domain, however you can envisage users
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
281 wanting different logical units for nested layouts - so using the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
282 properties of the current lahyout is probably not so dumb. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
283 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
284 logical_unit_height (Lisp_Object text, Lisp_Object face, Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
285 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
286 int charheight = 0;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
287 widget_query_string_geometry (text, face,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
288 0, &charheight, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
289 /* For the returned value to be useful it needs to be big enough to
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
290 accomodate the largest single-height widget. This is currently
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
291 the edit-field. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
292 return charheight + 2 * widget_spacing (domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
293 + 4 * widget_border_width (domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
294 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
295
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
296 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
297 widget_logical_unit_height (Lisp_Image_Instance* ii)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
298 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
299 return logical_unit_height (NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)) ?
866
613552a02607 [xemacs-hg @ 2002-06-04 17:39:43 by andyp]
andyp
parents: 863
diff changeset
300 NILP (IMAGE_INSTANCE_NAME (ii)) ?
613552a02607 [xemacs-hg @ 2002-06-04 17:39:43 by andyp]
andyp
parents: 863
diff changeset
301 Fsymbol_name (Qwidget)
613552a02607 [xemacs-hg @ 2002-06-04 17:39:43 by andyp]
andyp
parents: 863
diff changeset
302 : IMAGE_INSTANCE_NAME (ii)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
303 : IMAGE_INSTANCE_WIDGET_TEXT (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
304 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
305 IMAGE_INSTANCE_DOMAIN (ii));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
306 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
307
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
308 /* Wire widget property invocations to specific widgets. The problem
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
309 we are solving here is that when instantiators get converted to
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
310 instances they lose some type information (they just become
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
311 subwindows or widgets for example). For widgets we need to preserve
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
312 this type information so that we can do widget specific operations
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
313 on the instances. This is encoded in the widget type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
314 field. widget_property gets invoked by decoding the primary type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
315 (Qwidget), <widget>_property then invokes based on the secondary
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
316 type (Qedit_field for example). It is debatable whether we should
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
317 wire things in this generalised way rather than treating widgets
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
318 specially in image_instance_property. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
319 static Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 widget_property (Lisp_Object image_instance, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
322 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
324 #if 0 /* The usefulness of this is dubious. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* first see if its a general property ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 if (!NILP (Fplist_member (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
328 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
330 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
331 IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
336 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 /* ... then fail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
344 /* Update the displayed properties of a widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
345
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
346 #### This has been adapted from the original set_property functions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
347 and thus reuses the state management of that. A better solution is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
348 to simply re-parse the instantiator when items need updating. This
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
349 make comparing differences much simpler and obviates the need for a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
350 lot of the state variables.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
351
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
352 #### property is still a valid function since we have to be able to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
353 extract information from the actual widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
354
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
355 #### update_widget should probably be re-written to use the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
356 instantiator. We probably want to keep a record of the differences
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
357 also to make this easy. We would also need a pending_instantiator
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
358 so that changes could be delayed. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
359 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
360 widget_update (Lisp_Object image_instance, Lisp_Object instantiator)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
362 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 struct image_instantiator_methods* meths;
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
364 struct gcpro gcpro1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
366 Lisp_Object text = find_keyword_in_vector (instantiator, Q_text);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
367 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
368 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
369 Lisp_Object descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
370
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
371 GCPRO1 (descriptor_item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
372
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
373 /* Pick up any generic properties that we might need to keep hold
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
374 of.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
375 #### This is potentially bogus because it is changing the items
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
376 in place rather than in the pending items. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377 if (!NILP (text))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
378 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
379 IMAGE_INSTANCE_WIDGET_TEXT (ii) = text;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
380 IMAGE_INSTANCE_TEXT_CHANGED (ii) = 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
381 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
382
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
383 /* Retrieve the gui item information. This is easy if we have been
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
384 provided with a vector, more difficult if we have just been given
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
385 keywords.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
386
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
387 #### This is inconsistent with instantiation in that you have to
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
388 have the :descriptor keyword for updates in order to recognise
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
389 changes. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
390 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
391 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
392 descriptor_item = gui_parse_item_keywords_no_errors (desc);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
393 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
394 else
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
395 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
396 /* Since we are updating the instantiator could be incomplete
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
397 and hence the gui item descriptor not well formed. We
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
398 therefore try updating and discard the results if nothing
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
399 changed. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
400 descriptor_item = copy_gui_item (IMAGE_INSTANCE_WIDGET_ITEM (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
401 if (!update_gui_item_keywords (descriptor_item, instantiator))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
402 descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
403 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
404
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
405 /* Record new items for update. *_redisplay will do the
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
406 rest. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
407 if (!EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
408 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
409 !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
410 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
411 if (!NILP (items))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
412 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
413 if (NILP (descriptor_item))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
414 descriptor_item = IMAGE_INSTANCE_WIDGET_ITEM (ii);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
415
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
416 check_valid_item_list (items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
417 #ifdef DEBUG_WIDGET_OUTPUT
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
418 stderr_out ("items for widget %p updated\n",
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
419 IMAGE_INSTANCE_SUBWINDOW_ID (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
420 #endif
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
421 /* Don't set the actual items since we might decide not to use
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
422 the new ones (because nothing has really changed). If we did
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
423 set them and didn't use them then we would get into whole
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
424 heaps of trouble when the old items get GC'd. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
425 descriptor_item = Fcons (descriptor_item, parse_gui_item_tree_children (items));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
426 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
427 /* If the descriptor was updated but not the items we need to fill
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
428 in the `new' items. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
429 else if (!NILP (descriptor_item)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
430 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
431 CONSP (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
432 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
433 descriptor_item = Fcons
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
434 (descriptor_item,
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
435 copy_gui_item_tree (XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii))));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
436 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
437 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
438
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
439 if (!NILP (descriptor_item))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
440 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
441 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = descriptor_item;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
442 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii) = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
443 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
444
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
445 UNGCPRO;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
446
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
447 /* Now try device specific methods first ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
448 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
449 IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
450 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
451 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
452 /* ... then format specific methods ... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
453 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
454 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
456 #if 0 /* The usefulness of this is dubious. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
457 /* we didn't do any device specific properties, so shove the property in our plist. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
458 IMAGE_INSTANCE_WIDGET_PROPS (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
459 = Fplist_put (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, val);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
460 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
461 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
462
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
463 /* Like the rest of redisplay, we want widget updates to occur
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
464 asynchronously. Thus toolkit specific methods for setting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
465 properties must be called by redisplay instead of by *_update. Thus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 *_update records the change and this function actually implements
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
467 it. We want to be slightly clever about this however by supplying
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
468 format specific functions for the updates instead of lumping them
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
469 all into this function. Note that there is no need for format
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
470 generic functions. This is not the same as widget_update! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
471 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
472 redisplay_widget (Lisp_Object widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
474 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
475 struct image_instantiator_methods* meths;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
476
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
477 if (!WIDGET_IMAGE_INSTANCEP (widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
478 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
479 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
480 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
481
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
482 /* Device-format specific methods - e.g. x_tab_control_redisplay () */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
483 meths = decode_device_ii_format (image_instance_device (widget),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 IMAGE_INSTANCE_WIDGET_TYPE (ii),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 ERROR_ME_NOT);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
486 MAYBE_IIFORMAT_METH (meths, redisplay, (widget));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
488 /* Device generic methods - e.g. x_redisplay_widget (). We must
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 update the widget's size as it may have been changed by the the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
490 layout routines. We also do this here so that explicit resizing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491 from lisp does not result in synchronous updates. Do this last so
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
492 that format-specific methods have an opportunity to prevent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
493 wholesale changes - e.g. rebuilding tabs. */
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
494 MAYBE_DEVMETH (DOMAIN_XDEVICE (IMAGE_INSTANCE_DOMAIN (ii)),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
495 redisplay_widget, (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
497 /* Pick up the items we recorded earlier. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
501 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
502 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
506 static void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
507 widget_query_string_geometry (Lisp_Object string, Lisp_Object face,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
508 int *width, int *height, Lisp_Object domain)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
509 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
510 struct device *d = DOMAIN_XDEVICE (domain);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
511
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
512 if (HAS_DEVMETH_P (d, widget_query_string_geometry))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
513 DEVMETH (d, widget_query_string_geometry,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
514 (string, face, width, height, domain));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
515 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
516 query_string_geometry (string, face, width, height, 0, domain);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
517
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
518 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
519
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
520 /* Determine the spacing of the widget. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
521 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
522 widget_spacing (Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
523 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
524 if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain), widget_spacing))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
525 return DEVMETH (DOMAIN_XDEVICE (domain),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
526 widget_spacing, (0));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
527 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
528 return DEFAULT_WIDGET_SPACING;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
529 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
530
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
531 /* Query for a widgets desired geometry. If no type specific method is
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
532 provided then use the widget text to calculate sizes. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
533 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
534 widget_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
535 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
536 enum image_instance_geometry disp, Lisp_Object domain)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
537 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
538 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
539 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
540 Lisp_Object dynamic_width = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
541 Lisp_Object dynamic_height = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
542
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
543 /* First just set up what we already have. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
544 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
545 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
546
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
547 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
548 ||
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
549 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
550 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
551 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
552 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
553 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
554 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
555 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
556 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
557 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
558 domain));
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
559 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
560 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
561 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
562 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
563 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
564 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
566 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
567 domain));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 else
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
569 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 int w, h;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
572 /* Then if we are allowed to resize the widget, make the
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
573 size the same as the text dimensions. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
574 widget_query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
575 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
576 &w, &h, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
577 /* Adjust the size for borders. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
578 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
579 *width = w + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
580 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
581 *height = h + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
582 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
583 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584 /* Finish off with dynamic sizing. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
585 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
586 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
587 dynamic_width =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
588 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
589 if (INTP (dynamic_width))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
590 *width = XINT (dynamic_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
591 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
592 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
594 dynamic_height =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
595 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
596 if (INTP (dynamic_height))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
597 *height = XINT (dynamic_height);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
598 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
599 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
600 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
601
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 widget_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
604 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 Lisp_Object domain)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
606 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
607 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
608 struct image_instantiator_methods* meths;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
609
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
610 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
613 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
614 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
617 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
618 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
619 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
620 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
621 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
622 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
623 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
625 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
626 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
627 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
628 return 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
629 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
630
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 widget_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 if (NILP (desc))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
637 invalid_argument ("Must supply :descriptor", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 if (VECTORP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 gui_parse_item_keywords (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 if (!NILP (find_keyword_in_vector (instantiator, Q_width))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 && !NILP (find_keyword_in_vector (instantiator, Q_pixel_width)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
644 invalid_argument ("Must supply only one of :width and :pixel-width", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 if (!NILP (find_keyword_in_vector (instantiator, Q_height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 && !NILP (find_keyword_in_vector (instantiator, Q_pixel_height)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
648 invalid_argument ("Must supply only one of :height and :pixel-height", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 combo_box_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 widget_validate (instantiator);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
655 if (NILP (find_keyword_in_vector (instantiator, Q_items)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
656 invalid_argument ("Must supply item list", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 /* we need to convert things like glyphs to images, eval expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 etc.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
662 widget_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
663 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 Lisp_Object glyph = find_keyword_in_vector (inst, Q_image);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 /* we need to eval glyph if its an expression, we do this for the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 same reasons we normalize file to data.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 #### should just normalize the data. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 {
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
674 substitute_keyword_value (inst, Q_image,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
675 glyph_instantiator_to_glyph (glyph));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 return inst;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
682 initialize_widget_image_instance (Lisp_Image_Instance *ii, Lisp_Object type)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 /* initialize_subwindow_image_instance (ii);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 IMAGE_INSTANCE_WIDGET_TYPE (ii) = type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
687 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
690 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
693 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
694 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
695 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_HORIZONTAL;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
696 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = 0;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
697 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 /* Instantiate a button widget. Unfortunately instantiated widgets are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 particular to a frame since they need to have a parent. It's not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 like images where you just select the image into the context you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 want to display it in and BitBlt it. So image instances can have a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 many-to-one relationship with things you see, whereas widgets can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 only be one-to-one (i.e. per frame) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
707 widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
708 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
709 int dest_mask, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 /* #### practically all of this should be moved to widget_update()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 so that users can dynamically change all possible widget
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
713 properties. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
714 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 Lisp_Object face = find_keyword_in_vector (instantiator, Q_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 Lisp_Object height = find_keyword_in_vector (instantiator, Q_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 Lisp_Object width = find_keyword_in_vector (instantiator, Q_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 Lisp_Object pixwidth = find_keyword_in_vector (instantiator, Q_pixel_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 Lisp_Object pixheight = find_keyword_in_vector (instantiator, Q_pixel_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
722 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
723 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724 Lisp_Object mwidth = find_keyword_in_vector (instantiator, Q_margin_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725 Lisp_Object ifocus = find_keyword_in_vector (instantiator, Q_initial_focus);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 int pw=0, ph=0, tw=0, th=0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
727
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 /* this just does pixel type sizing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 dest_mask, domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 if (!(dest_mask & IMAGE_WIDGET_MASK))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
733 incompatible_image_types (instantiator, dest_mask, IMAGE_WIDGET_MASK);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
737 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
738
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 /* retrieve the fg and bg colors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 if (!NILP (face))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
741 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
743 /* Retrieve the gui item information. This is easy if we have been
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 provided with a vector, more difficult if we have just been given
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
745 keywords. Note that standard gui descriptor shortcuts will not work
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
746 because of keyword parsing.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
747
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
748 #### This is bogus in that descriptor and items share the same slot,
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
749 we should rationalize. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
750 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
751 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
752 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
753 gui_parse_item_keywords_no_errors (desc);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
754 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
755 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 /* big cheat - we rely on the fact that a gui item looks like an instantiator */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
758 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
759 widget_gui_parse_item_keywords (instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
762 /* Pick up the orientation before we do our first layout. */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
763 if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
765
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 /* parse more gui items out of the properties */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 if (!NILP (items) && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
770 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
771 Fcons (IMAGE_INSTANCE_WIDGET_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
772 parse_gui_item_tree_children (items));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
775 /* Normalize size information. We now only assign sizes if the user
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
776 gives us some explicitly, or there are some constraints that we
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
777 can't change later on. Otherwise we postpone sizing until query
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
778 geometry gets called. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
779 if (!NILP (pixwidth)) /* pixwidth takes precendent */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
780 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
781 if (!INTP (pixwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
782 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = pixwidth;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
783 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
785 pw = XINT (pixwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
786 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
787 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
788 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
789 else if (!NILP (width))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
790 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
791 tw = XINT (width);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
792 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
793 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
794
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 if (!NILP (pixheight))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
796 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797 if (!INTP (pixheight))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = pixheight;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
800 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
801 ph = XINT (pixheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
802 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
803 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
804 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
805 else if (!NILP (height) && XINT (height) > 1)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
806 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
807 th = XINT (height);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
808 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
809 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
810
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
811 /* Taking the default face information when the user has specified
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
812 size in characters is probably as good as any since the widget
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
813 face is more likely to be proportional and thus give inadequate
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
814 results. Using character sizes can only ever be approximate
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
815 anyway. :height is measured in logical characters which take into
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
816 account the borders and spacing on widgets. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
817 if (tw)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
818 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
819 int charwidth;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
820 default_face_font_info (domain, 0, 0, 0, &charwidth, 0);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
821 pw = ROUND_UP (charwidth * tw + 4 * widget_instance_border_width (ii), charwidth);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
822 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
823
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
824 /* For heights the widget face is more appropriate. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
825 if (th == 1)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
826 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
827 int charheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
828 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
829 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
830 widget_query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
831 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
832 0, &charheight, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
833 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
834 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
835 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
836 default_face_font_info (domain, 0, 0, &charheight, 0, 0);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
837 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
838 ph = (charheight + 2 * widget_instance_border_width (ii)) * th;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
839 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
840 /* For heights > 1 use logical units. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
841 else if (th > 1)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
842 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
843 ph = widget_logical_unit_height (ii) * th;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
844 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 /* for a widget with an image pick up the dimensions from that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
849 if (!pw)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
850 pw = glyph_width (glyph, image_instance) + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
851 if (!ph)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
852 ph = glyph_height (glyph, image_instance) + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
853 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
854 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
857 /* Pick up the margin width. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
858 if (!NILP (mwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
859 IMAGE_INSTANCE_MARGIN_WIDTH (ii) = XINT (mwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
860
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
861 IMAGE_INSTANCE_WANTS_INITIAL_FOCUS (ii) = !NILP (ifocus);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
862
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
863 /* Layout for the layout widget is premature at this point since the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
864 children will not have been instantiated. We can't instantiate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
865 them until the device instantiation method for the layout has
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
866 been executed. We do however want to record any specified
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
867 dimensions. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
868 if (pw) IMAGE_INSTANCE_WIDTH (ii) = pw;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
869 if (ph) IMAGE_INSTANCE_HEIGHT (ii) = ph;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
870 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
871
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
872 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
873 widget_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
874 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
875 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 debug_widget_instances++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 stderr_out ("instantiated ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 debug_print (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 stderr_out ("%d widgets instantiated\n", debug_widget_instances);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
884 /* Get the geometry of a button control. We need to adjust the size
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
885 depending on the type of button. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
886 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 button_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
888 int* width, int* height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
889 enum image_instance_geometry disp, Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
890 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
891 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
892 int w, h;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
893 widget_query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
894 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
895 &w, &h, domain);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
896 /* Adjust the size for borders. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
897 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
898 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
899 *width = w + 3 * widget_instance_border_width (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 if (EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qradio)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
902 ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
903 EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qtoggle))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
904 /* This is an approximation to the size of the actual button bit. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
905 *width += 12;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
906 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
907 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
908 *height = h + 3 * widget_instance_border_width (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
909 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
910
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
911 /* Get the geometry of an edit field. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
912 static void
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
913 edit_field_query_geometry (Lisp_Object image_instance,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
914 int* width, int* height,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
915 enum image_instance_geometry disp, Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
916 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
917 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
918 int w, h;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
919 widget_query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
920 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
921 &w, &h, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
922 /* Adjust the size for borders. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
923 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
924 *width = w + 4 * widget_instance_border_width (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
925 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
926 *height = h + 4 * widget_instance_border_width (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
927 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
929 /* tree-view geometry - get the height right */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931 tree_view_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
932 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
933 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
935 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
936 Lisp_Object items = IMAGE_INSTANCE_WIDGET_ITEMS (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
937
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
938
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
939 if (*width)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
940 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
941 /* #### what should this be. reconsider when X has tree views. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
942 widget_query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
943 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
944 width, 0, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
945 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
946 if (*height)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
947 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
948 int len, h;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
949 /* #### widget face would be better here. */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
950 default_face_font_info (domain, 0, 0, &h, 0, 0);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
951 GET_LIST_LENGTH (items, len);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
952 *height = len * h;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
953 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
956 /* Get the geometry of a tab control. This is based on the number of
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
957 items and text therin in the tab control. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
959 tab_control_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
960 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
961 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
963 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
964 Lisp_Object items = XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
966 int tw = 0, th = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
968 LIST_LOOP (rest, items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
970 int h, w;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
971
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
972 widget_query_string_geometry (XGUI_ITEM (XCAR (rest))->name,
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
973 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
974 &w, &h, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
975 tw += 5 * widget_instance_border_width (ii); /* some bias */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
976 tw += w;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
977 th = max (th, h + 2 * widget_instance_border_width (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
980 /* Fixup returned values depending on orientation. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
981 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
982 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
983 if (height) *height = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
984 if (width) *width = th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
985 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
986 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
987 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
988 if (height) *height = th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
989 if (width) *width = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
990 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
993 /* Determine whether only the order has changed for a tab. */
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
994 int
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
995 tab_control_order_only_changed (Lisp_Object image_instance)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
996 {
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
997 /* Called within redisplay */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
998 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
999 int found = 0, len, pending_len;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1000 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1001
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1002 /* Degenerate case. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1003 if (NILP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1004 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1005
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1006 /* See whether we just need a change in order. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1007 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_ITEMS (ii), len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1008 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1009 pending_len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1010 if (len == pending_len)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1011 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1012 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1013 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1014 Lisp_Object pending_rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1015 found = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1016 LIST_LOOP (pending_rest,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1017 XCDR (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1018 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1019 if (gui_item_equal_sans_selected (XCAR (rest),
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1020 XCAR (pending_rest), 0, 1))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1021 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1022 found = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1024 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1025 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1026 if (!found)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1027 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1028 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1029 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1030 return found;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1031 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1032
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 * widget layout *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 *****************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1037 /* We need to cascade normalization.*/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1039 layout_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1040 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 /* This function can call lisp */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1043 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1044 Lisp_Object alist = Qnil, new_items = Qnil, border;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1045 /* This function can call lisp */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1046 Lisp_Object items;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1047
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1048 GCPRO2 (alist, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1049 alist = tagged_vector_to_alist (inst);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1050 items = assq_no_quit (Q_items, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1051
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1052 /* We need to normalize sub-objects. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 if (!NILP (items))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1056 LIST_LOOP (rest, XCDR (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1058 /* Substitute the new instantiator */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1059 new_items = Fcons (normalize_image_instantiator (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1060 console_type, dest_mask),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1061 new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1062 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1063 new_items = Fnreverse (new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1064 Fsetcdr (items, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1065 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1066 /* Normalize the border spec. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1067 border = assq_no_quit (Q_border, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1068 if (!NILP (border) && VECTORP (XCDR (border)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1069 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1070 Fsetcdr (border, normalize_image_instantiator (XCDR (border),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1071 console_type, dest_mask));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1072 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1073
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1074 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1075 Lisp_Object result = alist_to_tagged_vector (XVECTOR_DATA (inst)[0],
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1076 alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1077 free_alist (alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1078 RETURN_UNGCPRO (result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1079 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1080 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1081
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1082 /* Update the instances in the layout. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1083 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1084 layout_update (Lisp_Object image_instance, Lisp_Object instantiator)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1085 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1086 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1087 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1088 Lisp_Object border_inst = find_keyword_in_vector (instantiator, Q_border);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1089 Lisp_Object justify = find_keyword_in_vector (instantiator, Q_justify);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1090 Lisp_Object hjustify = find_keyword_in_vector (instantiator, Q_horizontally_justify);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1091 Lisp_Object vjustify = find_keyword_in_vector (instantiator, Q_vertically_justify);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1092 Lisp_Object border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1093 Lisp_Object children = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1094 int structure_changed = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1095 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1096
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1097 /* Pick up horizontal justification, left is the default.*/
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1098 if (!NILP (hjustify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1099 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1100 if (EQ (hjustify, Qright) || EQ (hjustify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1101 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_RIGHT;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1102 else if (EQ (hjustify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1103 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1104 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1105 /* If not set use general justification. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1106 else if (!NILP (justify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1107 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1108 if (EQ (justify, Qright) || EQ (justify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1109 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_RIGHT;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1110 else if (EQ (justify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1111 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1112 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1113
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1114 /* Pick up vertical justification, top is the default. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1115 if (!NILP (vjustify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1116 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1117 if (EQ (vjustify, Qright) || EQ (vjustify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1118 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_BOTTOM;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1119 else if (EQ (vjustify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1120 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1121 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1122 /* If not set use general justification. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1123 else if (!NILP (justify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1124 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1125 if (EQ (justify, Qright) || EQ (justify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1126 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_BOTTOM;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1127 else if (EQ (justify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1128 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1129 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1130
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1131 /* We want to avoid consing if we can. This is quite awkward because
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1132 we have to deal with the border as well as the items. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1133 GCPRO1 (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1134
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1135 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1136 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1137 border = XCAR (children);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1138 children = XCDR (children);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1139 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1140
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1141 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1142 stderr_out ("layout updated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1143 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1144 /* Update the border. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1145 if (!NILP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1146 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1147 if (VECTORP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1148 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1149 /* We are going to be sneaky here and add the border text as
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1150 just another child, the layout and output routines don't know
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1151 this and will just display at the offsets we prescribe. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1152 if (!NILP (border))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1153 call3 (Qset_glyph_image, border, border_inst,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1154 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1155 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1156 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1157 border = Fcons (call1 (Qmake_glyph, border_inst), Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1158 structure_changed = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1159 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1160 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1161 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1162 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1163 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1164 if (!NILP (border))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1165 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1166 border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1167 structure_changed = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1168 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1169 if (EQ (border_inst, Qt))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1170 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1171 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1172 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border_inst;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1175
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1176 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1177 if (!NILP (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1179 int len1, len2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1180 GET_LIST_LENGTH (items, len1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1181 GET_LIST_LENGTH (children, len2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1182 /* The structure hasn't changed so just update the images. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1183 if (!structure_changed && len1 == len2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1184 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1185 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1186 for (; !NILP (children); children = XCDR (children), items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1187 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1188 call3 (Qset_glyph_image, XCAR (children), XCAR (items),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1189 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1190 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1191 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1192 /* The structure has changed so start over. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1193 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1194 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1195 /* Instantiate any new glyphs. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1196 for (; !NILP (items); items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1197 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1198 /* #### We really want to use call_with_suspended_errors
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1199 here, but it won't allow us to call lisp. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1200 border = Fcons (call1 (Qmake_glyph, XCAR (items)), border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1201 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1202 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Fnreverse (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1203 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1205 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1206 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1207
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1208 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1209 layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1210 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1211 int dest_mask, Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1212 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1213 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1214 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1215
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1216 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1217 stderr_out ("layout instantiated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1218 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1219 /* Do widget type instantiation first. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1220 widget_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1221 dest_mask, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1222
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1223 if (NILP (orient))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1224 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1225 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1226 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1227
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1228 /* Get child glyphs and finish instantiation. We can't do image
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1229 instance children yet as we might not have a containing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1230 window. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231 layout_update (image_instance, instantiator);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1233
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1240 /* Layout widget. Sizing commentary: we have a number of problems that
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1241 we would like to address. Some consider some of these more
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1242 important than others. It used to be that size information was
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1243 determined at instantiation time and was then fixed forever
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1244 after. Generally this is not what we want. Users want size to be
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1245 "big enough" to accommodate whatever they are trying to show and
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1246 this is dependent on text length, lines, font metrics etc. Of
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1247 course these attributes can change dynamically and so the size
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1248 should changed dynamically also. Only in a few limited cases should
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1249 the size be fixed and remain fixed. Of course this actually means
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1250 that we don't really want to specify the size *at all* for most
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1251 widgets - we want it to be discovered dynamically. Thus we can
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1252 envisage the following scenarios:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1253
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1254 1. A button is sized to accommodate its text, the text changes and the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1255 button should change size also.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1256
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1257 2. A button is given an explicit size. Its size should never change.
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1258
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1259 3. Layout is put inside an area. The size of the area changes, the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1260 layout should change with it.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1261
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1262 4. A button grows to accommodate additional text. The whitespace
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1263 around it should be modified to cope with the new layout
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1264 requirements.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1265
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1266 5. A button grows. The area surrounding it should grow also if
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1267 possible.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1268
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1269 What metrics are important?
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1270 1. Actual width and height.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1271
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1272 2. Whether the width and height are what the widget actually wants, or
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1273 whether it can grow or shrink.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1274
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1275 Text glyphs are particularly troublesome since their metrics depend
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1276 on the context in which they are being viewed. For instance they
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1277 can appear differently depending on the window face, frame face or
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1278 glyph face. In order to simplify this text glyphs can now only have
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1279 a glyph-face or image-instance face. All other glyphs are
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1280 essentially fixed in appearance. Perhaps the problem is that text
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1281 glyphs are cached on a device basis like most other glyphs. Instead
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1282 they should be cached per-window and then the instance would be
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1283 fixed and we wouldn't have to mess around with font metrics and the
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1284 rest.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1285
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1286 Another sizing problem is alignment. We provide layout widgets that
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1287 allow users to stack widgets vertically or horizontally. These
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1288 layouts also allow the widgets to be centered (space evenly
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1289 distributed), left or right justified (fixed spacing widgets
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1290 stacked against the left, righ, top or bottom edge). Unfortunately
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1291 this doesn't allow widgets in different layouts to be aligned. For
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1292 instance how should the search dialog be organized for alignment?
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1293 The obvious choice of two vertical columns does not work since the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1294 size of individual widgets will affect where they get placed. The
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1295 same is true for several rows of widgets. To solve this problem we
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1296 introduce the notion of `logical_unit_height'. This is a size
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1297 quantity that is designed to be big enough to accomodate the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1298 largest `single height unit'. The function
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1299 widget_logical_unit_height() determines the value of this in
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1300 pixels. It is dependent on the widget face and some combination of
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1301 spacing and border-width. Thus if users specify left or right
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1302 justification in a vertical layout they get something in logical
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1303 units. To simplify this the functions
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1304 `widget-logical-to-character-height' and
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1305 `widget-logical-to-character-width' allow conversion between
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1306 characters and logical units so that frames can be sized
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1307 appropriately. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1308
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1309 /* Query the geometry of a layout widget. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1311 layout_query_geometry (Lisp_Object image_instance, int* width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1312 int* height, enum image_instance_geometry disp,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1313 Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1315 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1316 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1317 int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1318 int gheight, gwidth, luh;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1319
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1320 /* If we are not initialized then we won't have any children. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1321 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1322 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1323
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1324 /* First just set up what we already have. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1325 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1326 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1327
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1328 /* If we are not allowed to dynamically size then return. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1329 if (!IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1330 &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1331 !IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1332 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1333
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1334 luh = widget_logical_unit_height (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1335
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1336 /* Pick up the border text if we have one. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1337 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1338 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1339 glyph_query_geometry (XCAR (items), &gwidth, &gheight, disp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1340 image_instance);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1341 ph_adjust = gheight;
1068
9d75b4fe084c [xemacs-hg @ 2002-10-24 14:19:25 by youngs]
youngs
parents: 1065
diff changeset
1342 /* Include text width in vertical layouts. */
9d75b4fe084c [xemacs-hg @ 2002-10-24 14:19:25 by youngs]
youngs
parents: 1065
diff changeset
1343 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_VERTICAL)
9d75b4fe084c [xemacs-hg @ 2002-10-24 14:19:25 by youngs]
youngs
parents: 1065
diff changeset
1344 maxpw = gwidth + BORDER_FIDDLE_FACTOR;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1345 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1346 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1347
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1348 /* Flip through the items to work out how much stuff we have to display */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1349 LIST_LOOP (rest, items)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1350 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1351 Lisp_Object glyph = XCAR (rest);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1352 glyph_query_geometry (glyph, &gwidth, &gheight, disp, image_instance);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1353
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1354 nitems ++;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1355 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1356 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1357 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1358 maxpw += gwidth;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1359 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1360 else
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1361 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1362 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1363 maxph += gheight;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1364 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1365 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1367 /* Work out minimum space we need to fit all the items. This could
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1368 have been fixed by the user. */
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1369 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1370 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1371 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1372 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1373 Lisp_Object dynamic_width =
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1374 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1375 if (INTP (dynamic_width))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1376 *width = XINT (dynamic_width);
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1377 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1378 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1379 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1380 *width = maxpw + ((nitems + 1) * widget_instance_border_width (ii) +
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1381 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1382 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1383 else
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1384 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1385 *width = maxpw + 2 * (widget_instance_border_width (ii) * 2 +
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1386 IMAGE_INSTANCE_MARGIN_WIDTH (ii));
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1387 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1388 }
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1389
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1390 /* Work out vertical spacings. */
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1391 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1392 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1393 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1394 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1395 Lisp_Object dynamic_height =
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1396 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1397 if (INTP (dynamic_height))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1398 *height = XINT (dynamic_height);
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1399 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1400 else if (IMAGE_INSTANCE_SUBWINDOW_LOGICAL_LAYOUT (ii))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1401 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1402 *height = nitems * luh + ph_adjust;
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1403 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1404 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_VERTICAL)
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1405 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1406 *height = maxph + ((nitems + 1) * widget_instance_border_width (ii) +
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1407 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1408 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1409 else
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1410 {
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1411 *height = maxph + (2 * widget_instance_border_width (ii) +
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1412 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1068
diff changeset
1413 }
1065
332649c64dbc [xemacs-hg @ 2002-10-24 13:44:51 by youngs]
youngs
parents: 872
diff changeset
1414 }
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1415 #ifdef DEBUG_WIDGET_OUTPUT
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1416 stderr_out ("layout wants %dx%d\n", *width, *height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1417 #endif
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1418 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1419
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1420 int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1421 layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1422 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1423 Lisp_Object domain)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1424 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1425 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1426 Lisp_Object rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1427 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1428 int x, y, maxph = 0, maxpw = 0, nitems = 0,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1429 horiz_spacing, vert_spacing, ph_adjust = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1430 int gheight, gwidth;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1431 /* See comments in widget_logical_unit_height(). */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1432 int luh = widget_logical_unit_height (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1433
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1434 /* If we are not initialized then we won't have any children. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1435 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1436 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1438 #ifdef DEBUG_WIDGET_OUTPUT
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1439 stderr_out ("layout output %dx%d\n", width, height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1440 #endif
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1441
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1442 /* Pick up the border text if we have one. A border can have the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1443 values Qetched_in, Qetched_out, Qbevel_in, Qbevel_out or an
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1444 integer. The first four just affect the display properties of the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1445 border that is drawn. The last is an offset and implies that the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1446 first item in the list of subcontrols is a text control that
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1447 should be displayed on the border. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1448 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1449 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1450 Lisp_Object border = XCAR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1451 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1452 glyph_query_geometry (border, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1453 IMAGE_DESIRED_GEOMETRY, image_instance);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1454 /* The vertical offset for subsequent items is the full height
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1455 of the border glyph. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1456 ph_adjust = gheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1457 /* The offset for the border is half the glyph height. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1458 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (gheight / 2);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1459
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1460 /* #### Really, what should this be? */
1068
9d75b4fe084c [xemacs-hg @ 2002-10-24 14:19:25 by youngs]
youngs
parents: 1065
diff changeset
1461 glyph_do_layout (border, gwidth, gheight, BORDER_FIDDLE_FACTOR, 0,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1462 image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1463 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1464
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1465 /* Flip through the items to work out how much stuff we have to display. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 Lisp_Object glyph = XCAR (rest);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1469
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1470 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1471 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1472 nitems ++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1473 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1474 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1476 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1477 maxpw += gwidth;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1479 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1481 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1482 maxph += gheight;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 /* work out spacing between items and bounds of the layout */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1487 if (width < maxpw)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 /* The user wants a smaller space than the largest item, so we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 just provide default spacing and will let the output routines
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1490 clip. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1491 horiz_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1492 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1493 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 /* We have a larger area to display in so distribute the space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 evenly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1496 horiz_spacing = (width - (maxpw +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1497 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1498 / (nitems + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1500 horiz_spacing = (width - maxpw) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1501 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1503 /* We are trying here to get widgets to line up when they are left
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1504 or right justified vertically. This means that we must position
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1505 widgets on logical unit boundaries, even though their height may
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1506 be greater or less than a logical unit. In order to avoid
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1507 clipping we need to determine how big the widget wants to be and
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1508 then allocate as many logical units as necessary in order to
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1509 accommodate it. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1510 if (height < maxph)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1511 vert_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii)) * 2;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1512 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1513 == LAYOUT_VERTICAL)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1514 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1515 if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1516 vert_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii)) * 2;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1517 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1518 vert_spacing = (height - (maxph + ph_adjust +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1519 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1520 / (nitems + 1);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1521 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1523 vert_spacing = (height - (maxph + ph_adjust)) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1524 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1526 y = yoffset = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1527 x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 /* Now flip through putting items where we want them, paying
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1530 attention to justification. Make sure we don't mess with the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1531 border glyph. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 Lisp_Object glyph = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1536 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1537 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1538
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1539 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1540 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1541 if (IMAGE_INSTANCE_SUBWINDOW_BOTTOM_JUSTIFIED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1542 y = height - (gheight + vert_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1543 else if (IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1544 y = (height - gheight) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1545 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1546 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1547 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1548 if (IMAGE_INSTANCE_SUBWINDOW_RIGHT_JUSTIFIED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1549 x = width - (gwidth + horiz_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1550 else if (IMAGE_INSTANCE_SUBWINDOW_H_CENTERED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1551 x = (width - gwidth) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1552 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1553
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1554 /* Now layout subwidgets if they require it. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1555 glyph_do_layout (glyph, gwidth, gheight, x, y, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1556
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1557 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1558 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1559 x += (gwidth + horiz_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1560 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1561 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1562 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1563 y += (gheight + vert_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1564 if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1565 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1566 /* justified, vertical layout, try and align on logical unit
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1567 boundaries. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1568 y = ROUND_UP (y - yoffset, luh) + yoffset;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1569 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1570 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1571
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1572 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1573 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1574 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1575
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1576 /* Get the glyphs that comprise a layout. These are created internally
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1577 and so are otherwise inaccessible to lisp. We need some way of getting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1578 properties from the widgets that comprise a layout and this is the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1579 simplest way of doing it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1581 #### Eventually we should allow some more intelligent access to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1582 sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1583 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1584 layout_property (Lisp_Object image_instance, Lisp_Object prop)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1585 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1586 /* This function can GC. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1587 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1588 if (EQ (prop, Q_items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1589 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1590 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1591 CONSP (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1592 return Fcopy_sequence (XCDR
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1593 (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1594 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1595 return Fcopy_sequence (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1597 return Qunbound;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1598 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1600 /* Layout subwindows if they are real subwindows. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1601 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1602 native_layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1603 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1604 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1605 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1606 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1607 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1608
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1609 /* The first time this gets called, the layout will be only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1610 partially instantiated. The children get done in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1611 post_instantiate. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1612 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1613 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1614
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1615 /* Defining this overrides the default layout_layout so we first have to call that to get
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1616 suitable instances and values set up. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1617 layout_layout (image_instance, width, height, xoffset, yoffset, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1618
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1619 LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1620 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1621 struct display_glyph_area dga;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1622 dga.xoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1623 dga.yoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1624 dga.width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1625 dga.height = IMAGE_INSTANCE_HEIGHT (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1626
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1627 map_subwindow (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1628 IMAGE_INSTANCE_XOFFSET (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1629 IMAGE_INSTANCE_YOFFSET (ii), &dga);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1630 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1631 return 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1634 DEFUN ("widget-logical-to-character-width", Fwidget_logical_to_character_width, 1, 3, 0, /*
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1635 Convert the width in logical widget units to characters.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1636 Logical widget units do not take into account adjusments made for
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1637 layout borders, so this adjusment is approximated.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1638 */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1639 (width, face, domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1640 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1641 int w, neww, charwidth;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1642 int border_width = DEFAULT_WIDGET_BORDER_WIDTH;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1643
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1644 if (NILP (domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1645 domain = Fselected_frame (Qnil);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1646
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1647 CHECK_INT (width);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1648 w = XINT (width);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1649
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1650 if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain), widget_border_width))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1651 border_width = DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1652
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1653 default_face_font_info (domain, 0, 0, 0, &charwidth, 0);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1654 neww = ROUND_UP (charwidth * w + 4 * border_width + 2 * widget_spacing (domain),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1655 charwidth) / charwidth;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1656
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1657 return make_int (neww);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1658 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1659
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1660 DEFUN ("widget-logical-to-character-height", Fwidget_logical_to_character_height, 1, 3, 0, /*
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1661 Convert the height in logical widget units to characters.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1662 Logical widget units do not take into account adjusments made for
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1663 layout borders, so this adjustment is approximated.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1664
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1665 If the components of a widget layout are justified to the top or the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1666 bottom then they are aligned in terms of `logical units'. This is a
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1667 size quantity that is designed to be big enough to accomodate the
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1668 largest `single height' widget. It is dependent on the widget face and
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1669 some combination of spacing and border-width. Thus if you specify top
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1670 or bottom justification in a vertical layout the subcontrols are laid
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1671 out one per logical unit. This allows adjoining layouts to have
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1672 identical alignment for their subcontrols.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1673
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1674 Since frame sizes are measured in characters, this function allows you
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1675 to do appropriate conversion between logical units and characters.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1676 */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1677 (height, face, domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1678 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1679 int h, newh, charheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1680
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1681 CHECK_INT (height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1682 if (NILP (domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1683 domain = Fselected_frame (Qnil);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1684
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1685 h = XINT (height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1686
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1687 default_face_font_info (domain, 0, 0, &charheight, 0, 0);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1688 newh = ROUND_UP (logical_unit_height (Fsymbol_name (Qwidget),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1689 Vwidget_face, domain) * h, charheight)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1690 / charheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1691
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1692 return make_int (newh);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1693 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1694
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 syms_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1703 DEFSYMBOL (Qetched_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1704 DEFSYMBOL (Qetched_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1705 DEFSYMBOL (Qbevel_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1706 DEFSYMBOL (Qbevel_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1707 DEFSYMBOL (Qmake_glyph);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1708
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1709 DEFSUBR (Fwidget_logical_to_character_height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1710 DEFSUBR (Fwidget_logical_to_character_width);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1713 #define VALID_GUI_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1714 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_active, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1715 IIFORMAT_VALID_KEYWORD (type, Q_suffix, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1716 IIFORMAT_VALID_KEYWORD (type, Q_keys, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1717 IIFORMAT_VALID_KEYWORD (type, Q_style, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1718 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_selected, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1719 IIFORMAT_VALID_KEYWORD (type, Q_filter, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1720 IIFORMAT_VALID_KEYWORD (type, Q_config, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1721 IIFORMAT_VALID_KEYWORD (type, Q_included, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1722 IIFORMAT_VALID_KEYWORD (type, Q_initial_focus, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1723 IIFORMAT_VALID_KEYWORD (type, Q_key_sequence, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1724 IIFORMAT_VALID_KEYWORD (type, Q_accelerator, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1725 IIFORMAT_VALID_KEYWORD (type, Q_label, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1726 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1727 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback_ex, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1728 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_descriptor, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1729 check_valid_string_or_vector); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1730 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1732 #define VALID_WIDGET_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1733 IIFORMAT_VALID_KEYWORD (type, Q_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1734 IIFORMAT_VALID_KEYWORD (type, Q_height, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1735 IIFORMAT_VALID_KEYWORD (type, Q_pixel_width, check_valid_int_or_function); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1736 IIFORMAT_VALID_KEYWORD (type, Q_pixel_height, check_valid_int_or_function); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1737 IIFORMAT_VALID_KEYWORD (type, Q_face, check_valid_face); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1738 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1740
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1741 static void image_instantiator_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1742 { /* we only do this for properties */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM (widget, "widget");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 IIFORMAT_HAS_METHOD (widget, property);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1745 IIFORMAT_HAS_METHOD (widget, update);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1746 IIFORMAT_HAS_METHOD (widget, query_geometry);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1747 IIFORMAT_HAS_METHOD (widget, layout);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1748 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1750 static void image_instantiator_buttons (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1751 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (button, "button");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 IIFORMAT_HAS_SHARED_METHOD (button, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1756 IIFORMAT_HAS_SHARED_METHOD (button, post_instantiate, widget);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1758 IIFORMAT_HAS_SHARED_METHOD (button, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1759 IIFORMAT_HAS_METHOD (button, query_geometry);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1760 IIFORMAT_VALID_KEYWORD (button,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1761 Q_image, check_valid_instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 VALID_WIDGET_KEYWORDS (button);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 VALID_GUI_KEYWORDS (button);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1764 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1766 static void image_instantiator_edit_fields (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1767 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (edit_field, "edit-field");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1772 IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1773 IIFORMAT_HAS_SHARED_METHOD (edit_field, governing_domain, subwindow);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1774 IIFORMAT_HAS_METHOD (edit_field, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 VALID_WIDGET_KEYWORDS (edit_field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 VALID_GUI_KEYWORDS (edit_field);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1777 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1779 static void image_instantiator_combo_box (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1780 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (combo_box, "combo-box");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 IIFORMAT_HAS_METHOD (combo_box, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1784 IIFORMAT_HAS_SHARED_METHOD (combo_box, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1785
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 VALID_GUI_KEYWORDS (combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 IIFORMAT_VALID_KEYWORD (combo_box, Q_height, check_valid_int);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1790 IIFORMAT_VALID_KEYWORD (combo_box, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1791 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 IIFORMAT_VALID_KEYWORD (combo_box, Q_face, check_valid_face);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1793 IIFORMAT_VALID_KEYWORD (combo_box, Q_items, check_valid_item_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1794 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1796 static void image_instantiator_scrollbar (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1797 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (scrollbar, "scrollbar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1802 IIFORMAT_HAS_SHARED_METHOD (scrollbar, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1803 IIFORMAT_HAS_SHARED_METHOD (scrollbar, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 VALID_GUI_KEYWORDS (scrollbar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1806 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1807 check_valid_int_or_function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1808 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1809 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 IIFORMAT_VALID_KEYWORD (scrollbar, Q_face, check_valid_face);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1811 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1813 static void image_instantiator_progress_guage (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1814 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge, "progress-gauge");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1819 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1820 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 VALID_WIDGET_KEYWORDS (progress_gauge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 VALID_GUI_KEYWORDS (progress_gauge);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1823
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1824 IIFORMAT_VALID_KEYWORD (progress_gauge, Q_value, check_valid_int);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1825 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1827 static void image_instantiator_tree_view (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1828 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tree_view, "tree-view");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1832 IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1833 IIFORMAT_HAS_SHARED_METHOD (tree_view, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1834 IIFORMAT_HAS_SHARED_METHOD (tree_view, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1835 IIFORMAT_HAS_METHOD (tree_view, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 VALID_WIDGET_KEYWORDS (tree_view);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 VALID_GUI_KEYWORDS (tree_view);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1838 IIFORMAT_VALID_KEYWORD (tree_view, Q_items, check_valid_item_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1839 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1841 static void image_instantiator_tab_control (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1842 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tab_control, "tab-control");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1846 IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1847 IIFORMAT_HAS_SHARED_METHOD (tab_control, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1848 IIFORMAT_HAS_SHARED_METHOD (tab_control, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1849 IIFORMAT_HAS_METHOD (tab_control, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 VALID_WIDGET_KEYWORDS (tab_control);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 VALID_GUI_KEYWORDS (tab_control);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1852 IIFORMAT_VALID_KEYWORD (tab_control, Q_orientation,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1853 check_valid_tab_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1854 IIFORMAT_VALID_KEYWORD (tab_control, Q_items, check_valid_item_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1855 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1857 static void image_instantiator_labels (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1858 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1861 IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1862 IIFORMAT_HAS_SHARED_METHOD (label, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1863 IIFORMAT_HAS_SHARED_METHOD (label, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 VALID_WIDGET_KEYWORDS (label);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1866 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1868 #define VALID_LAYOUT_KEYWORDS(layout) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1869 VALID_WIDGET_KEYWORDS (layout); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1870 IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1871 IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification); \
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1872 IIFORMAT_VALID_KEYWORD (layout, Q_vertically_justify, check_valid_justification); \
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1873 IIFORMAT_VALID_KEYWORD (layout, Q_horizontally_justify, check_valid_justification); \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1874 IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1875 IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1876 IIFORMAT_VALID_KEYWORD (layout, Q_items, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1877 check_valid_instantiator_list)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1878
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1879 static void image_instantiator_layout (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1880 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1882 IIFORMAT_HAS_SHARED_METHOD (layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1883 IIFORMAT_HAS_METHOD (layout, instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1884 IIFORMAT_HAS_METHOD (layout, post_instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1885 IIFORMAT_HAS_SHARED_METHOD (layout, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 IIFORMAT_HAS_METHOD (layout, normalize);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1887 IIFORMAT_HAS_METHOD (layout, query_geometry);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1888 IIFORMAT_HAS_METHOD (layout, layout);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1889 IIFORMAT_HAS_METHOD (layout, update);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1890 IIFORMAT_HAS_METHOD (layout, property);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1891
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1892 VALID_GUI_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1893 VALID_LAYOUT_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1894 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1895
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1896 static void image_instantiator_native_layout (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1897 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1898 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (native_layout, "native-layout");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1899 IIFORMAT_HAS_SHARED_METHOD (native_layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1900 IIFORMAT_HAS_SHARED_METHOD (native_layout, instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1901 IIFORMAT_HAS_SHARED_METHOD (native_layout, post_instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1902 IIFORMAT_HAS_METHOD (native_layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1903 IIFORMAT_HAS_SHARED_METHOD (native_layout, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1904 IIFORMAT_HAS_SHARED_METHOD (native_layout, normalize, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1905 IIFORMAT_HAS_SHARED_METHOD (native_layout, query_geometry, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1906 IIFORMAT_HAS_SHARED_METHOD (native_layout, layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1907 IIFORMAT_HAS_SHARED_METHOD (native_layout, property, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1908
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1909 VALID_GUI_KEYWORDS (native_layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1910 VALID_LAYOUT_KEYWORDS (native_layout);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1914 image_instantiator_format_create_glyphs_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1915 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1916 image_instantiator_widget();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1917 image_instantiator_buttons();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1918 image_instantiator_edit_fields();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1919 image_instantiator_combo_box();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1920 image_instantiator_scrollbar();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1921 image_instantiator_progress_guage();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1922 image_instantiator_tree_view();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1923 image_instantiator_tab_control();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1924 image_instantiator_labels();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1925 image_instantiator_layout();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1926 image_instantiator_native_layout();
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1927 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1928
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1929 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 reinit_vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 debug_widget_instances = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 reinit_vars_of_glyphs_widget ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 }
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1942
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1943
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1944 void
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1945 specifier_vars_of_glyphs_widget (void)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1946 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1947 DEFVAR_SPECIFIER ("widget-border-width",
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1948 &Vwidget_border_width /*
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1949 *Border width of widgets.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1950 This is a specifier; use `set-specifier' to change it.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1951 */ );
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1952 Vwidget_border_width = Fmake_specifier (Qnatnum);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1953 }