annotate src/scrollbar-x.c @ 617:af57a77cbc92

[xemacs-hg @ 2001-06-18 07:09:50 by ben] --------------------------------------------------------------- DOCUMENTATION FIXES: --------------------------------------------------------------- eval.c: Correct documentation. elhash.c: Doc correction. --------------------------------------------------------------- LISP OBJECT CLEANUP: --------------------------------------------------------------- bytecode.h, buffer.h, casetab.h, chartab.h, console-msw.h, console.h, database.c, device.h, eldap.h, elhash.h, events.h, extents.h, faces.h, file-coding.h, frame.h, glyphs.h, gui-x.h, gui.h, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lrecord.h, lstream.h, mule-charset.h, objects.h, opaque.h, postgresql.h, process.h, rangetab.h, specifier.h, toolbar.h, tooltalk.h, ui-gtk.h: Add wrap_* to all objects (it was already there for a few of them) -- an expression to encapsulate a pointer into a Lisp object, rather than the inconvenient XSET*. "wrap" was chosen because "make" as in make_int(), make_char() is not appropriate. (It implies allocation. The issue does not exist for ints and chars because they are not allocated.) Full error checking has been added to these expressions. When used without error checking, non-union build, use of these expressions will incur no loss of efficiency. (In fact, XSET* is now defined in terms of wrap_* in a non-union build.) In a union build, you will also get no loss of efficiency provided that you have a decent optimizing compiler, and a compiler that either understands inlines or automatically inlines those particular functions. (And since people don't normally do their production builds on union, it doesn't matter.) Update the sample Lisp object definition in lrecord.h accordingly. dumper.c: Fix places in dumper that referenced wrap_object to reference its new name, wrap_pointer_1. buffer.c, bufslots.h, conslots.h, console.c, console.h, devslots.h, device.c, device.h, frame.c, frame.h, frameslots.h, window.c, window.h, winslots.h: -- Extract out the Lisp objects of `struct device' into devslots.h, just like for the other structures. -- Extract out the remaining (not copied into the window config) Lisp objects in `struct window' into winslots.h; use different macros (WINDOW_SLOT vs. WINDOW_SAVED_SLOT) to differentiate them. -- Eliminate the `dead' flag of `struct frame', since it duplicates information already available in `framemeths', and fix FRAME_LIVE_P accordingly. (Devices and consoles already work this way.) -- In *slots.h, switch to system where MARKED_SLOT is automatically undef'd at the end of the file. (Follows what winslots.h already does.) -- Update the comments at the beginning of *slots.h to be accurate. -- When making any of the above objects dead, zero it out entirely and reset all Lisp object slots to Qnil. (We were already doing this somewhat, but not consistently.) This (1) Eliminates the possibility of extra objects hanging around that ought to be GC'd, (2) Causes an immediate crash if anyone tries to access a structure in one of these objects, (3) Ensures consistent behavior wrt dead objects. dialog-msw.c: Use internal_object_printer, since this object should not escape. --------------------------------------------------------------- FIXING A CRASH THAT I HIT ONCE (AND A RELATED BAD BEHAVIOR): --------------------------------------------------------------- eval.c: Fix up some comments about the FSF implementation. Fix two nasty bugs: (1) condition_case_unwind frees the conses sitting in the catch->tag slot too quickly, resulting in a crash that I hit. (2) catches need to be unwound one at a time when calling unwind-protect code, rather than all at once at the end; otherwise, incorrect behavior can result. (A comment shows exactly how.) backtrace.h: Improve comment about FSF differences in the handler stack. --------------------------------------------------------------- FIXING A CRASH THAT I REPEATEDLY HIT WHEN USING THE MOUSE WHEEL UNDER MSWINDOWS: --------------------------------------------------------------- Basic idea: My crash is due either to a dead, non-marked, GC-collected frame inside of a window mirror, or a prematurely freed window mirror. We need to mark the Lisp objects inside of window mirrors. Tracking the lifespan of window mirrors and scrollbar instances is extremely hard, and there may well be lurking bugs where such objects are freed too soon. The only safe way to fix these problems (and it fixes both problems at once) is to make both of these structures Lisp objects. lrecord.h, emacs.c, inline.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, symsinit.h: Make scrollbar instances actual Lisp objects. Mark the window mirrors in them. inline.c needs to know about scrollbar.h now. Record the new type in lrecord.h. Fix up scrollbar-*.c appropriately. Create a hash table in scrollbar-msw.c so that the scrollbar instances stored in scrollbar HWND's are properly GC-protected. Create complex_vars_of_scrollbar_mswindows() to create the hash table at startup, and call it from emacs.c. Don't store the scrollbar instance as a property of the GTK scrollbar, as it's not used and if we did this, we'd have to separately GC-protect it in a hash table, like in MS Windows. lrecord.h, frame.h, frame.c, frameslots.h, redisplay.c, window.c, window.h: Move mark_window_mirror from redisplay.c to window.c. Make window mirrors actual Lisp objects. Tell lrecord.h about them. Change the window mirror member of struct frame from a pointer to a Lisp object, and add XWINDOW_MIRROR in appropriate places. Mark the scrollbar instances in the window mirror. redisplay.c, redisplay.h, alloc.c: Delete mark_redisplay. Don't call mark_redisplay. We now mark frame-specific structures in mark_frame. NOTE: I also deleted an extremely questionable call to update_frame_window_mirrors(). It was extremely questionable before, and now totally impossible, since it will create Lisp objects during redisplay. frame.c: Mark the scrollbar instances, which are now Lisp objects. Call mark_gutter() here, not in mark_redisplay(). gutter.c: Update comments about correct marking. --------------------------------------------------------------- ISSUES BROUGHT UP BY MARTIN: --------------------------------------------------------------- buffer.h: Put back these macros the way Steve T and I think they ought to be. I already explained in a previous changelog entry why I think these macros should be the way I'd defined them. Once again: We fix these macros so they don't care about the type of their lvalues. The non-C-string equivalents of these already function in the same way, and it's correct because it should be OK to pass in a CBufbyte *, a BufByte *, a Char_Binary *, an UChar_Binary *, etc. The whole reason for these different types is to work around errors caused by signed-vs-unsigned non-matching types. Any possible error that might be caught in a DFC macro would also be caught wherever the argument is used elsewhere. So creating multiple macro versions would add no useful error-checking and just further complicate an already complicated area. As for Martin's "ANSI aliasing" bug, XEmacs is not ANSI-aliasing clean and probably never will be. Unless the board agrees to change XEmacs in this way (and we really don't want to go down that road), this is not a bug. sound.h: Undo Martin's type change. signal.c: Fix problem identified by Martin with Linux and g++ due to non-standard declaration of setitimer(). systime.h: Update the docs for "qxe_" to point out why making the encapsulation explicit is always the right way to go. (setitimer() itself serves as an example.) For 21.4: update-elc-2.el: Correct misplaced parentheses, making lisp/mule not get recompiled.
author ben
date Mon, 18 Jun 2001 07:10:32 +0000
parents abe6d1db359e
children e38acbeb1cae
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 /* scrollbar implementation -- X interface.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1994 Amdahl Corporation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 Copyright (C) 1995 Darrell Kindred <dkindred+@cmu.edu>.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 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
11 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 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
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
26 /* This file Mule-ized (more like Mule-verified) by Ben Wing, 7-8-00. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
27
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "console-x.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "EmacsFrame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "glyphs-x.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "gui-x.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "scrollbar-x.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 static void x_update_vertical_scrollbar_callback (Widget widget, LWLIB_ID id,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 XtPointer client_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 static void x_update_horizontal_scrollbar_callback (Widget widget, LWLIB_ID id,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 XtPointer client_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 /* Used to prevent changing the size of the slider while drag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 scrolling, under Motif. This is necessary because the Motif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 scrollbar is incredibly stupid about updating the slider and causes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 lots of flicker if it is done too often. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 static int inhibit_slider_size_change;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 int stupid_vertical_scrollbar_drag_hack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* Doesn't work with athena */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 static int vertical_drag_in_progress;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 x_inhibit_scrollbar_slider_size_change (void)
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 /* Doesn't work with Athena */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 return inhibit_slider_size_change;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 x_free_scrollbar_instance (struct scrollbar_instance *instance)
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 if (SCROLLBAR_X_NAME (instance))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 xfree (SCROLLBAR_X_NAME (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 if (SCROLLBAR_X_WIDGET (instance))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 if (XtIsManaged (SCROLLBAR_X_WIDGET (instance)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 XtUnmanageChild (SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 lw_destroy_all_widgets (SCROLLBAR_X_ID (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 }
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 if (instance->scrollbar_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 xfree (instance->scrollbar_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 }
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 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 x_release_scrollbar_instance (struct scrollbar_instance *instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 if (XtIsManaged (SCROLLBAR_X_WIDGET (instance)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 XtUnmanageChild (SCROLLBAR_X_WIDGET (instance));
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 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 x_create_scrollbar_instance (struct frame *f, int vertical,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 struct scrollbar_instance *instance)
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 char buffer[32];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 /* initialize the X specific data section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 instance->scrollbar_data = xnew_and_zero (struct x_scrollbar_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 SCROLLBAR_X_ID (instance) = new_lwlib_id ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 sprintf (buffer, "scrollbar_%d", SCROLLBAR_X_ID (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 SCROLLBAR_X_NAME (instance) = xstrdup (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID) || \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 defined (LWLIB_SCROLLBARS_ATHENA3D)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 SCROLLBAR_X_VDRAG_ORIG_VALUE (instance) = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 if (vertical)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 SCROLLBAR_X_WIDGET (instance) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 lw_create_widget ("vertical-scrollbar", SCROLLBAR_X_NAME (instance),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 SCROLLBAR_X_ID (instance),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 NULL, FRAME_X_CONTAINER_WIDGET (f), 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 x_update_vertical_scrollbar_callback, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 else
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 SCROLLBAR_X_WIDGET (instance) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 lw_create_widget ("horizontal-scrollbar", SCROLLBAR_X_NAME (instance),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 SCROLLBAR_X_ID (instance),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 NULL, FRAME_X_CONTAINER_WIDGET (f), 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 x_update_horizontal_scrollbar_callback, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 #define UPDATE_DATA_FIELD(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 if (new_##field >= 0 && \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 SCROLLBAR_X_POS_DATA (inst).field != new_##field) { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 SCROLLBAR_X_POS_DATA (inst).field = new_##field; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 inst->scrollbar_instance_changed = 1; \
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 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 /* #### The -1 check is such a hack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 x_update_scrollbar_instance_values (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 struct scrollbar_instance *inst,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 int new_line_increment,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 int new_page_increment,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 int new_minimum, int new_maximum,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 int new_slider_size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 int new_slider_position,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 int new_scrollbar_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 int new_scrollbar_height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 int new_scrollbar_x, int new_scrollbar_y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 UPDATE_DATA_FIELD (line_increment);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 UPDATE_DATA_FIELD (page_increment);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 UPDATE_DATA_FIELD (minimum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 UPDATE_DATA_FIELD (maximum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 UPDATE_DATA_FIELD (slider_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 UPDATE_DATA_FIELD (slider_position);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 UPDATE_DATA_FIELD (scrollbar_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 UPDATE_DATA_FIELD (scrollbar_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 UPDATE_DATA_FIELD (scrollbar_x);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 UPDATE_DATA_FIELD (scrollbar_y);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* This doesn't work with Athena, why? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 if (w && !vertical_drag_in_progress)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 int new_vov = SCROLLBAR_X_POS_DATA (inst).slider_position;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 int new_vows = marker_position (w->start[CURRENT_DISP]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 if (SCROLLBAR_X_VDRAG_ORIG_VALUE (inst) != new_vov)
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 SCROLLBAR_X_VDRAG_ORIG_VALUE (inst) = new_vov;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 inst->scrollbar_instance_changed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 if (SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (inst) != new_vows)
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 SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (inst) = new_vows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 inst->scrollbar_instance_changed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 /* Used by x_update_scrollbar_instance_status. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 update_one_scrollbar_bs (struct frame *f, Widget sb_widget)
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 Boolean use_backing_store;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 Xt_GET_VALUE (FRAME_X_TEXT_WIDGET (f), XtNuseBackingStore, &use_backing_store);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 if (use_backing_store && sb_widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 unsigned long mask = CWBackingStore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 XSetWindowAttributes attrs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 attrs.backing_store = Always;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 XChangeWindowAttributes (XtDisplay (sb_widget),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 XtWindow (sb_widget),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 mask,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 &attrs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* Create a widget value structure for passing down to lwlib so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 it can update the scrollbar widgets. Used by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 x_update_scrollbar_instance_status. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 static widget_value *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 scrollbar_instance_to_widget_value (struct scrollbar_instance *instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 widget_value *wv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 wv = xmalloc_widget_value ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 /* #### maybe should add malloc_scrollbar_values to resource these? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 wv->scrollbar_data = xnew (scrollbar_values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 wv->name = SCROLLBAR_X_NAME (instance);
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
220 wv->name = xstrdup (wv->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 wv->value = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 wv->key = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 wv->enabled = instance->scrollbar_is_active;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 wv->selected = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 wv->call_data = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 *wv->scrollbar_data = SCROLLBAR_X_POS_DATA (instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 wv->next = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 return wv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 /* Used by x_update_scrollbar_instance_status. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 update_one_widget_scrollbar_pointer (struct window *w, Widget wid)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 if (POINTER_IMAGE_INSTANCEP (w->scrollbar_pointer))
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 XDefineCursor (XtDisplay (wid), XtWindow (wid),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 XIMAGE_INSTANCE_X_CURSOR (w->scrollbar_pointer));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 XSync (XtDisplay (wid), False);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 /* A device method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 x_update_scrollbar_instance_status (struct window *w, int active, int size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 struct scrollbar_instance *instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 Boolean managed = XtIsManaged (SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 if (active && size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 widget_value *wv = scrollbar_instance_to_widget_value (instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 if (instance->scrollbar_instance_changed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 lw_modify_all_widgets (SCROLLBAR_X_ID (instance), wv, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 instance->scrollbar_instance_changed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 if (!managed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 XtManageChild (SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 if (XtWindow (SCROLLBAR_X_WIDGET (instance)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 /* Raise this window so that it's visible on top of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 text window below it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 XRaiseWindow (XtDisplay (SCROLLBAR_X_WIDGET (instance)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 XtWindow (SCROLLBAR_X_WIDGET (instance)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 update_one_widget_scrollbar_pointer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (w, SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 if (!SCROLLBAR_X_BACKING_STORE_INITIALIZED (instance))
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 update_one_scrollbar_bs (f, SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 SCROLLBAR_X_BACKING_STORE_INITIALIZED (instance) = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 if (!wv->scrollbar_data) abort ();
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
284 free_widget_value_tree (wv);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 else if (managed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 /* This isn't needed with Athena Scrollbars. It might not be needed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 /* with Motif scrollbars (it is apparently needed with Lesstif). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 XtUngrabKeyboard (SCROLLBAR_X_WIDGET (instance), CurrentTime);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 XtUnmanageChild (SCROLLBAR_X_WIDGET (instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 enum x_scrollbar_loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 X_FIND_SCROLLBAR_WINDOW_MIRROR,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 X_SET_SCROLLBAR_POINTER,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 X_WINDOW_IS_SCROLLBAR,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 X_UPDATE_FRAME_SCROLLBARS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 static struct window_mirror *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 x_scrollbar_loop (enum x_scrollbar_loop type, Lisp_Object window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 struct window_mirror *mir,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 LWLIB_ID id, Window x_win)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 struct window_mirror *retval = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 while (mir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 struct scrollbar_instance *vinstance = mir->scrollbar_vertical_instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 struct scrollbar_instance *hinstance = mir->scrollbar_horizontal_instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 struct window *w = XWINDOW (window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 if (mir->vchild)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 retval = x_scrollbar_loop (type, w->vchild, mir->vchild, id, x_win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 else if (mir->hchild)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 retval = x_scrollbar_loop (type, w->hchild, mir->hchild, id, x_win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 if (hinstance || vinstance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 switch (type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 case X_FIND_SCROLLBAR_WINDOW_MIRROR:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 if ((vinstance && SCROLLBAR_X_ID (vinstance) == id) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 (hinstance && SCROLLBAR_X_ID (hinstance) == id))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 return mir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 case X_UPDATE_FRAME_SCROLLBARS:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 if (!mir->vchild && !mir->hchild)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 update_window_scrollbars (w, mir, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 case X_SET_SCROLLBAR_POINTER:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 if (!mir->vchild && !mir->hchild)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 Widget widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 widget = SCROLLBAR_X_WIDGET (hinstance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 if (widget && XtIsManaged (widget))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 update_one_widget_scrollbar_pointer (w, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 widget = SCROLLBAR_X_WIDGET (vinstance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 if (widget && XtIsManaged (widget))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 update_one_widget_scrollbar_pointer (w, widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 case X_WINDOW_IS_SCROLLBAR:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 if (!mir->vchild && !mir->hchild)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 Widget widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 widget = SCROLLBAR_X_WIDGET (hinstance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 if (widget && XtIsManaged (widget) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 XtWindow (widget) == x_win)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 return (struct window_mirror *) 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 widget = SCROLLBAR_X_WIDGET (vinstance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 if (widget && XtIsManaged (widget) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 XtWindow (widget) == x_win)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 return (struct window_mirror *) 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 mir = mir->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 window = w->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 /* Used by callbacks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 static struct window_mirror *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 find_scrollbar_window_mirror (struct frame *f, LWLIB_ID id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 if (f->mirror_dirty)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 update_frame_window_mirror (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 return x_scrollbar_loop (X_FIND_SCROLLBAR_WINDOW_MIRROR, f->root_window,
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 442
diff changeset
387 XWINDOW_MIRROR (f->root_mirror), id, (Window) NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 * This is the only callback provided for vertical scrollbars. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 * should be able to handle all of the scrollbar events in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 * scroll_action (see lwlib.h). The client data will be of type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 * scroll_event (see lwlib.h). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 x_update_vertical_scrollbar_callback (Widget widget, LWLIB_ID id,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 XtPointer client_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 scroll_event *data = (scroll_event *) client_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 struct device *d = get_device_from_display (XtDisplay (widget));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 struct frame *f = x_any_window_to_frame (d, XtWindow (widget));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 Lisp_Object win, frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 struct scrollbar_instance *instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 struct window_mirror *mirror;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 if (!f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 mirror = find_scrollbar_window_mirror (f, id);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
411 if (!mirror)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
412 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
413
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 win = real_window (mirror, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 if (NILP (win))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 instance = mirror->scrollbar_vertical_instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 frame = WINDOW_FRAME (XWINDOW (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 /* It seems that this is necessary whenever signal_special_Xt_user_event()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 is called. #### Why??? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 switch (data->action)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 case SCROLLBAR_LINE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 signal_special_Xt_user_event (frame, Qscrollbar_line_up, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 case SCROLLBAR_LINE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 signal_special_Xt_user_event (frame, Qscrollbar_line_down, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 /* The Athena scrollbar paging behavior is that of xterms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 Depending on where you click the size of the page varies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 Motif always does a standard Emacs page. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 case SCROLLBAR_PAGE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 #if !defined (LWLIB_SCROLLBARS_MOTIF) && !defined (LWLIB_SCROLLBARS_LUCID) && \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 !defined (LWLIB_SCROLLBARS_ATHENA3D)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 double tmp = ((double) data->slider_value /
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (double) SCROLLBAR_X_POS_DATA(instance).scrollbar_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 double line = tmp *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (double) window_displayed_height (XWINDOW (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 if (line > -1.0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 line = -1.0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 signal_special_Xt_user_event (frame, Qscrollbar_page_up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 Fcons (win, make_int ((int) line)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 signal_special_Xt_user_event (frame, Qscrollbar_page_up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 Fcons (win, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 case SCROLLBAR_PAGE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 #if !defined (LWLIB_SCROLLBARS_MOTIF) && !defined (LWLIB_SCROLLBARS_LUCID) && \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 !defined (LWLIB_SCROLLBARS_ATHENA3D)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 double tmp = ((double) data->slider_value /
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (double) SCROLLBAR_X_POS_DATA(instance).scrollbar_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 double line = tmp *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (double) window_displayed_height (XWINDOW (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 if (SCROLLBAR_X_POS_DATA(instance).maximum >
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (SCROLLBAR_X_POS_DATA(instance).slider_size + SCROLLBAR_X_POS_DATA(instance).slider_position))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 if (line < 1.0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 line = 1.0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 signal_special_Xt_user_event (frame, Qscrollbar_page_down,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 Fcons (win,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 make_int ((int) line)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 signal_special_Xt_user_event (frame, Qscrollbar_page_down,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 Fcons (win, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 case SCROLLBAR_TOP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 signal_special_Xt_user_event (frame, Qscrollbar_to_top, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 case SCROLLBAR_BOTTOM:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 signal_special_Xt_user_event (frame, Qscrollbar_to_bottom, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 case SCROLLBAR_CHANGE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 inhibit_slider_size_change = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 vertical_drag_in_progress = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 SCROLLBAR_X_VDRAG_ORIG_VALUE (instance) = data->slider_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 XINT (Fwindow_start (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 stupid_vertical_scrollbar_drag_hack = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 case SCROLLBAR_DRAG:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 int value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 inhibit_slider_size_change = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 #if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 /* Doing drags with Motif-like scrollbars is a mess, since we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 want to avoid having the window position jump when you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 first grab the scrollbar, but we also want to ensure that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 you can scroll all the way to the top or bottom of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 buffer. This can all be replaced with something sane when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 we get line-based scrolling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 vertical_drag_in_progress = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 if (SCROLLBAR_X_VDRAG_ORIG_VALUE (instance) < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 SCROLLBAR_X_VDRAG_ORIG_VALUE (instance) = data->slider_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 XINT (Fwindow_start (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 /* Could replace this piecewise linear scrolling with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 quadratic through the three points, but I'm not sure that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 would feel any nicer in practice. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 if (data->slider_value < SCROLLBAR_X_VDRAG_ORIG_VALUE (instance))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 /* We've dragged up; slide linearly from original position to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 window-start=data.minimum, slider-value=data.minimum. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 if (SCROLLBAR_X_VDRAG_ORIG_VALUE (instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 <= SCROLLBAR_X_POS_DATA (instance).minimum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 /* shouldn't get here, but just in case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 value = SCROLLBAR_X_POS_DATA (instance).minimum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 value = (int)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (SCROLLBAR_X_POS_DATA (instance).minimum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 + (((double)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 - SCROLLBAR_X_POS_DATA (instance).minimum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 * (data->slider_value -
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 SCROLLBAR_X_POS_DATA (instance).minimum))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 / (SCROLLBAR_X_VDRAG_ORIG_VALUE (instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 - SCROLLBAR_X_POS_DATA (instance).minimum)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 else
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 /* We've dragged down; slide linearly from original position to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 window-start=data.maximum, slider-value=data.maximum. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 if (SCROLLBAR_X_VDRAG_ORIG_VALUE (instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 >= (SCROLLBAR_X_POS_DATA (instance).maximum -
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 SCROLLBAR_X_POS_DATA (instance).slider_size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 /* avoid divide by zero */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 value = SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 else
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 value = (int)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 + (((double)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (SCROLLBAR_X_POS_DATA (instance).maximum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 - SCROLLBAR_X_VDRAG_ORIG_WINDOW_START (instance))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 * (data->slider_value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 - SCROLLBAR_X_VDRAG_ORIG_VALUE (instance)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 / (SCROLLBAR_X_POS_DATA (instance).maximum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 - SCROLLBAR_X_POS_DATA (instance).slider_size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 - SCROLLBAR_X_VDRAG_ORIG_VALUE (instance))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 }
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 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 stupid_vertical_scrollbar_drag_hack = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 value = data->slider_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 if (value >= SCROLLBAR_X_POS_DATA (instance).maximum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 value = SCROLLBAR_X_POS_DATA (instance).maximum - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (value < SCROLLBAR_X_POS_DATA (instance).minimum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 value = SCROLLBAR_X_POS_DATA (instance).minimum;
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 signal_special_Xt_user_event (frame, Qscrollbar_vertical_drag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 Fcons (win, make_int (value)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594
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 }
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 * This is the only callback provided for horizontal scrollbars. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 * should be able to handle all of the scrollbar events in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 * scroll_action (see lwlib.h). The client data will be of type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 * scroll_event (see lwlib.h). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 x_update_horizontal_scrollbar_callback (Widget widget, LWLIB_ID id,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 XtPointer client_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 scroll_event *data = (scroll_event *) client_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 struct device *d = get_device_from_display (XtDisplay (widget));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 struct frame *f = x_any_window_to_frame (d, XtWindow (widget));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 Lisp_Object win, frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 struct window_mirror *mirror;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 if (!f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 mirror = find_scrollbar_window_mirror (f, id);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
617 if (!mirror)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
618 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 436
diff changeset
619
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 win = real_window (mirror, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 if (NILP (win))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 frame = WINDOW_FRAME (XWINDOW (win));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 /* It seems that this is necessary whenever signal_special_Xt_user_event()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 is called. #### Why??? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 switch (data->action)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 case SCROLLBAR_LINE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 signal_special_Xt_user_event (frame, Qscrollbar_char_left, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 case SCROLLBAR_LINE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 signal_special_Xt_user_event (frame, Qscrollbar_char_right, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 case SCROLLBAR_PAGE_UP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 signal_special_Xt_user_event (frame, Qscrollbar_page_left, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 case SCROLLBAR_PAGE_DOWN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 signal_special_Xt_user_event (frame, Qscrollbar_page_right, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 case SCROLLBAR_TOP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 signal_special_Xt_user_event (frame, Qscrollbar_to_left, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 case SCROLLBAR_BOTTOM:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 signal_special_Xt_user_event (frame, Qscrollbar_to_right, win);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 case SCROLLBAR_CHANGE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 inhibit_slider_size_change = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 case SCROLLBAR_DRAG:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 inhibit_slider_size_change = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 /* #### Fix the damn toolkit code so they all work the same way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 Lucid is the one mostly wrong.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 #if defined (LWLIB_SCROLLBARS_LUCID) || defined (LWLIB_SCROLLBARS_ATHENA3D)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 signal_special_Xt_user_event (frame, Qscrollbar_horizontal_drag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (Fcons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 (win, make_int (data->slider_value))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 signal_special_Xt_user_event (frame, Qscrollbar_horizontal_drag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (Fcons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 (win,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 make_int (data->slider_value - 1))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 x_scrollbar_pointer_changed_in_window (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 XSETWINDOW (window, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 x_scrollbar_loop (X_SET_SCROLLBAR_POINTER, window, find_window_mirror (w),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 0, (Window) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 /* Make sure that all scrollbars on frame are up-to-date. Called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 directly from x_set_frame_properties in frame-x.c*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 x_update_frame_scrollbars (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 /* Consider this code to be "in_display" so that we abort() if Fsignal()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 gets called. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 in_display++;
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 442
diff changeset
691 x_scrollbar_loop (X_UPDATE_FRAME_SCROLLBARS, f->root_window,
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 442
diff changeset
692 XWINDOW_MIRROR (f->root_mirror), 0, (Window) NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 in_display--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 if (in_display < 0) abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 x_compute_scrollbar_instance_usage (struct device *d,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 struct scrollbar_instance *inst,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 struct overhead_stats *ovstats)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 int total = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 while (inst)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 struct x_scrollbar_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 (struct x_scrollbar_data *) inst->scrollbar_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 total += malloced_storage_size (data, sizeof (*data), ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 total += malloced_storage_size (data->name, 1 + strlen (data->name),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 inst = inst->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 return total;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 #endif /* MEMORY_USAGE_STATS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 console_type_create_scrollbar_x (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 CONSOLE_HAS_METHOD (x, inhibit_scrollbar_slider_size_change);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 CONSOLE_HAS_METHOD (x, free_scrollbar_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 CONSOLE_HAS_METHOD (x, release_scrollbar_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 CONSOLE_HAS_METHOD (x, create_scrollbar_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 CONSOLE_HAS_METHOD (x, update_scrollbar_instance_values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 CONSOLE_HAS_METHOD (x, update_scrollbar_instance_status);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 CONSOLE_HAS_METHOD (x, scrollbar_pointer_changed_in_window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 CONSOLE_HAS_METHOD (x, compute_scrollbar_instance_usage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 #endif /* MEMORY_USAGE_STATS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 reinit_vars_of_scrollbar_x (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 stupid_vertical_scrollbar_drag_hack = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 vars_of_scrollbar_x (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 reinit_vars_of_scrollbar_x ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 #if defined (LWLIB_SCROLLBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 Fprovide (intern ("lucid-scrollbars"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 #elif defined (LWLIB_SCROLLBARS_MOTIF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 Fprovide (intern ("motif-scrollbars"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 #elif defined (LWLIB_SCROLLBARS_ATHENA)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 Fprovide (intern ("athena-scrollbars"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 }