annotate src/glyphs-widget.c @ 853:2b6fa2618f76

[xemacs-hg @ 2002-05-28 08:44:22 by ben] merge my stderr-proc ws make-docfile.c: Fix places where we forget to check for EOF. code-init.el: Don't use CRLF conversion by default on process output. CMD.EXE and friends work both ways but Cygwin programs don't like the CRs. code-process.el, multicast.el, process.el: Removed. Improvements to call-process-internal: -- allows a buffer to be specified for input and stderr output -- use it on all systems -- implement C-g as documented -- clean up and comment call-process-region uses new call-process facilities; no temp file. remove duplicate funs in process.el. comment exactly how coding systems work and fix various problems. open-multicast-group now does similar coding-system frobbing to open-network-stream. dumped-lisp.el, faces.el, msw-faces.el: Fix some hidden errors due to code not being defined at the right time. xemacs.mak: Add -DSTRICT. ================================================================ ALLOW SEPARATION OF STDOUT AND STDERR IN PROCESSES ================================================================ Standard output and standard error can be processed separately in a process. Each can have its own buffer, its own mark in that buffer, and its filter function. You can specify a separate buffer for stderr in `start-process' to get things started, or use the new primitives: set-process-stderr-buffer process-stderr-buffer process-stderr-mark set-process-stderr-filter process-stderr-filter Also, process-send-region takes a 4th optional arg, a buffer. Currently always uses a pipe() under Unix to read the error output. (#### Would a PTY be better?) sysdep.h, sysproc.h, unexfreebsd.c, unexsunos4.c, nt.c, emacs.c, callproc.c, symsinit.h, sysdep.c, Makefile.in.in, process-unix.c: Delete callproc.c. Move child_setup() to process-unix.c. wait_for_termination() now only needed on a few really old systems. console-msw.h, event-Xt.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.h, process-nt.c, process-unix.c, process.c, process.h, procimpl.h: Rewrite the process methods to handle a separate channel for error input. Create Lstreams for reading in the error channel. Many process methods need change. In general the changes are fairly clear as they involve duplicating what's used for reading the normal stdout and changing for stderr -- although tedious, as such changes are required throughout the entire process code. Rewrote the code that reads process output to do two loops, one for stdout and one for stderr. gpmevent.c, tooltalk.c: set_process_filter takes an argument for stderr. ================================================================ NEW ERROR-TRAPPING MECHANISM ================================================================ Totally rewrite error trapping code to be unified and support more features. Basic function is call_trapping_problems(), which lets you specify, by means of flags, what sorts of problems you want trapped. these can include -- quit -- errors -- throws past the function -- creation of "display objects" (e.g. buffers) -- deletion of already-existing "display objects" (e.g. buffers) -- modification of already-existing buffers -- entering the debugger -- gc -- errors->warnings (ala suspended errors) etc. All other error funs rewritten in terms of this one. Various older mechanisms removed or rewritten. window.c, insdel.c, console.c, buffer.c, device.c, frame.c: When creating a display object, added call to note_object_created(), for use with trapping_problems mechanism. When deleting, call check_allowed_operation() and note_object deleted(). The trapping-problems code records the objects created since the call-trapping-problems began. Those objects can be deleted, but none others (i.e. previously existing ones). bytecode.c, cmdloop.c: internal_catch takes another arg. eval.c: Add long comments describing the "five lists" used to maintain state (backtrace, gcpro, specbind, etc.) in the Lisp engine. backtrace.h, eval.c: Implement trapping-problems mechanism, eliminate old mechanisms or redo in terms of new one. frame.c, gutter.c: Flush out the concept of "critical display section", defined by the in_display() var. Use an internal_bind() to get it reset, rather than just doing it at end, because there may be a non-local exit. event-msw.c, event-stream.c, console-msw.h, device.c, dialog-msw.c, frame.c, frame.h, intl.c, toolbar.c, menubar-msw.c, redisplay.c, alloc.c, menubar-x.c: Make use of new trapping-errors stuff and rewrite code based on old mechanisms. glyphs-widget.c, redisplay.h: Protect calling Lisp in redisplay. insdel.c: Protect hooks against deleting existing buffers. frame-msw.c: Use EQ, not EQUAL in hash tables whose keys are just numbers. Otherwise we run into stickiness in redisplay because internal_equal() can QUIT. ================================================================ SIGNAL, C-G CHANGES ================================================================ Here we change the way that C-g interacts with event reading. The idea is that a C-g occurring while we're reading a user event should be read as C-g, but elsewhere should be a QUIT. The former code did all sorts of bizarreness -- requiring that no QUIT occurs anywhere in event-reading code (impossible to enforce given the stuff called or Lisp code invoked), and having some weird system involving enqueue/dequeue of a C-g and interaction with Vquit_flag -- and it didn't work. Now, we simply enclose all code where we want C-g read as an event with {begin/end}_dont_check_for_quit(). This completely turns off the mechanism that checks (and may remove or alter) C-g in the read-ahead queues, so we just get the C-g normal. Signal.c documents this very carefully. cmdloop.c: Correct use of dont_check_for_quit to new scheme, remove old out-of-date comments. event-stream.c: Fix C-g handling to actually work. device-x.c: Disable quit checking when err out. signal.c: Cleanup. Add large descriptive comment. process-unix.c, process-nt.c, sysdep.c: Use QUIT instead of REALLY_QUIT. It's not necessary to use REALLY_QUIT and just confuses the issue. lisp.h: Comment quit handlers. ================================================================ CONS CHANGES ================================================================ free_cons() now takes a Lisp_Object not the result of XCONS(). car and cdr have been renamed so that they don't get used directly; go through XCAR(), XCDR() instead. alloc.c, dired.c, editfns.c, emodules.c, fns.c, glyphs-msw.c, glyphs-x.c, glyphs.c, keymap.c, minibuf.c, search.c, eval.c, lread.c, lisp.h: Correct free_cons calling convention: now takes Lisp_Object, not Lisp_Cons chartab.c: Eliminate direct use of ->car, ->cdr, should be black box. callint.c: Rewrote using EXTERNAL_LIST_LOOP to avoid use of Lisp_Cons. ================================================================ USE INTERNAL-BIND-* ================================================================ eval.c: Cleanups of these funs. alloc.c, fileio.c, undo.c, specifier.c, text.c, profile.c, lread.c, redisplay.c, menubar-x.c, macros.c: Rewrote to use internal_bind_int() and internal_bind_lisp_object() in place of whatever varied and cumbersome mechanisms were formerly there. ================================================================ SPECBIND SANITY ================================================================ backtrace.h: - Improved comments backtrace.h, bytecode.c, eval.c: Add new mechanism check_specbind_stack_sanity() for sanity checking code each time the catchlist or specbind stack change. Removed older prototype of same mechanism. ================================================================ MISC ================================================================ lisp.h, insdel.c, window.c, device.c, console.c, buffer.c: Fleshed out authorship. device-msw.c: Correct bad Unicode-ization. print.c: Be more careful when not initialized or in fatal error handling. search.c: Eliminate running_asynch_code, an FSF holdover. alloc.c: Added comments about gc-cons-threshold. dialog-x.c: Use begin_gc_forbidden() around code to build up a widget value tree, like in menubar-x.c. gui.c: Use Qunbound not Qnil as the default for gethash. lisp-disunion.h, lisp-union.h: Added warnings on use of VOID_TO_LISP(). lisp.h: Use ERROR_CHECK_STRUCTURES to turn on ERROR_CHECK_TRAPPING_PROBLEMS and ERROR_CHECK_TYPECHECK lisp.h: Add assert_with_message. lisp.h: Add macros for gcproing entire arrays. (You could do this before but it required manual twiddling the gcpro structure.) lisp.h: Add prototypes for new functions defined elsewhere.
author ben
date Tue, 28 May 2002 08:45:36 +0000
parents a5954632b187
children 42375619fa45
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.
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
2 Copyright (C) 1998, 1999, 2000 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"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "device.h"
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;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 int debug_widget_instances;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 /* TODO:
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
70 - tooltips for controls, especially buttons.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
71 - keyboard traversal.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
72 - lisp configurable layout.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
75 /* 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
76 dialog box units. Why? sigh. We could reuse the metrics for dialogs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 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
78 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
79 buttons in groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 widget_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 return IMAGE_WIDGET_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
87 check_valid_instantiator (Lisp_Object data)
428
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 Lisp_Object glyph = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 if (SYMBOLP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 glyph = XSYMBOL (data)->value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
93 if (!CONSP (glyph) && !VECTORP (glyph))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
94 invalid_argument ("instantiator item must be a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 check_valid_orientation (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 if (!EQ (data, Qhorizontal)
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 !EQ (data, Qvertical))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
103 invalid_constant ("unknown orientation for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 static void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
107 check_valid_tab_orientation (Lisp_Object data)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
108 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
109 if (!EQ (data, Qtop)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
110 &&
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
111 !EQ (data, Qbottom)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
112 &&
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
113 !EQ (data, Qleft)
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 !EQ (data, Qright))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
116 invalid_constant ("unknown orientation for tab control", data);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
117 }
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 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 check_valid_justification (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 if (!EQ (data, Qleft) && !EQ (data, Qright) && !EQ (data, Qcenter))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
123 invalid_constant ("unknown justification for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 check_valid_border (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 if (!EQ (data, Qt) && !EQ (data, Qetched_in) && !EQ (data, Qetched_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 && !EQ (data, Qbevel_in) && !EQ (data, Qbevel_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 && !GLYPHP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
132 invalid_argument ("unknown border style for layout", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 check_valid_anything (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 {
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_callback (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 (!SYMBOLP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 && !COMPILED_FUNCTIONP (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 && !CONSP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
147 invalid_argument (":callback must be a function or expression", data);
428
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
152 check_valid_int_or_function (Lisp_Object data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
153 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
154 if (!INTP (data) && !CONSP (data) && !SYMBOLP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
155 invalid_argument ("must be an integer or expresssion", data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
156 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
157
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
158 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 check_valid_symbol (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 CHECK_SYMBOL (data);
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 check_valid_string_or_vector (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 if (!STRINGP (data) && !VECTORP (data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
168 invalid_argument (":descriptor must be a string or a vector", data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
171 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 check_valid_item_list (Lisp_Object items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 CHECK_LIST (items);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 EXTERNAL_LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 if (STRINGP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 CHECK_STRING (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 else if (VECTORP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 gui_parse_item_keywords (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 else if (LISTP (XCAR (rest)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 check_valid_item_list (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
186 invalid_argument ("Items must be vectors, lists or strings", 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 }
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 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
191 check_valid_instantiator_list (Lisp_Object data)
428
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 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 CHECK_LIST (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 EXTERNAL_LIST_LOOP (rest, data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 check_valid_instantiator (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 }
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 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 glyph_instantiator_to_glyph (Lisp_Object sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 /* This function calls lisp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 Lisp_Object glyph = sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 struct gcpro gcpro1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
208
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 GCPRO1 (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 /* if we have a symbol get at the actual data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 if (SYMBOLP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 glyph = XSYMBOL (glyph)->value;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
213
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 if (CONSP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 glyph = Feval (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* Be really helpful to the user. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 if (VECTORP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
220 glyph = call1 (Qmake_glyph, glyph);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 RETURN_UNGCPRO (glyph);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 substitute_keyword_value (Lisp_Object inst, Lisp_Object key, Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* substitute the new glyph */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 for (i = 0; i < XVECTOR_LENGTH (inst); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 if (EQ (key, XVECTOR_DATA (inst)[i]))
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 XVECTOR_DATA (inst)[i+1] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
242 /* Wire widget property invocations to specific widgets. The problem
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
243 we are solving here is that when instantiators get converted to
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
244 instances they lose some type information (they just become
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
245 subwindows or widgets for example). For widgets we need to preserve
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
246 this type information so that we can do widget specific operations
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
247 on the instances. This is encoded in the widget type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
248 field. widget_property gets invoked by decoding the primary type
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
249 (Qwidget), <widget>_property then invokes based on the secondary
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
250 type (Qedit_field for example). It is debatable whether we should
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
251 wire things in this generalised way rather than treating widgets
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
252 specially in image_instance_property. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 static Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 widget_property (Lisp_Object image_instance, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
256 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258 #if 0 /* The usefulness of this is dubious. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 /* first see if its a general property ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 if (!NILP (Fplist_member (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
262 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
270 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 if (meths && HAS_IIFORMAT_METH_P (meths, property))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 return IIFORMAT_METH (meths, property, (image_instance, prop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 /* ... then fail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 /* Update the displayed properties of a widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280 #### This has been adapted from the original set_property functions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
281 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
282 to simply re-parse the instantiator when items need updating. This
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
283 make comparing differences much simpler and obviates the need for a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 lot of the state variables.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
285
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 #### 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
287 extract information from the actual widget.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
288
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289 #### update_widget should probably be re-written to use the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 instantiator. We probably want to keep a record of the differences
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
291 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
292 so that changes could be delayed. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
293 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
294 widget_update (Lisp_Object image_instance, Lisp_Object instantiator)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
296 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 struct image_instantiator_methods* meths;
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
298 struct gcpro gcpro1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
300 Lisp_Object text = find_keyword_in_vector (instantiator, Q_text);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
301 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
302 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
303 Lisp_Object descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
304
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
305 GCPRO1 (descriptor_item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
306
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
307 /* 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
308 of.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
309 #### This is potentially bogus because it is changing the items
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
310 in place rather than in the pending items. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
311 if (!NILP (text))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
312 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
313 IMAGE_INSTANCE_WIDGET_TEXT (ii) = text;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
314 IMAGE_INSTANCE_TEXT_CHANGED (ii) = 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
315 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
316
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
317 /* 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
318 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
319 keywords.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
320
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
321 #### This is inconsistent with instantiation in that you have to
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
322 have the :descriptor keyword for updates in order to recognise
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
323 changes. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
324 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
325 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
326 descriptor_item = gui_parse_item_keywords_no_errors (desc);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
327 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
328 else
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
329 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
330 /* Since we are updating the instantiator could be incomplete
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
331 and hence the gui item descriptor not well formed. We
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
332 therefore try updating and discard the results if nothing
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
333 changed. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
334 descriptor_item = copy_gui_item (IMAGE_INSTANCE_WIDGET_ITEM (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
335 if (!update_gui_item_keywords (descriptor_item, instantiator))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
336 descriptor_item = Qnil;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
337 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
338
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
339 /* Record new items for update. *_redisplay will do the
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
340 rest. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
341 if (!EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
342 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
343 !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
344 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
345 if (!NILP (items))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
346 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
347 if (NILP (descriptor_item))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
348 descriptor_item = IMAGE_INSTANCE_WIDGET_ITEM (ii);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
349
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
350 check_valid_item_list (items);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
351 #ifdef DEBUG_WIDGET_OUTPUT
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
352 stderr_out ("items for widget %p updated\n",
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
353 IMAGE_INSTANCE_SUBWINDOW_ID (ii));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
354 #endif
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
355 /* 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
356 the new ones (because nothing has really changed). If we did
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
357 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
358 heaps of trouble when the old items get GC'd. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
359 descriptor_item = Fcons (descriptor_item, parse_gui_item_tree_children (items));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
360 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
361 /* 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
362 in the `new' items. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
363 else if (!NILP (descriptor_item)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
364 &&
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
365 CONSP (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
366 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
367 descriptor_item = Fcons
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
368 (descriptor_item,
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
369 copy_gui_item_tree (XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii))));
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
370 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
371 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
372
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
373 if (!NILP (descriptor_item))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
374 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
375 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = descriptor_item;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
376 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii) = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
377 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
378
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
379 UNGCPRO;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
380
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
381 /* Now try device specific methods first ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
382 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
383 IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
384 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
385 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
386 /* ... then format specific methods ... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
387 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
388 ERROR_ME_NOT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
389 MAYBE_IIFORMAT_METH (meths, update, (image_instance, instantiator));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
390 #if 0 /* The usefulness of this is dubious. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
391 /* 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
392 IMAGE_INSTANCE_WIDGET_PROPS (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
393 = Fplist_put (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, val);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
394 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
395 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
396
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
397 /* Like the rest of redisplay, we want widget updates to occur
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
398 asynchronously. Thus toolkit specific methods for setting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
399 properties must be called by redisplay instead of by *_update. Thus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
400 *_update records the change and this function actually implements
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
401 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
402 format specific functions for the updates instead of lumping them
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
403 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
404 generic functions. This is not the same as widget_update! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
405 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
406 redisplay_widget (Lisp_Object widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
407 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
408 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
409 struct image_instantiator_methods* meths;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
410
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
411 if (!WIDGET_IMAGE_INSTANCEP (widget)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
412 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
413 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
414 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
415
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
416 /* Device-format specific methods - e.g. x_tab_control_redisplay () */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
417 meths = decode_device_ii_format (image_instance_device (widget),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 IMAGE_INSTANCE_WIDGET_TYPE (ii),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 ERROR_ME_NOT);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
420 MAYBE_IIFORMAT_METH (meths, redisplay, (widget));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
421
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
422 /* Device generic methods - e.g. x_redisplay_widget (). We must
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
423 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
424 layout routines. We also do this here so that explicit resizing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
425 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
426 that format-specific methods have an opportunity to prevent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
427 wholesale changes - e.g. rebuilding tabs. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
428 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), redisplay_widget, (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
429
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
430 /* Pick up the items we recorded earlier. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
431 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
433 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
434 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
435 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
439 static void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
440 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
441 int *width, int *height, Lisp_Object domain)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
442 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
443 struct device *d = DOMAIN_XDEVICE (domain);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
444
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
445 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
446 DEVMETH (d, widget_query_string_geometry,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
447 (string, face, width, height, domain));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
448 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
449 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
450
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
451 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
452
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
453 /* 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
454 provided then use the widget text to calculate sizes. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
456 widget_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
457 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
458 enum image_instance_geometry disp, Lisp_Object domain)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
459 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
460 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
461 struct image_instantiator_methods* meths;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
462 Lisp_Object dynamic_width = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
463 Lisp_Object dynamic_height = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
464
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
465 /* First just set up what we already have. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
466 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
467 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
468
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
469 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
470 ||
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
471 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
472 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
473 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
474 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
475 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
476 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
477 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
478 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
479 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
480 domain));
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
481 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
482 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
483 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
484 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
485 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
486 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487 IIFORMAT_METH (meths, query_geometry, (image_instance,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
488 width, height, disp,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
489 domain));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
490 else
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
491 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
492 int w, h;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
493
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
494 /* Then if we are allowed to resize the widget, make the
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
495 size the same as the text dimensions. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
496 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
497 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
498 &w, &h, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
499 /* Adjust the size for borders. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
500 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
501 *width = w + 2 * WIDGET_BORDER_WIDTH;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
502 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
503 *height = h + 2 * WIDGET_BORDER_HEIGHT;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
504 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
505 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
506 /* Finish off with dynamic sizing. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
507 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
508 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
509 dynamic_width =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
510 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
511 if (INTP (dynamic_width))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
512 *width = XINT (dynamic_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
513 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
514 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
515 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
516 dynamic_height =
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
517 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
518 if (INTP (dynamic_height))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
519 *height = XINT (dynamic_height);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
520 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
521 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
522 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
523
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
524 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
525 widget_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
526 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
527 Lisp_Object domain)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
528 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
529 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
530 struct image_instantiator_methods* meths;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
531
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
532 /* .. then try device specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
533 meths = decode_device_ii_format (image_instance_device (image_instance),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
534 IMAGE_INSTANCE_WIDGET_TYPE (ii),
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
535 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
536 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
537 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
538 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
539 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
540 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
541 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
542 /* ... then format specific methods ... */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
543 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
544 ERROR_ME_NOT);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
545 if (meths && HAS_IIFORMAT_METH_P (meths, layout))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
546 return IIFORMAT_METH (meths, layout, (image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
547 width, height, xoffset, yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
548 domain));
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
549 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
550 return 1;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
551 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
552
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 widget_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 if (NILP (desc))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
559 invalid_argument ("Must supply :descriptor", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 if (VECTORP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 gui_parse_item_keywords (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 if (!NILP (find_keyword_in_vector (instantiator, Q_width))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 && !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
566 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
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 if (!NILP (find_keyword_in_vector (instantiator, Q_height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 && !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
570 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
571 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 combo_box_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 widget_validate (instantiator);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 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
578 invalid_argument ("Must supply item list", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 /* we need to convert things like glyphs to images, eval expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 etc.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584 widget_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
585 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 Lisp_Object glyph = find_keyword_in_vector (inst, Q_image);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 /* 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
591 same reasons we normalize file to data.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
592
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 #### should just normalize the data. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 substitute_keyword_value (inst, Q_image, glyph_instantiator_to_glyph (glyph));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 return inst;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
603 initialize_widget_image_instance (Lisp_Image_Instance *ii, Lisp_Object type)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 /* initialize_subwindow_image_instance (ii);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 IMAGE_INSTANCE_WIDGET_TYPE (ii) = type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
608 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
614 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
615 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_HORIZONTAL;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
617 IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 /* Instantiate a button widget. Unfortunately instantiated widgets are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 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
622 like images where you just select the image into the context you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 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
624 many-to-one relationship with things you see, whereas widgets can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 only be one-to-one (i.e. per frame) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 void
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
627 widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
628 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
629 int dest_mask, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
631 /* #### practically all of this should be moved to widget_update()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
632 so that users can dynamically change all possible widget
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633 properties. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
634 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 Lisp_Object face = find_keyword_in_vector (instantiator, Q_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 Lisp_Object height = find_keyword_in_vector (instantiator, Q_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 Lisp_Object width = find_keyword_in_vector (instantiator, Q_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 Lisp_Object pixwidth = find_keyword_in_vector (instantiator, Q_pixel_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 Lisp_Object pixheight = find_keyword_in_vector (instantiator, Q_pixel_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
642 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
643 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
644 Lisp_Object mwidth = find_keyword_in_vector (instantiator, Q_margin_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
645 Lisp_Object ifocus = find_keyword_in_vector (instantiator, Q_initial_focus);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 int pw=0, ph=0, tw=0, th=0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
647
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 /* this just does pixel type sizing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 dest_mask, domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 if (!(dest_mask & IMAGE_WIDGET_MASK))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 incompatible_image_types (instantiator, dest_mask, IMAGE_WIDGET_MASK);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
657 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
658
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 /* retrieve the fg and bg colors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 if (!NILP (face))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
661 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
663 /* 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
664 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
665 keywords. Note that standard gui descriptor shortcuts will not work
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
666 because of keyword parsing.
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
667
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
668 #### 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
669 we should rationalize. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
670 if (VECTORP (desc))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
671 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
672 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
673 gui_parse_item_keywords_no_errors (desc);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
674 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
675 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 /* 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
678 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
679 widget_gui_parse_item_keywords (instantiator);
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
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
682 /* Pick up the orientation before we do our first layout. */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
683 if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
684 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
685
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 /* parse more gui items out of the properties */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687 if (!NILP (items) && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
690 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 Fcons (IMAGE_INSTANCE_WIDGET_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 parse_gui_item_tree_children (items));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
695 /* Normalize size information. We now only assign sizes if the user
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
696 gives us some explicitly, or there are some constraints that we
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
697 can't change later on. Otherwise we postpone sizing until query
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
698 geometry gets called. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
699 if (!NILP (pixwidth)) /* pixwidth takes precendent */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
700 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
701 if (!INTP (pixwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = pixwidth;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
705 pw = XINT (pixwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
708 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
709 else if (!NILP (width))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
710 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
711 tw = XINT (width);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
712 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
713 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
714
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 if (!NILP (pixheight))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
716 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 if (!INTP (pixheight))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = pixheight;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 ph = XINT (pixheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
724 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
725 else if (!NILP (height) && XINT (height) > 1)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
726 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
727 th = XINT (height);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
728 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
729 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
730
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
731 /* Taking the default face information when the user has specified
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
732 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
733 face is more likely to be proportional and thus give inadequate
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
734 results. Using character sizes can only ever be approximate
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
735 anyway. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
736 if (tw || th)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
737 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
738 int charwidth, charheight;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
739 default_face_font_info (domain, 0, 0, &charheight, &charwidth, 0);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
740 if (tw)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
741 pw = charwidth * tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
742 if (th)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
743 ph = charheight * th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
744 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 /* for a widget with an image pick up the dimensions from that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 if (!NILP (glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
749 if (!pw)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750 pw = glyph_width (glyph, image_instance) + 2 * WIDGET_BORDER_WIDTH;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
751 if (!ph)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
752 ph = glyph_height (glyph, image_instance) + 2 * WIDGET_BORDER_HEIGHT;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
753 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
754 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
757 /* Pick up the margin width. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
758 if (!NILP (mwidth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 IMAGE_INSTANCE_MARGIN_WIDTH (ii) = XINT (mwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
760
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 IMAGE_INSTANCE_WANTS_INITIAL_FOCUS (ii) = !NILP (ifocus);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
762
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
763 /* 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
764 children will not have been instantiated. We can't instantiate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
765 them until the device instantiation method for the layout has
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
766 been executed. We do however want to record any specified
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 dimensions. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 if (pw) IMAGE_INSTANCE_WIDTH (ii) = pw;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
769 if (ph) IMAGE_INSTANCE_HEIGHT (ii) = ph;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
770 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
771
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
772 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
773 widget_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
774 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
775 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 debug_widget_instances++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 stderr_out ("instantiated ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 debug_print (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 stderr_out ("%d widgets instantiated\n", debug_widget_instances);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 /* 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
785 depending on the type of button. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
786 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
787 button_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
788 int* width, int* height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
789 enum image_instance_geometry disp, Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
791 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
792 int w, h;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
793 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
794 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
795 &w, &h, domain);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
796 /* Adjust the size for borders. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797 if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799 *width = w + 2 * WIDGET_BORDER_WIDTH;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
800
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
801 if (EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qradio)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
802 ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
803 EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qtoggle))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
804 /* 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
805 *width += 12;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
806 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
807 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
808 *height = h + 2 * WIDGET_BORDER_HEIGHT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
809 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
810
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
811 /* tree-view geometry - get the height right */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
813 tree_view_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
814 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
815 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
817 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
818 Lisp_Object items = IMAGE_INSTANCE_WIDGET_ITEMS (ii);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
819
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
820
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
821 if (*width)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
822 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
823 /* #### 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
824 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
825 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
826 width, 0, domain);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
827 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
828 if (*height)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
829 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
830 int len, h;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
831 default_face_font_info (domain, 0, 0, &h, 0, 0);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
832 GET_LIST_LENGTH (items, len);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
833 *height = len * h;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
834 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
837 /* 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
838 items and text therin in the tab control. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
840 tab_control_query_geometry (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
841 int* width, int* height,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
842 enum image_instance_geometry disp, Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
844 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
845 Lisp_Object items = XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
847 int tw = 0, th = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
849 LIST_LOOP (rest, items)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
851 int h, w;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
852
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
853 widget_query_string_geometry (XGUI_ITEM (XCAR (rest))->name,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
854 IMAGE_INSTANCE_WIDGET_FACE (ii),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
855 &w, &h, domain);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
856 tw += 5 * WIDGET_BORDER_WIDTH; /* some bias */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
857 tw += w;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
858 th = max (th, h + 2 * WIDGET_BORDER_HEIGHT);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
861 /* Fixup returned values depending on orientation. */
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
862 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
863 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
864 if (height) *height = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
865 if (width) *width = th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
866 }
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
867 else
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
868 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
869 if (height) *height = th;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
870 if (width) *width = tw;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
871 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
874 /* Determine whether only the order has changed for a tab. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
875 int tab_control_order_only_changed (Lisp_Object image_instance)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
876 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
877 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
878 int found = 0, len, pending_len;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
879 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
880
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
881 /* Degenerate case. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
882 if (NILP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
883 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
884
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
885 /* See whether we just need a change in order. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
886 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_ITEMS (ii), len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 GET_LIST_LENGTH (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
888 pending_len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
889 if (len == pending_len)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
890 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
891 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
892 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
893 Lisp_Object pending_rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
894 found = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
895 LIST_LOOP (pending_rest,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
896 XCDR (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
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 (gui_item_equal_sans_selected (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
899 XCAR (pending_rest), 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 found = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
902 break;
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 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
905 if (!found)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
906 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
907 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
908 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
909 return found;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
910 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
911
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 * widget layout *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 *****************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
916 /* We need to cascade normalization.*/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 layout_normalize (Lisp_Object inst, Lisp_Object console_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 Lisp_Object dest_mask)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 /* This function can call lisp */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
922 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
923 Lisp_Object alist = Qnil, new_items = Qnil, border;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
924 /* This function can call lisp */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
925 Lisp_Object items;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
926
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
927 GCPRO2 (alist, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928 alist = tagged_vector_to_alist (inst);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
929 items = assq_no_quit (Q_items, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
930
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931 /* We need to normalize sub-objects. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 if (!NILP (items))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 Lisp_Object rest;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
935 LIST_LOOP (rest, XCDR (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
937 /* Substitute the new instantiator */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
938 new_items = Fcons (normalize_image_instantiator (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
939 console_type, dest_mask),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
940 new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
941 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
942 new_items = Fnreverse (new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
943 Fsetcdr (items, new_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
944 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
945 /* Normalize the border spec. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
946 border = assq_no_quit (Q_border, alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
947 if (!NILP (border) && VECTORP (XCDR (border)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
948 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
949 Fsetcdr (border, normalize_image_instantiator (XCDR (border),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
950 console_type, dest_mask));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
951 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
952
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
953 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
954 Lisp_Object result = alist_to_tagged_vector (XVECTOR_DATA (inst)[0],
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
955 alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
956 free_alist (alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
957 RETURN_UNGCPRO (result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
958 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
959 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
960
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
961 /* Update the instances in the layout. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
962 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
963 layout_update (Lisp_Object image_instance, Lisp_Object instantiator)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
964 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
965 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
966 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
967 Lisp_Object border_inst = find_keyword_in_vector (instantiator, Q_border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
968 Lisp_Object border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
969 Lisp_Object children = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
970 int structure_changed = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
971 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
972
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
973 /* 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
974 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
975
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
976 GCPRO1 (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
977
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
978 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
979 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
980 border = XCAR (children);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
981 children = XCDR (children);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
982 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
983
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
984 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
985 stderr_out ("layout updated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
986 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
987 /* Update the border. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
988 if (!NILP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
989 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
990 if (VECTORP (border_inst))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
991 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
992 /* 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
993 just another child, the layout and output routines don't know
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
994 this and will just display at the offsets we prescribe. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
995 if (!NILP (border))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
996 call3 (Qset_glyph_image, border, border_inst,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
997 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
998 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
999 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1000 border = Fcons (call1 (Qmake_glyph, border_inst), Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1001 structure_changed = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1002 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1003 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1004 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1005 else
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 if (!NILP (border))
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 border = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1010 structure_changed = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1011 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1012 if (EQ (border_inst, Qt))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1013 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1014 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1015 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border_inst;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1018
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1019 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1020 if (!NILP (items))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1022 int len1, len2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 GET_LIST_LENGTH (items, len1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1024 GET_LIST_LENGTH (children, len2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1025 /* The structure hasn't changed so just update the images. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1026 if (!structure_changed && len1 == len2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1027 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1028 /* Pick up the sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1029 for (; !NILP (children); children = XCDR (children), items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1030 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1031 call3 (Qset_glyph_image, XCAR (children), XCAR (items),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1032 IMAGE_INSTANCE_DOMAIN (ii));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1033 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1034 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1035 /* The structure has changed so start over. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1036 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1037 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1038 /* Instantiate any new glyphs. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1039 for (; !NILP (items); items = XCDR (items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1040 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1041 /* #### We really want to use call_with_suspended_errors
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 454
diff changeset
1042 here, but it won't allow us to call lisp. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1043 border = Fcons (call1 (Qmake_glyph, XCAR (items)), border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1044 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1045 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Fnreverse (border);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1046 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1048 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1049 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1050
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1051 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1052 layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1053 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1054 int dest_mask, Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1055 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1056 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1057 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1058
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1059 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1060 stderr_out ("layout instantiated\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1061 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1062 /* Do widget type instantiation first. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1063 widget_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1064 dest_mask, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1065
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1066 if (NILP (orient))
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 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1071 /* Get child glyphs and finish instantiation. We can't do image
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1072 instance children yet as we might not have a containing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1073 window. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1074 layout_update (image_instance, instantiator);
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 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1078 layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1079 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1080 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1083 /* Layout widget. Sizing commentary: we have a number of problems that
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1084 we would like to address. Some consider some of these more
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1085 important than others. It used to be that size information was
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1086 determined at instantiation time and was then fixed forever
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1087 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
1088 "big enough" to accommodate whatever they are trying to show and
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1089 this is dependent on text length, lines, font metrics etc. Of
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1090 course these attributes can change dynamically and so the size
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1091 should changed dynamically also. Only in a few limited cases should
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1092 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
1093 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
1094 widgets - we want it to be discovered dynamically. Thus we can
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1095 envisage the following scenarios:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1096
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1097 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
1098 button should change size also.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1099
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1100 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
1101
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1102 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
1103 layout should change with it.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1104
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1105 4. A button grows to accommodate additional text. The whitespace
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1106 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
1107 requirements.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1108
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1109 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
1110 possible.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1111
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1112 What metrics are important?
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1113 1. Actual width and height.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1114
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1115 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
1116 whether it can grow or shrink.
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1117
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1118 Text glyphs are particularly troublesome since their metrics depend
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1119 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
1120 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
1121 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
1122 a glyph-face or image-instance face. All other glyphs are
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1123 essentially fixed in appearance. Perhaps the problem is that text
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1124 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
1125 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
1126 fixed and we wouldn't have to mess around with font metrics and the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1127 rest. */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1128
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1129 /* 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
1130 get here if the size is not already fixed. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1132 layout_query_geometry (Lisp_Object image_instance, int* width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1133 int* height, enum image_instance_geometry disp,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1134 Lisp_Object domain)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1136 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1137 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1138 int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1139 int gheight, gwidth;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1140
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1141 /* 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
1142 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1143 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1144
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1145 /* First just set up what we already have. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1146 if (width) *width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1147 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1148
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1149 /* If we are not allowed to dynamically size then return. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1150 if (!IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)
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 !IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1153 return;
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 /* Pick up the border text if we have one. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1156 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1157 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1158 glyph_query_geometry (XCAR (items), &gwidth, &gheight, disp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1159 image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1160 ph_adjust = gheight / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1161 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1162 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1163
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1164 /* 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
1165 LIST_LOOP (rest, items)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1166 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1167 Lisp_Object glyph = XCAR (rest);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1168 glyph_query_geometry (glyph, &gwidth, &gheight, disp, image_instance);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1169
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1170 nitems ++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1171 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1172 == LAYOUT_HORIZONTAL)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1173 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1174 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1175 maxpw += gwidth;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1176 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1177 else
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1178 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1179 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1180 maxph += gheight;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1181 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1182 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1184 /* 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
1185 have been fixed by the user. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1186 if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1187 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1188 Lisp_Object dynamic_width =
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
1189 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1190 if (INTP (dynamic_width))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1191 *width = XINT (dynamic_width);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1192 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1193 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1194 == LAYOUT_HORIZONTAL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1195 *width = maxpw + ((nitems + 1) * WIDGET_BORDER_WIDTH +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1196 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1197 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1198 *width = maxpw + 2 * (WIDGET_BORDER_WIDTH * 2 +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1199 IMAGE_INSTANCE_MARGIN_WIDTH (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1201 /* Work out vertical spacings. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1202 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1203 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1204 Lisp_Object dynamic_height =
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
1205 eval_within_redisplay (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1206 if (INTP (dynamic_height))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1207 *height = XINT (dynamic_height);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1208 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1209 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1210 == LAYOUT_VERTICAL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1211 *height = maxph + ((nitems + 1) * WIDGET_BORDER_HEIGHT +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1212 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1213 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1214 *height = maxph + (2 * WIDGET_BORDER_HEIGHT +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1215 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1216 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1217
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1218 int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1219 layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1220 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1221 Lisp_Object domain)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1222 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1223 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1224 Lisp_Object rest;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1225 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1226 int x, y, maxph = 0, maxpw = 0, nitems = 0,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1227 horiz_spacing, vert_spacing, ph_adjust = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1228 int gheight, gwidth;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1229
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1230 /* 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
1231 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 /* Pick up the border text if we have one. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237 Lisp_Object border = XCAR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1238 items = XCDR (items);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1239 glyph_query_geometry (border, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1240 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1241 ph_adjust = gheight / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1242 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (ph_adjust);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1243
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1244 /* #### Really, what should this be? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1245 glyph_do_layout (border, gwidth, gheight, 10, 0,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1246 image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1247 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1248
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1249 /* 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
1250 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 Lisp_Object glyph = XCAR (rest);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1253
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1254 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1255 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1256 nitems ++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1257 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1258 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1260 maxph = max (maxph, gheight);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1261 maxpw += gwidth;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1263 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1265 maxpw = max (maxpw, gwidth);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1266 maxph += gheight;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 /* work out spacing between items and bounds of the layout */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1271 if (width < maxpw)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 /* The user wants a smaller space than the largest item, so we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 just provide default spacing and will let the output routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 clip.. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 horiz_spacing = WIDGET_BORDER_WIDTH * 2;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1276 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1277 == LAYOUT_HORIZONTAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 /* We have a larger area to display in so distribute the space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 evenly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1280 horiz_spacing = (width - (maxpw +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1281 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1282 / (nitems + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1284 horiz_spacing = (width - maxpw) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1285 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1287 if (height < maxph)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 vert_spacing = WIDGET_BORDER_HEIGHT * 2;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1289 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1290 == LAYOUT_VERTICAL)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1291 vert_spacing = (height - (maxph + ph_adjust +
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1292 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1293 / (nitems + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1295 vert_spacing = (height - (maxph + ph_adjust)) / 2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1296 - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1298 y = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1299 x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 /* Now flip through putting items where we want them, paying
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1302 attention to justification. Make sure we don't mess with the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1303 border glyph. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 LIST_LOOP (rest, items)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 Lisp_Object glyph = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1308 glyph_query_geometry (glyph, &gwidth, &gheight,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1309 IMAGE_DESIRED_GEOMETRY, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1310
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1311 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1312 == LAYOUT_HORIZONTAL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1313 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1314 if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1315 == LAYOUT_JUSTIFY_RIGHT)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1316 y = height - (gheight + vert_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1317 if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1318 == LAYOUT_JUSTIFY_CENTER)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1319 y = (height - gheight) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1320 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1321 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1322 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1323 if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1324 == LAYOUT_JUSTIFY_RIGHT)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1325 x = width - (gwidth + horiz_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1326 if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1327 == LAYOUT_JUSTIFY_CENTER)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1328 x = (width - gwidth) / 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1329 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1330
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1331 /* Now layout subwidgets if they require it. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1332 glyph_do_layout (glyph, gwidth, gheight, x, y, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1333
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1334 if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1335 == LAYOUT_HORIZONTAL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1336 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1337 x += (gwidth + horiz_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1338 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1339 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1340 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1341 y += (gheight + vert_spacing);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1342 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1343
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1344 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1345 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1346 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1347
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1348 /* Get the glyphs that comprise a layout. These are created internally
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1349 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
1350 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
1351 simplest way of doing it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1353 #### Eventually we should allow some more intelligent access to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1354 sub-widgets. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1355 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1356 layout_property (Lisp_Object image_instance, Lisp_Object prop)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1357 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1358 /* This function can GC. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1359 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1360 if (EQ (prop, Q_items))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1361 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1362 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1363 CONSP (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1364 return Fcopy_sequence (XCDR
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1365 (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1366 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1367 return Fcopy_sequence (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1369 return Qunbound;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1370 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1372 /* Layout subwindows if they are real subwindows. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1373 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1374 native_layout_layout (Lisp_Object image_instance,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1375 int width, int height, int xoffset, int yoffset,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1376 Lisp_Object domain)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1377 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1378 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1379 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1380
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1381 /* The first time this gets called, the layout will be only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1382 partially instantiated. The children get done in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1383 post_instantiate. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1384 if (!IMAGE_INSTANCE_INITIALIZED (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1385 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1386
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1387 /* 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
1388 suitable instances and values set up. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1389 layout_layout (image_instance, width, height, xoffset, yoffset, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1390
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1391 LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (ii))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1392 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1393 struct display_glyph_area dga;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1394 dga.xoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1395 dga.yoffset = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1396 dga.width = IMAGE_INSTANCE_WIDTH (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1397 dga.height = IMAGE_INSTANCE_HEIGHT (ii);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1398
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1399 map_subwindow (XCAR (rest),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1400 IMAGE_INSTANCE_XOFFSET (ii),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1401 IMAGE_INSTANCE_YOFFSET (ii), &dga);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1402 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1403 return 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 syms_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1414 DEFSYMBOL (Qetched_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1415 DEFSYMBOL (Qetched_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1416 DEFSYMBOL (Qbevel_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1417 DEFSYMBOL (Qbevel_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1418 DEFSYMBOL (Qmake_glyph);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1421 #define VALID_GUI_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1422 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_active, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1423 IIFORMAT_VALID_KEYWORD (type, Q_suffix, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1424 IIFORMAT_VALID_KEYWORD (type, Q_keys, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1425 IIFORMAT_VALID_KEYWORD (type, Q_style, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1426 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_selected, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1427 IIFORMAT_VALID_KEYWORD (type, Q_filter, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1428 IIFORMAT_VALID_KEYWORD (type, Q_config, check_valid_symbol); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1429 IIFORMAT_VALID_KEYWORD (type, Q_included, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1430 IIFORMAT_VALID_KEYWORD (type, Q_initial_focus, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1431 IIFORMAT_VALID_KEYWORD (type, Q_key_sequence, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1432 IIFORMAT_VALID_KEYWORD (type, Q_accelerator, check_valid_string); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1433 IIFORMAT_VALID_KEYWORD (type, Q_label, check_valid_anything); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1434 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1435 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_callback_ex, check_valid_callback); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1436 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_descriptor, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1437 check_valid_string_or_vector); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1438 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1440 #define VALID_WIDGET_KEYWORDS(type) do { \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1441 IIFORMAT_VALID_KEYWORD (type, Q_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1442 IIFORMAT_VALID_KEYWORD (type, Q_height, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1443 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
1444 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
1445 IIFORMAT_VALID_KEYWORD (type, Q_face, check_valid_face); \
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1446 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1448
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1449 static void image_instantiator_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1450 { /* we only do this for properties */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM (widget, "widget");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 IIFORMAT_HAS_METHOD (widget, property);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1453 IIFORMAT_HAS_METHOD (widget, update);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1454 IIFORMAT_HAS_METHOD (widget, query_geometry);
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1455 IIFORMAT_HAS_METHOD (widget, layout);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1456 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1458 static void image_instantiator_buttons (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1459 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (button, "button");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 IIFORMAT_HAS_SHARED_METHOD (button, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1464 IIFORMAT_HAS_SHARED_METHOD (button, post_instantiate, widget);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1466 IIFORMAT_HAS_SHARED_METHOD (button, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1467 IIFORMAT_HAS_METHOD (button, query_geometry);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1468 IIFORMAT_VALID_KEYWORD (button,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1469 Q_image, check_valid_instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 VALID_WIDGET_KEYWORDS (button);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 VALID_GUI_KEYWORDS (button);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1472 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1474 static void image_instantiator_edit_fields (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1475 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (edit_field, "edit-field");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1480 IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1481 IIFORMAT_HAS_SHARED_METHOD (edit_field, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 VALID_WIDGET_KEYWORDS (edit_field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 VALID_GUI_KEYWORDS (edit_field);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1484 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1486 static void image_instantiator_combo_box (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1487 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (combo_box, "combo-box");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 IIFORMAT_HAS_METHOD (combo_box, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1491 IIFORMAT_HAS_SHARED_METHOD (combo_box, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1492
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 VALID_GUI_KEYWORDS (combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 IIFORMAT_VALID_KEYWORD (combo_box, Q_height, check_valid_int);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1497 IIFORMAT_VALID_KEYWORD (combo_box, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1498 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 IIFORMAT_VALID_KEYWORD (combo_box, Q_face, check_valid_face);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1500 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
1501 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1503 static void image_instantiator_scrollbar (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1504 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (scrollbar, "scrollbar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1509 IIFORMAT_HAS_SHARED_METHOD (scrollbar, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1510 IIFORMAT_HAS_SHARED_METHOD (scrollbar, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 VALID_GUI_KEYWORDS (scrollbar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1513 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1514 check_valid_int_or_function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1515 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_height,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1516 check_valid_int_or_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 IIFORMAT_VALID_KEYWORD (scrollbar, Q_face, check_valid_face);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1518 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1520 static void image_instantiator_progress_guage (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1521 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge, "progress-gauge");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1526 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1527 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 VALID_WIDGET_KEYWORDS (progress_gauge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 VALID_GUI_KEYWORDS (progress_gauge);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1530
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1531 IIFORMAT_VALID_KEYWORD (progress_gauge, Q_value, check_valid_int);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1532 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1534 static void image_instantiator_tree_view (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1535 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tree_view, "tree-view");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1539 IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1540 IIFORMAT_HAS_SHARED_METHOD (tree_view, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1541 IIFORMAT_HAS_SHARED_METHOD (tree_view, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1542 IIFORMAT_HAS_METHOD (tree_view, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 VALID_WIDGET_KEYWORDS (tree_view);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 VALID_GUI_KEYWORDS (tree_view);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1545 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
1546 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1548 static void image_instantiator_tab_control (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1549 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tab_control, "tab-control");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1553 IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1554 IIFORMAT_HAS_SHARED_METHOD (tab_control, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1555 IIFORMAT_HAS_SHARED_METHOD (tab_control, governing_domain, subwindow);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1556 IIFORMAT_HAS_METHOD (tab_control, query_geometry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 VALID_WIDGET_KEYWORDS (tab_control);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 VALID_GUI_KEYWORDS (tab_control);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1559 IIFORMAT_VALID_KEYWORD (tab_control, Q_orientation,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1560 check_valid_tab_orientation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1561 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
1562 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1564 static void image_instantiator_labels (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1565 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1568 IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1569 IIFORMAT_HAS_SHARED_METHOD (label, post_instantiate, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1570 IIFORMAT_HAS_SHARED_METHOD (label, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 VALID_WIDGET_KEYWORDS (label);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1573 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1575 #define VALID_LAYOUT_KEYWORDS(layout) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1576 VALID_WIDGET_KEYWORDS (layout); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1577 IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1578 IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1579 IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1580 IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int); \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1581 IIFORMAT_VALID_KEYWORD (layout, Q_items, \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1582 check_valid_instantiator_list)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1583
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1584 static void image_instantiator_layout (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1585 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1587 IIFORMAT_HAS_SHARED_METHOD (layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1588 IIFORMAT_HAS_METHOD (layout, instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1589 IIFORMAT_HAS_METHOD (layout, post_instantiate);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1590 IIFORMAT_HAS_SHARED_METHOD (layout, governing_domain, subwindow);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 IIFORMAT_HAS_METHOD (layout, normalize);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1592 IIFORMAT_HAS_METHOD (layout, query_geometry);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1593 IIFORMAT_HAS_METHOD (layout, layout);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1594 IIFORMAT_HAS_METHOD (layout, update);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1595 IIFORMAT_HAS_METHOD (layout, property);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1596
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1597 VALID_GUI_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1598 VALID_LAYOUT_KEYWORDS (layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1599 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1600
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1601 static void image_instantiator_native_layout (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1602 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1603 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (native_layout, "native-layout");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1604 IIFORMAT_HAS_SHARED_METHOD (native_layout, possible_dest_types, widget);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1605 IIFORMAT_HAS_SHARED_METHOD (native_layout, instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1606 IIFORMAT_HAS_SHARED_METHOD (native_layout, post_instantiate, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1607 IIFORMAT_HAS_METHOD (native_layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1608 IIFORMAT_HAS_SHARED_METHOD (native_layout, governing_domain, subwindow);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1609 IIFORMAT_HAS_SHARED_METHOD (native_layout, normalize, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1610 IIFORMAT_HAS_SHARED_METHOD (native_layout, query_geometry, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1611 IIFORMAT_HAS_SHARED_METHOD (native_layout, layout, layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1612 IIFORMAT_HAS_SHARED_METHOD (native_layout, property, layout);
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 VALID_GUI_KEYWORDS (native_layout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1615 VALID_LAYOUT_KEYWORDS (native_layout);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1619 image_instantiator_format_create_glyphs_widget (void)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1620 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1621 image_instantiator_widget();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1622 image_instantiator_buttons();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1623 image_instantiator_edit_fields();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1624 image_instantiator_combo_box();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1625 image_instantiator_scrollbar();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1626 image_instantiator_progress_guage();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1627 image_instantiator_tree_view();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1628 image_instantiator_tab_control();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1629 image_instantiator_labels();
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1630 image_instantiator_layout();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1631 image_instantiator_native_layout();
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1632 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1633
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1634 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 reinit_vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 #ifdef DEBUG_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 debug_widget_instances = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 vars_of_glyphs_widget (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 reinit_vars_of_glyphs_widget ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 }