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