1 /* # skkinput (Simple Kana-Kanji Input)
2 *
3 * This file is part of skkinput.
4 * Copyright (C) 2002
5 * Takashi SAKAMOTO (PXG01715@nifty.ne.jp)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with skkinput; see the file COPYING. If not, write to
19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 #include "AfxWin.h"
22 #include <stdio.h>
23 #include <X11/Intrinsic.h>
24 #include <X11/Shell.h>
25 #include "TOverTheSpotWindowP.h"
26 #include "TRootWindow.h"
27 #include "TSubWindowFrame.h"
28 #include "TTerminal.h"
29 #include "TConvAttr.h"
30 #include "dispatch.h"
31 #include "ttext.h"
32
33 #if !defined (DEFAULT_FONTSET)
34 #define DEFAULT_FONTSET "-*--12-*"
35 #endif
36 #if !defined (DEFAULT_FONTHEIGHT)
37 #define DEFAULT_FONTHEIGHT 12
38 #endif
39
40 #define offset(field) XtOffsetOf(TOverTheSpotWindowRec, toverwin.field)
41 #define soffset(field) XtOffsetOf(ShellWidgetRec, shell.field)
42 #define goffset(field) XtOffsetOf(WidgetRec, core.field )
43
44 static XtResource srOverTheSpotWindowResource [] = {
45 { XtNwidth, XtCWidth,
46 XtRDimension, sizeof (Dimension),
47 goffset (width), XtRImmediate, (XtPointer) 640, },
48 { XtNheight, XtCHeight,
49 XtRDimension, sizeof (Dimension),
50 goffset (height), XtRImmediate, (XtPointer) 48, },
51 { XtNbackground, XtCBackground,
52 XtRPixel, sizeof (Pixel),
53 goffset (background_pixel), XtRString, XtDefaultBackground, },
54 { XtNforeground, XtCForeground,
55 XtRPixel, sizeof (Pixel),
56 offset (m_pxlForeground), XtRString, XtDefaultForeground, },
57 #if 0
58 { XtNreverseVideo, XtCReverseVideo,
59 XtRBoolean, sizeof (Boolean),
60 offset (m_fReverseVideo), XtRImmediate, (XtPointer) False, },
61 #endif
62 /* ����ͤȤ��ƤΤ����Ѥ���� default �� fontset ̾��*/
63 { XtNfontSet, XtCFontSet,
64 XtRString, sizeof (String),
65 offset (m_strFontSet), XtRImmediate, (XtPointer) DEFAULT_FONTSET, },
66 { XtNclientWindow, XtCClientWindow,
67 XtRWindow, sizeof (Window),
68 offset (m_wndClient), XtRImmediate, (XtPointer) None, },
69 { XtNfocusWindow, XtCFocusWindow,
70 XtRWindow, sizeof (Window),
71 offset (m_wndFocus), XtRImmediate, (XtPointer) None, },
72 { XtNminibufFrame, XtCMinibufFrame,
73 XtRWidget, sizeof (Widget),
74 offset (m_wgMinibuf), XtRWidget, NULL, },
75 } ;
76
77 #undef offset
78 #undef goffset
79
80 static void toverTheSpotWindow_onInitialize (Widget, Widget, ArgList, Cardinal*) ;
81 static void toverTheSpotWindow_onRealize (Widget, XtValueMask*, XSetWindowAttributes*) ;
82 static Boolean toverTheSpotWindow_onSetValues (Widget, Widget, Widget, ArgList, Cardinal*) ;
83 static void toverTheSpotWindow_onDestroy (Widget) ;
84 static void toverTheSpotWindow_onKeyPress (Widget, XEvent*, String*, Cardinal*) ;
85 static void toverTheSpotWindow_onKeyRelease (Widget, XEvent*, String*, Cardinal*) ;
86
87 static int toverTheSpotWindow_onFocusResize (void*, XEvent*) ;
88 static int toverTheSpotWindow_onTopTerminalExpose (void*, XEvent*) ;
89 static int toverTheSpotWindow_onMiddleTerminalExpose (void*, XEvent*) ;
90 static int toverTheSpotWindow_onBottomTerminalExpose (void*, XEvent*) ;
91 static int toverTheSpotWindow_onTerminalDestroy (void*, XEvent*) ;
92 static int toverTheSpotWindow_onModeshellExpose (void*, XEvent*) ;
93 static int toverTheSpotWindow_onModeshellDestroy (void*, XEvent*) ;
94 static int toverTheSpotWindow_onSubwindowKeyPress (void*, XEvent*) ;
95 static int toverTheSpotWindow_onSubwindowKeyRelease (void*, XEvent*) ;
96
97 static Boolean toverTheSpotWindow_putchar (Widget, const Char) ;
98 static Boolean toverTheSpotWindow_puts (Widget, const Char*, int) ;
99 static void toverTheSpotWindow_flush (Widget) ;
100 static void toverTheSpotWindow_clear (Widget) ;
101 static void toverTheSpotWindow_rev (Widget, Boolean) ;
102 static Boolean toverTheSpotWindow_rectVariablep(Widget) ;
103 static Boolean toverTheSpotWindow_haveExternModelinep (Widget) ;
104 static Boolean toverTheSpotWindow_setModeline (Widget, const Char*, int) ;
105 static Boolean toverTheSpotWindow_autoPopupp (Widget) ;
106
107 static void* toverTheSpotWindow_getclient (Widget) ;
108 static int toverTheSpotWindow_getrect (Widget, XRectangle*) ;
109 static void toverTheSpotWindow_activate (Widget, Boolean) ;
110 static void* toverTheSpotWindow_getfontset (Widget) ;
111 static Boolean toverTheSpotWindow_getlinespacing (Widget, int*) ;
112 static void* toverTheSpotWindow_getlispframeobject (Widget) ;
113 static void toverTheSpotWindow_setattribute (Widget, const TConversionAttribute*) ;
114 static Boolean toverTheSpotWindow_onSetAttributeFocusWindow (Widget, const TConversionAttribute*) ;
115 static Boolean toverTheSpotWindow_onSetPreeditAttribute (Widget, const TConversionAttribute*) ;
116 static Boolean toverTheSpotWindow_onSetPAttributeSpotLocation (Widget, const TConversionAttribute*) ;
117 static Boolean toverTheSpotWindow_onSetPAttributeClientArea (Widget, const TConversionAttribute*) ;
118 static Boolean toverTheSpotWindow_onSetPAttributeFont (Widget, const TConversionAttribute*) ;
119 static Boolean toverTheSpotWindow_onSetPAttributeLineSpacing (Widget, const TConversionAttribute*) ;
120 static Boolean toverTheSpotWindow_onSetPAttributeColormap (Widget, const TConversionAttribute*) ;
121 static Boolean toverTheSpotWindow_onSetPAttributeBackground (Widget, const TConversionAttribute*) ;
122 static Boolean toverTheSpotWindow_onSetPAttributeForeground (Widget, const TConversionAttribute*) ;
123 static Boolean toverTheSpotWindow_onSetStatusAttribute (Widget, const TConversionAttribute*) ;
124 static Boolean toverTheSpotWindow_onSetSAttributeClientArea (Widget, const TConversionAttribute*) ;
125 static Boolean toverTheSpotWindow_onSetSAttributeFont (Widget, const TConversionAttribute*) ;
126 static Boolean toverTheSpotWindow_onSetSAttributeLineSpacing (Widget, const TConversionAttribute*) ;
127 static Boolean toverTheSpotWindow_onSetSAttributeColormap (Widget, const TConversionAttribute*) ;
128 static Boolean toverTheSpotWindow_onSetSAttributeBackground (Widget, const TConversionAttribute*) ;
129 static Boolean toverTheSpotWindow_onSetSAttributeForeground (Widget, const TConversionAttribute*) ;
130 static Boolean toverTheSpotWindow_getPreeditLineSpacing (Widget, int*) ;
131 static void toverTheSpotWindow_setMinibufferFrameSize (Widget, int, int, int, int) ;
132 static unsigned long toverTheSpotWindow_getPreeditWindowAttribute (Widget, XSetWindowAttributes*) ;
133 static unsigned long toverTheSpotWindow_getStatusWindowAttribute (Widget, XSetWindowAttributes*) ;
134 static Boolean toverTheSpotWindow_createTerminalWindow (Widget) ;
135 static Boolean toverTheSpotWindow_createModeshellWindow (Widget) ;
136 static Boolean toverTheSpotWindow_createMinibufferFrame (Widget) ;
137
138 static void toverTheSpotWindow_configureTerminalWindow (Widget) ;
139 static void toverTheSpotWindow_displayTerminal (Widget, Window, GC, TOverTheSpotTerminalTextControl*, int, int) ;
140 static int toverTheSpotWindow_configureFocusOffset (Widget) ;
141 static void toverTheSpotWindow_resizeModeshellWindow (Widget) ;
142 static void toverTheSpotWindow_popup (Widget) ;
143 static void toverTheSpotWindow_popdown (Widget) ;
144 static void toverTheSpotWindow_convertStatus2Preedit (TConversionAttribute*, const TConversionAttribute*) ;
145
146 void XGetRectangleOfWindow (Display*, Window, XRectangle*) ;
147
148
149 static XtActionsRec srOverTheSpotWindowAction [] = {
150 { "onKeyPress", toverTheSpotWindow_onKeyPress, },
151 { "onKeyRelease", toverTheSpotWindow_onKeyRelease, },
152 } ;
153
154 static char strOverTheSpotWindowTranslation [] =
155 "<Key>: onKeyPress()\n\
156 <KeyRelease>: onKeyRelease()\n" ;
157
158 static int (*srOverTheSpotTerminalExposeProc [])(void*, XEvent*) = {
159 toverTheSpotWindow_onTopTerminalExpose,
160 toverTheSpotWindow_onMiddleTerminalExpose,
161 toverTheSpotWindow_onBottomTerminalExpose,
162 } ;
163
164 TOverTheSpotWindowClassRec toverTheSpotWindowClassRec = {
165 { /* core fields */
166 /* superclass */ (WidgetClass) &tframeClassRec,
167 /* class_name */ "TOverTheSpotWindow",
168 /* size */ sizeof (TOverTheSpotWindowRec),
169 /* class_initialize */ NULL,
170 /* class_part_initialize*/ NULL,
171 /* class_inited */ FALSE,
172 /* initialize */ toverTheSpotWindow_onInitialize,
173 /* initialize_hook */ NULL,
174 /* realize */ toverTheSpotWindow_onRealize,
175 /* actions */ srOverTheSpotWindowAction,
176 /* num_actions */ XtNumber (srOverTheSpotWindowAction),
177 /* resources */ srOverTheSpotWindowResource,
178 /* num_resources */ XtNumber(srOverTheSpotWindowResource),
179 /* xrm_class */ NULLQUARK,
180 /* compress_motion */ TRUE,
181 /* compress_exposure */ TRUE,
182 /* compress_enterleave */ TRUE,
183 /* visible_interest */ FALSE,
184 /* destroy */ toverTheSpotWindow_onDestroy,
185 /* resize */ NULL,
186 /* expose */ NULL,
187 /* set_values */ toverTheSpotWindow_onSetValues,
188 /* set_values_hook */ NULL,
189 /* set_values_almost */ XtInheritSetValuesAlmost,
190 /* get_values_hook */ NULL,
191 /* accept_focus */ NULL,
192 /* version */ XtVersion,
193 /* callback_private */ NULL,
194 /* tm_table */ strOverTheSpotWindowTranslation,
195 /* query_geometry */ XtInheritQueryGeometry,
196 /* display_accelerator */ NULL,
197 /* extension */ NULL,
198 },
199 { /* Composite */
200 /* geometry_manager */ XtInheritGeometryManager,
201 /* change_managed */ XtInheritChangeManaged,
202 /* insert_child */ XtInheritInsertChild,
203 /* delete_child */ XtInheritDeleteChild,
204 /* extension */ NULL,
205 },
206 { /* Shell */
207 /* extension */ NULL,
208 },
209 {
210 /* getclient */ toverTheSpotWindow_getclient,
211 /* getlispframeobject */ toverTheSpotWindow_getlispframeobject,
212 /* setattribute */ toverTheSpotWindow_setattribute,
213 /* getrect */ toverTheSpotWindow_getrect,
214 /* activate */ toverTheSpotWindow_activate,
215 /* getfontset */ toverTheSpotWindow_getfontset,
216 /* getlinespacing */ toverTheSpotWindow_getlinespacing,
217 /* puts */ toverTheSpotWindow_puts,
218 /* putchar */ toverTheSpotWindow_putchar,
219 /* rev */ toverTheSpotWindow_rev,
220 /* clear */ toverTheSpotWindow_clear,
221 /* flush */ toverTheSpotWindow_flush,
222 /* rectVariablep */ toverTheSpotWindow_rectVariablep,
223 /* haveExternModelinep */ toverTheSpotWindow_haveExternModelinep,
224 /* setModeline */ toverTheSpotWindow_setModeline,
225 /* autoPopupp */ toverTheSpotWindow_autoPopupp,
226 /* setCaret */ NULL,
227 },
228 {
229 /* dummy */ 0,
230 },
231 } ;
232
233 WidgetClass toverTheSpotWindowWidgetClass = (WidgetClass) &toverTheSpotWindowClassRec ;
234
235 void
toverTheSpotWindow_onInitialize(Widget wgRequest,Widget wgNew,ArgList args,Cardinal * num_args)236 toverTheSpotWindow_onInitialize (
237 Widget wgRequest,
238 Widget wgNew,
239 ArgList args,
240 Cardinal* num_args)
241 {
242 register TOverTheSpotWindowWidget w = (TOverTheSpotWindowWidget) wgNew ;
243 register TOverTheSpotTerminal* pTerminal ;
244 register int i ;
245 register const char* strFontSet ;
246
247 TConvAttr_Initialize (&w->toverwin.m_caInitial) ;
248 TConvAttr_Initialize (&w->toverwin.m_caCurrent) ;
249
250 w->toverwin.m_ptFocus.x = w->toverwin.m_ptFocus.y = 0 ;
251 w->toverwin.m_ptClient.x = w->toverwin.m_ptClient.y = 0 ;
252
253 /* default �� fontset �ǽ�������롣���ݤʤΤ� -*--12-* �Ǥ����䡣*/
254 TFontSet_Initialize (&w->toverwin.m_fsTerminal) ;
255 TFontSet_Initialize (&w->toverwin.m_fsMinibuf) ;
256 strFontSet = w->toverwin.m_strFontSet ;
257 TFontSet_Load (XtDisplay (wgNew), &w->toverwin.m_fsTerminal, strFontSet, False) ;
258 TFontSet_Load (XtDisplay (wgNew), &w->toverwin.m_fsMinibuf, strFontSet, False) ;
259
260 pTerminal = &w->toverwin.m_Terminal ;
261 for (i = 0 ; i < 3 ; i ++) {
262 pTerminal->m_wndTerminal [i] = None ;
263 pTerminal->m_rGC [i] = None ;
264 pTerminal->m_rnControlOffset [i] = -1 ;
265 }
266 TVarbuffer_Initialize (&pTerminal->m_vbufText, sizeof (Char)) ;
267 TVarbuffer_Initialize (&pTerminal->m_vbufControl, sizeof (TOverTheSpotTerminalTextControl)) ;
268 pTerminal->m_fRev = False ;
269 pTerminal->m_nCursor = -1 ;
270 pTerminal->m_nLine = 0 ;
271
272 w->toverwin.m_wgMinibuf = 0 ;
273 TVarbuffer_Initialize (&w->toverwin.m_vbufModeshellText, sizeof (Char)) ;
274 w->toverwin.m_wndModeshell = None ;
275 w->toverwin.m_gcModeshell = None ;
276 w->toverwin.m_fActive = False ;
277 w->toverwin.m_ptSpot.x = 0 ;
278 w->toverwin.m_ptSpot.y = 0 ;
279 w->toverwin.m_fFloatingModeshell = True ;
280 w->toverwin.m_szModeshell.cx = 0 ;
281 w->toverwin.m_szModeshell.cy = 0 ;
282
283 /* ���� m_fDestroy �ϼ�ʬ���Ȥ� XtDestroyWidget �ǤϤʤ�
284 * �̤γ�Ū�װ��ˤ�ä������Բ�ǽ�ˤʤäƤ��뤳�Ȥ��̣���롣
285 */
286 w->toverwin.m_fDestroy = False ;
287 return ;
288 }
289
290 void
toverTheSpotWindow_onRealize(register Widget gw,register XtValueMask * pValueMask,register XSetWindowAttributes * pXSWA)291 toverTheSpotWindow_onRealize (
292 register Widget gw,
293 register XtValueMask* pValueMask,
294 register XSetWindowAttributes* pXSWA)
295 {
296 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
297 register CoreWidgetClass super ;
298 register Display* pDisplay = XtDisplay (gw) ;
299
300 super = (CoreWidgetClass) XtClass (gw)->core_class.superclass ;
301 (*super->core_class.realize) (gw, pValueMask, pXSWA) ;
302
303 if (wgThis->toverwin.m_wndClient == None) {
304 XtDestroyWidget (gw) ;
305 return ;
306 }
307 /* �����ʳ��ޤǤ���������ͤȤ�����¸���롣�ʹߤ� current �Τ��ѹ�����롣*/
308 TConvAttr_Copy (&wgThis->toverwin.m_caInitial, &wgThis->toverwin.m_caCurrent) ;
309
310 /* Focus Window �����ꤵ��Ƥ��뤫�ɤ������ǧ���롣����Ƥ��ʤ���С�Client Window
311 * �� Focus Window �Ȥ������Ѥ��롣*/
312 if (wgThis->toverwin.m_wndFocus == None)
313 wgThis->toverwin.m_wndFocus = wgThis->toverwin.m_wndClient ;
314 if (!IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask) ||
315 !IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAClientArea)) {
316 XRectangle rect ;
317
318 SET_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask) ;
319 SET_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAClientArea) ;
320 XGetRectangleOfWindow (pDisplay, wgThis->toverwin.m_wndFocus, &rect) ;
321 CONVATTR_PREEDIT_CLIENTAREA (wgThis->toverwin.m_caCurrent) = rect ;
322 }
323 /* FocusWindow �� Resize ��ƻ뤹�롣����� Preedit �� CAClientArea
324 * �����ꤷ�ʤ� Client ���к��Ǥ��롣*/
325 AfxRegisterWindow (pDisplay, wgThis->toverwin.m_wndFocus, ConfigureNotify, StructureNotifyMask, gw, toverTheSpotWindow_onFocusResize) ;
326
327 if (!toverTheSpotWindow_createTerminalWindow (gw) ||
328 !toverTheSpotWindow_createModeshellWindow (gw)) {
329 XtDestroyWidget (gw) ;
330 return ;
331 }
332
333 /* Modeshell ���礭����ɽ������ʸ���������Ԥ���
334 */
335 toverTheSpotWindow_configureFocusOffset (gw) ;
336 toverTheSpotWindow_resizeModeshellWindow (gw) ;
337 toverTheSpotWindow_configureTerminalWindow (gw) ;
338
339 /* Minibuffer �� Realize �ˤĤ��ƤϤޤ����Ȥ⡣��ˤ��롣
340 * �����˺��Τʤ顢������ lisp object �ˤ���ɬ�פ�������
341 * ����ޤ� lisp machine ������Ȥ߹���ǡ������ʤ����뤫������
342 * ���������
343 */
344 toverTheSpotWindow_createMinibufferFrame (gw) ;
345 return ;
346 }
347
348 Boolean
toverTheSpotWindow_onSetValues(register Widget curw,register Widget reqw,register Widget neww,register ArgList args,register Cardinal * num_args)349 toverTheSpotWindow_onSetValues (
350 register Widget curw,
351 register Widget reqw,
352 register Widget neww,
353 register ArgList args,
354 register Cardinal* num_args)
355 {
356 register TOverTheSpotWindowWidget wgCur = (TOverTheSpotWindowWidget) curw ;
357 register TOverTheSpotWindowWidget wgReq = (TOverTheSpotWindowWidget) reqw ;
358 register TOverTheSpotWindowWidget wgNew = (TOverTheSpotWindowWidget) neww ;
359
360 if (wgReq->toverwin.m_wgMinibuf != wgCur->toverwin.m_wgMinibuf) {
361 /* Minibuffer Frame ���������ѹ����뤳�ȤϤǤ��ʤ���
362 * �����Ĥ� get only �Ǥ��롣*/
363 #if defined (DEBUG)
364 fprintf (stderr, "minibuffer frame can't change from (%p) to (%p).\n",
365 wgCur->toverwin.m_wgMinibuf, wgReq->toverwin.m_wgMinibuf) ;
366 #endif
367 wgNew->toverwin.m_wgMinibuf = wgCur->toverwin.m_wgMinibuf ;
368 }
369 return False ;
370 }
371
372 void
toverTheSpotWindow_onDestroy(register Widget gw)373 toverTheSpotWindow_onDestroy (
374 register Widget gw)
375 {
376 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
377 register TOverTheSpotTerminal* pTerminal ;
378 register Display* pDisplay ;
379 register Window wndTerminal, wndModeshell, wndFocus ;
380 register int i ;
381
382 pDisplay = XtDisplay (gw) ;
383 pTerminal = &wgThis->toverwin.m_Terminal ;
384 for (i = 0 ; i < 3 ; i ++) {
385 wndTerminal = pTerminal->m_wndTerminal [i] ;
386 if (wndTerminal != None) {
387 AfxUnregisterWindow (wndTerminal, Expose, ExposureMask, gw, srOverTheSpotTerminalExposeProc [i]) ;
388 AfxUnregisterWindow (wndTerminal, DestroyNotify, StructureNotifyMask, gw, toverTheSpotWindow_onTerminalDestroy) ;
389 AfxUnregisterWindow (wndTerminal, KeyPress, KeyPressMask, gw, toverTheSpotWindow_onSubwindowKeyPress) ;
390 AfxUnregisterWindow (wndTerminal, KeyRelease, KeyReleaseMask, gw, toverTheSpotWindow_onSubwindowKeyRelease) ;
391 /* ���� destroy �� XErrorEvent �������������ǽ�����⤤��*/
392 if (!wgThis->toverwin.m_fDestroy)
393 XDestroyWindow (pDisplay, wndTerminal) ;
394 }
395 XFreeGC (pDisplay, pTerminal->m_rGC [i]) ;
396 pTerminal->m_rGC [i] = None ;
397 }
398 XFreeGC (pDisplay, wgThis->toverwin.m_gcModeshell) ;
399 wgThis->toverwin.m_gcModeshell = None ;
400
401 wndModeshell = wgThis->toverwin.m_wndModeshell ;
402 if (wndModeshell != None) {
403 AfxUnregisterWindow (wndModeshell, Expose, ExposureMask, gw, toverTheSpotWindow_onModeshellExpose) ;
404 AfxUnregisterWindow (wndModeshell, DestroyNotify, StructureNotifyMask, gw, toverTheSpotWindow_onModeshellDestroy) ;
405 AfxUnregisterWindow (wndModeshell, KeyPress, KeyPressMask, gw, toverTheSpotWindow_onSubwindowKeyPress) ;
406 AfxUnregisterWindow (wndModeshell, KeyRelease, KeyReleaseMask, gw, toverTheSpotWindow_onSubwindowKeyRelease) ;
407 /* ���� destroy �� XErrorEvent �������������ǽ�����⤤��*/
408 if (!wgThis->toverwin.m_fDestroy)
409 XDestroyWindow (pDisplay, wndModeshell) ;
410 wgThis->toverwin.m_wndModeshell = None ;
411 }
412 wndFocus = wgThis->toverwin.m_wndFocus ;
413 if (wndFocus != None) {
414 AfxUnregisterWindow (wndFocus, ConfigureNotify, StructureNotifyMask, wgThis, toverTheSpotWindow_onFocusResize) ;
415 wgThis->toverwin.m_wndFocus = None ;
416 }
417
418 TFontSet_Destroy (&wgThis->toverwin.m_fsTerminal) ;
419 TFontSet_Destroy (&wgThis->toverwin.m_fsMinibuf) ;
420 TVarbuffer_Uninitialize (&pTerminal->m_vbufText) ;
421 TVarbuffer_Uninitialize (&pTerminal->m_vbufControl) ;
422 TVarbuffer_Uninitialize (&wgThis->toverwin.m_vbufModeshellText) ;
423
424 TConvAttr_Uninitialize (&wgThis->toverwin.m_caInitial) ;
425 TConvAttr_Uninitialize (&wgThis->toverwin.m_caCurrent) ;
426 return ;
427 }
428
429 void
toverTheSpotWindow_onKeyPress(register Widget gw,register XEvent * pEvent,register String * params,register Cardinal * num_params)430 toverTheSpotWindow_onKeyPress (
431 register Widget gw,
432 register XEvent* pEvent,
433 register String* params,
434 register Cardinal* num_params)
435 {
436 if (!XtIsRealized (gw))
437 return ;
438 #if defined (DEBUG)
439 fprintf (stderr, "toverTheSpotWindow_onKeyPress(%p)\n", gw) ;
440 #endif
441 /* Event Select: None ���ȡ������˸����ä� KeyEvent ���ꤲ�����ǽ��
442 * �����롣*/
443 XtCallCallbacks (gw, XtNkeyPressCallback, (XtPointer) pEvent) ;
444 return ;
445 }
446
447 void
toverTheSpotWindow_onKeyRelease(register Widget gw,register XEvent * pEvent,register String * params,register Cardinal * num_params)448 toverTheSpotWindow_onKeyRelease (
449 register Widget gw,
450 register XEvent* pEvent,
451 register String* params,
452 register Cardinal* num_params)
453 {
454 return ;
455 }
456
457 /* Focus ���Ƥ��� Window �� Resize Event �����⤷��Client Area ��
458 * �����Ѵ� client �ˤ�ä�Ϳ����줿�ΤǤʤ���С����� resize �ξ����
459 * ��äƺ��ľ����
460 */
461 int
toverTheSpotWindow_onFocusResize(register void * pClosure,register XEvent * pEvent)462 toverTheSpotWindow_onFocusResize (
463 register void* pClosure,
464 register XEvent* pEvent)
465 {
466 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
467 register TConversionAttribute* pCurAttr ;
468
469 assert (pClosure != NULL) ;
470 assert (pEvent != NULL) ;
471
472 if (!XtIsRealized ((Widget)wgThis))
473 return 0 ;
474 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caInitial, CAPreeditMask) &&
475 IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caInitial, CAClientArea))
476 return 0 ;
477
478 pCurAttr = &wgThis->toverwin.m_caCurrent ;
479 pCurAttr->m_Preedit.m_area.x = pEvent->xconfigure.x ;
480 pCurAttr->m_Preedit.m_area.y = pEvent->xconfigure.y ;
481 pCurAttr->m_Preedit.m_area.width = pEvent->xconfigure.width ;
482 pCurAttr->m_Preedit.m_area.height = pEvent->xconfigure.height ;
483 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
484 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAClientArea) ;
485 return 0 ;
486 }
487
488 int
toverTheSpotWindow_onTopTerminalExpose(register void * pClosure,register XEvent * pEvent)489 toverTheSpotWindow_onTopTerminalExpose (
490 register void* pClosure,
491 register XEvent* pEvent)
492 {
493 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
494 register TOverTheSpotTerminal* pTerminal ;
495 register TOverTheSpotTerminalTextControl* pControl ;
496 register Window window ;
497 register GC gc ;
498 register int nControl, nOffset ;
499
500 pTerminal = &wgThis->toverwin.m_Terminal ;
501 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
502 nOffset = pTerminal->m_rnControlOffset [0] ;
503 if (nControl <= nOffset || nOffset < 0)
504 return 0 ;
505 pControl = TVarbuffer_GetBuffer (&pTerminal->m_vbufControl) ;
506 pControl += nOffset ;
507 nControl -= nOffset ;
508 window = pTerminal->m_wndTerminal [0] ;
509 gc = pTerminal->m_rGC [0] ;
510 toverTheSpotWindow_displayTerminal ((Widget)wgThis, window, gc, pControl, nControl, 1) ;
511 return 0 ;
512 }
513
514 int
toverTheSpotWindow_onMiddleTerminalExpose(register void * pClosure,register XEvent * pEvent)515 toverTheSpotWindow_onMiddleTerminalExpose (
516 register void* pClosure,
517 register XEvent* pEvent)
518 {
519 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
520 register TOverTheSpotTerminal* pTerminal ;
521 register TOverTheSpotTerminalTextControl* pControl ;
522 register Window window ;
523 register GC gc ;
524 register int nControl, nOffset, nLine ;
525
526 pTerminal = &wgThis->toverwin.m_Terminal ;
527 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
528 nOffset = pTerminal->m_rnControlOffset [1] ;
529 #if defined (DEBUG)
530 fprintf (stderr, "onMiddleTerminalExpose (%d, %d, %d)\n",
531 nControl, nOffset, pTerminal->m_nLine) ;
532 #endif
533 if (nControl <= nOffset || nOffset < 0 || pTerminal->m_nLine < 1)
534 return 0 ;
535 pControl = TVarbuffer_GetBuffer (&pTerminal->m_vbufControl) ;
536 pControl += nOffset ;
537 nControl -= nOffset ;
538 window = pTerminal->m_wndTerminal [1] ;
539 gc = pTerminal->m_rGC [1] ;
540 nLine = (pTerminal->m_nLine >= 2)? pTerminal->m_nLine - 1 : 1 ;
541 toverTheSpotWindow_displayTerminal ((Widget)wgThis, window, gc, pControl, nControl, nLine) ;
542 return 0 ;
543 }
544
545 int
toverTheSpotWindow_onBottomTerminalExpose(register void * pClosure,register XEvent * pEvent)546 toverTheSpotWindow_onBottomTerminalExpose (
547 register void* pClosure,
548 register XEvent* pEvent)
549 {
550 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
551 register TOverTheSpotTerminal* pTerminal ;
552 register TOverTheSpotTerminalTextControl* pControl ;
553 register Window window ;
554 register GC gc ;
555 register int nControl, nOffset ;
556
557 pTerminal = &wgThis->toverwin.m_Terminal ;
558 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
559 nOffset = pTerminal->m_rnControlOffset [2] ;
560 if (nControl <= nOffset || nOffset < 0 || pTerminal->m_nLine < 2)
561 return 0 ;
562 #if defined (DEBUG)
563 fprintf (stderr, "onBottomTerminalExpose (%d, %d, %d)\n",
564 nControl, nOffset, pTerminal->m_nLine) ;
565 #endif
566 pControl = TVarbuffer_GetBuffer (&pTerminal->m_vbufControl) ;
567 pControl += nOffset ;
568 nControl -= nOffset ;
569 window = pTerminal->m_wndTerminal [2] ;
570 gc = pTerminal->m_rGC [2] ;
571 toverTheSpotWindow_displayTerminal ((Widget)wgThis, window, gc, pControl, nControl, 1) ;
572 return 0 ;
573 }
574
575 int
toverTheSpotWindow_onTerminalDestroy(register void * pClosure,register XEvent * pEvent)576 toverTheSpotWindow_onTerminalDestroy (
577 register void* pClosure,
578 register XEvent* pEvent)
579 {
580 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
581 register TOverTheSpotTerminal* pTerminal ;
582 register Window window ;
583 register int n ;
584
585 pTerminal = &wgThis->toverwin.m_Terminal ;
586 window = pEvent->xany.window ;
587 for (n = 0 ; n < 3 ; n ++) {
588 if (pTerminal->m_wndTerminal [n] == window) {
589 AfxUnregisterWindow (window, Expose, ExposureMask, pClosure, srOverTheSpotTerminalExposeProc [n]) ;
590 AfxUnregisterWindow (window, DestroyNotify, StructureNotifyMask, pClosure, toverTheSpotWindow_onTerminalDestroy) ;
591 AfxUnregisterWindow (window, KeyPress, KeyPressMask, pClosure, toverTheSpotWindow_onSubwindowKeyPress) ;
592 AfxUnregisterWindow (window, KeyRelease, KeyReleaseMask, pClosure, toverTheSpotWindow_onSubwindowKeyRelease) ;
593 pTerminal->m_wndTerminal [n] = None ;
594 break ;
595 }
596 }
597 if (!wgThis->toverwin.m_fDestroy) {
598 XtCallCallbacks ((Widget)wgThis, XtNdestroyCallback, (XtPointer) 0) ;
599 wgThis->toverwin.m_fDestroy = True ;
600 }
601 return 0 ;
602 }
603
604 int
toverTheSpotWindow_onModeshellExpose(register void * pClosure,register XEvent * pEvent)605 toverTheSpotWindow_onModeshellExpose (
606 register void* pClosure,
607 register XEvent* pEvent)
608 {
609 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
610 register Display* pDisplay ;
611 register Window window ;
612 register GC gc ;
613 register TFontSet* pFontSet ;
614 register int y ;
615 register Pixel pxlForeground, pxlBackground ;
616 register const Char* pString ;
617 register int nString ;
618
619 pString = TVarbuffer_GetBuffer (&wgThis->toverwin.m_vbufModeshellText) ;
620 nString = TVarbuffer_GetUsage (&wgThis->toverwin.m_vbufModeshellText) ;
621 window = wgThis->toverwin.m_wndModeshell ;
622 if (window == None || nString <= 0)
623 return 0 ;
624
625 pDisplay = XtDisplay ((Widget)wgThis) ;
626
627 pxlForeground = wgThis->toverwin.m_pxlForeground ;
628 pxlBackground = wgThis->core.background_pixel ;
629 if (wgThis->toverwin.m_fFloatingModeshell) {
630 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask)) {
631 if (IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAForegroundPixel))
632 pxlForeground = CONVATTR_PREEDIT_FOREGROUND (wgThis->toverwin.m_caCurrent) ;
633 if (IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CABackgroundPixel))
634 pxlBackground = CONVATTR_PREEDIT_BACKGROUND (wgThis->toverwin.m_caCurrent) ;
635 }
636 pFontSet = &wgThis->toverwin.m_fsTerminal ;
637 } else {
638 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAStatusMask)) {
639 if (IS_CONVATTR_STATUS_MASK (wgThis->toverwin.m_caCurrent, CAForegroundPixel))
640 pxlForeground = CONVATTR_STATUS_FOREGROUND (wgThis->toverwin.m_caCurrent) ;
641 if (IS_CONVATTR_STATUS_MASK (wgThis->toverwin.m_caCurrent, CABackgroundPixel))
642 pxlBackground = CONVATTR_STATUS_BACKGROUND (wgThis->toverwin.m_caCurrent) ;
643 }
644 pFontSet = &wgThis->toverwin.m_fsMinibuf ;
645 }
646 gc = wgThis->toverwin.m_gcModeshell ;
647 y = TFontSet_GetAscent (pFontSet) ;
648 XSetBackground (pDisplay, gc, pxlBackground) ;
649 XSetForeground (pDisplay, gc, pxlForeground) ;
650
651 TTextOut (pDisplay, window, gc, pFontSet, 0, y, pString, nString, NULL) ;
652 return 0 ;
653 }
654
655 int
toverTheSpotWindow_onModeshellDestroy(register void * pClosure,register XEvent * pEvent)656 toverTheSpotWindow_onModeshellDestroy (
657 register void* pClosure,
658 register XEvent* pEvent)
659 {
660 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) pClosure ;
661 register Window window ;
662
663 /* Destroy ���Ф��ִ֤� KinputClient ����� entry ��������
664 * ���Ƥ� Window ��������줿�ʳ��� Widget �Ͼä��ʤ���Ф�
665 * ��ʤ���
666 */
667 window = pEvent->xany.window ;
668 if (wgThis->toverwin.m_wndModeshell != window)
669 return 0 ;
670 AfxUnregisterWindow (window, Expose, ExposureMask, pClosure, toverTheSpotWindow_onModeshellExpose) ;
671 AfxUnregisterWindow (window, DestroyNotify, StructureNotifyMask, pClosure, toverTheSpotWindow_onModeshellDestroy) ;
672 AfxUnregisterWindow (window, KeyPress, KeyPressMask, pClosure, toverTheSpotWindow_onSubwindowKeyPress) ;
673 AfxUnregisterWindow (window, KeyRelease, KeyReleaseMask, pClosure, toverTheSpotWindow_onSubwindowKeyRelease) ;
674 wgThis->toverwin.m_wndModeshell = None ;
675
676 if (!wgThis->toverwin.m_fDestroy) {
677 XtCallCallbacks ((Widget)wgThis, XtNdestroyCallback, (XtPointer) 0) ;
678 wgThis->toverwin.m_fDestroy = True ;
679 }
680 return 0 ;
681 }
682
683 int
toverTheSpotWindow_onSubwindowKeyPress(register void * pClosure,register XEvent * pEvent)684 toverTheSpotWindow_onSubwindowKeyPress (
685 register void* pClosure,
686 register XEvent* pEvent)
687 {
688 register Widget gw = (Widget) pClosure ;
689
690 XtCallCallbacks (gw, XtNkeyPressCallback, (XtPointer) pEvent) ;
691 return 0 ;
692 }
693
694 int
toverTheSpotWindow_onSubwindowKeyRelease(register void * pClosure,register XEvent * pEvent)695 toverTheSpotWindow_onSubwindowKeyRelease (
696 register void* pClosure,
697 register XEvent* pEvent)
698 {
699 return 0 ;
700 }
701
702 /* private functions
703 */
704 void*
toverTheSpotWindow_getclient(register Widget gw)705 toverTheSpotWindow_getclient (
706 register Widget gw)
707 {
708 TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
709
710 return wgThis->tframe.m_pClient ;
711 }
712
713 int
toverTheSpotWindow_getrect(register Widget gw,register XRectangle * pRect)714 toverTheSpotWindow_getrect (
715 register Widget gw,
716 register XRectangle* pRect)
717 {
718 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
719 register XRectangle* pCurRect ;
720
721 if (pRect == NULL)
722 return 1 ;
723
724 pCurRect = &CONVATTR_PREEDIT_CLIENTAREA (wgThis->toverwin.m_caCurrent) ;
725 pRect->x = wgThis->toverwin.m_ptSpot.x ; /*pCurRect->x ;*/
726 pRect->y = wgThis->toverwin.m_ptSpot.y ; /*pCurRect->y ;*/
727 pRect->width = pCurRect->width ;
728 pRect->height = pCurRect->height ;
729 return 1 ;
730 }
731
732 void
toverTheSpotWindow_activate(register Widget gw,register Boolean fActivate)733 toverTheSpotWindow_activate (
734 register Widget gw,
735 register Boolean fActivate)
736 {
737 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
738
739 if (!XtIsRealized (gw) || wgThis->toverwin.m_fDestroy)
740 return ;
741
742 if (fActivate) {
743 toverTheSpotWindow_popup (gw) ;
744 } else {
745 toverTheSpotWindow_popdown (gw) ;
746 }
747 return ;
748 }
749
750 void*
toverTheSpotWindow_getfontset(register Widget gw)751 toverTheSpotWindow_getfontset (
752 register Widget gw)
753 {
754 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
755
756 return &wgThis->toverwin.m_fsTerminal ;
757 }
758
759 Boolean
toverTheSpotWindow_getlinespacing(register Widget gw,register int * pnLineSpacing)760 toverTheSpotWindow_getlinespacing (
761 register Widget gw,
762 register int* pnLineSpacing)
763 {
764 return toverTheSpotWindow_getPreeditLineSpacing (gw, pnLineSpacing) ;
765 }
766
767 void*
toverTheSpotWindow_getlispframeobject(register Widget gw)768 toverTheSpotWindow_getlispframeobject (
769 register Widget gw)
770 {
771 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
772
773 return wgThis->tframe.m_pLispFrameObject ;
774 }
775
776 void
toverTheSpotWindow_setattribute(register Widget gw,register const TConversionAttribute * pAttribute)777 toverTheSpotWindow_setattribute (
778 register Widget gw,
779 register const TConversionAttribute* pAttribute)
780 {
781 static Boolean (*rpSetAttrProcTbl[])(Widget, const TConversionAttribute*) = {
782 toverTheSpotWindow_onSetAttributeFocusWindow,
783 toverTheSpotWindow_onSetPreeditAttribute,
784 toverTheSpotWindow_onSetStatusAttribute,
785 } ;
786 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
787 register int i ;
788 register unsigned int uMask ;
789 register Boolean fReconf ;
790
791 assert (gw != NULL) ;
792 assert (pAttribute != NULL) ;
793
794 if (wgThis->toverwin.m_fDestroy)
795 return ;
796
797 uMask = 1 << CAFocusWindowBit ;
798 fReconf = False ;
799 for (i = 0 ; i <= (CAStatusMaskBit - CAFocusWindowBit) ; i ++) {
800 if (IS_CONVATTR_MASK (*pAttribute, uMask)) {
801 fReconf = (rpSetAttrProcTbl [i])(gw, pAttribute)? True : fReconf ;
802 }
803 uMask = uMask << 1 ;
804 }
805 if (XtIsRealized (gw) && fReconf && wgThis->toverwin.m_fActive) {
806 register TOverTheSpotTerminal* pTerminal ;
807 register int nControl, nText ;
808
809 pTerminal = &wgThis->toverwin.m_Terminal ;
810 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
811 nText = TVarbuffer_GetUsage (&pTerminal->m_vbufText) ;
812 #if defined (DEBUG)
813 fprintf (stderr, "toverTheSpotWindow_setattribute (%d)\n", fReconf) ;
814 #endif
815 /* ����������ľ����*/
816 toverTheSpotWindow_configureFocusOffset (gw) ;
817 toverTheSpotWindow_resizeModeshellWindow (gw) ;
818 if (nControl > 0 && nText > 0)
819 XtCallCallbacks (gw, XtNconfigureCallback, (XtPointer) 0) ;
820 //toverTheSpotWindow_configureTerminalWindow (gw) ;
821 }
822 return ;
823 }
824
825 Boolean
toverTheSpotWindow_onSetAttributeFocusWindow(register Widget gw,register const TConversionAttribute * pAttribute)826 toverTheSpotWindow_onSetAttributeFocusWindow (
827 register Widget gw,
828 register const TConversionAttribute* pAttribute)
829 {
830 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
831 register TOverTheSpotTerminal* pTerminal ;
832 register Display* pDisplay ;
833 register TConversionAttribute* pCurAttr ;
834 register Window wndNewFocus, wndOldFocus ;
835 register int i ;
836 register XRectangle* pArea ;
837
838 assert (gw != NULL) ;
839 assert (pAttribute != NULL) ;
840 assert ((pAttribute->m_uMask & CAFocusWindow) != 0) ;
841
842 wndNewFocus = CONVATTR_FOCUSWINDOW (*pAttribute) ;
843 pDisplay = XtDisplay (gw) ;
844 #if defined (DEBUG)
845 fprintf (stderr, "FocusWindow: (%lx)\n", wndNewFocus) ;
846 #endif
847 if (!XtIsRealized (gw)) {
848 SET_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAFocusWindow) ;
849 CONVATTR_FOCUSWINDOW (wgThis->toverwin.m_caCurrent) = wndNewFocus ;
850 return False ;
851 }
852 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAFocusWindow))
853 return False ;
854 wndOldFocus = CONVATTR_FOCUSWINDOW (wgThis->toverwin.m_caCurrent) ;
855 if (wndOldFocus == wndNewFocus)
856 return False ;
857
858 CONVATTR_FOCUSWINDOW (wgThis->toverwin.m_caCurrent) = wndNewFocus ;
859 wgThis->toverwin.m_wndFocus = wndNewFocus ;
860 toverTheSpotWindow_configureFocusOffset (gw) ;
861
862 /* Realize ����Ƥ�����֤Ǥ� Focus Window ���ѹ��� CAClientArea ��
863 * �����Ǥ����Ƚ�Ǥ��롣
864 */
865 pCurAttr = &wgThis->toverwin.m_caCurrent ;
866 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
867 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAClientArea) ;
868 pArea = &CONVATTR_PREEDIT_CLIENTAREA (*pCurAttr) ;
869 XGetRectangleOfWindow (pDisplay, wndNewFocus, pArea) ;
870 pArea->x = pArea->y = 0 ;
871
872 /* Focus Window �� Resize �δƻ��³���롣*/
873 if (wndOldFocus != None)
874 AfxUnregisterWindow (wndOldFocus, ConfigureNotify, StructureNotifyMask, wgThis, toverTheSpotWindow_onFocusResize) ;
875 if (wndNewFocus != None)
876 AfxRegisterWindow (pDisplay, wndNewFocus, ConfigureNotify, StructureNotifyMask, wgThis, toverTheSpotWindow_onFocusResize) ;
877 return True ;
878 }
879
880 Boolean
toverTheSpotWindow_onSetPreeditAttribute(register Widget gw,register const TConversionAttribute * pAttribute)881 toverTheSpotWindow_onSetPreeditAttribute (
882 register Widget gw,
883 register const TConversionAttribute* pAttribute)
884 {
885 register unsigned int uMask ;
886 register int i ;
887 register Boolean fRetval ;
888 static Boolean (*rpSetPAttrProcTbl[])(Widget, const TConversionAttribute*) = {
889 toverTheSpotWindow_onSetPAttributeSpotLocation,
890 toverTheSpotWindow_onSetPAttributeClientArea,
891 toverTheSpotWindow_onSetPAttributeFont,
892 toverTheSpotWindow_onSetPAttributeLineSpacing,
893 toverTheSpotWindow_onSetPAttributeColormap,
894 toverTheSpotWindow_onSetPAttributeForeground,
895 toverTheSpotWindow_onSetPAttributeBackground,
896 } ;
897
898 #if defined (DEBUG)
899 fprintf (stderr, "PreeditMask: %x\n", pAttribute->m_Preedit.m_uMask) ;
900 #endif
901 uMask = 1 << CASpotLocationBit ;
902 i = 0 ;
903 fRetval = False ;
904 while (i <= (CABackgroundPixelBit - CASpotLocationBit)) {
905 if (IS_CONVATTR_PREEDIT_MASK (*pAttribute, uMask)) {
906 fRetval = (rpSetPAttrProcTbl [i])(gw, pAttribute)? True : fRetval ;
907 }
908 uMask = uMask << 1 ;
909 i ++ ;
910 }
911 return fRetval ;
912 }
913
914 Boolean
toverTheSpotWindow_onSetPAttributeSpotLocation(register Widget gw,register const TConversionAttribute * pAttribute)915 toverTheSpotWindow_onSetPAttributeSpotLocation (
916 register Widget gw,
917 register const TConversionAttribute* pAttribute)
918 {
919 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
920 register Boolean fMove ;
921 register TOverTheSpotTerminal* pTerminal ;
922 register int x, y, nControl, nText ;
923
924 assert (gw != NULL) ;
925 assert (pAttribute != NULL) ;
926
927 x = CONVATTR_PREEDIT_SPOT(*pAttribute).x ;
928 y = CONVATTR_PREEDIT_SPOT(*pAttribute).y ;
929
930 pTerminal = &wgThis->toverwin.m_Terminal ;
931 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
932 nText = TVarbuffer_GetUsage (&pTerminal->m_vbufText) ;
933 /* Spot ���ѹ��� ReConfigure ��ɬ�פˤĤʤ��롣*/
934 fMove = (wgThis->toverwin.m_ptSpot.x != x || wgThis->toverwin.m_ptSpot.y != y) ;
935 wgThis->toverwin.m_ptSpot.x = x ;
936 wgThis->toverwin.m_ptSpot.y = y ;
937
938 if (wgThis->toverwin.m_wndModeshell != None && fMove &&
939 wgThis->toverwin.m_fFloatingModeshell) {
940 register TFontSet* pFontSet = &wgThis->toverwin.m_fsTerminal ;
941 register int nAscent, nDescent, nFontHeight ;
942 register Boolean fLineSpacing ;
943 int nLineSpacing ;
944 register int nFocusX, nFocusY ;
945
946 fLineSpacing = toverTheSpotWindow_getPreeditLineSpacing (gw, &nLineSpacing) ;
947 nDescent = TFontSet_GetDescent (pFontSet) ;
948 nAscent = TFontSet_GetAscent (pFontSet) ;
949 nFontHeight = TFontSet_GetHeight (pFontSet) ;
950 nFocusX = wgThis->toverwin.m_ptFocus.x ;
951 nFocusY = wgThis->toverwin.m_ptFocus.y ;
952 y += (fLineSpacing && nFontHeight < nLineSpacing)? (nLineSpacing - nAscent) : nDescent ;
953 XMoveWindow (XtDisplay (gw), wgThis->toverwin.m_wndModeshell, nFocusX + x, nFocusY + y) ;
954 }
955 return fMove && (nControl > 0 && nText > 0) ;
956 }
957
958 Boolean
toverTheSpotWindow_onSetPAttributeClientArea(register Widget gw,register const TConversionAttribute * pAttribute)959 toverTheSpotWindow_onSetPAttributeClientArea (
960 register Widget gw,
961 register const TConversionAttribute* pAttribute)
962 {
963 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
964 register TConversionAttribute* pCurAttr ;
965 register Boolean fRetval = False ;
966 register XRectangle* pCurArea ;
967 register const XRectangle* pNewArea ;
968 register int nWidth, nHeight ;
969
970 assert (gw != NULL) ;
971 assert (pAttribute != NULL) ;
972
973 pCurAttr = &wgThis->toverwin.m_caCurrent ;
974 pNewArea = &CONVATTR_PREEDIT_CLIENTAREA (*pAttribute) ;
975 pCurArea = &CONVATTR_PREEDIT_CLIENTAREA (*pCurAttr) ;
976
977 if (pNewArea->width == 0 || pNewArea->height == 0) {
978 register Window wndFocus ;
979 XRectangle rc ;
980
981 wndFocus = wgThis->toverwin.m_wndClient ;
982 if (IS_CONVATTR_MASK (*pCurAttr, CAFocusWindow))
983 wndFocus = CONVATTR_FOCUSWINDOW (*pCurAttr) ;
984 if (wndFocus != None) {
985 XGetRectangleOfWindow (XtDisplay (gw), wndFocus, &rc) ;
986 } else {
987 rc.width = 65535 ;
988 rc.height = 65535 ;
989 }
990 nWidth = (pNewArea->width <= 0)? rc.width : pNewArea->width ;
991 nHeight = (pNewArea->height <= 0)? rc.height : pNewArea->height ;
992 } else {
993 nWidth = pNewArea->width ;
994 nHeight = pNewArea->height ;
995 }
996 #if defined (DEBUG) || 0
997 fprintf (stderr, "ClientArea: (%d, %d, %d(%d), %d(%d))\n",
998 pAttribute->m_Preedit.m_area.x,
999 pAttribute->m_Preedit.m_area.y,
1000 nWidth,
1001 pAttribute->m_Preedit.m_area.width,
1002 nHeight,
1003 pAttribute->m_Preedit.m_area.height) ;
1004 #endif
1005
1006 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
1007 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAClientArea)) {
1008 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1009 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAClientArea) ;
1010 pCurArea->x = pNewArea->x ;
1011 pCurArea->y = pNewArea->y ;
1012 pCurArea->width = nWidth ;
1013 pCurArea->height = nHeight ;
1014 fRetval = True ;
1015 } else {
1016 if (pCurArea->x != pNewArea->x ||
1017 pCurArea->y != pNewArea->y ||
1018 pCurArea->width != nWidth ||
1019 pCurArea->height != nHeight)
1020 fRetval = True ;
1021 pCurArea->x = pNewArea->x ;
1022 pCurArea->y = pNewArea->y ;
1023 pCurArea->width = nWidth ;
1024 pCurArea->height = nHeight ;
1025 }
1026 return fRetval ;
1027 }
1028
1029 Boolean
toverTheSpotWindow_onSetPAttributeFont(register Widget gw,register const TConversionAttribute * pAttribute)1030 toverTheSpotWindow_onSetPAttributeFont (
1031 register Widget gw,
1032 register const TConversionAttribute* pAttribute)
1033 {
1034 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1035 register TConversionAttribute* pCurAttr ;
1036
1037 assert (gw != NULL) ;
1038 assert (pAttribute != NULL) ;
1039
1040 #if defined (DEBUG)
1041 fprintf (stderr, "toverTheSpotWindow_onSetPAttributeFont (%p)\n", gw) ;
1042 #endif
1043 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1044 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
1045 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAFont)) {
1046 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1047 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAFont) ;
1048 }
1049 TFontSet_Copy (&wgThis->toverwin.m_fsTerminal, &CONVATTR_PREEDIT_FONTSET (*pAttribute)) ;
1050 UNSET_CONVATTR_PREEDIT_MASK (*pCurAttr, CALineSpacing) ;
1051
1052 /* �礱�Ƥ��� charset �� font ������С��������Ѱդ��롣
1053 */
1054 TFontSet_Adjust (XtDisplay (gw), &wgThis->toverwin.m_fsTerminal, DEFAULT_FONTHEIGHT) ;
1055 #if defined (DEBUG)
1056 TFontSet_Show (&wgThis->toverwin.m_fsTerminal) ;
1057 #endif
1058 return True ;
1059 }
1060
1061 Boolean
toverTheSpotWindow_onSetPAttributeLineSpacing(register Widget gw,register const TConversionAttribute * pAttribute)1062 toverTheSpotWindow_onSetPAttributeLineSpacing (
1063 register Widget gw,
1064 register const TConversionAttribute* pAttribute)
1065 {
1066 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1067 register TConversionAttribute* pCurAttr ;
1068
1069 assert (gw != NULL) ;
1070 assert (pAttribute != NULL) ;
1071
1072 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1073 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
1074 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CALineSpacing) ||
1075 pCurAttr->m_Preedit.m_nLineSpacing != pAttribute->m_Preedit.m_nLineSpacing) {
1076 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1077 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CALineSpacing) ;
1078 pCurAttr->m_Preedit.m_nLineSpacing = pAttribute->m_Preedit.m_nLineSpacing ;
1079 return True ;
1080 }
1081 return False ;
1082 }
1083
1084 Boolean
toverTheSpotWindow_onSetPAttributeColormap(register Widget gw,register const TConversionAttribute * pAttribute)1085 toverTheSpotWindow_onSetPAttributeColormap (
1086 register Widget gw,
1087 register const TConversionAttribute* pAttribute)
1088 {
1089 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1090 register TConversionAttribute* pCurAttr ;
1091 register TOverTheSpotTerminal* pTerminal ;
1092 register Window window ;
1093 register Colormap colNew ;
1094 register int i ;
1095
1096 assert (gw != NULL) ;
1097 assert (pAttribute != NULL) ;
1098
1099 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1100 colNew = pAttribute->m_Preedit.m_colormap ;
1101 if (IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) &&
1102 IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAColormap) &&
1103 pCurAttr->m_Preedit.m_colormap == colNew)
1104 return False ;
1105
1106 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1107 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAColormap) ;
1108 pCurAttr->m_Preedit.m_colormap = colNew ;
1109
1110 pTerminal = &wgThis->toverwin.m_Terminal ;
1111 for (i = 0 ; i < 3 ; i ++) {
1112 window = pTerminal->m_wndTerminal [i] ;
1113 if (window != None)
1114 XSetWindowColormap (XtDisplay (gw), window, colNew) ;
1115 }
1116 window = wgThis->toverwin.m_wndModeshell ;
1117 if (window != None)
1118 XSetWindowColormap (XtDisplay (gw), window, colNew) ;
1119 return False ;
1120 }
1121
1122 Boolean
toverTheSpotWindow_onSetPAttributeBackground(register Widget gw,register const TConversionAttribute * pAttribute)1123 toverTheSpotWindow_onSetPAttributeBackground (
1124 register Widget gw,
1125 register const TConversionAttribute* pAttribute)
1126 {
1127 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1128 register TConversionAttribute* pCurAttr ;
1129 register TOverTheSpotTerminal* pTerminal ;
1130 register Window window ;
1131 register int i ;
1132 register Pixel pxlBack ;
1133
1134 assert (gw != NULL) ;
1135 assert (pAttribute != NULL) ;
1136
1137 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1138 pxlBack = CONVATTR_PREEDIT_BACKGROUND (*pAttribute) ;
1139 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
1140 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CABackgroundPixel)) {
1141 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1142 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CABackgroundPixel) ;
1143 } else {
1144 if (CONVATTR_PREEDIT_BACKGROUND (*pCurAttr) == pxlBack)
1145 return False ;
1146 }
1147 CONVATTR_PREEDIT_BACKGROUND (*pCurAttr) = pxlBack ;
1148 #if defined (DEBUG)
1149 fprintf (stderr, "toverTheSpotWindow_onSetPAttributeBackground (%p, %lx)\n",
1150 gw, pxlBack) ;
1151 #endif
1152
1153 pTerminal = &wgThis->toverwin.m_Terminal ;
1154 for (i = 0 ; i < 3 ; i ++) {
1155 window = pTerminal->m_wndTerminal [i] ;
1156 if (window != None)
1157 XSetWindowBackground (XtDisplay (gw), window, pxlBack) ;
1158 }
1159 window = wgThis->toverwin.m_wndModeshell ;
1160 if (window != None)
1161 XSetWindowBackground (XtDisplay (gw), window, pxlBack) ;
1162 return False ;
1163 }
1164
1165 Boolean
toverTheSpotWindow_onSetPAttributeForeground(register Widget gw,register const TConversionAttribute * pAttribute)1166 toverTheSpotWindow_onSetPAttributeForeground (
1167 register Widget gw,
1168 register const TConversionAttribute* pAttribute)
1169 {
1170 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1171 register TConversionAttribute* pCurAttr ;
1172 register Pixel pxlFore ;
1173
1174 assert (gw != NULL) ;
1175 assert (pAttribute != NULL) ;
1176
1177 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1178 pxlFore = CONVATTR_PREEDIT_FOREGROUND (*pAttribute) ;
1179 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
1180 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAForegroundPixel)) {
1181 SET_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ;
1182 SET_CONVATTR_PREEDIT_MASK (*pCurAttr, CAForegroundPixel) ;
1183 } else {
1184 if (CONVATTR_PREEDIT_FOREGROUND (*pCurAttr) == pxlFore)
1185 return False ;
1186 }
1187 #if defined (DEBUG)
1188 fprintf (stderr, "toverTheSpotWindow_onSetPAttributeForeground (%p, %lx)\n",
1189 gw, pxlFore) ;
1190 #endif
1191 CONVATTR_PREEDIT_FOREGROUND (*pCurAttr) = pxlFore ;
1192 return True ;
1193 }
1194
1195 /* Status Attribute: Status Attribute ¦�ϲ���ޤǤμ�����ɬ�פ���
1196 */
1197 Boolean
toverTheSpotWindow_onSetStatusAttribute(register Widget gw,register const TConversionAttribute * pAttribute)1198 toverTheSpotWindow_onSetStatusAttribute (
1199 register Widget gw,
1200 register const TConversionAttribute* pAttribute)
1201 {
1202 register unsigned int uMask ;
1203 register int i ;
1204 register Boolean fRetval ;
1205 static Boolean (*rpSetSAttrProcTbl[])(Widget, const TConversionAttribute*) = {
1206 NULL,
1207 toverTheSpotWindow_onSetSAttributeClientArea,
1208 toverTheSpotWindow_onSetSAttributeFont,
1209 toverTheSpotWindow_onSetSAttributeLineSpacing,
1210 toverTheSpotWindow_onSetSAttributeColormap,
1211 toverTheSpotWindow_onSetSAttributeForeground,
1212 toverTheSpotWindow_onSetSAttributeBackground,
1213 } ;
1214
1215 uMask = 1 << CASpotLocationBit ;
1216 i = 0 ;
1217 fRetval = False ;
1218 while (i <= (CABackgroundPixelBit - CASpotLocationBit)) {
1219 if (IS_CONVATTR_STATUS_MASK (*pAttribute, uMask) &&
1220 rpSetSAttrProcTbl [i] != NULL)
1221 fRetval = (rpSetSAttrProcTbl [i])(gw, pAttribute) || fRetval ;
1222 uMask = uMask << 1 ;
1223 i ++ ;
1224 }
1225 return False ;
1226 }
1227
1228 /* Status Attribute: ɽ���ΰ�����ꡣ
1229 */
1230 Boolean
toverTheSpotWindow_onSetSAttributeClientArea(register Widget gw,register const TConversionAttribute * pAttribute)1231 toverTheSpotWindow_onSetSAttributeClientArea (
1232 register Widget gw,
1233 register const TConversionAttribute* pAttribute)
1234 {
1235 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1236 register TConversionAttribute* pCurAttr ;
1237 register Boolean fRetval = False ;
1238 register const XRectangle* pNewArea ;
1239
1240 assert (gw != NULL) ;
1241 assert (pAttribute != NULL) ;
1242
1243 #if defined (DEBUG)
1244 fprintf (stderr, "Status: ClientArea: (%d, %d, %d, %d)\n",
1245 pAttribute->m_Status.m_area.x,
1246 pAttribute->m_Status.m_area.y,
1247 pAttribute->m_Status.m_area.width,
1248 pAttribute->m_Status.m_area.height) ;
1249 #endif
1250 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1251 pNewArea = &CONVATTR_STATUS_CLIENTAREA (*pAttribute) ;
1252 if (!IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) ||
1253 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAClientArea)) {
1254 SET_CONVATTR_MASK (*pCurAttr, CAStatusMask) ;
1255 SET_CONVATTR_STATUS_MASK (*pCurAttr, CAClientArea) ;
1256 CONVATTR_STATUS_CLIENTAREA (*pCurAttr) = *pNewArea ;
1257 fRetval = True ;
1258 } else {
1259 register XRectangle* pCurArea ;
1260
1261 pCurArea = &CONVATTR_STATUS_CLIENTAREA (*pCurAttr) ;
1262 if (pCurArea->x != pNewArea->x ||
1263 pCurArea->y != pNewArea->y ||
1264 pCurArea->width != pNewArea->width ||
1265 pCurArea->height != pNewArea->height)
1266 fRetval = True ;
1267 *pCurArea = *pNewArea ;
1268 }
1269 if (fRetval) {
1270 register int nDX = 0 ;
1271 if (wgThis->toverwin.m_wndModeshell != None &&
1272 !wgThis->toverwin.m_fFloatingModeshell) {
1273 XMoveWindow (XtDisplay (gw), wgThis->toverwin.m_wndModeshell, pNewArea->x, pNewArea->y) ;
1274 nDX = wgThis->toverwin.m_szModeshell.cx ;
1275 }
1276 toverTheSpotWindow_setMinibufferFrameSize (gw, pNewArea->x + nDX, pNewArea->y, pNewArea->width - nDX, pNewArea->height) ;
1277 }
1278 return fRetval ;
1279 }
1280
1281 Boolean
toverTheSpotWindow_onSetSAttributeFont(register Widget gw,register const TConversionAttribute * pAttribute)1282 toverTheSpotWindow_onSetSAttributeFont (
1283 register Widget gw,
1284 register const TConversionAttribute* pAttribute)
1285 {
1286 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1287 register TConversionAttribute* pCurAttr ;
1288
1289 assert (gw != NULL) ;
1290 assert (pAttribute != NULL) ;
1291
1292 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1293 /* modeshell ��Τ�ɬ�פ��� */
1294 TFontSet_Copy (&wgThis->toverwin.m_fsMinibuf, &CONVATTR_STATUS_FONTSET (*pAttribute)) ;
1295
1296 if (wgThis->toverwin.m_wgMinibuf != NULL &&
1297 XtClass (wgThis->toverwin.m_wgMinibuf) == tsubWindowFrameWidgetClass) {
1298 TConversionAttribute ca ;
1299
1300 /* modeshell �ΰ��֤������餵�ʤ��Ȥ����ʤ��Τǡ����ΰ��֤Ǥ�
1301 * �ޤ����� */
1302 TConvAttr_Initialize (&ca) ;
1303 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
1304 SET_CONVATTR_PREEDIT_MASK (ca, CAFont) ;
1305 TFontSet_Copy (&CONVATTR_PREEDIT_FONTSET (ca), &CONVATTR_STATUS_FONTSET (*pAttribute)) ;
1306 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
1307 TConvAttr_Uninitialize (&ca) ;
1308 }
1309 SET_CONVATTR_STATUS_MASK (*pCurAttr, CAFont) ;
1310 UNSET_CONVATTR_STATUS_MASK (*pCurAttr, CALineSpacing) ;
1311 return True ;
1312 }
1313
1314 Boolean
toverTheSpotWindow_onSetSAttributeLineSpacing(register Widget gw,register const TConversionAttribute * pAttribute)1315 toverTheSpotWindow_onSetSAttributeLineSpacing (
1316 register Widget gw,
1317 register const TConversionAttribute* pAttribute)
1318 {
1319 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1320 register TConversionAttribute* pCurAttr ;
1321
1322 assert (gw != NULL) ;
1323 assert (pAttribute != NULL) ;
1324
1325 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1326 if (!IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) ||
1327 !IS_CONVATTR_STATUS_MASK (*pCurAttr, CALineSpacing) ||
1328 pCurAttr->m_Status.m_nLineSpacing != pAttribute->m_Status.m_nLineSpacing) {
1329 SET_CONVATTR_MASK (*pCurAttr, CAStatusMask) ;
1330 SET_CONVATTR_STATUS_MASK (*pCurAttr, CALineSpacing) ;
1331 pCurAttr->m_Status.m_nLineSpacing = pAttribute->m_Status.m_nLineSpacing ;
1332
1333 if (wgThis->toverwin.m_wgMinibuf != NULL &&
1334 XtClass (wgThis->toverwin.m_wgMinibuf) == tsubWindowFrameWidgetClass) {
1335 TConversionAttribute ca ;
1336
1337 TConvAttr_Initialize (&ca) ;
1338 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
1339 SET_CONVATTR_PREEDIT_MASK (ca, CALineSpacing) ;
1340 ca.m_Preedit.m_nLineSpacing = pAttribute->m_Status.m_nLineSpacing ;
1341 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
1342 TConvAttr_Uninitialize (&ca) ;
1343 }
1344 return True ;
1345 }
1346 return False ;
1347 }
1348
1349 Boolean
toverTheSpotWindow_onSetSAttributeColormap(register Widget gw,register const TConversionAttribute * pAttribute)1350 toverTheSpotWindow_onSetSAttributeColormap (
1351 register Widget gw,
1352 register const TConversionAttribute* pAttribute)
1353 {
1354 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1355 register TConversionAttribute* pCurAttr ;
1356 register Colormap colNew ;
1357 TConversionAttribute ca ;
1358
1359 assert (gw != NULL) ;
1360 assert (pAttribute != NULL) ;
1361
1362 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1363 colNew = pAttribute->m_Preedit.m_colormap ;
1364 if (IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) &&
1365 IS_CONVATTR_STATUS_MASK (*pCurAttr, CAColormap) &&
1366 pCurAttr->m_Status.m_colormap == colNew)
1367 return False ;
1368
1369 SET_CONVATTR_MASK (*pCurAttr, CAStatusMask) ;
1370 SET_CONVATTR_STATUS_MASK (*pCurAttr, CAColormap) ;
1371 pCurAttr->m_Status.m_colormap = colNew ;
1372
1373 if (!wgThis->toverwin.m_fFloatingModeshell &&
1374 wgThis->toverwin.m_wndModeshell != None)
1375 XSetWindowColormap (XtDisplay (gw), wgThis->toverwin.m_wndModeshell, colNew) ;
1376
1377 if (wgThis->toverwin.m_wgMinibuf != NULL &&
1378 XtClass (wgThis->toverwin.m_wgMinibuf) == tsubWindowFrameWidgetClass) {
1379 TConvAttr_Initialize (&ca) ;
1380 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
1381 SET_CONVATTR_PREEDIT_MASK (ca, CAColormap) ;
1382 ca.m_Preedit.m_colormap = colNew ;
1383 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
1384 TConvAttr_Uninitialize (&ca) ;
1385 }
1386 return False ;
1387 }
1388
1389 Boolean
toverTheSpotWindow_onSetSAttributeBackground(register Widget gw,register const TConversionAttribute * pAttribute)1390 toverTheSpotWindow_onSetSAttributeBackground (
1391 register Widget gw,
1392 register const TConversionAttribute* pAttribute)
1393 {
1394 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1395 register TConversionAttribute* pCurAttr ;
1396 register Pixel pxlBack ;
1397 TConversionAttribute ca ;
1398
1399 assert (gw != NULL) ;
1400 assert (pAttribute != NULL) ;
1401
1402 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1403 pxlBack = CONVATTR_STATUS_BACKGROUND (*pAttribute) ;
1404 if (!IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) ||
1405 !IS_CONVATTR_STATUS_MASK (*pCurAttr, CABackgroundPixel)) {
1406 SET_CONVATTR_MASK (*pCurAttr, CAStatusMask) ;
1407 SET_CONVATTR_STATUS_MASK (*pCurAttr, CABackgroundPixel) ;
1408 } else {
1409 if (CONVATTR_STATUS_BACKGROUND (*pCurAttr) == pxlBack)
1410 return False ;
1411 }
1412 CONVATTR_STATUS_BACKGROUND (*pCurAttr) = pxlBack ;
1413
1414 if (!wgThis->toverwin.m_fFloatingModeshell &&
1415 wgThis->toverwin.m_wndModeshell != None)
1416 XSetWindowBackground (XtDisplay (gw), wgThis->toverwin.m_wndModeshell, pxlBack) ;
1417
1418 if (wgThis->toverwin.m_wgMinibuf != NULL &&
1419 XtClass (wgThis->toverwin.m_wgMinibuf) == tsubWindowFrameWidgetClass) {
1420 TConvAttr_Initialize (&ca) ;
1421 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
1422 SET_CONVATTR_PREEDIT_MASK (ca, CABackgroundPixel) ;
1423 CONVATTR_PREEDIT_BACKGROUND (ca) = pxlBack ;
1424 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
1425 TConvAttr_Uninitialize (&ca) ;
1426 }
1427 return False ;
1428 }
1429
1430 Boolean
toverTheSpotWindow_onSetSAttributeForeground(register Widget gw,register const TConversionAttribute * pAttribute)1431 toverTheSpotWindow_onSetSAttributeForeground (
1432 register Widget gw,
1433 register const TConversionAttribute* pAttribute)
1434 {
1435 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1436 register TConversionAttribute* pCurAttr ;
1437 register Pixel pxlFore ;
1438 TConversionAttribute ca ;
1439
1440 assert (gw != NULL) ;
1441 assert (pAttribute != NULL) ;
1442
1443 pCurAttr = &wgThis->toverwin.m_caCurrent ;
1444 pxlFore = CONVATTR_STATUS_FOREGROUND (*pAttribute) ;
1445 if (!IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) ||
1446 !IS_CONVATTR_STATUS_MASK (*pCurAttr, CAForegroundPixel)) {
1447 SET_CONVATTR_MASK (*pCurAttr, CAStatusMask) ;
1448 SET_CONVATTR_STATUS_MASK (*pCurAttr, CAForegroundPixel) ;
1449 } else {
1450 if (CONVATTR_STATUS_FOREGROUND (*pCurAttr) == pxlFore)
1451 return False ;
1452 }
1453 CONVATTR_STATUS_FOREGROUND (*pCurAttr) = pxlFore ;
1454
1455 if (wgThis->toverwin.m_wgMinibuf != NULL &&
1456 XtClass (wgThis->toverwin.m_wgMinibuf) == tsubWindowFrameWidgetClass) {
1457 TConvAttr_Initialize (&ca) ;
1458 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
1459 SET_CONVATTR_PREEDIT_MASK (ca, CAForegroundPixel) ;
1460 CONVATTR_PREEDIT_FOREGROUND (ca) = pxlFore ;
1461 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
1462 TConvAttr_Uninitialize (&ca) ;
1463 }
1464 return True ;
1465 }
1466
1467 /* ���楳���ɤϲ��Ԥ������Ƥ��ʤ������ʤ�̤뤤�����ɤ��ʤ��ġ�
1468 */
1469 Boolean
toverTheSpotWindow_puts(register Widget gw,register const Char * pText,register int nText)1470 toverTheSpotWindow_puts (
1471 register Widget gw,
1472 register const Char* pText,
1473 register int nText)
1474 {
1475 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1476 register TOverTheSpotTerminal* pTerminal ;
1477 register TOverTheSpotTerminalTextControl* pControl ;
1478 register const Char* ptr ;
1479 register const Char* pStrInput ;
1480 register int nptr, nInput, nControl ;
1481 register Boolean fNewControl = False ;
1482 TOverTheSpotTerminalTextControl localControl ;
1483
1484 if (wgThis->toverwin.m_fDestroy)
1485 return False ;
1486
1487 pTerminal = &wgThis->toverwin.m_Terminal ;
1488 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
1489 if (nControl > 0) {
1490 pControl = TVarbuffer_GetBuffer (&pTerminal->m_vbufControl) ;
1491 pControl = pControl + nControl - 1 ;
1492 if (TSUCCEEDED (pControl->m_fFinish) ||
1493 pControl->m_fRev != pTerminal->m_fRev) {
1494 /* ���ξ��ˤϿ���������ȥ��뤬ɬ�ס�*/
1495 pControl = &localControl ;
1496 fNewControl = True ;
1497 }
1498 } else {
1499 pControl = &localControl ;
1500 fNewControl = True ;
1501 }
1502 if (fNewControl) {
1503 pControl->m_fRev = pTerminal->m_fRev ;
1504 pControl->m_nTextPos = TVarbuffer_GetUsage (&pTerminal->m_vbufText) ;
1505 pControl->m_nText = 0 ;
1506 pControl->m_fFinish = False ;
1507 }
1508
1509 ptr = pStrInput = pText ;
1510 nptr = nText ;
1511 while (nptr > 0) {
1512 if (*ptr == '\n') {
1513 nInput = ptr - pStrInput ;
1514 if (nInput > 0 &&
1515 TFAILED (TVarbuffer_Add (&pTerminal->m_vbufText, pStrInput, nInput)))
1516 return False ;
1517 pControl->m_nText += nInput ;
1518 #if defined (DEBUG) || 0
1519 fprintf (stderr, "TextPos(%d), Text(%d), %d, %d\n",
1520 pControl->m_nTextPos, pControl->m_nText, nInput, nText) ;
1521 #endif
1522 pControl->m_fFinish = True ;
1523 if (fNewControl) {
1524 if (TFAILED (TVarbuffer_Add (&pTerminal->m_vbufControl, pControl, 1)))
1525 return False ;
1526 }
1527 pControl = &localControl ;
1528 fNewControl = True ;
1529 pControl->m_fRev = pTerminal->m_fRev ;
1530 pControl->m_nTextPos = TVarbuffer_GetUsage (&pTerminal->m_vbufText) ;
1531 pControl->m_nText = 0 ;
1532 pControl->m_fFinish = False ;
1533 pTerminal->m_nLine ++ ; /* ���Ԥ��뤫�ϥ쥤�����Ȥ˽��פʤΤǵ������롣*/
1534 pStrInput = ptr + 1 ;
1535 }
1536 ptr ++ ;
1537 nptr -- ;
1538 }
1539 if (ptr != pStrInput) {
1540 nInput = ptr - pStrInput ;
1541 if (TFAILED (TVarbuffer_Add (&pTerminal->m_vbufText, pStrInput, nInput)))
1542 return False ;
1543 pControl->m_nText += nInput ;
1544 #if defined (DEBUG) || 0
1545 fprintf (stderr, "TextPos(%d), Text(%d), %d, %d\n",
1546 pControl->m_nTextPos, pControl->m_nText, nInput, nText) ;
1547 #endif
1548 }
1549 if (fNewControl) {
1550 if (TFAILED (TVarbuffer_Add (&pTerminal->m_vbufControl, pControl, 1)))
1551 return False ;
1552 }
1553 return True ;
1554 }
1555
1556 Boolean
toverTheSpotWindow_putchar(register Widget gw,const Char cc)1557 toverTheSpotWindow_putchar (
1558 register Widget gw,
1559 const Char cc)
1560 {
1561 return toverTheSpotWindow_puts (gw, &cc, 1) ;
1562 }
1563
1564 void
toverTheSpotWindow_flush(register Widget gw)1565 toverTheSpotWindow_flush (
1566 register Widget gw)
1567 {
1568 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1569
1570 if (wgThis->toverwin.m_fActive && !wgThis->toverwin.m_fDestroy)
1571 toverTheSpotWindow_configureTerminalWindow (gw) ;
1572 return ;
1573 }
1574
1575 /*
1576 */
1577 void
toverTheSpotWindow_clear(register Widget gw)1578 toverTheSpotWindow_clear (
1579 register Widget gw)
1580 {
1581 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1582 register TOverTheSpotTerminal* pTerminal ;
1583
1584 if (wgThis->toverwin.m_fDestroy)
1585 return ;
1586
1587 pTerminal = &wgThis->toverwin.m_Terminal ;
1588 TVarbuffer_Clear (&pTerminal->m_vbufText) ;
1589 TVarbuffer_Clear (&pTerminal->m_vbufControl) ;
1590 pTerminal->m_nCursor = 0 ;
1591 pTerminal->m_nLine = 0 ;
1592 return ;
1593 }
1594
1595 /*
1596 */
1597 void
toverTheSpotWindow_rev(register Widget gw,register Boolean fRev)1598 toverTheSpotWindow_rev (
1599 register Widget gw,
1600 register Boolean fRev)
1601 {
1602 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1603 register TOverTheSpotTerminal* pTerminal ;
1604
1605 pTerminal = &wgThis->toverwin.m_Terminal ;
1606 pTerminal->m_fRev = fRev ;
1607 return ;
1608 }
1609
1610 Boolean
toverTheSpotWindow_rectVariablep(register Widget gw)1611 toverTheSpotWindow_rectVariablep (
1612 register Widget gw)
1613 {
1614 return True ;
1615 }
1616
1617 Boolean
toverTheSpotWindow_haveExternModelinep(register Widget gw)1618 toverTheSpotWindow_haveExternModelinep (
1619 register Widget gw)
1620 {
1621 return True ;
1622 }
1623
1624 Boolean
toverTheSpotWindow_setModeline(register Widget gw,register const Char * pString,register int nString)1625 toverTheSpotWindow_setModeline (
1626 register Widget gw,
1627 register const Char* pString,
1628 register int nString)
1629 {
1630 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1631 register const Char* pPrevString ;
1632 register int nPrevString ;
1633 register Boolean fRedraw ;
1634
1635 if (wgThis->toverwin.m_fDestroy)
1636 return True ;
1637
1638 pPrevString = TVarbuffer_GetBuffer (&wgThis->toverwin.m_vbufModeshellText) ;
1639 nPrevString = TVarbuffer_GetUsage (&wgThis->toverwin.m_vbufModeshellText) ;
1640 fRedraw = (nPrevString != nString || memcmp (pPrevString, pString, nString * sizeof (Char)) != 0) ;
1641 if (!fRedraw)
1642 return True ;
1643 TVarbuffer_Clear (&wgThis->toverwin.m_vbufModeshellText) ;
1644 if (TFAILED (TVarbuffer_Add (&wgThis->toverwin.m_vbufModeshellText, pString, nString)))
1645 return False ;
1646 toverTheSpotWindow_resizeModeshellWindow (gw) ;
1647 toverTheSpotWindow_onModeshellExpose (gw, 0) ;
1648 //XClearArea (XtDisplay (gw), wgThis->toverwin.m_wndModeshell, 0, 0, 0, 0, True) ;
1649 return True ;
1650 }
1651
1652 Boolean
toverTheSpotWindow_autoPopupp(register Widget gw)1653 toverTheSpotWindow_autoPopupp (
1654 register Widget gw)
1655 {
1656 return False ;
1657 }
1658
1659
1660 /* Terminal Window �Υ�����Ĵ����Ԥ���
1661 *
1662 * 3�Ĥ� Window ���ڤ��ؤ��ƻȤäƤ���Τ��������줾��� Window �ΰ��֤ȥ�����
1663 * ������ˤʤ롣
1664 */
1665 void
toverTheSpotWindow_configureTerminalWindow(register Widget gw)1666 toverTheSpotWindow_configureTerminalWindow (
1667 register Widget gw)
1668 {
1669 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1670 register TOverTheSpotTerminal* pTerminal ;
1671 register TOverTheSpotTerminalTextControl* pControl ;
1672 register TOverTheSpotTerminalTextControl* pControlHead ;
1673 register Display* pDisplay ;
1674 register const Char* pText ;
1675 register int nControl, nWindow, nMaxWindow, nClientAreaX, nClientAreaY ;
1676 register int nX, nY, nMasterClientAreaWidth, nClientAreaWidth, nFocusX, nFocusY ;
1677 register TFontSet* pFontSet ;
1678 int rnLineCount [3], nLineSpacing ;
1679 TSize sz ;
1680 register Boolean fEmpty, fLineSpacing ;
1681
1682 pDisplay = XtDisplay (gw) ;
1683 pTerminal = &wgThis->toverwin.m_Terminal ;
1684 pText = TVarbuffer_GetBuffer (&pTerminal->m_vbufText) ;
1685 pControlHead = TVarbuffer_GetBuffer (&pTerminal->m_vbufControl) ;
1686 pControl = pControlHead ;
1687 nControl = TVarbuffer_GetUsage (&pTerminal->m_vbufControl) ;
1688 pFontSet = &wgThis->toverwin.m_fsTerminal ;
1689 fEmpty = (nControl <= 0) ;
1690 fLineSpacing = toverTheSpotWindow_getPreeditLineSpacing (gw, &nLineSpacing) ;
1691
1692 nWindow = 0 ;
1693 rnLineCount [nWindow ++] = 1 ;
1694 if ((pTerminal->m_nLine - 2) >= 0)
1695 rnLineCount [nWindow ++] = pTerminal->m_nLine - 1 ;
1696 if (pTerminal->m_nLine >= 1)
1697 rnLineCount [nWindow ++] = 1 ;
1698
1699 nMaxWindow = nWindow ;
1700 nWindow = 0 ;
1701 /* ������֤����ꡣ*/
1702 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask) &&
1703 IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAClientArea)) {
1704 nMasterClientAreaWidth = wgThis->toverwin.m_caCurrent.m_Preedit.m_area.width ;
1705 nClientAreaX = wgThis->toverwin.m_caCurrent.m_Preedit.m_area.x ;
1706 nClientAreaY = wgThis->toverwin.m_caCurrent.m_Preedit.m_area.y ;
1707 } else {
1708 nClientAreaX = 0 ;
1709 nClientAreaY = 0 ;
1710 nMasterClientAreaWidth = 65535 ;
1711 }
1712 nFocusX = wgThis->toverwin.m_ptFocus.x ;
1713 nFocusY = wgThis->toverwin.m_ptFocus.y ;
1714 nX = wgThis->toverwin.m_ptSpot.x ;
1715 nY = wgThis->toverwin.m_ptSpot.y - TFontSet_GetAscent (pFontSet) ;
1716 #if defined (DEBUG) || 0
1717 fprintf (stderr, "Spot:(%d, %d) Client:(%d, %d, %d, %d), line=%d\n",
1718 wgThis->toverwin.m_ptSpot.x,
1719 wgThis->toverwin.m_ptSpot.y,
1720 nClientAreaX,
1721 nClientAreaY,
1722 nMasterClientAreaWidth - wgThis->toverwin.m_ptSpot.x,
1723 wgThis->toverwin.m_caCurrent.m_Preedit.m_area.height,
1724 pTerminal->m_nLine) ;
1725 #endif
1726 nClientAreaWidth = nMasterClientAreaWidth - wgThis->toverwin.m_ptSpot.x ;
1727
1728 while (nWindow < nMaxWindow) {
1729 register int nCurLineWidth, nCurLineHeight, nWidth, nHeight, nLine ;
1730 register Boolean fFinish ;
1731
1732 pTerminal->m_rnControlOffset [nWindow] = pControl - pControlHead ;
1733
1734 nLine = rnLineCount [nWindow] ;
1735 nCurLineWidth = 0 ;
1736 nCurLineHeight = 0 ;
1737 nWidth = 0 ;
1738 nHeight = 0 ;
1739 while (nControl > 0) {
1740 TGetTextExtents (pFontSet, pText + pControl->m_nTextPos, pControl->m_nText, &sz) ;
1741 #if defined (DEBUG) || 0
1742 fprintf (stderr, "Control: TextPos(%d), Text(%d), Rev(%d), Fin(%d), %d x %d\n",
1743 pControl->m_nTextPos, pControl->m_nText,
1744 pControl->m_fRev, pControl->m_fFinish,
1745 sz.cx, sz.cy) ;
1746 #endif
1747 nCurLineWidth += sz.cx ;
1748 nCurLineHeight = (nCurLineHeight < sz.cy)? sz.cy : nCurLineHeight ;
1749 fFinish = pControl->m_fFinish ;
1750 pControl ++ ;
1751 nControl -- ;
1752
1753 if (fFinish || nControl <= 0) {
1754 nHeight += (fLineSpacing)? nLineSpacing : nCurLineHeight ;
1755 nWidth = (nWidth < nCurLineWidth)? nCurLineWidth : nWidth ;
1756 nLine -- ;
1757 if (nLine <= 0)
1758 break ;
1759 nCurLineWidth = 0 ;
1760 nCurLineHeight = 0 ;
1761 }
1762 }
1763 nWidth = (nWidth > nClientAreaWidth)? nClientAreaWidth : nWidth ;
1764
1765 #if defined (DEBUG) || 0
1766 fprintf (stderr, "Window(%d): (%d, %d, %d, %d)\n",
1767 nWindow, nX, nY, nWidth, nHeight) ;
1768 #endif
1769 if (pTerminal->m_wndTerminal [nWindow] != None) {
1770 if (nWidth > 0 && nHeight > 0) {
1771 XMoveResizeWindow (pDisplay, pTerminal->m_wndTerminal [nWindow], nFocusX + nX, nFocusY + nY, nWidth, nHeight) ;
1772 XMapRaised (pDisplay, pTerminal->m_wndTerminal [nWindow]) ;
1773 (srOverTheSpotTerminalExposeProc [nWindow])(gw, 0) ;
1774 // XClearArea (pDisplay, pTerminal->m_wndTerminal [nWindow], 0, 0, 0, 0, True) ;
1775 } else {
1776 XUnmapWindow (pDisplay, pTerminal->m_wndTerminal [nWindow]) ;
1777 }
1778 }
1779 nX = nClientAreaX ;
1780 nY += nHeight ;
1781 nClientAreaWidth = nMasterClientAreaWidth ;
1782 nWindow ++ ;
1783 }
1784 while (nWindow < 3) {
1785 if (pTerminal->m_wndTerminal [nWindow] != None)
1786 XUnmapWindow (pDisplay, pTerminal->m_wndTerminal [nWindow]) ;
1787 pTerminal->m_rnControlOffset [nWindow] = -1 ;
1788 nWindow ++ ;
1789 }
1790
1791 /* Modeshell ���ư�����롣���̳��˽Фʤ��褦�ˤ�������å����ʤ���*/
1792 if (wgThis->toverwin.m_wndModeshell != None &&
1793 wgThis->toverwin.m_fFloatingModeshell) {
1794
1795 if (nMaxWindow <= 1) {
1796 nX = wgThis->toverwin.m_ptSpot.x ;
1797 if (fEmpty) {
1798 register int nFontHeight = TFontSet_GetHeight (pFontSet) ;
1799 nY += (fLineSpacing && nFontHeight < nLineSpacing)? nLineSpacing : nFontHeight ;
1800 }
1801 } else {
1802 nX = nClientAreaX ;
1803 }
1804 #if defined (DEBUG)
1805 fprintf (stderr, "spot(x,y,ls,empty)=(%d,%d,%d,%d)\n", nX, nY, nLineSpacing, fEmpty) ;
1806 #endif
1807 XMoveWindow (pDisplay, wgThis->toverwin.m_wndModeshell, nFocusX + nX, nFocusY + nY) ;
1808 }
1809 return ;
1810 }
1811
1812 void
toverTheSpotWindow_displayTerminal(register Widget gw,register Window wndTerminal,register GC gc,register TOverTheSpotTerminalTextControl * pControl,register int nControl,register int nLine)1813 toverTheSpotWindow_displayTerminal (
1814 register Widget gw,
1815 register Window wndTerminal,
1816 register GC gc,
1817 register TOverTheSpotTerminalTextControl* pControl,
1818 register int nControl,
1819 register int nLine)
1820 {
1821 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1822 register TOverTheSpotTerminal* pTerminal ;
1823 register Display* pDisplay ;
1824 register const Char* pText ;
1825 register TFontSet* pFontSet ;
1826 register Pixel pxlForeground, pxlBackground ;
1827 register int x, y, nHeight, nAscent, nDescent ;
1828 register Boolean fLineSpacing ;
1829 int nLineSpacing ;
1830 TSize sz ;
1831
1832 if (nControl <= 0 || nLine <= 0)
1833 return ;
1834
1835 pDisplay = XtDisplay (wgThis) ;
1836 pTerminal = &wgThis->toverwin.m_Terminal ;
1837 pFontSet = &wgThis->toverwin.m_fsTerminal ;
1838 x = 0 ;
1839 nAscent = TFontSet_GetAscent (pFontSet) ;
1840 nDescent = TFontSet_GetDescent (pFontSet) ;
1841 y = nAscent ;
1842 nHeight = 0 ;
1843 fLineSpacing = toverTheSpotWindow_getPreeditLineSpacing (gw, &nLineSpacing) ;
1844 pxlForeground = wgThis->toverwin.m_pxlForeground ;
1845 pxlBackground = wgThis->core.background_pixel ;
1846 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask)) {
1847 if (IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CAForegroundPixel))
1848 pxlForeground = CONVATTR_PREEDIT_FOREGROUND (wgThis->toverwin.m_caCurrent) ;
1849 if (IS_CONVATTR_PREEDIT_MASK (wgThis->toverwin.m_caCurrent, CABackgroundPixel))
1850 pxlBackground = CONVATTR_PREEDIT_BACKGROUND (wgThis->toverwin.m_caCurrent) ;
1851 }
1852 #if defined (DEBUG)
1853 fprintf (stderr, "displayTerminal (Fore:%lx, Back:%lx)\n",
1854 pxlForeground, pxlBackground) ;
1855 #endif
1856
1857 pText = TVarbuffer_GetBuffer (&pTerminal->m_vbufText) ;
1858 while (nControl > 0) {
1859 #if defined (DEBUG)
1860 fprintf (stderr, "[%d(%d)]", pControl->m_nText, pControl->m_fRev) ;
1861 #endif
1862 if (pControl->m_fRev) {
1863 XSetBackground (pDisplay, gc, pxlForeground) ;
1864 XSetForeground (pDisplay, gc, pxlBackground) ;
1865 } else {
1866 XSetForeground (pDisplay, gc, pxlForeground) ;
1867 XSetBackground (pDisplay, gc, pxlBackground) ;
1868 }
1869 if (pControl->m_nText > 0) {
1870 TTextOut (pDisplay, wndTerminal, gc, pFontSet, x, y, pText + pControl->m_nTextPos, pControl->m_nText, &sz) ;
1871 x += sz.cx ;
1872 nHeight = (nHeight < sz.cy)? sz.cy : nHeight ;
1873 }
1874
1875 /* ���ιԤ��ޤ�뤫�ɤ����Υ����å���*/
1876 if (pControl->m_fFinish) {
1877 XClearArea (pDisplay, wndTerminal, x, y - nAscent, 65535, y + nDescent, False) ;
1878 nLine -- ;
1879 if (nLine <= 0)
1880 break ;
1881 x = 0 ;
1882 y += (fLineSpacing)? nLineSpacing : nHeight ;
1883 nHeight = 0 ;
1884 }
1885 pControl ++ ;
1886 nControl -- ;
1887 }
1888 #if defined (DEBUG)
1889 fprintf (stderr, "\n") ;
1890 #endif
1891 return ;
1892 }
1893
1894 /* Spot ������ϤǤ��ʤ�������ˤϡ�Terminal Window �Ȥΰ��ִط���ɬ�ס�
1895 */
1896 void
toverTheSpotWindow_resizeModeshellWindow(register Widget gw)1897 toverTheSpotWindow_resizeModeshellWindow (
1898 register Widget gw)
1899 {
1900 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1901 register Display* pDisplay = XtDisplay (gw) ;
1902 register const Char* pString ;
1903 register int nString ;
1904 register Boolean fFixedModeshell ;
1905 TSize sz ;
1906
1907 if (wgThis->toverwin.m_wndModeshell == None)
1908 return ;
1909
1910 fFixedModeshell = (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAStatusMask) &&
1911 IS_CONVATTR_STATUS_MASK (wgThis->toverwin.m_caCurrent, CAClientArea) &&
1912 wgThis->toverwin.m_wndClient != wgThis->toverwin.m_wndFocus) ;
1913
1914 pString = TVarbuffer_GetBuffer (&wgThis->toverwin.m_vbufModeshellText) ;
1915 nString = TVarbuffer_GetUsage (&wgThis->toverwin.m_vbufModeshellText) ;
1916 if (nString <= 0) {
1917 XUnmapWindow (pDisplay, wgThis->toverwin.m_wndModeshell) ;
1918 sz.cx = 0 ;
1919 sz.cy = 0 ;
1920 } else {
1921 register TFontSet* pFontSet ;
1922
1923 if (wgThis->toverwin.m_fActive)
1924 XMapWindow (pDisplay, wgThis->toverwin.m_wndModeshell) ;
1925 if (fFixedModeshell) {
1926 pFontSet = &wgThis->toverwin.m_fsMinibuf ;
1927 } else {
1928 pFontSet = &wgThis->toverwin.m_fsTerminal ;
1929 }
1930 TGetTextExtents (pFontSet, pString, nString, &sz) ;
1931 XResizeWindow (pDisplay, wgThis->toverwin.m_wndModeshell, sz.cx, sz.cy) ;
1932 }
1933 wgThis->toverwin.m_szModeshell = sz ;
1934
1935 if (fFixedModeshell) {
1936 register const XRectangle* pRC = &CONVATTR_STATUS_CLIENTAREA (wgThis->toverwin.m_caCurrent) ;
1937 toverTheSpotWindow_setMinibufferFrameSize (gw, pRC->x + sz.cx, pRC->y, pRC->width - sz.cx, pRC->height) ;
1938 }
1939 return ;
1940 }
1941
1942 int
toverTheSpotWindow_configureFocusOffset(register Widget gw)1943 toverTheSpotWindow_configureFocusOffset (
1944 register Widget gw)
1945 {
1946 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1947 register Display* pDisplay = XtDisplay (gw) ;
1948 register Window wndClient, wndFocus ;
1949 register Boolean fRedraw = False ;
1950 int x, y, nFocusX, nFocusY ;
1951 Window dummy ;
1952
1953 wndClient = wgThis->toverwin.m_wndClient ;
1954 wndFocus = wgThis->toverwin.m_wndFocus ;
1955 XTranslateCoordinates (pDisplay, wndClient, RootWindowOfScreen (XtScreen (gw)), 0, 0, &x, &y, &dummy) ;
1956 if (wndClient != wndFocus) {
1957 /* Client Window ����� Focus Window ���ɤ�������줿���֤ˤ���
1958 * �Τ������Ƥ�����
1959 */
1960 XTranslateCoordinates (pDisplay, wndFocus, wndClient, 0, 0, &nFocusX, &nFocusY, &dummy) ;
1961 } else {
1962 nFocusX = nFocusY = 0 ;
1963 }
1964 if (wgThis->toverwin.m_ptClient.x != x || wgThis->toverwin.m_ptClient.y != y) {
1965 wgThis->toverwin.m_ptClient.x = x ;
1966 wgThis->toverwin.m_ptClient.y = y ;
1967 fRedraw = True ;
1968 }
1969 if (wgThis->toverwin.m_ptFocus.x != nFocusX || wgThis->toverwin.m_ptFocus.y != nFocusY) {
1970 wgThis->toverwin.m_ptFocus.x = nFocusX ;
1971 wgThis->toverwin.m_ptFocus.y = nFocusY ;
1972 fRedraw = True ;
1973 }
1974 return fRedraw ;
1975 }
1976
1977 /*
1978 *
1979 */
1980 void
toverTheSpotWindow_popup(register Widget gw)1981 toverTheSpotWindow_popup (
1982 register Widget gw)
1983 {
1984 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
1985 register TOverTheSpotTerminal* pTerminal ;
1986 register int i ;
1987
1988 pTerminal = &wgThis->toverwin.m_Terminal ;
1989 for (i = 0 ; i < 3 ; i ++) {
1990 if (pTerminal->m_wndTerminal [i] != None)
1991 XMapWindow (XtDisplay (gw), pTerminal->m_wndTerminal [i]) ;
1992 }
1993 if (wgThis->toverwin.m_wndModeshell != None)
1994 XMapWindow (XtDisplay (gw), wgThis->toverwin.m_wndModeshell) ;
1995
1996 if (!wgThis->toverwin.m_fActive) {
1997 toverTheSpotWindow_configureTerminalWindow (gw) ;
1998 wgThis->toverwin.m_fActive = True ;
1999 }
2000 return ;
2001 }
2002
2003 void
toverTheSpotWindow_popdown(register Widget gw)2004 toverTheSpotWindow_popdown (
2005 register Widget gw)
2006 {
2007 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2008 register TOverTheSpotTerminal* pTerminal ;
2009 register int i ;
2010
2011 pTerminal = &wgThis->toverwin.m_Terminal ;
2012 for (i = 0 ; i < 3 ; i ++) {
2013 if (pTerminal->m_wndTerminal [i] != None)
2014 XUnmapWindow (XtDisplay (gw), pTerminal->m_wndTerminal [i]) ;
2015 }
2016 if (wgThis->toverwin.m_wndModeshell != None)
2017 XUnmapWindow (XtDisplay (gw), wgThis->toverwin.m_wndModeshell) ;
2018 wgThis->toverwin.m_fActive = False ;
2019 return ;
2020 }
2021
2022 Boolean
toverTheSpotWindow_getPreeditLineSpacing(register Widget gw,register int * pnLineSpacing)2023 toverTheSpotWindow_getPreeditLineSpacing (
2024 register Widget gw,
2025 register int* pnLineSpacing)
2026 {
2027 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2028 register TConversionAttribute* pCurAttr ;
2029
2030 assert (gw != NULL) ;
2031 assert (pnLineSpacing != NULL) ;
2032
2033 pCurAttr = &wgThis->toverwin.m_caCurrent ;
2034 if (!IS_CONVATTR_MASK (*pCurAttr, CAPreeditMask) ||
2035 !IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CALineSpacing)) {
2036 *pnLineSpacing = TFontSet_GetHeight (&wgThis->toverwin.m_fsTerminal) ;
2037 return False ;
2038 }
2039 *pnLineSpacing = pCurAttr->m_Preedit.m_nLineSpacing ;
2040 return True ;
2041 }
2042
2043 void
toverTheSpotWindow_setMinibufferFrameSize(register Widget gw,register int nX,register int nY,register int nWidth,register int nHeight)2044 toverTheSpotWindow_setMinibufferFrameSize (
2045 register Widget gw,
2046 register int nX,
2047 register int nY,
2048 register int nWidth,
2049 register int nHeight)
2050 {
2051 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2052 TConversionAttribute ca ;
2053
2054 if (wgThis->toverwin.m_fFloatingModeshell ||
2055 wgThis->toverwin.m_wgMinibuf == NULL ||
2056 XtClass (wgThis->toverwin.m_wgMinibuf) != tsubWindowFrameWidgetClass)
2057 return ;
2058
2059 TConvAttr_Initialize (&ca) ;
2060 SET_CONVATTR_MASK (ca, CAPreeditMask) ;
2061 SET_CONVATTR_PREEDIT_MASK (ca, CAClientArea) ;
2062 ca.m_Preedit.m_area.x = nX ;
2063 ca.m_Preedit.m_area.y = nY ;
2064 ca.m_Preedit.m_area.width = nWidth ;
2065 ca.m_Preedit.m_area.height = nHeight ;
2066 TFrame_SetAttribute (wgThis->toverwin.m_wgMinibuf, &ca) ;
2067 TConvAttr_Uninitialize (&ca) ;
2068 return ;
2069 }
2070
2071 unsigned long
toverTheSpotWindow_getPreeditWindowAttribute(register Widget gw,register XSetWindowAttributes * pSWA)2072 toverTheSpotWindow_getPreeditWindowAttribute (
2073 register Widget gw,
2074 register XSetWindowAttributes* pSWA)
2075 {
2076 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2077 register TConversionAttribute* pCurAttr ;
2078 register unsigned long lMask ;
2079 register Pixel pxlBack ;
2080
2081 pCurAttr = &wgThis->toverwin.m_caCurrent ;
2082 pxlBack = wgThis->core.background_pixel ;
2083 lMask = CWOverrideRedirect | CWBackPixel | CWBorderPixel ;
2084
2085 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAPreeditMask)) {
2086 if (IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CABackgroundPixel))
2087 pxlBack = CONVATTR_PREEDIT_BACKGROUND (*pCurAttr) ;
2088 if (IS_CONVATTR_PREEDIT_MASK (*pCurAttr, CAColormap)) {
2089 pSWA->colormap = pCurAttr->m_Preedit.m_colormap ;
2090 lMask |= CWColormap ;
2091 }
2092 }
2093 pSWA->override_redirect = True ;
2094 pSWA->background_pixel = pxlBack ;
2095 pSWA->border_pixel = pxlBack ;
2096 return lMask ;
2097 }
2098
2099 unsigned long
toverTheSpotWindow_getStatusWindowAttribute(register Widget gw,register XSetWindowAttributes * pSWA)2100 toverTheSpotWindow_getStatusWindowAttribute (
2101 register Widget gw,
2102 register XSetWindowAttributes* pSWA)
2103 {
2104 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2105 register TConversionAttribute* pCurAttr ;
2106 register unsigned long lMask ;
2107 register Pixel pxlBack ;
2108
2109 pCurAttr = &wgThis->toverwin.m_caCurrent ;
2110 pxlBack = wgThis->core.background_pixel ;
2111 lMask = CWOverrideRedirect | CWBackPixel | CWBorderPixel ;
2112
2113 if (IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAStatusMask)) {
2114 if (IS_CONVATTR_STATUS_MASK (*pCurAttr, CABackgroundPixel))
2115 pxlBack = CONVATTR_STATUS_BACKGROUND (*pCurAttr) ;
2116 if (IS_CONVATTR_STATUS_MASK (*pCurAttr, CAColormap)) {
2117 pSWA->colormap = pCurAttr->m_Status.m_colormap ;
2118 lMask |= CWColormap ;
2119 }
2120 }
2121 pSWA->override_redirect = True ;
2122 pSWA->background_pixel = pxlBack ;
2123 pSWA->border_pixel = pxlBack ;
2124 return lMask ;
2125 }
2126
2127 Boolean
toverTheSpotWindow_createTerminalWindow(register Widget gw)2128 toverTheSpotWindow_createTerminalWindow (
2129 register Widget gw)
2130 {
2131 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2132 register Display* pDisplay = XtDisplay (gw) ;
2133 register TOverTheSpotTerminal* pTerminal ;
2134 register Window wndFocus, wndTerminal ;
2135 register GC gc ;
2136 register unsigned long lMask ;
2137 register int i ;
2138 XSetWindowAttributes swa ;
2139
2140 lMask = toverTheSpotWindow_getPreeditWindowAttribute (gw, &swa) ;
2141 wndFocus = wgThis->toverwin.m_wndClient ;
2142 pTerminal = &wgThis->toverwin.m_Terminal ;
2143 for (i = 0 ; i < 3 ; i ++) {
2144 wndTerminal = XCreateWindow (pDisplay, wndFocus, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, lMask, &swa) ;
2145 if (wndTerminal == None)
2146 return False ;
2147 pTerminal->m_wndTerminal [i] = wndTerminal ;
2148
2149 gc = XCreateGC (pDisplay, wndTerminal, 0, NULL) ;
2150 if (gc == None)
2151 return False ;
2152
2153 pTerminal->m_rGC [i] = gc ;
2154
2155 AfxRegisterWindow (pDisplay, wndTerminal, Expose, ExposureMask, gw, srOverTheSpotTerminalExposeProc [i]) ;
2156 AfxRegisterWindow (pDisplay, wndTerminal, DestroyNotify, StructureNotifyMask, gw, toverTheSpotWindow_onTerminalDestroy) ;
2157 AfxRegisterWindow (pDisplay, wndTerminal, KeyPress, KeyPressMask, gw, toverTheSpotWindow_onSubwindowKeyPress) ;
2158 AfxRegisterWindow (pDisplay, wndTerminal, KeyRelease, KeyReleaseMask, gw, toverTheSpotWindow_onSubwindowKeyRelease) ;
2159 }
2160 return True ;
2161 }
2162
2163 Boolean
toverTheSpotWindow_createModeshellWindow(register Widget gw)2164 toverTheSpotWindow_createModeshellWindow (
2165 register Widget gw)
2166 {
2167 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2168 register Display* pDisplay = XtDisplay (gw) ;
2169 register Window wndFocus, wndModeshell ;
2170 register GC gc ;
2171 register int x, y ;
2172 register unsigned long lMask ;
2173 XSetWindowAttributes swa ;
2174
2175 wndFocus = wgThis->toverwin.m_wndClient ;
2176 if (!IS_CONVATTR_MASK (wgThis->toverwin.m_caCurrent, CAStatusMask) ||
2177 !IS_CONVATTR_STATUS_MASK (wgThis->toverwin.m_caCurrent, CAClientArea) ||
2178 wgThis->toverwin.m_wndClient == wgThis->toverwin.m_wndFocus) {
2179 /* floating modeshell */
2180 wgThis->toverwin.m_fFloatingModeshell = True ;
2181 x = y = 0 ;
2182 } else {
2183 /* fixed modeshell */
2184 wgThis->toverwin.m_fFloatingModeshell = False ;
2185 x = wgThis->toverwin.m_caCurrent.m_Status.m_area.x ;
2186 y = wgThis->toverwin.m_caCurrent.m_Status.m_area.y ;
2187 }
2188
2189 if (wgThis->toverwin.m_fFloatingModeshell) {
2190 lMask = toverTheSpotWindow_getPreeditWindowAttribute (gw, &swa) ;
2191 } else {
2192 lMask = toverTheSpotWindow_getStatusWindowAttribute (gw, &swa) ;
2193 }
2194
2195 /* Focus Window ��Ž���դ� Modeshell ��������롣�����Ĥ� terminal ��
2196 * ���Ƥ��뤬���ɤ��Τ��� ���ʤ� overspec �ʵ������뤬�ġ�
2197 */
2198 wndModeshell = XCreateWindow (pDisplay, wndFocus, x, y, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, lMask, &swa) ;
2199 if (wndModeshell == None)
2200 return False ;
2201 wgThis->toverwin.m_wndModeshell = wndModeshell ;
2202
2203 gc = XCreateGC (pDisplay, wndModeshell, 0, NULL) ;
2204 if (gc == None)
2205 return False ;
2206 wgThis->toverwin.m_gcModeshell = gc ;
2207
2208 AfxRegisterWindow (pDisplay, wndModeshell, Expose, ExposureMask, gw, toverTheSpotWindow_onModeshellExpose) ;
2209 AfxRegisterWindow (pDisplay, wndModeshell, DestroyNotify, StructureNotifyMask, gw, toverTheSpotWindow_onModeshellDestroy) ;
2210 AfxRegisterWindow (pDisplay, wndModeshell, KeyPress, KeyPressMask, gw, toverTheSpotWindow_onSubwindowKeyPress) ;
2211 AfxRegisterWindow (pDisplay, wndModeshell, KeyRelease, KeyReleaseMask, gw, toverTheSpotWindow_onSubwindowKeyRelease) ;
2212 return True ;
2213 }
2214
2215 Boolean
toverTheSpotWindow_createMinibufferFrame(register Widget gw)2216 toverTheSpotWindow_createMinibufferFrame (
2217 register Widget gw)
2218 {
2219 register TOverTheSpotWindowWidget wgThis = (TOverTheSpotWindowWidget) gw ;
2220 register TConversionAttribute* pCurAttr ;
2221 register Widget wgMinibufFrame ;
2222 Boolean fInput ;
2223 Arg rArg [12] ;
2224 register int nArg ;
2225
2226 nArg = 0 ;
2227 XtSetArg (rArg [nArg], XtNinput, &fInput) ; nArg ++ ;
2228 XtGetValues (gw, rArg, nArg) ;
2229
2230 nArg = 0 ;
2231 XtSetArg (rArg [nArg], XtNmappedWhenManaged, False) ; nArg ++ ;
2232 XtSetArg (rArg [nArg], XtNclientWindow, wgThis->toverwin.m_wndClient) ; nArg ++ ;
2233 XtSetArg (rArg [nArg], XtNfocusWindow, None) ; nArg ++ ;
2234 XtSetArg (rArg [nArg], XtNinput, fInput) ; nArg ++ ;
2235
2236 pCurAttr = &wgThis->toverwin.m_caCurrent ;
2237 if (!IS_CONVATTR_MASK (*pCurAttr, CAStatusMask) ||
2238 !IS_CONVATTR_STATUS_MASK (*pCurAttr, CAClientArea) ||
2239 wgThis->toverwin.m_wndClient == wgThis->toverwin.m_wndFocus) {
2240 XtSetArg (rArg [nArg], XtNautoPopup, True) ; nArg ++ ;
2241 XtSetArg (rArg [nArg], XtNheight, 1) ; nArg ++ ;
2242 wgMinibufFrame = TRootWindowFrame_Create (XtParent (gw), rArg, nArg) ;
2243 } else {
2244 register const XRectangle* pRect = &pCurAttr->m_Status.m_area ;
2245 register int nDX = 0 ;
2246
2247 if (!wgThis->toverwin.m_fFloatingModeshell &&
2248 wgThis->toverwin.m_wndModeshell != None)
2249 nDX = wgThis->toverwin.m_szModeshell.cx ;
2250
2251 XtSetArg (rArg [nArg], XtNx, pRect->x + nDX) ; nArg ++ ;
2252 XtSetArg (rArg [nArg], XtNy, pRect->y) ; nArg ++ ;
2253 XtSetArg (rArg [nArg], XtNwidth, pRect->width - nDX) ; nArg ++ ;
2254 XtSetArg (rArg [nArg], XtNheight, pRect->height) ; nArg ++ ;
2255 if (IS_CONVATTR_STATUS_MASK (*pCurAttr, CAForegroundPixel)) {
2256 XtSetArg (rArg [nArg], XtNforeground, pCurAttr->m_Status.m_foreground) ;
2257 nArg ++ ;
2258 }
2259 if (IS_CONVATTR_STATUS_MASK (*pCurAttr, CABackgroundPixel)) {
2260 XtSetArg (rArg [nArg], XtNbackground, pCurAttr->m_Status.m_background) ;
2261 nArg ++ ;
2262 }
2263 wgMinibufFrame = TSubWindowFrame_Create (XtParent (gw), rArg, nArg) ;
2264 if (wgMinibufFrame != NULL) {
2265 TConversionAttribute ca ;
2266
2267 TConvAttr_Initialize (&ca) ;
2268 toverTheSpotWindow_convertStatus2Preedit (&ca, pCurAttr) ;
2269 ca.m_wndFocus = wgThis->toverwin.m_wndClient ;
2270 ca.m_uMask |= CAFocusWindow ;
2271 SET_CONVATTR_PREEDIT_MASK (ca, CAFont) ;
2272 TFontSet_Copy (&ca.m_Preedit.m_FontSet, &wgThis->toverwin.m_fsMinibuf) ;
2273 TFrame_SetAttribute (wgMinibufFrame, &ca) ;
2274 TConvAttr_Uninitialize (&ca) ;
2275 }
2276 }
2277 if (wgMinibufFrame == NULL)
2278 return False ;
2279 wgThis->toverwin.m_wgMinibuf = wgMinibufFrame ;
2280 return True ;
2281 }
2282
2283 void
toverTheSpotWindow_convertStatus2Preedit(register TConversionAttribute * pDest,register const TConversionAttribute * pSrc)2284 toverTheSpotWindow_convertStatus2Preedit (
2285 register TConversionAttribute* pDest,
2286 register const TConversionAttribute* pSrc)
2287 {
2288 assert (pDest != NULL) ;
2289 assert (pSrc != NULL) ;
2290
2291 pDest->m_wndFocus = pSrc->m_wndFocus ;
2292 pDest->m_uMask = pSrc->m_uMask & ~(CAPreeditMask | CAStatusMask) ;
2293 if (!IS_CONVATTR_MASK (*pSrc, CAStatusMask))
2294 return ;
2295 pDest->m_uMask |= CAPreeditMask ;
2296 pDest->m_Preedit.m_uMask = pSrc->m_Status.m_uMask & ~CASpotLocation ;
2297 pDest->m_Preedit.m_cursor = pSrc->m_Status.m_cursor ;
2298 pDest->m_Preedit.m_foreground = pSrc->m_Status.m_foreground ;
2299 pDest->m_Preedit.m_background = pSrc->m_Status.m_background ;
2300 pDest->m_Preedit.m_nLineSpacing = pSrc->m_Status.m_nLineSpacing ;
2301 pDest->m_Preedit.m_colormap = pSrc->m_Status.m_colormap ;
2302 pDest->m_Preedit.m_cursor = pSrc->m_Status.m_cursor ;
2303 pDest->m_Preedit.m_area = pSrc->m_Status.m_area ;
2304 pDest->m_Preedit.m_areaNeeded = pSrc->m_Status.m_areaNeeded ;
2305 return ;
2306 }
2307
2308 /*
2309 * ���ꤵ�줿����礭�������֤ξ���� XRectangle ��¤�Τ�������֤��ؿ���
2310 */
2311 void
XGetRectangleOfWindow(register Display * pDisplay,register Window win,register XRectangle * pArea)2312 XGetRectangleOfWindow (
2313 register Display* pDisplay,
2314 register Window win,
2315 register XRectangle* pArea)
2316 {
2317 Window wndRoot ;
2318 int x, y ;
2319 unsigned int border_width, depth_size, height, width ;
2320
2321 XGetGeometry (pDisplay, win, &wndRoot, &x, &y, &width, &height, &border_width, &depth_size) ;
2322 pArea->x = (short) x ;
2323 pArea->y = (short) y ;
2324 pArea->width = (unsigned short)width ;
2325 pArea->height = (unsigned short)height ;
2326 return ;
2327 }
2328
2329 Widget
TOverTheSpotWindowFrame_Create(Widget wgParent,ArgList arglist,Cardinal nArglist)2330 TOverTheSpotWindowFrame_Create (
2331 Widget wgParent,
2332 ArgList arglist,
2333 Cardinal nArglist)
2334 {
2335 return XtCreateWidget ("TOverTheSpotWindow", toverTheSpotWindowWidgetClass, wgParent, arglist, nArglist) ;
2336 }
2337
2338