annotate src/glyphs-widget.c @ 872:79c6ff3eef26

[xemacs-hg @ 2002-06-20 21:18:01 by ben] font changes etc.; some 21.4 changes mule/mule-msw-init-late.el: Specify charset->windows-registry conversion. mule/mule-x-init.el: Delete extra mule font additions here. Put them in faces.c. cl-macs.el: Document better. font-lock.el: Move Lisp function regexp to lisp-mode.el. lisp-mode.el: Various indentation fixes: Handle flet functions better. Handle argument lists in defuns and flets. Handle quoted lists, e.g. property lists -- don't indent like function calls. Distinguish between lambdas and other lists. lisp-mode.el: Handle this form. faces.el, font-menu.el, font.el, gtk-faces.el, msw-faces.el, msw-font-menu.el, x-faces.el, x-init.el: Major overhaul of face-handling code: -- Fix lots of bogus code in msw-faces.el, msw-font-menu.el, font-menu.el that was "truenaming" font specs -- i.e. in the process of frobbing a particular field in a general user-specified font spec with wildcarded fields, sticking in particular values for all the remaining wildcarded fields. This bug was rampant everywhere except in x-faces.el (the oldest and only correctly written code). This also means that we need to work with font names at all times and not font instances, because a font instance is essentially a truenamed font. -- Total rewrite of extremely junky code in msw-faces.el. Work with names as well as font instances, and return names; stop truenaming when canonicalizing and frobbing; fix handling of the combined style field, i.e. weight/slant (also fixed in font.el). -- Totally rewrite the frobbing functions in faces.el. This time, we frob all the instantiators rather than just computing a single instance value and working backwards. That way, e.g., `bold' will work for all charsets that have bold available, rather than only for whatever charset was part of the computed font instance (another example of the truename virus). Also fix up code to look at the fallbacks (all of them) when no global value present, so we don't need to put something in the global value. Intelligently handle a request to frob a buffer locale, rather than signalling an error. When frobbing instantiators, try hard to figure out what device type is associated with them, and frob each according to its own proper device type. Correctly handle inheritance vectors given as instantiators. Preserve existing tags when putting back frobbed instantiators. Extract out general specifier-frobbing code into specifier.el. Document everything cleanly. Do lots of other things better, etc. -- Don't duplicatively set a global specification for the default font -- it's already in the fallback and we no longer need a default global specification present. Delete various code in x-faces.el and msw-faces.el that duplicated the lists of fonts in faces.c. -- init-global-faces was not being called at all under MS Windows! Major bogosity. That caused device-specific values to get stuck into all the fonts, making it very hard to change them -- setting global specs caused nothing to happen. -- Correct weight names in font.el. -- Lots more font fixups in objects*.c. Printer.el: Warning fix. specifier.el: Add more args to map-specifier. Add various "heuristic" specifier functions to aid in creation of specifier-munging code such as in faces.el. subr.el: New functions. lwlib.c: Fix warning. config.inc.samp: Clean up, add args to control fastcall (not yet supported! the changes needed are in another ws of mine), profile support, vc6 support, union-type. xemacs.dsp, xemacs.mak: Semi-major overhaul. Fix bug where dump-id was always getting recomputed, forcing a redump even when nothing changed. Add support for fastcall. Support edit-and-continue (on by default) with vc6. Use incremental linking when doing a debug compilation. Add support for profiling. Consolidate the various debug flags. Partial support for "batch-compiling" -- compiling many files on a single invocation of the compiler. Doesn't seem to help that much for me, so it's not finished or enabled by default. Remove HAVE_MSW_C_DIRED, we always do. Correct some sloppy use of directories. s/cygwin32.h: Allow pdump to work under Cygwin (mmap is broken, so need to undefine HAVE_MMAP). s/win32-common.h, s/windowsnt.h: Support for fastcall. Add WIN32_ANY for identifying all Win32 variants (Cygwin, native, MinGW). Both of these are properly used in another ws. alloc.c, balloon-x.c, buffer.c, bytecode.c, callint.c, cm.c, cmdloop.c, cmds.c, console-gtk.c, console-gtk.h, console-msw.c, console-msw.h, console-stream.c, console-stream.h, console-tty.c, console-tty.h, console-x.c, console-x.h, console.c, console.h, device-gtk.c, device-msw.c, device-tty.c, device-x.c, device.c, device.h, devslots.h, dialog-gtk.c, dialog-msw.c, dialog-x.c, dialog.c, dired-msw.c, editfns.c, emacs.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, extents.c, extents.h, faces.c, fileio.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gui-gtk.c, gui-msw.c, gui-x.c, gui.c, gutter.c, input-method-xlib.c, intl-encap-win32.c, intl-win32.c, keymap.c, lisp.h, macros.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, menubar.h, minibuf.c, mule-charset.c, nt.c, objects-gtk.c, objects-gtk.h, objects-msw.c, objects-msw.h, objects-tty.c, objects-tty.h, objects-x.c, objects-x.h, objects.c, objects.h, postgresql.c, print.c, process.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, redisplay.h, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, select-gtk.c, select-msw.c, select-x.c, select.c, signal.c, sound.c, specifier.c, symbols.c, syntax.c, sysdep.c, syssignal.h, syswindows.h, toolbar-common.c, toolbar-gtk.c, toolbar-msw.c, toolbar-x.c, toolbar.c, unicode.c, window.c, window.h: The following are the major changes made: (1) Separation of various header files into an external and an internal version, similar to the existing separation of process.h and procimpl.h. Eventually this should be done for all Lisp objects. The external version has the same name as currently; the internal adds -impl. The external file has XFOO() macros for objects, but the structure is opaque and defined only in the internal file. It's now reasonable to move all prototypes in lisp.h into the appropriate external file, and this should be done. Currently, separation has been done on extents.h, objects*.h, console.h, device.h, frame.h, and window.h. For c/d/f/w, the most basic properties are available in the external header file, with the macros resolving to functions. In the internal header file, the macros are redefined to directly access the structure. Also, the global MARK_FOO_CHANGED macros have been made into functions so that they can be accessed without needing to include lots of -impl headers -- they are used in almost exclusively in non-time-critical functions, and take up enough time that the function overhead will be negligible. Similarly, the function overhead from making the basic properties mentioned above into functions is negligible, and code that does heavy accessing of c/d/f/w structures inevitably ends up needing the internal header files, anyway. (2) More face changes. -- Major rewrite of objects-msw.c. Now handles wildcard specs properly, rather than "truenaming" (or even worse, signalling an error, which previously happened with some of the fallbacks if you tried to use them in make-font-instance!). -- Split charset matching of fonts into two stages -- one to find a font specifically designed for a particular charset (by examining its registry), the second to find a Unicode font that can support the charset. This needs to proceed as two complete, separate instantiations in order to work properly (otherwise many of the fonts in the HELLO page look wrong). This should also make it easy to support iso10646 (Unicode) fonts under X. -- All default values for fonts are now completely specified in the fallbacks. Stuff from mule-x-init.el has all been moved here, merged with the existing specs, and totally rethought so you get sensible results. (HELLO now looks much better!). -- Generalize the "default X/GTK device" stuff into a per-device-type "default device". -- Add mswindows-{set-}charset-registry. In time, charset<->code-page conversion functions will be removed. -- Wrap protective code around calls to compute device specifier tags, and do this computation before calling the face initialization code because the latter may need these tags to be correctly updated. (3) Other changes. EmacsFrame.c, glyphs-msw.c, eval.c, gui-x.c, intl-encap-win32.c, search.c, signal.c, toolbar-msw.c, unicode.c: Warning fixes. config.h.in: #undefs meant to be frobbed by configure *MUST* go inside of #ifndef WIN32_NO_CONFIGURE, and everything else *MUST* go outside! eval.c: Let detailed backtraces be detailed. specifier.c: Don't override user's print-string-length/print-length settings. glyphs.c: New function image-instance-instantiator. config.h.in, sysdep.c: Changes for fastcall. sysdep.c, nt.c: Fix up a previous botched patch that tried to add support for both EEXIST and EACCES. IF THE BOTCHED PATCH WENT INTO 21.4, THIS FIXUP NEEDS TO GO IN, TOO. search.c: Fix *evil* crash due to incorrect synching of syntax-cache code with 21.1. THIS SHOULD GO INTO 21.4.
author ben
date Thu, 20 Jun 2002 21:19:10 +0000
parents 613552a02607
children 332649c64dbc
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.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 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
8 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 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
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* written by Andy Piper <andy@xemacs.org> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include "lisp.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
27
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
28 #include "bytecode.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 866
diff changeset
30 #include "device-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "faces.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
32 #include "frame.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "glyphs.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
34 #include "gui.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
35 #include "insdel.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
36 #include "lstream.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "objects.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
38 #include "opaque.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 DEFINE_IMAGE_INSTANTIATOR_FORMAT (button);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 DEFINE_IMAGE_INSTANTIATOR_FORMAT (combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 Lisp_Object Qcombo_box;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 DEFINE_IMAGE_INSTANTIATOR_FORMAT (edit_field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Lisp_Object Qedit_field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 DEFINE_IMAGE_INSTANTIATOR_FORMAT (scrollbar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object Qscrollbar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 DEFINE_IMAGE_INSTANTIATOR_FORMAT (widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 DEFINE_IMAGE_INSTANTIATOR_FORMAT (label);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 Lisp_Object Qlabel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 DEFINE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 Lisp_Object Qprogress_gauge;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tree_view);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object Qtree_view;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tab_control);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Lisp_Object Qtab_control;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 DEFINE_IMAGE_INSTANTIATOR_FORMAT (layout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Lisp_Object Qlayout;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
59 DEFINE_IMAGE_INSTANTIATOR_FORMAT (native_layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
60 Lisp_Object Qnative_layout;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
63 Lisp_Object Qmake_glyph;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
64 Lisp_Object Vwidget_border_width;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
65
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
66 static int widget_border_width (Lisp_Object domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
67 static int widget_spacing (Lisp_Object domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
68 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
69 int *width, int *height, Lisp_Object domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 int debug_widget_instances;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 /* TODO:
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
76 - tooltips for controls, especially buttons.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
77 - keyboard traversal.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
78 - lisp configurable layout.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
81 /* 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
82 dialog box units. Why? sigh. We could reuse the metrics for dialogs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 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
84 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
85 buttons in groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 widget_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 return IMAGE_WIDGET_MASK;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
93 check_valid_instantiator (Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 Lisp_Object glyph = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 if (SYMBOLP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 glyph = XSYMBOL (data)->value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
99 if (!CONSP (glyph) && !VECTORP (glyph))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
100 invalid_argument ("instantiator item must be a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 check_valid_orientation (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 if (!EQ (data, Qhorizontal)
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 !EQ (data, Qvertical))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
109 invalid_constant ("unknown orientation for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 static void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
113 check_valid_tab_orientation (Lisp_Object data)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
114 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
115 if (!EQ (data, Qtop)
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 !EQ (data, Qbottom)
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, Qleft)
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, Qright))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
122 invalid_constant ("unknown orientation for tab control", data);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
123 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
124
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
125 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 check_valid_justification (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
128 if (!EQ (data, Qleft)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
129 &&
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
130 !EQ (data, Qright)
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, Qtop)
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, Qbottom)
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, Qcenter))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
137 invalid_constant ("unknown justification for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 check_valid_border (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 if (!EQ (data, Qt) && !EQ (data, Qetched_in) && !EQ (data, Qetched_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 && !EQ (data, Qbevel_in) && !EQ (data, Qbevel_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 && !GLYPHP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
146 invalid_argument ("unknown border style for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 check_valid_anything (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 }
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 check_valid_callback (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 if (!SYMBOLP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 && !COMPILED_FUNCTIONP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 && !CONSP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
161 invalid_argument (":callback must be a function or expression", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 }
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 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
166 check_valid_int_or_function (Lisp_Object data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
167 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
168 if (!INTP (data) && !CONSP (data) && !SYMBOLP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
169 invalid_argument ("must be an integer or expresssion", data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
170 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 check_valid_symbol (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 CHECK_SYMBOL (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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 check_valid_string_or_vector (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 if (!STRINGP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
182 invalid_argument (":descriptor must be a string or a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
185 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
186 check_valid_item_list (Lisp_Object items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 Lisp_Object rest;
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 CHECK_LIST (items);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 EXTERNAL_LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (STRINGP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 CHECK_STRING (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 else if (VECTORP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 gui_parse_item_keywords (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 else if (LISTP (XCAR (rest)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 check_valid_item_list (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 invalid_argument ("Items must be vectors, lists or strings", items);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 }
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 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
205 check_valid_instantiator_list (Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 Lisp_Object rest;
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 CHECK_LIST (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 EXTERNAL_LIST_LOOP (rest, data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
212 check_valid_instantiator (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 }
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 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 glyph_instantiator_to_glyph (Lisp_Object sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 /* This function calls lisp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 Lisp_Object glyph = sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 struct gcpro gcpro1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
222
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 GCPRO1 (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 /* if we have a symbol get at the actual data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 if (SYMBOLP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 glyph = XSYMBOL (glyph)->value;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 if (CONSP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 glyph = Feval (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* Be really helpful to the user. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 if (VECTORP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
234 glyph = call1 (Qmake_glyph, glyph);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 RETURN_UNGCPRO (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 substitute_keyword_value (Lisp_Object inst, Lisp_Object key, Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 for (i = 0; i < XVECTOR_LENGTH (inst); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 if (EQ (key, XVECTOR_DATA (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 XVECTOR_DATA (inst)[i+1] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 }
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
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
256 /* Determine the border with of the widget. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
257 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
258 widget_border_width (Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
259 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
260 /* #### 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
261 some portion of this. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
262 if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
263 widget_border_width))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
264 return DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
265 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
266 return DEFAULT_WIDGET_BORDER_WIDTH;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
267 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
268
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
269 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
270 widget_instance_border_width (Lisp_Image_Instance* ii)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
271 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
272 return widget_border_width (IMAGE_INSTANCE_DOMAIN (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
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
275 /* #### 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
276 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
277 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
278 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
279 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
280 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
281 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
282 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
283 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
284 int charheight = 0;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
285 widget_query_string_geometry (text, face,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
286 0, &charheight, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
287 /* 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
288 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
289 the edit-field. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
290 return charheight + 2 * widget_spacing (domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
291 + 4 * widget_border_width (domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
292 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
293
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
294 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
295 widget_logical_unit_height (Lisp_Image_Instance* ii)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
296 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
297 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
298 NILP (IMAGE_INSTANCE_NAME (ii)) ?
613552a02607 [xemacs-hg @ 2002-06-04 17:39:43 by andyp]
andyp
parents: 863
diff changeset
299 Fsymbol_name (Qwidget)
613552a02607 [xemacs-hg @ 2002-06-04 17:39:43 by andyp]
andyp
parents: 863
diff changeset
300 : IMAGE_INSTANCE_NAME (ii)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
301 : IMAGE_INSTANCE_WIDGET_TEXT (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
302 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
303 IMAGE_INSTANCE_DOMAIN (ii));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
304 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
305
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
306 /* Wire widget property invocations to specific widgets. The problem
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
307 we are solving here is that when instantiators get converted to
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
308 instances they lose some type information (they just become
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
309 subwindows or widgets for example). For widgets we need to preserve
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
310 this type information so that we can do widget specific operations
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
311 on the instances. This is encoded in the widget type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
312 field. widget_property gets invoked by decoding the primary type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
313 (Qwidget), <widget>_property then invokes based on the secondary
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
314 type (Qedit_field for example). It is debatable whether we should
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
315 wire things in this generalised way rather than treating widgets
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
316 specially in image_instance_property. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
317 static Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 widget_property (Lisp_Object image_instance, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
320 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
322 #if 0 /* The usefulness of this is dubious. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /* first see if its a general property ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 if (!NILP (Fplist_member (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
326 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
328 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
329 IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
334 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 /* ... then fail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
342 /* Update the displayed properties of a widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
343
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
344 #### This has been adapted from the original set_property functions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
345 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
346 to simply re-parse the instantiator when items need updating. This
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
347 make comparing differences much simpler and obviates the need for a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
348 lot of the state variables.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
349
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
350 #### 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
351 extract information from the actual widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
352
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
353 #### update_widget should probably be re-written to use the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
354 instantiator. We probably want to keep a record of the differences
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
355 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
356 so that changes could be delayed. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
357 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
358 widget_update (Lisp_Object image_instance, Lisp_Object instantiator)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
360 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 struct image_instantiator_methods* meths;
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
362 struct gcpro gcpro1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
364 Lisp_Object text = find_keyword_in_vector (instantiator, Q_text);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
365 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
366 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
367 Lisp_Object descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
368
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
369 GCPRO1 (descriptor_item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
370
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
371 /* 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
372 of.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
373 #### This is potentially bogus because it is changing the items
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
374 in place rather than in the pending items. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
375 if (!NILP (text))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
376 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377 IMAGE_INSTANCE_WIDGET_TEXT (ii) = text;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
378 IMAGE_INSTANCE_TEXT_CHANGED (ii) = 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
379 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
380
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
381 /* 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
382 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
383 keywords.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
384
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
385 #### This is inconsistent with instantiation in that you have to
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
386 have the :descriptor keyword for updates in order to recognise
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
387 changes. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
388 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
389 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
390 descriptor_item = gui_parse_item_keywords_no_errors (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 else
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 /* Since we are updating the instantiator could be incomplete
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
395 and hence the gui item descriptor not well formed. We
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
396 therefore try updating and discard the results if nothing
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
397 changed. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
398 descriptor_item = copy_gui_item (IMAGE_INSTANCE_WIDGET_ITEM (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
399 if (!update_gui_item_keywords (descriptor_item, instantiator))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
400 descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
401 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
402
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
403 /* Record new items for update. *_redisplay will do the
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
404 rest. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
405 if (!EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
406 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
407 !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
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 if (!NILP (items))
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 (descriptor_item))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
412 descriptor_item = IMAGE_INSTANCE_WIDGET_ITEM (ii);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
413
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
414 check_valid_item_list (items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
415 #ifdef DEBUG_WIDGET_OUTPUT
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
416 stderr_out ("items for widget %p updated\n",
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
417 IMAGE_INSTANCE_SUBWINDOW_ID (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
418 #endif
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
419 /* 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
420 the new ones (because nothing has really changed). If we did
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
421 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
422 heaps of trouble when the old items get GC'd. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
423 descriptor_item = Fcons (descriptor_item, parse_gui_item_tree_children (items));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
424 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
425 /* 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
426 in the `new' items. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
427 else if (!NILP (descriptor_item)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
428 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
429 CONSP (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
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 descriptor_item = Fcons
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
432 (descriptor_item,
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
433 copy_gui_item_tree (XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii))));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
434 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
435 }
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 if (!NILP (descriptor_item))
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 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = descriptor_item;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
440 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii) = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
441 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
442
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
443 UNGCPRO;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
444
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
445 /* Now try device specific methods first ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
446 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
447 IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
448 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
449 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
450 /* ... then format specific methods ... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
451 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
452 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
453 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
454 #if 0 /* The usefulness of this is dubious. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 /* 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
456 IMAGE_INSTANCE_WIDGET_PROPS (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
457 = Fplist_put (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, val);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
458 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
459 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
460
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
461 /* Like the rest of redisplay, we want widget updates to occur
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
462 asynchronously. Thus toolkit specific methods for setting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
463 properties must be called by redisplay instead of by *_update. Thus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
464 *_update records the change and this function actually implements
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
465 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
466 format specific functions for the updates instead of lumping them
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
467 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
468 generic functions. This is not the same as widget_update! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
469 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
470 redisplay_widget (Lisp_Object widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
471 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
472 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 struct image_instantiator_methods* meths;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
474
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
475 if (!WIDGET_IMAGE_INSTANCEP (widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
476 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
477 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
478 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
479
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
480 /* Device-format specific methods - e.g. x_tab_control_redisplay () */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
481 meths = decode_device_ii_format (image_instance_device (widget),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 IMAGE_INSTANCE_WIDGET_TYPE (ii),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 ERROR_ME_NOT);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
484 MAYBE_IIFORMAT_METH (meths, redisplay, (widget));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
485
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
486 /* Device generic methods - e.g. x_redisplay_widget (). We must
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487 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
488 layout routines. We also do this here so that explicit resizing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 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
490 that format-specific methods have an opportunity to prevent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491 wholesale changes - e.g. rebuilding tabs. */
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
492 MAYBE_DEVMETH (DOMAIN_XDEVICE (IMAGE_INSTANCE_DOMAIN (ii)),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
493 redisplay_widget, (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
494
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
495 /* Pick up the items we recorded earlier. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
504 static void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
505 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
506 int *width, int *height, Lisp_Object domain)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
507 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
508 struct device *d = DOMAIN_XDEVICE (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 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
511 DEVMETH (d, widget_query_string_geometry,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
512 (string, face, width, height, domain));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
513 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
514 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
515
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
516 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
517
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
518 /* Determine the spacing of the widget. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
519 static int
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
520 widget_spacing (Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
521 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
522 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
523 return DEVMETH (DOMAIN_XDEVICE (domain),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
524 widget_spacing, (0));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
525 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
526 return DEFAULT_WIDGET_SPACING;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
527 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
528
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
529 /* 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
530 provided then use the widget text to calculate sizes. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
531 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
532 widget_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
533 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
534 enum image_instance_geometry disp, Lisp_Object domain)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
535 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
536 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
537 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
538 Lisp_Object dynamic_width = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
539 Lisp_Object dynamic_height = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
540
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
541 /* First just set up what we already have. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
542 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
543 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
544
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
545 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
546 ||
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
547 IMAGE_INSTANCE_SUBWINDOW_H_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 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
550 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
552 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
553 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
554 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
555 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
556 domain));
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
557 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
558 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
559 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560 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
561 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
562 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
564 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
565 domain));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 else
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
567 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 int w, h;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
570 /* Then if we are allowed to resize the widget, make the
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
571 size the same as the text dimensions. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
572 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
573 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
574 &w, &h, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
575 /* Adjust the size for borders. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
576 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
577 *width = w + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
578 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
579 *height = h + 2 * widget_instance_border_width (ii);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
580 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
581 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
582 /* Finish off with dynamic sizing. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
583 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
585 dynamic_width =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
586 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
587 if (INTP (dynamic_width))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
588 *width = XINT (dynamic_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
589 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
590 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
591 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
592 dynamic_height =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
593 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
594 if (INTP (dynamic_height))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
595 *height = XINT (dynamic_height);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
596 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
597 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
598 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
599
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
601 widget_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 Lisp_Object domain)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
604 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
605 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
606 struct image_instantiator_methods* meths;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
607
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
608 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
611 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
612 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
616 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
617 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
618 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
619 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
620 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
621 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
622 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
623 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
625 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
626 return 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
627 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
628
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 widget_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
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 if (NILP (desc))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
635 invalid_argument ("Must supply :descriptor", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 if (VECTORP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 gui_parse_item_keywords (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 if (!NILP (find_keyword_in_vector (instantiator, Q_width))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 && !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
642 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
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 if (!NILP (find_keyword_in_vector (instantiator, Q_height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 && !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
646 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
647 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 combo_box_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 widget_validate (instantiator);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 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
654 invalid_argument ("Must supply item list", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 /* we need to convert things like glyphs to images, eval expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 etc.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
660 widget_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
661 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 Lisp_Object glyph = find_keyword_in_vector (inst, Q_image);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 /* 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
667 same reasons we normalize file to data.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 #### should just normalize the data. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 substitute_keyword_value (inst, Q_image, glyph_instantiator_to_glyph (glyph));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 return inst;
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 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
679 initialize_widget_image_instance (Lisp_Image_Instance *ii, Lisp_Object type)
428
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 /* initialize_subwindow_image_instance (ii);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 IMAGE_INSTANCE_WIDGET_TYPE (ii) = type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
684 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
686 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
690 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
691 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_HORIZONTAL;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
693 IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = 0;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
694 IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 /* Instantiate a button widget. Unfortunately instantiated widgets are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 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
699 like images where you just select the image into the context you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 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
701 many-to-one relationship with things you see, whereas widgets can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 only be one-to-one (i.e. per frame) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
704 widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
705 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
706 int dest_mask, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 /* #### practically all of this should be moved to widget_update()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 so that users can dynamically change all possible widget
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710 properties. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
711 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 Lisp_Object face = find_keyword_in_vector (instantiator, Q_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 Lisp_Object height = find_keyword_in_vector (instantiator, Q_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 Lisp_Object width = find_keyword_in_vector (instantiator, Q_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 Lisp_Object pixwidth = find_keyword_in_vector (instantiator, Q_pixel_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 Lisp_Object pixheight = find_keyword_in_vector (instantiator, Q_pixel_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
719 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
720 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 Lisp_Object mwidth = find_keyword_in_vector (instantiator, Q_margin_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 Lisp_Object ifocus = find_keyword_in_vector (instantiator, Q_initial_focus);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 int pw=0, ph=0, tw=0, th=0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 /* this just does pixel type sizing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 dest_mask, domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729 if (!(dest_mask & IMAGE_WIDGET_MASK))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 incompatible_image_types (instantiator, dest_mask, IMAGE_WIDGET_MASK);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
734 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
735
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 /* retrieve the fg and bg colors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 if (!NILP (face))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
738 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
740 /* 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
741 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
742 keywords. Note that standard gui descriptor shortcuts will not work
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
743 because of keyword parsing.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
744
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
745 #### 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
746 we should rationalize. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
747 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
748 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
749 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
750 gui_parse_item_keywords_no_errors (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 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 /* 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
755 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
756 widget_gui_parse_item_keywords (instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
759 /* Pick up the orientation before we do our first layout. */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
760 if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
762
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 /* parse more gui items out of the properties */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764 if (!NILP (items) && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
765 && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 Fcons (IMAGE_INSTANCE_WIDGET_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
769 parse_gui_item_tree_children (items));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
772 /* Normalize size information. We now only assign sizes if the user
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
773 gives us some explicitly, or there are some constraints that we
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
774 can't change later on. Otherwise we postpone sizing until query
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
775 geometry gets called. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
776 if (!NILP (pixwidth)) /* pixwidth takes precendent */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
777 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
778 if (!INTP (pixwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
779 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = pixwidth;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
780 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
781 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
782 pw = XINT (pixwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
783 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
785 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
786 else if (!NILP (width))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
787 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
788 tw = XINT (width);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
789 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
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
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 if (!NILP (pixheight))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
793 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
794 if (!INTP (pixheight))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
795 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = pixheight;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
796 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798 ph = XINT (pixheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
800 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
801 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
802 else if (!NILP (height) && XINT (height) > 1)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
803 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
804 th = XINT (height);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
805 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
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
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
808 /* Taking the default face information when the user has specified
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
809 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
810 face is more likely to be proportional and thus give inadequate
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
811 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
812 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
813 account the borders and spacing on widgets. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
814 if (tw)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
815 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
816 int charwidth;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
817 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
818 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
819 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
820
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
821 /* For heights the widget face is more appropriate. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
822 if (th == 1)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
823 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
824 int charheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
825 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
826 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
827 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
828 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
829 0, &charheight, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
830 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
831 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
832 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
833 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
834 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
835 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
836 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
837 /* For heights > 1 use logical units. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
838 else if (th > 1)
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 ph = widget_logical_unit_height (ii) * th;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
841 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 /* for a widget with an image pick up the dimensions from that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
846 if (!pw)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
847 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
848 if (!ph)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
849 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
850 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
851 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
854 /* Pick up the margin width. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
855 if (!NILP (mwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
856 IMAGE_INSTANCE_MARGIN_WIDTH (ii) = XINT (mwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
857
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
858 IMAGE_INSTANCE_WANTS_INITIAL_FOCUS (ii) = !NILP (ifocus);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
859
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
860 /* 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
861 children will not have been instantiated. We can't instantiate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
862 them until the device instantiation method for the layout has
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
863 been executed. We do however want to record any specified
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
864 dimensions. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
865 if (pw) IMAGE_INSTANCE_WIDTH (ii) = pw;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
866 if (ph) IMAGE_INSTANCE_HEIGHT (ii) = ph;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
867 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
868
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
869 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
870 widget_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
871 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
872 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 debug_widget_instances++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 stderr_out ("instantiated ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 debug_print (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 stderr_out ("%d widgets instantiated\n", debug_widget_instances);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
881 /* 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
882 depending on the type of button. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
883 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
884 button_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
885 int* width, int* height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
886 enum image_instance_geometry disp, Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
888 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
889 int w, h;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
890 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
891 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
892 &w, &h, domain);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
893 /* Adjust the size for borders. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
894 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
895 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
896 *width = w + 3 * widget_instance_border_width (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
897
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
898 if (EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qradio)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
899 ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900 EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qtoggle))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 /* 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
902 *width += 12;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
903 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
904 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
905 *height = h + 3 * widget_instance_border_width (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
906 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
907
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
908 /* Get the geometry of an edit field. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
909 static void
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
910 edit_field_query_geometry (Lisp_Object image_instance,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
911 int* width, int* height,
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
912 enum image_instance_geometry disp, Lisp_Object domain)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
913 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
914 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
915 int w, h;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
916 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
917 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
918 &w, &h, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
919 /* Adjust the size for borders. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
920 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
921 *width = w + 4 * widget_instance_border_width (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
922 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
923 *height = h + 4 * widget_instance_border_width (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
924 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
925
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
926 /* tree-view geometry - get the height right */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928 tree_view_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
929 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
930 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
932 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
933 Lisp_Object items = IMAGE_INSTANCE_WIDGET_ITEMS (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
934
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
935
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
936 if (*width)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
937 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
938 /* #### 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
939 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
940 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
941 width, 0, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
942 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
943 if (*height)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
944 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
945 int len, h;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
946 /* #### widget face would be better here. */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
947 default_face_font_info (domain, 0, 0, &h, 0, 0);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
948 GET_LIST_LENGTH (items, len);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
949 *height = len * h;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
950 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
953 /* 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
954 items and text therin in the tab control. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
956 tab_control_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
957 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
958 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
960 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
961 Lisp_Object items = XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
963 int tw = 0, th = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
965 LIST_LOOP (rest, items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
967 int h, w;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
968
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
969 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
970 IMAGE_INSTANCE_WIDGET_FACE (ii),
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
971 &w, &h, domain);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
972 tw += 5 * widget_instance_border_width (ii); /* some bias */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
973 tw += w;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
974 th = max (th, h + 2 * widget_instance_border_width (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
977 /* Fixup returned values depending on orientation. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
978 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
979 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
980 if (height) *height = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
981 if (width) *width = th;
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 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
984 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
985 if (height) *height = th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
986 if (width) *width = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
987 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
990 /* Determine whether only the order has changed for a tab. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
991 int tab_control_order_only_changed (Lisp_Object image_instance)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
992 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
993 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
994 int found = 0, len, pending_len;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
995 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
996
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
997 /* Degenerate case. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
998 if (NILP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
999 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1000
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1001 /* See whether we just need a change in order. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1002 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_ITEMS (ii), len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1003 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1004 pending_len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1005 if (len == pending_len)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1006 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1007 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1008 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1009 Lisp_Object pending_rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1010 found = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1011 LIST_LOOP (pending_rest,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1012 XCDR (IMAGE_INSTANCE_WIDGET_PENDING_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 if (gui_item_equal_sans_selected (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1015 XCAR (pending_rest), 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1016 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1017 found = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1018 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1019 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1020 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1021 if (!found)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1022 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 }
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 return found;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1026 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1027
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 * widget layout *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 *****************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1032 /* We need to cascade normalization.*/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1034 layout_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1035 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 /* This function can call lisp */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1038 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1039 Lisp_Object alist = Qnil, new_items = Qnil, border;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1040 /* This function can call lisp */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1041 Lisp_Object items;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1042
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1043 GCPRO2 (alist, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1044 alist = tagged_vector_to_alist (inst);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1045 items = assq_no_quit (Q_items, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1046
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1047 /* We need to normalize sub-objects. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 if (!NILP (items))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1051 LIST_LOOP (rest, XCDR (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1053 /* Substitute the new instantiator */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1054 new_items = Fcons (normalize_image_instantiator (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1055 console_type, dest_mask),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1056 new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1057 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1058 new_items = Fnreverse (new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1059 Fsetcdr (items, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1060 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1061 /* Normalize the border spec. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1062 border = assq_no_quit (Q_border, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1063 if (!NILP (border) && VECTORP (XCDR (border)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1064 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1065 Fsetcdr (border, normalize_image_instantiator (XCDR (border),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1066 console_type, dest_mask));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1067 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1068
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 Lisp_Object result = alist_to_tagged_vector (XVECTOR_DATA (inst)[0],
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1071 alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1072 free_alist (alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1073 RETURN_UNGCPRO (result);
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 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1076
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1077 /* Update the instances in the layout. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1078 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1079 layout_update (Lisp_Object image_instance, Lisp_Object instantiator)
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 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1082 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1083 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
1084 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
1085 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
1086 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
1087 Lisp_Object border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1088 Lisp_Object children = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1089 int structure_changed = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1090 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1091
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1092 /* Pick up horizontal justification, left is the default.*/
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1093 if (!NILP (hjustify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1094 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1095 if (EQ (hjustify, Qright) || EQ (hjustify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1096 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
1097 else if (EQ (hjustify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1098 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
1099 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1100 /* If not set use general justification. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1101 else if (!NILP (justify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1102 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1103 if (EQ (justify, Qright) || EQ (justify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1104 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
1105 else if (EQ (justify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1106 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
1107 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1108
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1109 /* Pick up vertical justification, top is the default. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1110 if (!NILP (vjustify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1111 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1112 if (EQ (vjustify, Qright) || EQ (vjustify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1113 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
1114 else if (EQ (vjustify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1115 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
1116 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1117 /* If not set use general justification. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1118 else if (!NILP (justify))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1119 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1120 if (EQ (justify, Qright) || EQ (justify, Qbottom))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1121 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
1122 else if (EQ (justify, Qcenter))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1123 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
1124 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1125
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1126 /* 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
1127 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
1128 GCPRO1 (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1129
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1130 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1131 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1132 border = XCAR (children);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1133 children = XCDR (children);
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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1136 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1137 stderr_out ("layout updated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1138 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1139 /* Update the border. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1140 if (!NILP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1141 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1142 if (VECTORP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1143 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1144 /* 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
1145 just another child, the layout and output routines don't know
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1146 this and will just display at the offsets we prescribe. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1147 if (!NILP (border))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1148 call3 (Qset_glyph_image, border, border_inst,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1149 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1150 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1151 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1152 border = Fcons (call1 (Qmake_glyph, border_inst), Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1153 structure_changed = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1154 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1155 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0);
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 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1158 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1159 if (!NILP (border))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1160 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1161 border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1162 structure_changed = 1;
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 (EQ (border_inst, Qt))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1165 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1166 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1167 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border_inst;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1170
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1171 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1172 if (!NILP (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1174 int len1, len2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1175 GET_LIST_LENGTH (items, len1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1176 GET_LIST_LENGTH (children, len2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1177 /* The structure hasn't changed so just update the images. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1178 if (!structure_changed && len1 == len2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1179 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1180 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1181 for (; !NILP (children); children = XCDR (children), items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1182 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1183 call3 (Qset_glyph_image, XCAR (children), XCAR (items),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1184 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1185 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1186 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1187 /* The structure has changed so start over. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1188 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1189 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1190 /* Instantiate any new glyphs. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1191 for (; !NILP (items); items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1192 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1193 /* #### We really want to use call_with_suspended_errors
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1194 here, but it won't allow us to call lisp. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1195 border = Fcons (call1 (Qmake_glyph, XCAR (items)), border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1196 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1197 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Fnreverse (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1198 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1200 UNGCPRO;
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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1203 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1204 layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1205 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1206 int dest_mask, Lisp_Object domain)
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 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1209 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1210
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1211 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1212 stderr_out ("layout instantiated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1213 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1214 /* Do widget type instantiation first. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1215 widget_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1216 dest_mask, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1217
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1218 if (NILP (orient))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1219 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1220 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1221 }
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 /* Get child glyphs and finish instantiation. We can't do image
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1224 instance children yet as we might not have a containing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1225 window. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1226 layout_update (image_instance, instantiator);
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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1229 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1230 layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1235 /* Layout widget. Sizing commentary: we have a number of problems that
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1236 we would like to address. Some consider some of these more
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1237 important than others. It used to be that size information was
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1238 determined at instantiation time and was then fixed forever
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1239 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
1240 "big enough" to accommodate whatever they are trying to show and
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1241 this is dependent on text length, lines, font metrics etc. Of
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1242 course these attributes can change dynamically and so the size
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1243 should changed dynamically also. Only in a few limited cases should
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1244 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
1245 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
1246 widgets - we want it to be discovered dynamically. Thus we can
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1247 envisage the following scenarios:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1248
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1249 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
1250 button should change size also.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1251
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1252 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
1253
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1254 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
1255 layout should change with it.
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 4. A button grows to accommodate additional text. The whitespace
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1258 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
1259 requirements.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1260
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1261 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
1262 possible.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1263
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1264 What metrics are important?
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1265 1. Actual width and height.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1266
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1267 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
1268 whether it can grow or shrink.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1269
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1270 Text glyphs are particularly troublesome since their metrics depend
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1271 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
1272 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
1273 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
1274 a glyph-face or image-instance face. All other glyphs are
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1275 essentially fixed in appearance. Perhaps the problem is that text
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1276 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
1277 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
1278 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
1279 rest.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1280
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1281 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
1282 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
1283 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
1284 distributed), left or right justified (fixed spacing widgets
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1285 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
1286 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
1287 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
1288 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
1289 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
1290 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
1291 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
1292 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
1293 largest `single height unit'. The function
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1294 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
1295 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
1296 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
1297 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
1298 units. To simplify this the functions
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1299 `widget-logical-to-character-height' and
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1300 `widget-logical-to-character-width' allow conversion between
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1301 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
1302 appropriately. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1303
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1304 /* Query the geometry of a layout widget. We assume that we can only
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1305 get here if the size is not already fixed. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1307 layout_query_geometry (Lisp_Object image_instance, int* width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1308 int* height, enum image_instance_geometry disp,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1309 Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1311 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1312 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1313 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
1314 int gheight, gwidth, luh;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1315
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1316 /* 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
1317 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1318 return;
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 /* First just set up what we already have. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1321 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1322 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
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 /* If we are not allowed to dynamically size then return. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1325 if (!IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1326 &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1327 !IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1328 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1329
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1330 luh = widget_logical_unit_height (ii);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1331
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1332 /* Pick up the border text if we have one. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1333 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1334 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1335 glyph_query_geometry (XCAR (items), &gwidth, &gheight, disp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1336 image_instance);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1337 ph_adjust = gheight;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1338 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1339 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1340
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1341 /* 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
1342 LIST_LOOP (rest, items)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1343 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1344 Lisp_Object glyph = XCAR (rest);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1345 glyph_query_geometry (glyph, &gwidth, &gheight, disp, image_instance);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1346
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1347 nitems ++;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1348 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1349 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1350 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1351 maxpw += gwidth;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1352 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1353 else
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1354 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1355 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1356 maxph += gheight;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1357 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1358 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1360 /* 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
1361 have been fixed by the user. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1362 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1363 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1364 Lisp_Object dynamic_width =
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
1365 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1366 if (INTP (dynamic_width))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1367 *width = XINT (dynamic_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1368 }
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1369 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1370 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1371 *width = maxpw + ((nitems + 1) * widget_instance_border_width (ii) +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1372 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1373 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1374 else
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1375 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1376 *width = maxpw + 2 * (widget_instance_border_width (ii) * 2 +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1377 IMAGE_INSTANCE_MARGIN_WIDTH (ii));
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1378 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1380 /* Work out vertical spacings. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1381 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1382 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1383 Lisp_Object dynamic_height =
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
1384 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1385 if (INTP (dynamic_height))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1386 *height = XINT (dynamic_height);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1387 }
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1388 else if (IMAGE_INSTANCE_SUBWINDOW_LOGICAL_LAYOUT (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1389 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1390 *height = nitems * luh + ph_adjust;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1391 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1392 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_VERTICAL)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1393 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1394 *height = maxph + ((nitems + 1) * widget_instance_border_width (ii) +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1395 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1396 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1397 else
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1398 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1399 *height = maxph + (2 * widget_instance_border_width (ii) +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1400 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1401 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1402 #ifdef DEBUG_WIDGET_OUTPUT
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1403 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
1404 #endif
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1405 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1406
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1407 int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1408 layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1409 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1410 Lisp_Object domain)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1411 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1412 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1413 Lisp_Object rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1414 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1415 int x, y, maxph = 0, maxpw = 0, nitems = 0,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1416 horiz_spacing, vert_spacing, ph_adjust = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1417 int gheight, gwidth;
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1418 /* See comments in widget_logical_unit_height(). */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1419 int luh = widget_logical_unit_height (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1420
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1421 /* 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
1422 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1423 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1425 #ifdef DEBUG_WIDGET_OUTPUT
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1426 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
1427 #endif
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1428
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1429 /* 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
1430 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
1431 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
1432 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
1433 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
1434 should be displayed on the border. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1435 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1436 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1437 Lisp_Object border = XCAR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1438 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1439 glyph_query_geometry (border, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1440 IMAGE_DESIRED_GEOMETRY, image_instance);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1441 /* 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
1442 of the border glyph. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1443 ph_adjust = gheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1444 /* 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
1445 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (gheight / 2);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1446
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1447 /* #### Really, what should this be? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1448 glyph_do_layout (border, gwidth, gheight, 10, 0,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1449 image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1450 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1451
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1452 /* 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
1453 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 Lisp_Object glyph = XCAR (rest);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1456
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1457 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1458 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1459 nitems ++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1460 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1461 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1463 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1464 maxpw += gwidth;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1466 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1468 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1469 maxph += gheight;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 /* work out spacing between items and bounds of the layout */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1474 if (width < maxpw)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 /* The user wants a smaller space than the largest item, so we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 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
1477 clip. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1478 horiz_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1479 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1480 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 /* We have a larger area to display in so distribute the space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 evenly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1483 horiz_spacing = (width - (maxpw +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1484 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1485 / (nitems + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1487 horiz_spacing = (width - maxpw) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1488 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1490 /* 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
1491 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
1492 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
1493 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
1494 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
1495 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
1496 accommodate it. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1497 if (height < maxph)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1498 vert_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii)) * 2;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1499 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1500 == LAYOUT_VERTICAL)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1501 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1502 if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1503 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
1504 else
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1505 vert_spacing = (height - (maxph + ph_adjust +
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1506 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1507 / (nitems + 1);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1508 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1510 vert_spacing = (height - (maxph + ph_adjust)) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1511 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1513 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
1514 x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 /* Now flip through putting items where we want them, paying
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1517 attention to justification. Make sure we don't mess with the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1518 border glyph. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 Lisp_Object glyph = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1523 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1524 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1525
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1526 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1527 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1528 if (IMAGE_INSTANCE_SUBWINDOW_BOTTOM_JUSTIFIED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1529 y = height - (gheight + vert_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1530 else if (IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1531 y = (height - gheight) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1532 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1533 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1534 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1535 if (IMAGE_INSTANCE_SUBWINDOW_RIGHT_JUSTIFIED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1536 x = width - (gwidth + horiz_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1537 else if (IMAGE_INSTANCE_SUBWINDOW_H_CENTERED (ii))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1538 x = (width - gwidth) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1539 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1540
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1541 /* Now layout subwidgets if they require it. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1542 glyph_do_layout (glyph, gwidth, gheight, x, y, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1543
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1544 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
442
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 x += (gwidth + horiz_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1547 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1548 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1549 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1550 y += (gheight + vert_spacing);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1551 if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1552 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1553 /* 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
1554 boundaries. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1555 y = ROUND_UP (y - yoffset, luh) + yoffset;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1556 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1557 }
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 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1560 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1561 }
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 /* Get the glyphs that comprise a layout. These are created internally
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1564 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
1565 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
1566 simplest way of doing it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1568 #### Eventually we should allow some more intelligent access to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1569 sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1570 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1571 layout_property (Lisp_Object image_instance, Lisp_Object prop)
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 /* This function can GC. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1574 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1575 if (EQ (prop, Q_items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1576 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1577 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1578 CONSP (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1579 return Fcopy_sequence (XCDR
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1580 (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1581 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1582 return Fcopy_sequence (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1584 return Qunbound;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1585 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1587 /* Layout subwindows if they are real subwindows. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1588 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1589 native_layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1590 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1591 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1592 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1593 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1594 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1595
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1596 /* The first time this gets called, the layout will be only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1597 partially instantiated. The children get done in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1598 post_instantiate. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1599 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1600 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1601
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1602 /* 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
1603 suitable instances and values set up. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1604 layout_layout (image_instance, width, height, xoffset, yoffset, 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 LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1607 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1608 struct display_glyph_area dga;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1609 dga.xoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1610 dga.yoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1611 dga.width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1612 dga.height = IMAGE_INSTANCE_HEIGHT (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1613
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1614 map_subwindow (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1615 IMAGE_INSTANCE_XOFFSET (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1616 IMAGE_INSTANCE_YOFFSET (ii), &dga);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1617 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1618 return 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1621 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
1622 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
1623 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
1624 layout borders, so this adjusment is approximated.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1625 */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1626 (width, face, domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1627 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1628 int w, neww, charwidth;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1629 int border_width = DEFAULT_WIDGET_BORDER_WIDTH;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1630
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1631 if (NILP (domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1632 domain = Fselected_frame (Qnil);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1633
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1634 CHECK_INT (width);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1635 w = XINT (width);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1636
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1637 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
1638 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
1639
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1640 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
1641 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
1642 charwidth) / charwidth;
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 return make_int (neww);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1645 }
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 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
1648 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
1649 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
1650 layout borders, so this adjustment is approximated.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1651
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1652 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
1653 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
1654 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
1655 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
1656 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
1657 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
1658 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
1659 identical alignment for their subcontrols.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1660
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1661 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
1662 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
1663 */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1664 (height, face, domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1665 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1666 int h, newh, charheight;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1667
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1668 CHECK_INT (height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1669 if (NILP (domain))
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1670 domain = Fselected_frame (Qnil);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1671
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1672 h = XINT (height);
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 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
1675 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
1676 Vwidget_face, domain) * h, charheight)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1677 / charheight;
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 return make_int (newh);
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
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 syms_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1690 DEFSYMBOL (Qetched_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1691 DEFSYMBOL (Qetched_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1692 DEFSYMBOL (Qbevel_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1693 DEFSYMBOL (Qbevel_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1694 DEFSYMBOL (Qmake_glyph);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1695
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1696 DEFSUBR (Fwidget_logical_to_character_height);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1697 DEFSUBR (Fwidget_logical_to_character_width);
428
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1700 #define VALID_GUI_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1701 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_active, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1702 IIFORMAT_VALID_KEYWORD (type, Q_suffix, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1703 IIFORMAT_VALID_KEYWORD (type, Q_keys, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1704 IIFORMAT_VALID_KEYWORD (type, Q_style, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1705 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_selected, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1706 IIFORMAT_VALID_KEYWORD (type, Q_filter, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1707 IIFORMAT_VALID_KEYWORD (type, Q_config, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1708 IIFORMAT_VALID_KEYWORD (type, Q_included, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1709 IIFORMAT_VALID_KEYWORD (type, Q_initial_focus, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1710 IIFORMAT_VALID_KEYWORD (type, Q_key_sequence, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1711 IIFORMAT_VALID_KEYWORD (type, Q_accelerator, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1712 IIFORMAT_VALID_KEYWORD (type, Q_label, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1713 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1714 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback_ex, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1715 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_descriptor, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1716 check_valid_string_or_vector); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1717 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1719 #define VALID_WIDGET_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1720 IIFORMAT_VALID_KEYWORD (type, Q_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1721 IIFORMAT_VALID_KEYWORD (type, Q_height, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1722 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
1723 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
1724 IIFORMAT_VALID_KEYWORD (type, Q_face, check_valid_face); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1725 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1727
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1728 static void image_instantiator_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1729 { /* we only do this for properties */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM (widget, "widget");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 IIFORMAT_HAS_METHOD (widget, property);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1732 IIFORMAT_HAS_METHOD (widget, update);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1733 IIFORMAT_HAS_METHOD (widget, query_geometry);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1734 IIFORMAT_HAS_METHOD (widget, layout);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1735 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1737 static void image_instantiator_buttons (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1738 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (button, "button");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 IIFORMAT_HAS_SHARED_METHOD (button, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1743 IIFORMAT_HAS_SHARED_METHOD (button, post_instantiate, widget);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1745 IIFORMAT_HAS_SHARED_METHOD (button, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1746 IIFORMAT_HAS_METHOD (button, query_geometry);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1747 IIFORMAT_VALID_KEYWORD (button,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1748 Q_image, check_valid_instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 VALID_WIDGET_KEYWORDS (button);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 VALID_GUI_KEYWORDS (button);
440
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
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1753 static void image_instantiator_edit_fields (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1754 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (edit_field, "edit-field");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1759 IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1760 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
1761 IIFORMAT_HAS_METHOD (edit_field, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 VALID_WIDGET_KEYWORDS (edit_field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 VALID_GUI_KEYWORDS (edit_field);
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_combo_box (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 (combo_box, "combo-box");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 IIFORMAT_HAS_METHOD (combo_box, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1771 IIFORMAT_HAS_SHARED_METHOD (combo_box, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1772
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 VALID_GUI_KEYWORDS (combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 IIFORMAT_VALID_KEYWORD (combo_box, Q_height, check_valid_int);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1777 IIFORMAT_VALID_KEYWORD (combo_box, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1778 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 IIFORMAT_VALID_KEYWORD (combo_box, Q_face, check_valid_face);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1780 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
1781 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1783 static void image_instantiator_scrollbar (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1784 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (scrollbar, "scrollbar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1789 IIFORMAT_HAS_SHARED_METHOD (scrollbar, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1790 IIFORMAT_HAS_SHARED_METHOD (scrollbar, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 VALID_GUI_KEYWORDS (scrollbar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1793 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1794 check_valid_int_or_function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1795 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1796 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 IIFORMAT_VALID_KEYWORD (scrollbar, Q_face, check_valid_face);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1798 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1800 static void image_instantiator_progress_guage (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1801 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge, "progress-gauge");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1806 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1807 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 VALID_WIDGET_KEYWORDS (progress_gauge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 VALID_GUI_KEYWORDS (progress_gauge);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1810
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1811 IIFORMAT_VALID_KEYWORD (progress_gauge, Q_value, check_valid_int);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1812 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1814 static void image_instantiator_tree_view (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1815 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tree_view, "tree-view");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1819 IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1820 IIFORMAT_HAS_SHARED_METHOD (tree_view, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1821 IIFORMAT_HAS_SHARED_METHOD (tree_view, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1822 IIFORMAT_HAS_METHOD (tree_view, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 VALID_WIDGET_KEYWORDS (tree_view);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 VALID_GUI_KEYWORDS (tree_view);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1825 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
1826 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1828 static void image_instantiator_tab_control (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1829 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tab_control, "tab-control");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1833 IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1834 IIFORMAT_HAS_SHARED_METHOD (tab_control, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1835 IIFORMAT_HAS_SHARED_METHOD (tab_control, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1836 IIFORMAT_HAS_METHOD (tab_control, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 VALID_WIDGET_KEYWORDS (tab_control);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 VALID_GUI_KEYWORDS (tab_control);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1839 IIFORMAT_VALID_KEYWORD (tab_control, Q_orientation,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1840 check_valid_tab_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1841 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
1842 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1844 static void image_instantiator_labels (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1845 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1848 IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1849 IIFORMAT_HAS_SHARED_METHOD (label, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1850 IIFORMAT_HAS_SHARED_METHOD (label, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 VALID_WIDGET_KEYWORDS (label);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1853 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1855 #define VALID_LAYOUT_KEYWORDS(layout) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1856 VALID_WIDGET_KEYWORDS (layout); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1857 IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1858 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
1859 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
1860 IIFORMAT_VALID_KEYWORD (layout, Q_horizontally_justify, check_valid_justification); \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1861 IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1862 IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1863 IIFORMAT_VALID_KEYWORD (layout, Q_items, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1864 check_valid_instantiator_list)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1865
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1866 static void image_instantiator_layout (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1867 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1869 IIFORMAT_HAS_SHARED_METHOD (layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1870 IIFORMAT_HAS_METHOD (layout, instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1871 IIFORMAT_HAS_METHOD (layout, post_instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1872 IIFORMAT_HAS_SHARED_METHOD (layout, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 IIFORMAT_HAS_METHOD (layout, normalize);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1874 IIFORMAT_HAS_METHOD (layout, query_geometry);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1875 IIFORMAT_HAS_METHOD (layout, layout);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1876 IIFORMAT_HAS_METHOD (layout, update);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1877 IIFORMAT_HAS_METHOD (layout, property);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1878
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1879 VALID_GUI_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1880 VALID_LAYOUT_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1881 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1882
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1883 static void image_instantiator_native_layout (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1884 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1885 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (native_layout, "native-layout");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1886 IIFORMAT_HAS_SHARED_METHOD (native_layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1887 IIFORMAT_HAS_SHARED_METHOD (native_layout, instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1888 IIFORMAT_HAS_SHARED_METHOD (native_layout, post_instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1889 IIFORMAT_HAS_METHOD (native_layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1890 IIFORMAT_HAS_SHARED_METHOD (native_layout, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1891 IIFORMAT_HAS_SHARED_METHOD (native_layout, normalize, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1892 IIFORMAT_HAS_SHARED_METHOD (native_layout, query_geometry, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1893 IIFORMAT_HAS_SHARED_METHOD (native_layout, layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1894 IIFORMAT_HAS_SHARED_METHOD (native_layout, property, layout);
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 VALID_GUI_KEYWORDS (native_layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1897 VALID_LAYOUT_KEYWORDS (native_layout);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1901 image_instantiator_format_create_glyphs_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1902 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1903 image_instantiator_widget();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1904 image_instantiator_buttons();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1905 image_instantiator_edit_fields();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1906 image_instantiator_combo_box();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1907 image_instantiator_scrollbar();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1908 image_instantiator_progress_guage();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1909 image_instantiator_tree_view();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1910 image_instantiator_tab_control();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1911 image_instantiator_labels();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1912 image_instantiator_layout();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1913 image_instantiator_native_layout();
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1914 }
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 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 reinit_vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 debug_widget_instances = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 reinit_vars_of_glyphs_widget ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 }
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1929
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1930
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1931 void
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1932 specifier_vars_of_glyphs_widget (void)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1933 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1934 DEFVAR_SPECIFIER ("widget-border-width",
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1935 &Vwidget_border_width /*
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1936 *Border width of widgets.
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1937 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
1938 */ );
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1939 Vwidget_border_width = Fmake_specifier (Qnatnum);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1940 }