Mercurial > hg > xemacs-beta
annotate lwlib/xlwgcs.c @ 5013:ae48681c47fa
changes to VOID_TO_LISP et al.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-08 Ben Wing <ben@xemacs.org>
* casetab.c (compute_canon_mapper):
* casetab.c (initialize_identity_mapper):
* casetab.c (compute_up_or_eqv_mapper):
* casetab.c (recompute_case_table):
* casetab.c (set_case_table):
* chartab.c (copy_mapper):
* chartab.c (copy_char_table_range):
* chartab.c (get_range_char_table_1):
* console.c (find_nonminibuffer_frame_not_on_console_predicate):
* console.c (find_nonminibuffer_frame_not_on_console):
* console.c (nuke_all_console_slots):
* device.c:
* device.c (find_nonminibuffer_frame_not_on_device_predicate):
* device.c (find_nonminibuffer_frame_not_on_device):
* dialog-msw.c (dialog_proc):
* dialog-msw.c (handle_question_dialog_box):
* dialog-x.c (maybe_run_dbox_text_callback):
* eval.c:
* eval.c (safe_run_hook_trapping_problems_1):
* eval.c (safe_run_hook_trapping_problems):
* event-msw.c:
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (mswindows_find_frame):
* faces.c (update_face_inheritance_mapper):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_get_mouse_position):
* frame-msw.c (mswindows_get_frame_parent):
* glade.c (connector):
* glade.c (Fglade_xml_signal_connect):
* glade.c (Fglade_xml_signal_autoconnect):
* glade.c (Fglade_xml_textdomain):
* glyphs-msw.c (mswindows_subwindow_instantiate):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs.c (check_instance_cache_mapper):
* glyphs.c (check_window_subwindow_cache):
* glyphs.c (check_image_instance_structure):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (popup_selection_callback):
* gui-x.c (button_item_to_widget_value):
* keymap.c (map_keymap_mapper):
* keymap.c (Fmap_keymap):
* menubar-gtk.c (__torn_off_sir):
* menubar-gtk.c (__activate_menu):
* menubar-gtk.c (menu_convert):
* menubar-gtk.c (__generic_button_callback):
* menubar-gtk.c (menu_descriptor_to_widget_1):
* menubar-msw.c:
* menubar-msw.c (EMPTY_ITEM_ID):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* menubar-x.c (pre_activate_callback):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (command_builder_find_menu_accelerator):
* print.c (print_internal):
* process-unix.c (close_process_descs_mapfun):
* process.c (get_process_from_usid):
* process.c (init_process_io_handles):
* profile.c (sigprof_handler):
* profile.c (get_profiling_info_timing_maphash):
* profile.c (Fget_profiling_info):
* profile.c (set_profiling_info_timing_maphash):
* profile.c (mark_profiling_info_maphash):
* scrollbar-msw.c (mswindows_create_scrollbar_instance):
* scrollbar-msw.c (mswindows_free_scrollbar_instance):
* scrollbar-msw.c (mswindows_handle_scrollbar_event):
* specifier.c (recompute_cached_specifier_everywhere_mapfun):
* specifier.c (recompute_cached_specifier_everywhere):
* syntax.c (copy_to_mirrortab):
* syntax.c (copy_if_not_already_present):
* syntax.c (update_just_this_syntax_table):
* text.c (new_dfc_convert_now_damn_it):
* text.h (LISP_STRING_TO_EXTERNAL):
* tooltalk.c:
* tooltalk.c (tooltalk_message_callback):
* tooltalk.c (tooltalk_pattern_callback):
* tooltalk.c (Fcreate_tooltalk_message):
* tooltalk.c (Fcreate_tooltalk_pattern):
* ui-byhand.c (__generic_toolbar_callback):
* ui-byhand.c (generic_toolbar_insert_item):
* ui-byhand.c (__emacs_gtk_ctree_recurse_internal):
* ui-byhand.c (Fgtk_ctree_recurse):
* ui-gtk.c (__internal_callback_destroy):
* ui-gtk.c (__internal_callback_marshal):
* ui-gtk.c (Fgtk_signal_connect):
* ui-gtk.c (gtk_type_to_lisp):
* ui-gtk.c (lisp_to_gtk_type):
* ui-gtk.c (lisp_to_gtk_ret_type):
* lisp-disunion.h:
* lisp-disunion.h (NON_LVALUE):
* lisp-union.h:
* lisp.h (LISP_HASH):
Rename:
LISP_TO_VOID -> STORE_LISP_IN_VOID
VOID_TO_LISP -> GET_LISP_FROM_VOID
These new names are meant to clearly identify that the Lisp object
is the source and void the sink, and that they can't be used the
other way around -- they aren't exact opposites despite the old
names. The names are also important given the new functions
created just below. Also, clarify comments in lisp-union.h and
lisp-disunion.h about the use of the functions.
* lisp.h:
New functions STORE_VOID_IN_LISP and GET_VOID_FROM_LISP. These
are different from the above in that the source is a void *
(previously, you had to use make_opaque_ptr()).
* eval.c (restore_lisp_object):
* eval.c (record_unwind_protect_restoring_lisp_object):
* eval.c (struct restore_int):
* eval.c (restore_int):
* eval.c (record_unwind_protect_restoring_int):
* eval.c (free_pointer):
* eval.c (record_unwind_protect_freeing):
* eval.c (free_dynarr):
* eval.c (record_unwind_protect_freeing_dynarr):
* eval.c (unbind_to_1):
Use STORE_VOID_IN_LISP and GET_VOID_FROM_LISP to eliminate the
use of make_opaque_ptr() and mostly eliminate Lisp consing
entirely in the use of these various record_unwind_protect_*
functions as well as internal_bind_* (e.g. internal_bind_int).
* tests.c:
* tests.c (Ftest_store_void_in_lisp):
* tests.c (syms_of_tests):
* tests.c (vars_of_tests):
Add an C-assert-style test to test STORE_VOID_IN_LISP and
GET_VOID_FROM_LISP to make sure the same value comes back that
was put in.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 08 Feb 2010 06:42:16 -0600 |
parents | 5460287a3327 |
children | 308d34e9f07d |
rev | line source |
---|---|
398 | 1 /* Tabs Widget for XEmacs. |
2 Copyright (C) 1999 Edward A. Falk | |
442 | 3 |
398 | 4 This file is part of XEmacs. |
442 | 5 |
398 | 6 XEmacs is free software; you can redistribute it and/or modify it |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
442 | 10 |
398 | 11 XEmacs is distributed in the hope that it will be useful, but WITHOUT |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
442 | 15 |
398 | 16 You should have received a copy of the GNU General Public License |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
442 | 20 |
398 | 21 /* Synched up with: Gcs.c 1.7 */ |
442 | 22 |
398 | 23 /* #### This code is duplicated many times within lwlib and XEmacs. It |
24 should be modularised. */ | |
25 | |
26 /* | |
27 * Gcs.c - Utility functions to allocate GCs. | |
28 * | |
29 * Author: Edward A. Falk | |
30 * falk@falconer.vip.best.com | |
31 * | |
32 * Date: Sept 29, 1998 | |
33 */ | |
34 | |
35 /* Functions: | |
36 * | |
37 * GC AllocFgGC(w, fg, font) | |
38 * Return a GC with foreground set as specified. | |
39 * If font is None, then the returned GC is allocated with font specified | |
40 * as a "don't care" value. | |
41 * | |
42 * GC | |
43 * AllocBackgroundGC(w, font) | |
44 * Return a GC with the foreground set to the widget's background color. | |
45 * | |
46 * GC | |
47 * AllocGreyGC(w, fg, font, contrast, be_nice_to_cmap) | |
48 * Widget w ; | |
49 * Pixel fg ; | |
50 * Font font ; | |
51 * int contrast ; | |
52 * int be_nice_to_cmap ; | |
53 * | |
54 * Return a GC suitable for rendering a widget in its "inactive" color. | |
55 * Normally returns a GC with a color somewhere between the widget's | |
56 * background color and the specified foreground. If font is None, then | |
57 * the returned GC is allocated with font specified as "don't care". | |
58 * If be_nice_to_cmap is True, the returned GC is created using a 50% | |
59 * dither instead of a new color. | |
60 * | |
61 * | |
62 * GC | |
63 * AllocShadeGC(w, fg, bg, font, contrast, be_nice_to_cmap) | |
64 * Widget w ; | |
65 * Pixel fg, bg ; | |
66 * Font font ; | |
67 * int contrast ; | |
68 * int be_nice_to_cmap ; | |
69 * | |
70 * Return a GC suitable for rendering in a shade somewhere between | |
71 * bg and fg, as determined by contrast (0 = bg, 100 = fg) | |
72 * If font is None, then the returned GC is allocated with | |
73 * font specified as "don't care". If be_nice_to_cmap | |
74 * is True, the returned GC is created using a 50% dither | |
75 * instead of a new color. | |
76 * | |
77 * | |
78 * GC | |
79 * AllocTopShadowGC(w, contrast, be_nice_to_cmap) | |
80 * Return a GC suitable for rendering the "top shadow" decorations of | |
81 * a widget. Returns a GC with foreground computed from widget's | |
82 * background color and contrast. If be_nice_to_cmap is True, the | |
83 * returned GC will use a foreground color of white. If widget depth | |
84 * is 1, this function will use a foreground color of black. | |
85 * | |
86 * GC | |
87 * AllocBotShadowGC(w, contrast, be_nice_to_cmap) | |
88 * Return a GC suitable for rendering the "bottom shadow" decorations | |
89 * of a widget. Returns a GC with foreground computed from widget's | |
90 * background color and contrast. If be_nice_to_cmap is True, the | |
91 * returned GC will use a foreground color of black. | |
92 * | |
93 * GC | |
94 * AllocArmGC(w, contrast, be_nice_to_cmap) | |
95 * Return a GC suitable for rendering the "armed" decorations of a | |
96 * widget. This GC would typically be used to fill in the widget's | |
97 * background. Returns a GC with foreground computed from widget's | |
98 * background color and contrast. If be_nice_to_cmap is True, the | |
99 * returned GC will use a foreground color of black and a 50% dither. | |
100 * | |
101 * | |
102 * void | |
103 * Draw3dBox(w, x,y,wid,hgt,s, topgc, botgc) | |
104 * Utility function. Draws a raised shadow box with outside dimensions | |
105 * as specified by x,y,wid,hgt and shadow width specified by s. | |
106 * A lowered shadow box may be generated by swapping topgc and botgc. | |
107 * | |
108 */ | |
109 | |
110 #include <config.h> | |
111 #include <stdio.h> | |
112 | |
113 #include <X11/Xlib.h> | |
114 #include <X11/IntrinsicP.h> | |
115 #include <X11/StringDefs.h> | |
4769
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
116 #include <X11/Xmu/Drawing.h> |
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
117 #include <X11/Xmu/Misc.h> |
398 | 118 #include "xlwgcs.h" |
119 | |
120 /* Color & GC allocation. | |
121 * | |
122 * Frame widgets use the following graphics contexts: | |
123 * | |
124 * Foreground tab label text drawn this way | |
125 * Insensitive Fg foreground color greyed out. | |
126 * Background frame background color | |
127 * Top shadow upper-left highlight around widget | |
128 * Bottom shadow lower-right highlight around widget | |
129 * Arm shadow button pressed and ready to be released | |
130 * | |
131 * | |
132 * GC's are defined as follows, depending on attributes and | |
133 * window depth: | |
134 * | |
135 * Monochrome: | |
136 * Foreground = foreground color attribute or BlackPixel() | |
137 * Grey = Foreground color + 50% dither | |
138 * Background = background color attribute or WhitePixel() | |
139 * top shadow = foreground | |
140 * bottom shadow = foreground | |
141 * arm shadow = (what?) | |
142 * | |
143 * Color, beNiceToColormap=true: | |
144 * Foreground = foreground color attribute or BlackPixel() | |
145 * Grey = Foreground color + 50% dither | |
146 * Background = background color attribute or WhitePixel() | |
147 * top shadow = white | |
148 * bottom shadow = black | |
149 * arm shadow = (what?) | |
150 * | |
151 * Color, beNiceToColormap=false: | |
152 * Foreground = foreground color attribute or BlackPixel() | |
153 * Grey = (foreground color + background color)/2 | |
154 * Background = background color attribute or WhitePixel() | |
155 * top shadow = background * 1.2 | |
156 * bottom shadow = background * .6 | |
157 * arm shadow = background * .8 | |
158 * | |
159 * Special cases: | |
160 * If background is white, ?? | |
161 * if background is black, ?? | |
162 * | |
163 * | |
164 * If the widget's background is solid white or solid black, | |
165 * this code just picks some numbers. (The choice is designed | |
442 | 166 * to be compatible with ThreeD interface.) |
398 | 167 */ |
168 | |
169 | |
170 | |
171 #if NeedFunctionPrototypes | |
172 static Pixmap getDitherPixmap(Widget, int contrast) ; | |
173 #else | |
174 static Pixmap getDitherPixmap() ; | |
175 #endif | |
176 | |
177 /* return a GC with the specified foreground and optional font */ | |
178 | |
179 GC | |
180 AllocFgGC(Widget w, Pixel fg, Font font) | |
181 { | |
182 XGCValues values ; | |
458 | 183 unsigned long vmask, dcmask ; |
398 | 184 |
185 values.foreground = fg ; | |
186 values.font = font ; | |
187 | |
188 if( font != None ) { | |
189 vmask = GCForeground|GCFont ; | |
190 dcmask = GCSubwindowMode|GCDashOffset| | |
191 GCDashList|GCArcMode|GCBackground|GCGraphicsExposures ; | |
192 } else { | |
193 vmask = GCForeground ; | |
194 dcmask = GCFont|GCSubwindowMode|GCDashOffset| | |
195 GCDashList|GCArcMode|GCBackground|GCGraphicsExposures ; | |
196 } | |
197 | |
198 return XtAllocateGC(w, w->core.depth, vmask, &values, 0L, dcmask) ; | |
199 } | |
200 | |
201 | |
202 /* return gc with widget background color as the foreground */ | |
203 | |
204 GC | |
205 AllocBackgroundGC(Widget w, Font font) | |
206 { | |
207 return AllocFgGC(w, w->core.background_pixel, font) ; | |
208 } | |
209 | |
210 | |
211 /* Allocate an "inactive" GC. Color is grey (possibly via | |
212 * dither pattern). | |
213 */ | |
214 | |
215 GC | |
216 AllocGreyGC(Widget w, Pixel fg, Font font, int contrast, Bool be_nice_to_cmap) | |
217 { | |
218 return AllocShadeGC(w, fg, w->core.background_pixel, | |
219 font, contrast, be_nice_to_cmap) ; | |
220 } | |
221 | |
222 | |
223 /* Allocate a GC somewhere between two colors. */ | |
224 | |
225 GC | |
226 AllocShadeGC(Widget w, Pixel fg, Pixel bg, Font font, | |
4769
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
227 int contrast, Bool be_nice_to_cmap) |
398 | 228 { |
229 XGCValues values ; | |
458 | 230 unsigned long vmask, dcmask ; |
398 | 231 |
232 values.foreground = fg ; | |
233 values.background = bg ; | |
234 values.font = font ; | |
235 | |
236 if( font != None ) { | |
237 vmask = GCForeground|GCFont ; | |
238 dcmask = GCSubwindowMode|GCDashOffset| | |
239 GCDashList|GCArcMode|GCGraphicsExposures ; | |
240 } else { | |
241 vmask = GCForeground; | |
242 dcmask = GCFont|GCSubwindowMode|GCDashOffset| | |
243 GCDashList|GCArcMode|GCGraphicsExposures ; | |
244 } | |
245 if( be_nice_to_cmap || w->core.depth == 1) | |
246 { | |
247 if( contrast <= 5 ) | |
248 values.foreground = bg ; | |
249 else if( contrast >= 95 ) | |
250 values.foreground = fg ; | |
251 else { | |
252 vmask |= GCBackground|GCStipple|GCFillStyle ; | |
253 values.fill_style = FillOpaqueStippled ; | |
254 values.stipple = getDitherPixmap(w, contrast) ; | |
255 } | |
256 | |
257 return XtAllocateGC(w, w->core.depth, vmask, &values, 0L, dcmask) ; | |
4769
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
258 } else { |
398 | 259 dcmask |= GCBackground ; |
260 values.foreground = AllocGreyPixel(w, fg, bg, contrast) ; | |
261 return XtAllocateGC(w, w->core.depth, vmask, &values, 0L, dcmask) ; | |
262 } | |
263 } | |
264 | |
265 /* return top-shadow gc. */ | |
266 | |
267 GC | |
268 AllocTopShadowGC(Widget w, int contrast, Bool be_nice_to_cmap) | |
269 { | |
270 Screen *scr = XtScreen (w); | |
271 XGCValues values ; | |
272 | |
273 if( w->core.depth == 1 ) | |
274 values.foreground = BlackPixelOfScreen(scr) ; | |
275 else if( be_nice_to_cmap ) | |
276 values.foreground = WhitePixelOfScreen(scr) ; | |
277 else | |
278 values.foreground = AllocShadowPixel(w, 100+contrast) ; | |
279 | |
280 return XtAllocateGC(w, w->core.depth, | |
281 GCForeground, &values, | |
282 0L, | |
283 GCBackground|GCFont|GCSubwindowMode|GCGraphicsExposures| | |
284 GCDashOffset|GCDashList|GCArcMode) ; | |
285 } | |
286 | |
287 /* return bottom-shadow gc. */ | |
288 | |
289 GC | |
290 AllocBotShadowGC(Widget w, int contrast, Bool be_nice_to_cmap) | |
291 { | |
292 Screen *scr = XtScreen (w); | |
293 XGCValues values ; | |
294 | |
295 if( w->core.depth == 1 || be_nice_to_cmap ) | |
296 values.foreground = BlackPixelOfScreen(scr) ; | |
297 else | |
298 values.foreground = AllocShadowPixel(w, 100-contrast) ; | |
299 | |
300 return XtAllocateGC(w, w->core.depth, | |
301 GCForeground, &values, | |
302 0L, | |
303 GCBackground|GCFont|GCSubwindowMode|GCGraphicsExposures| | |
304 GCDashOffset|GCDashList|GCArcMode) ; | |
305 } | |
306 | |
307 /* return arm-shadow gc. */ | |
308 | |
309 GC | |
4769
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
310 AllocArmGC(Widget w, int contrast, Bool be_nice_to_cmap) |
398 | 311 { |
312 Screen *scr = XtScreen (w); | |
313 XGCValues values ; | |
314 | |
315 /* Not clear exactly what we should do here. Take a look at | |
316 * Xaw3d to see what they do. | |
317 */ | |
318 if( w->core.depth == 1 || be_nice_to_cmap ) | |
319 { | |
320 values.background = w->core.background_pixel ; | |
321 if( values.background == BlackPixelOfScreen(scr) ) | |
322 values.foreground = WhitePixelOfScreen(scr) ; | |
323 else | |
324 values.foreground = BlackPixelOfScreen(scr) ; | |
325 values.fill_style = FillStippled ; | |
326 values.stipple = XmuCreateStippledPixmap(XtScreen(w), 1L, 0L, 1) ; | |
327 | |
328 return XtAllocateGC(w, w->core.depth, | |
329 GCForeground|GCBackground|GCStipple|GCFillStyle, | |
330 &values, 0L, | |
331 GCFont|GCSubwindowMode|GCGraphicsExposures| | |
332 GCDashOffset|GCDashList|GCArcMode) ; | |
4769
5460287a3327
Remove support for pre-X11R5 systems, including systems without Xmu. See
Jerry James <james@xemacs.org>
parents:
2286
diff
changeset
|
333 } else { |
398 | 334 values.foreground = AllocShadowPixel(w, 100-contrast) ; |
335 return XtAllocateGC(w, w->core.depth, | |
336 GCForeground, &values, | |
337 0L, | |
338 GCBackground|GCFont|GCSubwindowMode|GCGraphicsExposures| | |
339 GCDashOffset|GCDashList|GCArcMode) ; | |
340 } | |
341 } | |
342 | |
343 | |
344 Pixel | |
345 AllocShadowPixel(Widget w, int scale) | |
346 { | |
347 XColor get_c, set_c ; | |
348 Display *dpy = XtDisplay(w) ; | |
349 Screen *scr = XtScreen(w) ; | |
350 Colormap cmap ; | |
351 Pixel maxColor ; | |
352 | |
353 cmap = w->core.colormap ; | |
354 | |
355 get_c.pixel = w->core.background_pixel ; | |
356 if( get_c.pixel == WhitePixelOfScreen(scr) || | |
357 get_c.pixel == BlackPixelOfScreen(scr) ) | |
358 { | |
359 /* what we *ought* to do is choose gray75 as the base color, | |
360 * or perhaps gray83. Instead, we choose colors that are | |
361 * the same as ThreeD would choose. | |
362 */ | |
363 if( scale > 100 ) scale = 200 - scale ; | |
364 set_c.red = set_c.green = set_c.blue = 65535*scale/100 ; | |
365 } | |
366 else | |
367 { | |
368 XQueryColor(dpy, cmap, &get_c) ; | |
369 /* adjust scale so that brightest component does not | |
370 * exceed 65535; otherwise hue would change. | |
371 */ | |
372 if( scale > 100 ) { | |
373 maxColor = Max(get_c.red, Max(get_c.green, get_c.blue)) ; | |
374 if( scale*maxColor > 65535*100 ) | |
375 scale = 65535*100/maxColor ; | |
376 } | |
377 set_c.red = scale * get_c.red / 100 ; | |
378 set_c.green = scale * get_c.green / 100 ; | |
379 set_c.blue = scale * get_c.blue / 100 ; | |
380 } | |
381 set_c.flags = DoRed | DoGreen | DoBlue ; | |
382 if( XAllocColor(dpy, cmap, &set_c) ) | |
383 return set_c.pixel ; | |
384 else if( scale > 100 ) | |
385 return WhitePixelOfScreen(scr) ; | |
386 else | |
387 return BlackPixelOfScreen(scr) ; | |
388 } | |
389 | |
390 | |
391 /* Allocate a pixel partway between foreground and background */ | |
392 | |
393 | |
394 Pixel | |
395 AllocGreyPixel(Widget w, Pixel fg, Pixel bg, int scale) | |
396 { | |
397 XColor get_cf, get_cb ; | |
398 Display *dpy = XtDisplay(w) ; | |
399 Colormap cmap ; | |
400 | |
401 cmap = w->core.colormap ; | |
402 | |
403 get_cf.pixel = fg ; | |
404 get_cb.pixel = bg ; | |
405 | |
406 XQueryColor(dpy, cmap, &get_cf) ; | |
407 XQueryColor(dpy, cmap, &get_cb) ; | |
408 | |
409 return AllocGreyPixelC(w, &get_cf, &get_cb, scale) ; | |
410 } | |
411 | |
412 | |
413 | |
414 /* Allocate a pixel partway between foreground and background */ | |
415 | |
416 | |
417 Pixel | |
418 AllocGreyPixelC(Widget w, XColor *fg, XColor *bg, int scale) | |
419 { | |
420 XColor set_c ; | |
421 Display *dpy = XtDisplay(w) ; | |
422 int r,g,b ; | |
423 Colormap cmap = w->core.colormap ; | |
424 | |
425 r = (fg->red * scale + bg->red * (100-scale)) / 100 ; | |
426 g = (fg->green * scale + bg->green * (100-scale)) / 100 ; | |
427 b = (fg->blue * scale + bg->blue * (100-scale)) / 100 ; | |
428 | |
429 if( scale > 100 || scale < 0 ) /* look out for overflow */ | |
430 { | |
431 int minc, maxc ; | |
432 maxc = Max(r, Max(g,b)) ; | |
433 minc = Min(r, Min(g,b)) ; | |
434 if( maxc > 65535 ) | |
435 { | |
436 maxc /= 16 ; | |
437 r = r*(65535/16) / maxc ; | |
438 g = g*(65535/16) / maxc ; | |
439 b = b*(65535/16) / maxc ; | |
440 } | |
441 if( minc < 0 ) | |
442 { | |
443 r = Max(r,0) ; | |
444 g = Max(g,0) ; | |
445 b = Max(b,0) ; | |
446 } | |
447 } | |
448 | |
449 set_c.red = r ; set_c.green = g ; set_c.blue = b ; | |
450 set_c.flags = DoRed | DoGreen | DoBlue ; | |
451 (void)XAllocColor(dpy, cmap, &set_c) ; | |
452 return set_c.pixel ; | |
453 } | |
454 | |
455 | |
456 | |
457 | |
458 | |
459 /* draw a 3-d box */ | |
460 | |
461 void | |
462 Draw3dBox(Widget w, int x, int y, int wid, int hgt, int s, GC topgc, GC botgc) | |
463 { | |
464 Display *dpy = XtDisplay(w) ; | |
465 Window win = XtWindow(w) ; | |
466 | |
467 if( s == 0 ) return ; | |
468 | |
469 if( s == 1 ) { | |
470 XDrawLine(dpy,win,botgc, x,y+hgt-1, x+wid-1,y+hgt-1) ; | |
471 XDrawLine(dpy,win,botgc, x+wid-1,y, x+wid-1,y+hgt-1) ; | |
472 XDrawLine(dpy,win,topgc, x,y, x,y+hgt-1) ; | |
473 XDrawLine(dpy,win,topgc, x,y, x+wid-1,y) ; | |
474 } | |
475 else | |
476 { | |
477 XPoint pts[6] ; | |
478 | |
479 /* bottom-right shadow */ | |
480 pts[0].x = x ; pts[0].y = y + hgt ; | |
481 pts[1].x = s ; pts[1].y = -s ; | |
482 pts[2].x = wid-2*s ; pts[2].y = 0 ; | |
483 pts[3].x = 0 ; pts[3].y = -(hgt-2*s) ; | |
484 pts[4].x = s ; pts[4].y = -s ; | |
485 pts[5].x = 0 ; pts[5].y = hgt ; | |
486 XFillPolygon(dpy,win,botgc, pts,6, Nonconvex,CoordModePrevious) ; | |
487 | |
488 /* top-left shadow */ | |
489 pts[0].x = x ; pts[0].y = y ; | |
490 pts[1].x = wid ; pts[1].y = 0 ; | |
491 pts[2].x = -s ; pts[2].y = s ; | |
492 pts[3].x = -wid+2*s ; pts[3].y = 0 ; | |
493 pts[4].x = 0 ; pts[4].y = hgt-2*s ; | |
494 pts[5].x = -s ; pts[5].y = s ; | |
495 XFillPolygon(dpy,win,topgc, pts,6, Nonconvex,CoordModePrevious) ; | |
496 } | |
497 } | |
498 | |
458 | 499 static unsigned char screen0[2] = {0,0} ; |
500 static unsigned char screen25[2] = {0,0xaa} ; | |
501 static unsigned char screen75[2] = {0xaa,0xff} ; | |
502 static unsigned char screen100[2] = {0xff,0xff} ; | |
398 | 503 |
504 static Pixmap | |
505 getDitherPixmap(Widget w, int contrast) | |
506 { | |
507 Display *dpy = XtDisplay(w) ; | |
508 Window win = XtWindow(w) ; | |
509 | |
510 if( contrast <= 5 ) | |
511 return XCreateBitmapFromData(dpy,win, (char *)screen0, 2,2) ; | |
512 else if( contrast <= 37 ) | |
513 return XCreateBitmapFromData(dpy,win, (char *)screen25, 2,2) ; | |
514 else if( contrast <= 62 ) | |
515 return XmuCreateStippledPixmap(XtScreen(w), 1L, 0L, 1) ; | |
516 else if( contrast <= 95 ) | |
517 return XCreateBitmapFromData(dpy,win, (char *)screen75, 2,2) ; | |
518 else | |
519 return XCreateBitmapFromData(dpy,win, (char *)screen100, 2,2) ; | |
520 } |