comparison lib/ConvDisp.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:92745d501b9a
1 #ifndef lint
2 static char *rcsid = "$Id: ConvDisp.c,v 1.19 1992/08/05 01:51:35 ishisone Rel $";
3 #endif
4 /*
5 * Copyright (c) 1990 Software Research Associates, Inc.
6 *
7 * Permission to use, copy, modify, and distribute this software and its
8 * documentation for any purpose and without fee is hereby granted, provided
9 * that the above copyright notice appear in all copies and that both that
10 * copyright notice and this permission notice appear in supporting
11 * documentation, and that the name of Software Research Associates not be
12 * used in advertising or publicity pertaining to distribution of the
13 * software without specific, written prior permission. Software Research
14 * Associates makes no representations about the suitability of this software
15 * for any purpose. It is provided "as is" without express or implied
16 * warranty.
17 *
18 * Author: Makoto Ishisone, Software Research Associates, Inc., Japan
19 */
20
21 #include <X11/IntrinsicP.h>
22 #include <X11/StringDefs.h>
23 #include <X11/Xmu/Atoms.h>
24 #include <X11/Xmu/Converters.h>
25 #include "CachedAtom.h"
26 #include "ConvDispP.h"
27
28 #define DEBUG_VAR debug_ConvDisplay
29 #include "DebugPrint.h"
30
31 static XtResource resources[] = {
32 #define offset(field) XtOffset(ConvDisplayObject, convDisplay.field)
33 { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
34 offset(foreground), XtRString, XtDefaultForeground },
35 { XtNbackground, XtCBackground, XtRPixel, sizeof (Pixel),
36 offset(background), XtRString, XtDefaultBackground },
37 { XtNcursorBitmap, XtCCursorBitmap, XtRBitmap, sizeof (Pixmap),
38 offset(cursor), XtRImmediate, None },
39 { XtNhotX, XtCHotX, XtRPosition, sizeof (Position),
40 offset(hotx), XtRString, "3" },
41 { XtNhotY, XtCHotY, XtRPosition, sizeof (Position),
42 offset(hoty), XtRString, "2" },
43 #undef offset
44 };
45
46 static void ClassInitialize();
47 static void ClassPartInitialize();
48
49 static void Initialize();
50 static void Destroy();
51 static Boolean SetValues();
52
53 static Pixmap DefaultCursor();
54 static void GetGC();
55 static void ComputeBounds();
56
57 static int StringWidth();
58 static int LineHeight();
59 static void DrawString();
60 static int MaxChar();
61 static void DrawCursor();
62 static void GetCursorBounds();
63 static void SetFonts();
64
65 ConvDisplayClassRec convDisplayClassRec = {
66 { /* object fields */
67 /* superclass */ (WidgetClass) &objectClassRec,
68 /* class_name */ "ConvDisplay",
69 /* widget_size */ sizeof(ConvDisplayRec),
70 /* class_initialize */ ClassInitialize,
71 /* class_part_initialize */ ClassPartInitialize,
72 /* class_inited */ FALSE,
73 /* initialize */ Initialize,
74 /* initialize_hook */ NULL,
75 /* obj1 */ NULL,
76 /* obj2 */ NULL,
77 /* obj3 */ 0,
78 /* resources */ resources,
79 /* num_resources */ XtNumber(resources),
80 /* xrm_class */ NULLQUARK,
81 /* obj4 */ FALSE,
82 /* obj5 */ FALSE,
83 /* obj6 */ FALSE,
84 /* obj7 */ FALSE,
85 /* destroy */ Destroy,
86 /* obj8 */ NULL,
87 /* obj9 */ NULL,
88 /* set_values */ SetValues,
89 /* set_values_hook */ NULL,
90 /* obj10 */ NULL,
91 /* get_values_hook */ NULL,
92 /* obj11 */ NULL,
93 /* version */ XtVersion,
94 /* callback_private */ NULL,
95 /* obj12 */ NULL,
96 /* obj13 */ NULL,
97 /* obj14 */ NULL,
98 /* extension */ NULL
99 },
100 { /* convDisplay fields */
101 /* StringWidth */ StringWidth,
102 /* LineHeight */ LineHeight,
103 /* DrawString */ DrawString,
104 /* MaxChar */ MaxChar,
105 /* DrawCursor */ DrawCursor,
106 /* GetCursorBounds */ GetCursorBounds,
107 /* SetFonts */ SetFonts,
108 }
109 };
110
111 WidgetClass convDisplayObjectClass = (WidgetClass)&convDisplayClassRec;
112
113 static void
114 ClassInitialize()
115 {
116 static XtConvertArgRec screenConvertArg[] = {
117 { XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen),
118 sizeof(Screen *) }
119 };
120
121 /* add string->bitmap converter (for insert-cursor) */
122 XtAddConverter("String", "Bitmap", XmuCvtStringToBitmap,
123 screenConvertArg, XtNumber(screenConvertArg));
124 }
125
126 static void
127 ClassPartInitialize(cl)
128 WidgetClass cl;
129 {
130 ConvDisplayObjectClass class = (ConvDisplayObjectClass)cl;
131 ConvDisplayObjectClass super = (ConvDisplayObjectClass)class->object_class.superclass;
132 ConvDisplayClassPart *classpart = &(class->convDisplay_class);
133 ConvDisplayClassPart *superpart = &(super->convDisplay_class);
134
135 if (classpart->StringWidth == XtInheritStringWidth)
136 classpart->StringWidth = superpart->StringWidth;
137 if (classpart->LineHeight == XtInheritLineHeight)
138 classpart->LineHeight = superpart->LineHeight;
139 if (classpart->DrawString == XtInheritDrawString)
140 classpart->DrawString = superpart->DrawString;
141 if (classpart->MaxChar == XtInheritMaxChar)
142 classpart->MaxChar = superpart->MaxChar;
143 if (classpart->DrawCursor == XtInheritDrawCursor)
144 classpart->DrawCursor = superpart->DrawCursor;
145 if (classpart->GetCursorBounds == XtInheritGetCursorBounds)
146 classpart->GetCursorBounds = superpart->GetCursorBounds;
147 if (classpart->SetFonts == XtInheritSetFonts)
148 classpart->SetFonts = superpart->SetFonts;
149 }
150
151 /* ARGSUSED */
152 static void
153 Initialize(req, new, args, num_args)
154 Widget req;
155 Widget new;
156 ArgList args;
157 Cardinal *num_args;
158 {
159 ConvDisplayObject obj = (ConvDisplayObject)new;
160
161 if (obj->convDisplay.cursor == None) {
162 obj->convDisplay.cursor = DefaultCursor(obj);
163 obj->convDisplay.cursorcreated = True;
164 } else {
165 obj->convDisplay.cursorcreated = False;
166 }
167 obj->convDisplay.cursorvisible = False;
168 GetGC(obj);
169 ComputeBounds(obj);
170 }
171
172 static void
173 Destroy(w)
174 Widget w;
175 {
176 ConvDisplayObject obj = (ConvDisplayObject)w;
177
178 XtReleaseGC(w, obj->convDisplay.cursorgc);
179 if (obj->convDisplay.cursorcreated == True) {
180 XFreePixmap(XtDisplayOfObject(w), obj->convDisplay.cursor);
181 }
182 }
183
184 /* ARGSUSED */
185 static Boolean
186 SetValues(cur, req, wid, args, num_args)
187 Widget cur;
188 Widget req;
189 Widget wid;
190 ArgList args;
191 Cardinal *num_args;
192 {
193 ConvDisplayObject new = (ConvDisplayObject)wid;
194 ConvDisplayObject old = (ConvDisplayObject)cur;
195
196 if (new->convDisplay.foreground != old->convDisplay.foreground ||
197 new->convDisplay.background != old->convDisplay.background) {
198 XtReleaseGC(wid, old->convDisplay.cursorgc);
199 GetGC(new);
200 }
201
202 if (new->convDisplay.cursor != old->convDisplay.cursor ||
203 new->convDisplay.hotx != old->convDisplay.hotx ||
204 new->convDisplay.hoty != old->convDisplay.hoty) {
205 if (new->convDisplay.cursor != old->convDisplay.cursor &&
206 old->convDisplay.cursorcreated) {
207 XFreePixmap(XtDisplayOfObject(wid), old->convDisplay.cursor);
208 new->convDisplay.cursorcreated = False;
209 }
210 ComputeBounds(new);
211 }
212
213 return False;
214 }
215
216 static Pixmap
217 DefaultCursor(obj)
218 ConvDisplayObject obj;
219 {
220 static char default_bits[] = { 0x0c, 0x0c, 0x1e, 0x3f, 0x33 };
221 return XCreateBitmapFromData(XtDisplayOfObject((Widget)obj),
222 RootWindowOfScreen(XtScreenOfObject((Widget)obj)),
223 default_bits,
224 6, 5);
225 }
226
227 static void
228 GetGC(obj)
229 ConvDisplayObject obj;
230 {
231 XtGCMask mask = GCFunction|GCForeground|GCBackground;
232 XGCValues values;
233
234 values.function = GXxor;
235 values.foreground = obj->convDisplay.foreground ^ obj->convDisplay.background;
236 values.background = 0;
237 obj->convDisplay.cursorgc = XtGetGC((Widget)obj, mask, &values);
238 }
239
240 static void
241 ComputeBounds(obj)
242 ConvDisplayObject obj;
243 {
244 unsigned int width, height;
245 Window junkroot;
246 int junkx, junky;
247 unsigned int junkbw, junkdepth;
248
249 if (obj->convDisplay.cursor == None ||
250 !XGetGeometry(XtDisplayOfObject((Widget)obj), obj->convDisplay.cursor,
251 &junkroot, &junkx, &junky, &width, &height,
252 &junkbw, &junkdepth)) {
253 obj->convDisplay.cursor = None;
254 width = height = 0;
255 }
256 obj->convDisplay.cursorbounds.width = width;
257 obj->convDisplay.cursorbounds.height = height;
258 obj->convDisplay.cursorbounds.x = -obj->convDisplay.hotx;
259 obj->convDisplay.cursorbounds.y = -obj->convDisplay.hoty;
260 }
261
262 /* ARGSUSED */
263 static int
264 StringWidth(w, str, start, end)
265 Widget w;
266 ICString *str;
267 int start;
268 int end;
269 {
270 XtAppError(XtWidgetToApplicationContext(w),
271 "ConvDisplay Object: StringWidth function isn't defined.");
272 return 0; /* for lint */
273 }
274
275 /* ARGSUSED */
276 static int
277 LineHeight(w, ascentp)
278 Widget w;
279 Position *ascentp;
280 {
281 XtAppError(XtWidgetToApplicationContext(w),
282 "ConvDisplay Object: LineHeight function isn't defined.");
283 return 0; /* for lint */
284 }
285
286 /* ARGSUSED */
287 static void
288 DrawString(w, canvas, str, start, end, x, y)
289 Widget w;
290 Widget canvas;
291 ICString *str;
292 int start;
293 int end;
294 int x;
295 int y;
296 {
297 XtAppError(XtWidgetToApplicationContext(w),
298 "ConvDisplay Object: DrawString function isn't defined.");
299 }
300
301 /* ARGSUSED */
302 static int
303 MaxChar(w, str, start, width)
304 Widget w;
305 ICString *str;
306 int start;
307 int width;
308 {
309 XtAppError(XtWidgetToApplicationContext(w),
310 "ConvDisplay Object: MaxChar function isn't defined.");
311 return 0; /* for lint */
312 }
313
314 static void
315 DrawCursor(w, canvas, x, y, on)
316 Widget w;
317 Widget canvas;
318 int x;
319 int y;
320 int on;
321 {
322 ConvDisplayObject obj = (ConvDisplayObject)w;
323
324 if (!XtIsRealized(canvas) ||
325 obj->convDisplay.cursor == None ||
326 (obj->convDisplay.cursorvisible && on) ||
327 (!obj->convDisplay.cursorvisible && !on)) {
328 obj->convDisplay.cursorvisible = (on != 0);
329 return;
330 }
331
332 XCopyPlane(XtDisplay(canvas),
333 obj->convDisplay.cursor, XtWindow(canvas),
334 obj->convDisplay.cursorgc,
335 0, 0,
336 obj->convDisplay.cursorbounds.width,
337 obj->convDisplay.cursorbounds.height,
338 x + obj->convDisplay.cursorbounds.x,
339 y + obj->convDisplay.cursorbounds.y,
340 1L);
341 obj->convDisplay.cursorvisible = (on != 0);
342 }
343
344 static void
345 GetCursorBounds(w, bounds)
346 Widget w;
347 XRectangle *bounds;
348 {
349 ConvDisplayObject obj = (ConvDisplayObject)w;
350
351 bounds->x = obj->convDisplay.cursorbounds.x;
352 bounds->y = obj->convDisplay.cursorbounds.y;
353 bounds->width = obj->convDisplay.cursorbounds.width;
354 bounds->height = obj->convDisplay.cursorbounds.height;
355 }
356
357 /* ARGSUSED */
358 static void
359 SetFonts(w, fonts, num_fonts)
360 Widget w;
361 XFontStruct **fonts;
362 Cardinal num_fonts;
363 {
364 XtAppError(XtWidgetToApplicationContext(w),
365 "ConvDisplay Object: SetFonts function isn't defined.");
366 }
367
368
369 /*
370 * public functions
371 */
372
373 int
374 CDStringWidth(w, str, start, end)
375 Widget w;
376 ICString *str;
377 int start;
378 int end;
379 {
380 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
381
382 XtCheckSubclass(w, convDisplayObjectClass, "CDStringWidth()");
383 return (*class->convDisplay_class.StringWidth)(w, str, start, end);
384 }
385
386 int
387 CDLineHeight(w, ascent)
388 Widget w;
389 Position *ascent;
390 {
391 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
392
393 XtCheckSubclass(w, convDisplayObjectClass, "CDLineHeight()");
394 return (*class->convDisplay_class.LineHeight)(w, ascent);
395 }
396
397 void
398 CDDrawString(w, canvas, str, start, end, x, y)
399 Widget w;
400 Widget canvas;
401 ICString *str;
402 int start;
403 int end;
404 int x;
405 int y;
406 {
407 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
408
409 XtCheckSubclass(w, convDisplayObjectClass, "CDDrawString()");
410 (*class->convDisplay_class.DrawString)(w, canvas, str, start, end, x, y);
411 }
412
413 int
414 CDMaxChar(w, str, start, width)
415 Widget w;
416 ICString *str;
417 int start;
418 int width;
419 {
420 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
421
422 XtCheckSubclass(w, convDisplayObjectClass, "CDMaxChar()");
423 return (*class->convDisplay_class.MaxChar)(w, str, start, width);
424 }
425
426 void
427 CDDrawCursor(w, canvas, x, y, on)
428 Widget w;
429 Widget canvas;
430 int x;
431 int y;
432 int on;
433 {
434 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
435
436 XtCheckSubclass(w, convDisplayObjectClass, "CDDrawCursor()");
437 (*class->convDisplay_class.DrawCursor)(w, canvas, x, y, on);
438 }
439
440 void
441 CDGetCursorBounds(w, bounds)
442 Widget w;
443 XRectangle *bounds;
444 {
445 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
446
447 XtCheckSubclass(w, convDisplayObjectClass, "CDGetCursorBounds()");
448 (*class->convDisplay_class.GetCursorBounds)(w, bounds);
449 }
450
451 void
452 CDSetFonts(w, fonts, num_fonts)
453 Widget w;
454 XFontStruct **fonts;
455 Cardinal num_fonts;
456 {
457 ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
458
459 XtCheckSubclass(w, convDisplayObjectClass, "CDSetFonts()");
460 (*class->convDisplay_class.SetFonts)(w, fonts, num_fonts);
461 }
462
463
464 void
465 CDSetBlockCursor(w, shape)
466 Widget w;
467 XRectangle *shape;
468 {
469 ConvDisplayObject obj = (ConvDisplayObject)w;
470 Display *dpy = XtDisplayOfObject((Widget)obj);
471 Pixmap block;
472 GC tmpgc;
473 XGCValues values;
474
475 XtCheckSubclass(w, convDisplayObjectClass, "CDMakeBlockCursor()");
476
477 block = XCreatePixmap(dpy,
478 RootWindowOfScreen(XtScreenOfObject((Widget)obj)),
479 shape->width, shape->height, 1);
480
481 values.function = GXset;
482 tmpgc = XtGetGC(w, GCFunction, &values);
483 XFillRectangle(dpy, block, tmpgc, 0, 0, shape->width, shape->height);
484 XtReleaseGC(w, tmpgc);
485
486 XtVaSetValues(w,
487 XtNcursorBitmap, block,
488 XtNhotX, -shape->x,
489 XtNhotY, -shape->y,
490 NULL);
491 }
492
493
494 /*
495 * semi-public function (for subclass use)
496 */
497
498 int
499 _CDPickupFonts(widget, fontspecs, num_specs, fonts, num_fonts)
500 Widget widget;
501 FontSpec *fontspecs;
502 Cardinal num_specs;
503 XFontStruct **fonts;
504 Cardinal num_fonts;
505 {
506 Display *dpy = XtDisplayOfObject(widget);
507 Atom cs_reg = CachedInternAtom(dpy, "CHARSET_REGISTRY", False);
508 Atom cs_enc = CachedInternAtom(dpy, "CHARSET_ENCODING", False);
509 Atom atom;
510 Cardinal i, j;
511 FontSpec *fsp;
512 int npick;
513
514 DPRINT(("_CDPickupFonts()\n"));
515
516 /* pickup fonts */
517 npick = 0;
518 for (i = 0, fsp = fontspecs; i < num_specs; i++, fsp++) {
519 DPRINT(("\tlooking for a font..."));
520
521 fsp->font = NULL;
522 for (j = 0; j < num_fonts; j++) {
523 if (fonts[j] != NULL &&
524 XGetFontProperty(fonts[j], cs_reg, (unsigned long *)&atom) &&
525 atom == fsp->registry &&
526 XGetFontProperty(fonts[j], cs_enc, (unsigned long *)&atom) &&
527 atom == fsp->encoding) {
528 DPRINT((" found"));
529 fsp->font = fonts[j];
530 npick++;
531 break;
532 }
533 }
534 DPRINT(("\n"));
535 }
536
537 return npick;
538 }