Mercurial > hg > xemacs-beta
annotate src/EmacsManager.c @ 5366:f00192e1cd49
Examining the result of #'length: `eql', not `=', it's better style & cheaper
2011-03-08 Aidan Kehoe <kehoea@parhasard.net>
* buff-menu.el (list-buffers-noselect):
* byte-optimize.el (byte-optimize-identity):
* byte-optimize.el (byte-optimize-if):
* byte-optimize.el (byte-optimize-nth):
* byte-optimize.el (byte-optimize-nthcdr):
* bytecomp.el (byte-compile-warn-wrong-args):
* bytecomp.el (byte-compile-two-args-19->20):
* bytecomp.el (byte-compile-list):
* bytecomp.el (byte-compile-beginning-of-line):
* bytecomp.el (byte-compile-set):
* bytecomp.el (byte-compile-set-default):
* bytecomp.el (byte-compile-values):
* bytecomp.el (byte-compile-values-list):
* bytecomp.el (byte-compile-integerp):
* bytecomp.el (byte-compile-multiple-value-list-internal):
* bytecomp.el (byte-compile-throw):
* cl-macs.el (cl-do-arglist):
* cl-macs.el (cl-parse-loop-clause):
* cl-macs.el (multiple-value-bind):
* cl-macs.el (multiple-value-setq):
* cl-macs.el (get-setf-method):
* cmdloop.el (command-error):
* cmdloop.el (y-or-n-p-minibuf):
* cmdloop.el (yes-or-no-p-minibuf):
* coding.el (unencodable-char-position):
* cus-edit.el (custom-face-prompt):
* cus-edit.el (custom-buffer-create-internal):
* cus-edit.el (widget-face-action):
* cus-edit.el (custom-group-value-create):
* descr-text.el (describe-char-unicode-data):
* dialog-gtk.el (popup-builtin-question-dialog):
* dragdrop.el (experimental-dragdrop-drop-log-function):
* dragdrop.el (experimental-dragdrop-drop-mime-default):
* easymenu.el (easy-menu-add):
* easymenu.el (easy-menu-remove):
* faces.el (read-face-name):
* faces.el (set-face-stipple):
* files.el (file-name-non-special):
* font.el (font-combine-fonts):
* font.el (font-set-face-font):
* font.el (font-parse-rgb-components):
* font.el (font-rgb-color-p):
* font.el (font-color-rgb-components):
* gnuserv.el (gnuserv-edit-files):
* help.el (key-or-menu-binding):
* help.el (function-documentation-1):
* help.el (function-documentation):
* info.el (info):
* isearch-mode.el (isearch-exit):
* isearch-mode.el (isearch-edit-string):
* isearch-mode.el (isearch-*-char):
* isearch-mode.el (isearch-complete1):
* ldap.el (ldap-encode-country-string):
* ldap.el (ldap-decode-string):
* minibuf.el (read-file-name-internal-1):
* minibuf.el (read-non-nil-coding-system):
* minibuf.el (get-user-response):
* mouse.el (drag-window-divider):
* mule/ccl.el:
* mule/ccl.el (ccl-compile-if):
* mule/ccl.el (ccl-compile-break):
* mule/ccl.el (ccl-compile-repeat):
* mule/ccl.el (ccl-compile-write-repeat):
* mule/ccl.el (ccl-compile-call):
* mule/ccl.el (ccl-compile-end):
* mule/ccl.el (ccl-compile-read-multibyte-character):
* mule/ccl.el (ccl-compile-write-multibyte-character):
* mule/ccl.el (ccl-compile-translate-character):
* mule/ccl.el (ccl-compile-mule-to-unicode):
* mule/ccl.el (ccl-compile-unicode-to-mule):
* mule/ccl.el (ccl-compile-lookup-integer):
* mule/ccl.el (ccl-compile-lookup-character):
* mule/ccl.el (ccl-compile-map-multiple):
* mule/ccl.el (ccl-compile-map-single):
* mule/devan-util.el (devanagari-compose-to-one-glyph):
* mule/devan-util.el (devanagari-composition-component):
* mule/mule-cmds.el (finish-set-language-environment):
* mule/viet-util.el:
* mule/viet-util.el (viet-encode-viscii-char):
* multicast.el (open-multicast-group):
* newcomment.el (comment-quote-nested):
* newcomment.el (comment-region):
* newcomment.el (comment-dwim):
* regexp-opt.el (regexp-opt-group):
* replace.el (map-query-replace-regexp):
* specifier.el (derive-device-type-from-tag-set):
* subr.el (skip-chars-quote):
* test-harness.el (test-harness-from-buffer):
* test-harness.el (batch-test-emacs):
* wid-edit.el (widget-choice-action):
* wid-edit.el (widget-symbol-prompt-internal):
* wid-edit.el (widget-color-action):
* window-xemacs.el (push-window-configuration):
* window-xemacs.el (pop-window-configuration):
* window.el (quit-window):
* x-compose.el (electric-diacritic):
It's better style, and cheaper (often one assembler instruction
vs. a C funcall in the byte code), to use `eql' instead of `='
when it's clear what numerical type a given result will be. Change
much of our code to do this, with the help of a byte-compiler
change (not comitted) that looked for calls to #'length (which
always returns an integer) in its args.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Tue, 08 Mar 2011 23:41:52 +0000 |
parents | 726060ee587c |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* Emacs manager widget. |
2 Copyright (C) 1993-1995 Sun Microsystems, Inc. | |
3 Copyright (C) 1995 Ben Wing. | |
4 | |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
24 /* Written by Ben Wing, May, 1994. */ | |
25 | |
26 #include <config.h> | |
27 | |
28 #include <X11/StringDefs.h> | |
29 #include "EmacsManagerP.h" | |
30 #ifdef LWLIB_MENUBARS_MOTIF | |
1315 | 31 #include "xmotif.h" |
428 | 32 #include <Xm/RowColumn.h> |
33 #endif /* LWLIB_MENUBARS_MOTIF */ | |
2286 | 34 #include "compiler.h" |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
35 #include "../lwlib/xt-wrappers.h" |
428 | 36 |
37 /* For I, Emacs, am a kind god. Unlike the goddess Athena and the | |
38 Titan Motif, I require no ritual sacrifices to placate the lesser | |
39 daemons of geometry management. */ | |
40 | |
41 static XtResource resources[] = { | |
42 #define offset(field) XtOffset(EmacsManagerWidget, emacs_manager.field) | |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
43 #define res(name,_class,intrepr,size,member,extrepr,value) \ |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
44 Xt_RESOURCE (name, _class, intrepr, size, offset(member), extrepr, value) |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
45 res (XtNresizeCallback, XtCCallback, XtRCallback, XtCallbackList, |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
46 resize_callback, XtRImmediate, 0), |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
47 res (XtNqueryGeometryCallback, XtCCallback, XtRCallback, XtCallbackList, |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
48 query_geometry_callback, XtRImmediate, 0), |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
49 res (XtNuserData, XtCUserData, XtRPointer, XtPointer, |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
50 user_data, XtRImmediate, 0), |
428 | 51 }; |
52 | |
53 /**************************************************************** | |
54 * | |
55 * Full class record constant | |
56 * | |
57 ****************************************************************/ | |
58 | |
59 static XtGeometryResult QueryGeometry (Widget wid, | |
60 XtWidgetGeometry *request, | |
61 XtWidgetGeometry *reply); | |
62 static void Resize (Widget w); | |
63 static XtGeometryResult GeometryManager (Widget w, XtWidgetGeometry *request, | |
64 XtWidgetGeometry *reply); | |
65 static void ChangeManaged (Widget w); | |
66 static void Realize (Widget w, Mask *valueMask, | |
67 XSetWindowAttributes *attributes); | |
68 static void ClassInitialize (void); | |
69 | |
70 EmacsManagerClassRec emacsManagerClassRec = { | |
71 { | |
72 /* core_class fields */ | |
73 #ifdef LWLIB_USES_MOTIF | |
74 /* superclass */ (WidgetClass) &xmManagerClassRec, | |
75 #else | |
76 /* superclass */ (WidgetClass) &compositeClassRec, | |
77 #endif | |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
78 /* class_name */ (String) "EmacsManager", |
440 | 79 /* widget_size */ sizeof (EmacsManagerRec), |
428 | 80 /* class_initialize */ ClassInitialize, |
81 /* class_part_init */ NULL, | |
82 /* class_inited */ FALSE, | |
83 /* initialize */ NULL, | |
84 /* initialize_hook */ NULL, | |
85 /* realize */ Realize, | |
86 /* actions */ NULL, | |
87 /* num_actions */ 0, | |
88 /* resources */ resources, | |
89 /* num_resources */ XtNumber(resources), | |
90 /* xrm_class */ NULLQUARK, | |
91 /* compress_motion */ TRUE, | |
1294 | 92 /* compress_exposure */ XtExposeCompressMaximal | XtExposeNoRegion, |
428 | 93 /* compress_enterleave*/ TRUE, |
94 /* visible_interest */ FALSE, | |
95 /* destroy */ NULL, | |
96 /* resize */ Resize, | |
97 /* expose */ NULL, | |
98 /* set_values */ NULL, | |
99 /* set_values_hook */ NULL, | |
100 /* set_values_almost */ XtInheritSetValuesAlmost, | |
101 /* get_values_hook */ NULL, | |
102 /* accept_focus */ NULL, | |
103 /* version */ XtVersion, | |
104 /* callback_private */ NULL, | |
105 /* tm_table */ XtInheritTranslations, | |
106 /* query_geometry */ QueryGeometry, | |
107 /* display_accelerator*/ XtInheritDisplayAccelerator, | |
108 /* extension */ NULL | |
109 }, | |
110 { | |
111 /* composite_class fields */ | |
112 /* geometry_manager */ GeometryManager, | |
113 /* change_managed */ ChangeManaged, | |
114 /* insert_child */ XtInheritInsertChild, | |
115 /* delete_child */ XtInheritDeleteChild, | |
116 /* extension */ NULL | |
117 }, | |
118 #ifdef LWLIB_USES_MOTIF | |
119 { | |
120 /* constraint_class fields */ | |
121 NULL, /* resource list */ | |
122 0, /* num resources */ | |
123 0, /* constraint size */ | |
124 (XtInitProc)NULL, /* init proc */ | |
125 (XtWidgetProc)NULL, /* destroy proc */ | |
126 (XtSetValuesFunc)NULL, /* set values proc */ | |
127 NULL, /* extension */ | |
128 }, | |
129 { | |
130 /* manager_class fields */ | |
131 XtInheritTranslations, /* translations */ | |
132 NULL, /* syn_resources */ | |
133 0, /* num_syn_resources */ | |
134 NULL, /* syn_cont_resources */ | |
135 0, /* num_syn_cont_resources */ | |
136 XmInheritParentProcess, /* parent_process */ | |
137 NULL, /* extension */ | |
138 }, | |
139 #endif | |
140 { | |
141 /* emacs_manager_class fields */ | |
142 /* empty */ 0, | |
143 } | |
144 }; | |
145 | |
146 WidgetClass emacsManagerWidgetClass = (WidgetClass)&emacsManagerClassRec; | |
147 | |
148 /* What is my preferred size? A suggested size may be given. */ | |
149 | |
150 static XtGeometryResult | |
151 QueryGeometry (Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply) | |
152 { | |
153 EmacsManagerWidget emw = (EmacsManagerWidget) w; | |
154 EmacsManagerQueryGeometryStruct struc; | |
440 | 155 int request_mode = request->request_mode; |
428 | 156 |
440 | 157 struc.request_mode = request_mode; |
158 struc.proposed_width = (request_mode & CWWidth) ? request->width : 0; | |
159 struc.proposed_height = (request_mode & CWHeight) ? request->height : 0; | |
428 | 160 XtCallCallbackList (w, emw->emacs_manager.query_geometry_callback, &struc); |
161 reply->request_mode = CWWidth | CWHeight; | |
162 reply->width = struc.proposed_width; | |
163 reply->height = struc.proposed_height; | |
440 | 164 if (((request_mode & CWWidth) && (request->width != reply->width)) || |
165 ((request_mode & CWHeight) && (request->height != reply->height))) | |
428 | 166 return XtGeometryAlmost; |
167 return XtGeometryYes; | |
168 } | |
169 | |
170 static void | |
171 Resize (Widget w) | |
172 { | |
173 EmacsManagerWidget emw = (EmacsManagerWidget) w; | |
174 EmacsManagerResizeStruct struc; | |
175 | |
176 struc.width = w->core.width; | |
177 struc.height = w->core.height; | |
178 XtCallCallbackList (w, emw->emacs_manager.resize_callback, &struc); | |
179 } | |
180 | |
181 static XtGeometryResult | |
2286 | 182 GeometryManager (Widget w, XtWidgetGeometry *request, |
183 XtWidgetGeometry *UNUSED (reply)) | |
428 | 184 { |
185 /* Sure, any changes are fine. */ | |
186 | |
440 | 187 #ifdef LWLIB_MENUBARS_MOTIF |
428 | 188 /* The Motif menubar will merrily request a new size every time a |
189 child is added or deleted. Blow it off because it doesn't know | |
190 what it's talking about. */ | |
440 | 191 if (XtClass (w) != xmRowColumnWidgetClass) |
428 | 192 #endif /* LWLIB_MENUBARS_MOTIF */ |
193 { | |
440 | 194 if (request->request_mode & CWWidth) w->core.width = request->width; |
195 if (request->request_mode & CWHeight) w->core.height = request->height; | |
428 | 196 } |
440 | 197 if (request->request_mode & CWBorderWidth) |
198 w->core.border_width = request->border_width; | |
199 if (request->request_mode & CWX) w->core.x = request->x; | |
200 if (request->request_mode & CWY) w->core.y = request->y; | |
428 | 201 |
202 return XtGeometryYes; | |
203 } | |
204 | |
205 static void | |
206 ChangeManaged (Widget w) | |
207 { | |
208 if (!XtIsRealized (w)) | |
209 { | |
440 | 210 XtWidgetGeometry request, reply; |
428 | 211 |
212 /* find out how big we'd like to be ... */ | |
213 | |
440 | 214 request.request_mode = 0; |
215 XtQueryGeometry (w, &request, &reply); | |
216 EmacsManagerChangeSize (w, reply.width, reply.height); | |
428 | 217 } |
218 } | |
219 | |
220 static void | |
221 Realize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) | |
222 { | |
223 attributes->bit_gravity = NorthWestGravity; | |
224 *valueMask |= CWBitGravity; | |
225 | |
226 XtCreateWindow (w, (unsigned) InputOutput, (Visual *) CopyFromParent, | |
227 *valueMask, attributes); | |
228 } | |
229 | |
230 static void | |
231 ClassInitialize (void) | |
232 { | |
233 return; | |
234 } | |
235 | |
236 void | |
237 EmacsManagerChangeSize (Widget w, Dimension width, Dimension height) | |
238 { | |
239 if (width == 0) | |
240 width = w->core.width; | |
241 if (height == 0) | |
242 height = w->core.height; | |
243 | |
3381 | 244 /* #### AFAICT this gets called in two places. One is in ChangeManaged(), |
245 above. The other is in EmacsFrameResize(). Perhaps ChangeManaged() | |
246 should initiate resize requests, but EmacsFrameResize() should not. | |
247 Unfortunately, I've tried making this conditional on whether we're | |
248 called from EmacsFrameResize() or not, but that results in an infloop | |
249 via the callback to x_layout_widgets() in Resize(). Whee! */ | |
428 | 250 /* do nothing if we're already that size */ |
251 if (w->core.width != width || w->core.height != height) | |
2450 | 252 { |
253 XtGeometryResult result = | |
254 XtMakeResizeRequest (w, width, height, &w->core.width, &w->core.height); | |
255 if (result == XtGeometryNo) | |
256 return; | |
257 if (result == XtGeometryAlmost) | |
258 XtMakeResizeRequest (w, w->core.width, w->core.height, NULL, NULL); | |
259 Resize (w); | |
260 } | |
428 | 261 } |
262 | |
263 |