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 "TRootWindowP.h"
26 #include "TTerminal.h"
27 #include "TConvAttr.h"
28 
29 #define offset(field)	XtOffsetOf(TRootWindowRec, trootwin.field)
30 #define goffset(field)	XtOffsetOf(WidgetRec, core.field )
31 
32 static	XtResource	srRootWindowResource []	= {
33 	{	XtNwidth,					XtCWidth,
34 		XtRDimension,				sizeof (Dimension),
35 		goffset (width),			XtRImmediate,		(XtPointer) 640, },
36 	{	XtNheight,					XtCHeight,
37 		XtRDimension,				sizeof (Dimension),
38 		goffset (height),			XtRImmediate,		(XtPointer) 3, },
39 	{	XtNbackground,				XtCBackground,
40 		XtRPixel,					sizeof (Pixel),
41 		goffset (background_pixel),	XtRString,			XtDefaultBackground, },
42 #if 0
43 	{	XtNreverseVideo,			XtCReverseVideo,
44 		XtRBoolean,					sizeof (Boolean),
45 		offset (m_fReverseVideo),	XtRImmediate,		(XtPointer) False, },
46 #endif
47 	{	XtNclientWindow,			XtCClientWindow,
48 		XtRWindow,					sizeof (Window),
49 		offset (m_wndClient),		XtRImmediate,		(XtPointer) None, },
50 	{	XtNfocusWindow,				XtCFocusWindow,
51 		XtRWindow,					sizeof (Window),
52 		offset (m_wndFocus),		XtRImmediate,		(XtPointer) None, },
53 	{	XtNautoPopup,				XtCAutoPopup,
54 		XtRBoolean,					sizeof (Boolean),
55 		offset (m_fAutoPopup),		XtRImmediate,		(XtPointer) False, },
56 } ;
57 
58 #undef	offset
59 #undef	goffset
60 
61 static	void	trootWindow_onInitialize	(Widget, Widget, ArgList, Cardinal*) ;
62 static	void	trootWindow_onRealize		(Widget, XtValueMask*, XSetWindowAttributes*) ;
63 static	Boolean	trootWindow_onSetValues		(Widget, Widget, Widget, ArgList, Cardinal*) ;
64 static	void	trootWindow_onDestroy		(Widget) ;
65 static	void	trootWindow_onKeyPress		(Widget, XEvent*, String*, Cardinal*) ;
66 static	void	trootWindow_onKeyRelease	(Widget, XEvent*, String*, Cardinal*) ;
67 
68 static	void*	trootWindow_getclient		(Widget) ;
69 static	int		trootWindow_getrect			(Widget, XRectangle*) ;
70 static	void	trootWindow_activate		(Widget, Boolean) ;
71 static	void*	trootWindow_getfontset		(Widget) ;
72 static	Boolean	trootWindow_getlinespacing	(Widget, int*) ;
73 static	void*	trootWindow_getlispframeobject	(Widget) ;
74 static	void	trootWindow_setattribute		(Widget, const TConversionAttribute*) ;
75 static	Boolean	trootWindow_putchar			(Widget, const Char) ;
76 static	Boolean	trootWindow_puts			(Widget, const Char*, int) ;
77 static	void	trootWindow_rev				(Widget, Boolean) ;
78 static	void	trootWindow_clear			(Widget) ;
79 static	void	trootWindow_flush			(Widget) ;
80 static	Boolean	trootWindow_rectVariablep	(Widget) ;
81 static	Boolean	trootWindow_haveExternModelinep	(Widget) ;
82 static	Boolean	trootWindow_setModeline		(Widget, const Char*, int) ;
83 static	Boolean	trootWindow_autoPopupp		(Widget) ;
84 static	void	trootWindow_popup			(Widget) ;
85 static	void	trootWindow_popdown			(Widget) ;
86 
87 static	void	trootWindow_onTerminalConfigure	(Widget, XtPointer, XEvent*, Boolean*) ;
88 
89 static	void	trootWindow_adjustPopupWindow	(Widget) ;
90 static	Window	trootWindow_getToplevelWindow	(Display*, Window) ;
91 
92 static	XtActionsRec	srRootWindowAction []	= {
93 	{ "onKeyPress",		trootWindow_onKeyPress, },
94 	{ "onKeyRelease",	trootWindow_onKeyRelease, },
95 } ;
96 
97 static	char			strRootWindowTranslation []	=
98 "<Key>:                 onKeyPress()\n\
99  <KeyRelease>:          onKeyRelease()\n" ;
100 
101 TRootWindowClassRec		trootWindowClassRec	= {
102     {	/* core fields */
103 		/* superclass			*/	(WidgetClass) &tframeClassRec,
104 		/* class_name			*/	"TRootWindow",
105 		/* size					*/	sizeof (TRootWindowRec),
106 		/* class_initialize		*/	NULL,
107 		/* class_part_initialize*/	NULL,
108 		/* class_inited			*/	FALSE,
109 		/* initialize			*/	trootWindow_onInitialize,
110 		/* initialize_hook		*/	NULL,
111 		/* realize				*/	trootWindow_onRealize,
112 		/* actions				*/	srRootWindowAction,
113 		/* num_actions			*/	XtNumber (srRootWindowAction),
114 		/* resources			*/	srRootWindowResource,
115 		/* num_resources		*/	XtNumber(srRootWindowResource),
116 		/* xrm_class			*/	NULLQUARK,
117 		/* compress_motion		*/	TRUE,
118 		/* compress_exposure	*/	TRUE,
119 		/* compress_enterleave	*/	TRUE,
120 		/* visible_interest		*/	FALSE,
121 		/* destroy				*/	trootWindow_onDestroy,
122 		/* resize				*/	NULL,
123 		/* expose				*/	NULL,
124 		/* set_values			*/	trootWindow_onSetValues,
125 		/* set_values_hook		*/	NULL,
126 		/* set_values_almost	*/	XtInheritSetValuesAlmost,
127 		/* get_values_hook		*/	NULL,
128 		/* accept_focus			*/	NULL,
129 		/* version				*/	XtVersion,
130 		/* callback_private		*/	NULL,
131 		/* tm_table				*/	strRootWindowTranslation,
132 		/* query_geometry		*/	XtInheritQueryGeometry,
133 		/* display_accelerator	*/	NULL,
134 		/* extension	  		*/	NULL,
135     },
136 	{	/* Composite			*/
137 		/* geometry_manager		*/	XtInheritGeometryManager,
138 		/* change_managed		*/	XtInheritChangeManaged,
139 		/* insert_child			*/	XtInheritInsertChild,
140 		/* delete_child			*/	XtInheritDeleteChild,
141 		/* extension			*/	NULL,
142 	},
143 	{	/* Shell				*/
144 		/* extension			*/	NULL,
145 	},
146 	{
147 		/* getclient			*/	trootWindow_getclient,
148 		/* getlispframeobject	*/	trootWindow_getlispframeobject,
149 		/* setattribute			*/	trootWindow_setattribute,
150 		/* getrect				*/	trootWindow_getrect,
151 		/* activate				*/	trootWindow_activate,
152 		/* getfontset			*/	trootWindow_getfontset,
153 		/* getlinespacing		*/	trootWindow_getlinespacing,
154 		/* puts					*/	trootWindow_puts,
155 		/* putchar				*/	trootWindow_putchar,
156 		/* rev					*/	trootWindow_rev,
157 		/* clear				*/	trootWindow_clear,
158 		/* flush				*/	trootWindow_flush,
159 		/* rectvariablep		*/	trootWindow_rectVariablep,
160 		/* haveExternModelinep	*/	trootWindow_haveExternModelinep,
161 		/* setModeline			*/	trootWindow_setModeline,
162 		/* autoPopupp			*/	trootWindow_autoPopupp,
163 		/* setCaret				*/	NULL,
164 	},
165 	{
166 		/* dummy				*/	0,
167 	},
168 } ;
169 
170 WidgetClass	trootWindowWidgetClass	= (WidgetClass) &trootWindowClassRec ;
171 
172 void
trootWindow_onInitialize(Widget wgRequest,Widget wgNew,ArgList args,Cardinal * num_args)173 trootWindow_onInitialize (
174 	Widget		wgRequest,
175 	Widget		wgNew,
176 	ArgList		args,
177 	Cardinal*	num_args)
178 {
179 	TRootWindowWidget	w = (TRootWindowWidget) wgNew ;
180 
181 	w->trootwin.m_wgPopup		= 0 ;
182 	w->trootwin.m_wgTerminal	= 0 ;
183 	w->trootwin.m_fHaveText		= False ;
184 	w->trootwin.m_fActive		= False ;
185 	return ;
186 }
187 
188 void
trootWindow_onRealize(register Widget gw,register XtValueMask * pValueMask,register XSetWindowAttributes * pXSWA)189 trootWindow_onRealize (
190 	register Widget					gw,
191 	register XtValueMask*			pValueMask,
192 	register XSetWindowAttributes*	pXSWA)
193 {
194 	TRootWindowWidget	wgThis		= (TRootWindowWidget) gw ;
195 	register Display*	pDisplay	= XtDisplay (gw) ;
196 	CoreWidgetClass		super		= (CoreWidgetClass) XtClass (gw)->core_class.superclass ;
197 	Widget				wgPopup ;
198 	Widget				wgTerminal ;
199 	Arg					rArg [8] ;
200 	int					nArg ;
201 	register Window		wndToplevel ;
202 
203 	(*super->core_class.realize) (gw, pValueMask, pXSWA) ;
204 
205 	wndToplevel	= trootWindow_getToplevelWindow (pDisplay, wgThis->trootwin.m_wndClient) ;
206 	XSetTransientForHint (pDisplay, XtWindow (gw), wndToplevel) ;
207 
208 	/*	Popup Widget ��������롣���� Popup Widget ���Τ� RootWindowStyle
209 	 *	�� Window �ˤʤ롣
210 	 */
211 	nArg	= 0 ;
212 	XtSetArg (rArg [nArg], XtNwidth,	gw->core.width) ;			nArg ++ ;
213 	XtSetArg (rArg [nArg], XtNheight,	gw->core.height) ;			nArg ++ ;
214 	XtSetArg (rArg [nArg], XtNinput,	False) ;					nArg ++ ;
215 
216 	/*XtSetArg (rArg [nArg], XtNmappedWhenManaged,	False) ;		nArg ++ ;*/
217 	assert (nArg < (sizeof (rArg) / sizeof (rArg [0]))) ;
218 	wgPopup	= XtCreatePopupShell ("RootWindowStyleFrame", transientShellWidgetClass, gw, rArg, nArg) ;
219 
220 	/*	Terminal Window ��������롣*/
221 	nArg	= 0 ;
222 	XtSetArg (rArg [nArg], XtNinput, False) ; nArg ++ ;
223 	assert (nArg < (sizeof (rArg) / sizeof (rArg [0]))) ;
224 	wgTerminal	= XtCreateManagedWidget ("RootWindowTerminal", tterminalWidgetClass, wgPopup, rArg, nArg) ;
225 
226 	/*	Terminal Window �� Event Handler ����Ͽ���롣*/
227 	wgThis->trootwin.m_wgPopup		= wgPopup ;
228 	wgThis->trootwin.m_wgTerminal	= wgTerminal ;
229 	XtRealizeWidget (wgPopup) ;
230 
231 	trootWindow_adjustPopupWindow (gw) ;
232 	XtAddEventHandler (wgPopup,    StructureNotifyMask, False, trootWindow_onTerminalConfigure, gw) ;
233 	return ;
234 }
235 
236 Boolean
trootWindow_onSetValues(register Widget curw,register Widget reqw,register Widget neww,register ArgList args,register Cardinal * num_args)237 trootWindow_onSetValues (
238 	register Widget		curw,
239 	register Widget		reqw,
240 	register Widget		neww,
241 	register ArgList	args,
242 	register Cardinal*	num_args)
243 {
244 	return	False ;
245 }
246 
247 void
trootWindow_onDestroy(register Widget gw)248 trootWindow_onDestroy (
249 	register Widget	gw)
250 {
251 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
252 
253 	if (wgThis->trootwin.m_wgPopup != NULL) {
254 		register Widget	wgPopup	= wgThis->trootwin.m_wgPopup ;
255 
256 		XtDestroyWidget (wgPopup) ;
257 		wgThis->trootwin.m_wgPopup	= NULL ;
258 	}
259 	/*	Manage ����Ƥ���Τǡ����פ��� */
260 	if (wgThis->trootwin.m_wgTerminal != NULL) {
261 		register Widget	wgTerminal	= wgThis->trootwin.m_wgTerminal ;
262 
263 		XtDestroyWidget (wgTerminal) ;
264 		wgThis->trootwin.m_wgTerminal	= NULL ;
265 	}
266 	return ;
267 }
268 
269 void
trootWindow_onKeyPress(register Widget gw,register XEvent * pEvent,register String * pString,register Cardinal * num_args)270 trootWindow_onKeyPress (
271 	register Widget		gw,
272 	register XEvent*	pEvent,
273 	register String*	pString,
274 	register Cardinal*	num_args)
275 {
276 	if (!XtIsRealized (gw))
277 		return ;
278 #if defined (DEBUG)
279 	fprintf (stderr, "trootWindow_onKeyPress(%p)\n", gw) ;
280 #endif
281 	/*	Event Select: None ���ȡ������˸����ä� KeyEvent ���ꤲ�����ǽ��
282 	 *	�����롣*/
283 	XtCallCallbacks (gw, XtNkeyPressCallback, (XtPointer) pEvent) ;
284 	return ;
285  }
286 
287 void
trootWindow_onKeyRelease(register Widget gw,register XEvent * pEvent,register String * pString,register Cardinal * num_args)288 trootWindow_onKeyRelease (
289 	register Widget		gw,
290 	register XEvent*	pEvent,
291 	register String*	pString,
292 	register Cardinal*	num_args)
293 {
294 	return ;
295 }
296 
297 void
trootWindow_onTerminalConfigure(register Widget gwTerminal,register XtPointer closure,register XEvent * pEvent,register Boolean * pContinueToDispatch)298 trootWindow_onTerminalConfigure (
299 	register Widget			gwTerminal,
300 	register XtPointer		closure,
301 	register XEvent*		pEvent,
302 	register Boolean*		pContinueToDispatch)
303 {
304 	register TRootWindowWidget	wgThis		= (TRootWindowWidget) closure ;
305 	XRectangle	rc ;
306 
307 #if defined (DEBUG)
308 	fprintf (stderr, "Event: Type(%d), Window(%lx)\n",
309 			 pEvent->type, pEvent->xany.window) ;
310 #endif
311 	if (pEvent->type != ConfigureNotify)
312 		return ;
313 #if defined (DEBUG)
314 	if (pEvent->type == ConfigureNotify) {
315 		fprintf (stderr, "Configure: %d, %d, %d, %d\n",
316 				 pEvent->xconfigure.x, pEvent->xconfigure.y,
317 				 pEvent->xconfigure.width, pEvent->xconfigure.height) ;
318 	}
319 #endif
320 	rc.x		= 0 ;
321 	rc.y		= 0 ;
322 	rc.width	= pEvent->xconfigure.width ;
323 	rc.height	= pEvent->xconfigure.height ;
324 #if defined (DEBUG)
325 	if (wgThis->trootwin.m_wgTerminal != NULL) {
326 		XWindowAttributes	xwa ;
327 		XGetWindowAttributes (XtDisplay (wgThis), XtWindow (wgThis->trootwin.m_wgTerminal), &xwa) ;
328 		fprintf (stderr, "Terminal: core(%d, %d, %d, %d), window(%d, %d)\n",
329 				 wgThis->trootwin.m_wgTerminal->core.x,
330 				 wgThis->trootwin.m_wgTerminal->core.y,
331 				 wgThis->trootwin.m_wgTerminal->core.width,
332 				 wgThis->trootwin.m_wgTerminal->core.height,
333 				 xwa.width,
334 				 xwa.height) ;
335 	}
336 #endif
337 	XtCallCallbacks ((Widget) wgThis, XtNconfigureCallback, (XtPointer) &rc) ;
338 	return ;
339 }
340 
341 /*	private functions
342  */
343 void*
trootWindow_getclient(register Widget gw)344 trootWindow_getclient (
345 	register Widget	gw)
346 {
347 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
348 
349 	return	wgThis->tframe.m_pClient ;
350 }
351 
352 int
trootWindow_getrect(register Widget gw,register XRectangle * pRect)353 trootWindow_getrect (
354 	register Widget			gw,
355 	register XRectangle*	pRect)
356 {
357 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
358 
359 	if (pRect != NULL) {
360 		pRect->x		= 0 ;
361 		pRect->y		= 0 ;
362 		pRect->width	= wgThis->trootwin.m_wgTerminal->core.width ;
363 		pRect->height	= wgThis->trootwin.m_wgTerminal->core.height ;
364 	}
365 	return	1 ;
366 }
367 
368 void
trootWindow_activate(register Widget gw,register Boolean fActivate)369 trootWindow_activate (
370 	register Widget			gw,
371 	register Boolean		fActivate)
372 {
373 	if (fActivate) {
374 		trootWindow_popup (gw) ;
375 	} else {
376 		trootWindow_popdown (gw) ;
377 	}
378 	return ;
379 }
380 
381 void*
trootWindow_getfontset(register Widget gw)382 trootWindow_getfontset (
383 	register Widget			gw)
384 {
385 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
386 
387 	return	TTerminal_GetFontSet (wgThis->trootwin.m_wgTerminal) ;
388 }
389 
390 Boolean
trootWindow_getlinespacing(register Widget gw,register int * pnLineSpacing)391 trootWindow_getlinespacing (
392 	register Widget			gw,
393 	register int*			pnLineSpacing)
394 {
395 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
396 	register TFontSet*			pFontSet ;
397 
398 	pFontSet		= TTerminal_GetFontSet (wgThis->trootwin.m_wgTerminal) ;
399 	assert (pFontSet != NULL) ;
400 	*pnLineSpacing	= TFontSet_GetHeight (pFontSet) ;
401 	return	False ;
402 }
403 
404 void*
trootWindow_getlispframeobject(register Widget gw)405 trootWindow_getlispframeobject (
406 	register Widget			gw)
407 {
408 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
409 
410 	return	wgThis->tframe.m_pLispFrameObject ;
411 }
412 
413 void
trootWindow_setattribute(register Widget gw,register const TConversionAttribute * pAttribute)414 trootWindow_setattribute (
415 	register Widget			gw,
416 	register const TConversionAttribute*	pAttribute)
417 {
418 	/*	RootWindow Style ���ä� ConversionAttribute ���ʤ���
419 	 */
420 	return ;
421 }
422 
423 Boolean
trootWindow_putchar(register Widget gw,register const Char cc)424 trootWindow_putchar (
425 	register Widget			gw,
426 	register const Char		cc)
427 {
428 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
429 
430 	TTerminal_Putchar (wgThis->trootwin.m_wgTerminal, cc) ;
431 	wgThis->trootwin.m_fHaveText	= True ;
432 	return	True ;
433 }
434 
435 Boolean
trootWindow_puts(register Widget gw,register const Char * pText,register int nText)436 trootWindow_puts (
437 	register Widget			gw,
438 	register const Char*	pText,
439 	register int			nText)
440 {
441 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
442 	register Widget				wgTerminal ;
443 
444 	wgTerminal	= wgThis->trootwin.m_wgTerminal ;
445 	while (nText -- > 0)
446 		TTerminal_Putchar (wgTerminal, *pText ++) ;
447 	wgThis->trootwin.m_fHaveText	= True ;
448 	return	True ;
449 }
450 
451 void
trootWindow_rev(register Widget gw,register Boolean fRev)452 trootWindow_rev (
453 	register Widget			gw,
454 	register Boolean		fRev)
455 {
456 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
457 
458 	TTerminal_Rev (wgThis->trootwin.m_wgTerminal, fRev) ;
459 	return ;
460 }
461 
462 void
trootWindow_clear(register Widget gw)463 trootWindow_clear (
464 	register Widget			gw)
465 {
466 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
467 
468 	TTerminal_Clear (wgThis->trootwin.m_wgTerminal) ;
469 	wgThis->trootwin.m_fHaveText	= False ;
470 	return ;
471 }
472 
473 void
trootWindow_flush(register Widget gw)474 trootWindow_flush (
475 	register Widget			gw)
476 {
477 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
478 
479 	if (wgThis->trootwin.m_fAutoPopup &&
480 		wgThis->trootwin.m_fActive) {
481 		if (wgThis->trootwin.m_fHaveText) {
482 #if defined (DEBUG)
483 			fprintf (stderr, "HaveText...\n") ;
484 #endif
485 			XtPopup (wgThis->trootwin.m_wgPopup, XtGrabNone) ;
486 		} else {
487 #if defined (DEBUG)
488 			fprintf (stderr, "No Text...\n") ;
489 #endif
490 			XtPopdown (wgThis->trootwin.m_wgPopup) ;
491 			return ;
492 		}
493 	}
494 	TTerminal_Update (wgThis->trootwin.m_wgTerminal) ;
495 	return ;
496 }
497 
498 Boolean
trootWindow_rectVariablep(register Widget gw)499 trootWindow_rectVariablep (
500 	register Widget			gw)
501 {
502 	return	False ;
503 }
504 
505 Boolean
trootWindow_haveExternModelinep(register Widget gw)506 trootWindow_haveExternModelinep (
507 	register Widget			gw)
508 {
509 	return	False ;
510 }
511 
512 Boolean
trootWindow_setModeline(register Widget gw,register const Char * pString,register int nString)513 trootWindow_setModeline (
514 	register Widget			gw,
515 	register const Char*	pString,
516 	register int			nString)
517 {
518 	return	False ;
519 }
520 
521 Boolean
trootWindow_autoPopupp(register Widget gw)522 trootWindow_autoPopupp (
523 	register Widget			gw)
524 {
525 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
526 
527 	return	wgThis->trootwin.m_fAutoPopup ;
528 }
529 
530 void
trootWindow_adjustPopupWindow(register Widget gw)531 trootWindow_adjustPopupWindow (
532 	register Widget		gw)
533 {
534 	register TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
535 	register Display*	pDisplay 	= XtDisplay (gw) ;
536 	register Widget		wgPopup ;
537 	register Window		wndFocus, wndRoot ;
538 	Window	wndDummy ;
539 	int		nFocusX, nFocusY ;
540 	int		nX, nY, nFocusWidth, nFocusHeight, nRootWidth, nRootHeight, nDummy ;
541 	register int		nPosX, nPosY, nCanvasWidth, nCanvasHeight, nCanvasBorder ;
542 	register TFontSet*	pFS ;
543 
544 	wgPopup			= wgThis->trootwin.m_wgPopup ;
545 	assert (wgPopup != NULL) ;
546 	assert (wgThis->trootwin.m_wgTerminal != NULL) ;
547 	assert (XtIsRealized (wgThis->trootwin.m_wgTerminal)) ;
548 
549 	pFS				= TTerminal_GetFontSet (wgThis->trootwin.m_wgTerminal) ;
550 	nCanvasHeight	= TFontSet_GetHeight (pFS) * wgThis->core.height ;
551 	nCanvasWidth	= wgThis->trootwin.m_wgTerminal->core.width ;
552 	nCanvasBorder	= wgThis->trootwin.m_wgTerminal->core.border_width ;
553 
554 	if (wgThis->trootwin.m_wndFocus != None) {
555 		wndFocus	= wgThis->trootwin.m_wndFocus ;
556 	} else {
557 		wndFocus	= wgThis->trootwin.m_wndClient ;
558 	}
559 	assert (wndFocus != None) ;
560 
561 	XGetGeometry (pDisplay, wndFocus, &wndDummy, &nFocusX, &nFocusY, &nFocusWidth, &nFocusHeight, &nDummy, &nDummy) ;
562 #if defined (DEBUG)
563 	fprintf (stderr, "Focus:(%lx) => (%d, %d, %d, %d)\n", wndFocus, nFocusX, nFocusY, nFocusWidth, nFocusHeight) ;
564 #endif
565 	wndRoot	= RootWindowOfScreen (XtScreen (gw)) ;
566 	XGetGeometry (pDisplay, wndRoot, &wndDummy, &nDummy, &nDummy, &nRootWidth, &nRootHeight, &nDummy, &nDummy) ;
567 	XTranslateCoordinates (pDisplay, wndFocus, wndRoot, 0, 0, &nX, &nY, &wndDummy) ;
568 
569 	nPosX	= nX ;
570 	nPosY	= nY ;
571 	nPosY	= nY + nFocusHeight ;
572 	if ((nPosY + nCanvasHeight) > nRootHeight) {
573 		XSizeHints	sizehints ;
574 		long		supplied ;
575 
576 		if (nPosY < 0)
577 			nPosY	= nRootHeight - nCanvasHeight - nCanvasBorder ;
578 
579 		/* Window Manager �˥ҥ�Ȥ����äƤ��롣��������XSetWMNormalHints *
580 		 * ����ʬ�������ʤ��褦�ʤΤǡ������� hints ���ɤߤȤäƤ��麹��*
581 		 * �ؤ���Ȥ�����ˡ��Ȥ�ʤ���Фʤ�ʤ���*/
582 		XGetWMNormalHints (pDisplay, XtWindow (wgPopup), &sizehints, &supplied) ;
583 		sizehints.flags			|= PWinGravity ;
584 		sizehints.win_gravity	= SouthWestGravity ;
585 		XSetWMNormalHints (pDisplay, XtWindow (wgPopup), &sizehints) ;
586 	}
587 	if ((nPosX + nCanvasWidth) > nRootWidth)
588 		nPosX	= nRootWidth - nCanvasWidth - nCanvasBorder ;
589 	if (nPosX < 0)
590 		nPosX	= 0 ;
591 #if defined (DEBUG)
592 	fprintf (stderr, "Focus Window (%d, %d, %d, %d)\n", nX, nY, nFocusWidth, nFocusHeight) ;
593 	fprintf (stderr, "Adjust Popup Window => (%d, %d, %d, %d)\n", nPosX, nPosY, nCanvasWidth, nCanvasHeight) ;
594 #endif
595 	XtConfigureWidget (wgPopup, nPosX, nPosY, nCanvasWidth + nCanvasBorder * 2, nCanvasHeight + nCanvasBorder * 2, wgPopup->core.border_width) ;
596 	/*XtMoveWidget (wgPopup, nPosX, nPosY) ;*/
597 	return ;
598 }
599 
600 /*	�ƥ������Խ���ʬ��ɽ�����롣
601  */
602 void
trootWindow_popup(register Widget gw)603 trootWindow_popup (
604 	register Widget	gw)
605 {
606 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
607 
608 	if (!wgThis->trootwin.m_fAutoPopup ||
609 		wgThis->trootwin.m_fHaveText)
610 		XtPopup (wgThis->trootwin.m_wgPopup, XtGrabNone) ;
611 	wgThis->trootwin.m_fActive	= True ;
612 	return ;
613 }
614 
615 /*	�ƥ������Խ���ʬ����ɽ���ˤ��롣
616  */
617 void
trootWindow_popdown(register Widget gw)618 trootWindow_popdown (
619 	register Widget	gw)
620 {
621 	TRootWindowWidget	wgThis	= (TRootWindowWidget) gw ;
622 
623 	XtPopdown (wgThis->trootwin.m_wgPopup) ;
624 	wgThis->trootwin.m_fActive	= False ;
625 	return ;
626 }
627 
628 Window
trootWindow_getToplevelWindow(register Display * pDisplay,register Window win)629 trootWindow_getToplevelWindow (
630 	register Display*	pDisplay,
631 	register Window		win)
632 {
633     Atom			wm_state;
634     Atom 			type;
635     int				format;
636     unsigned long	nitems, bytesafter;
637     unsigned char*	data;
638     Window			root, parent;
639     Window*			children;
640     unsigned int	nchildren;
641 
642     wm_state	= XInternAtom (pDisplay, "WM_STATE", True);
643     for (;;) {
644 		type = None;
645 		if (wm_state != None) {
646 			data = NULL;
647 			XGetWindowProperty (pDisplay, win, wm_state, 0L, 0L, False, AnyPropertyType, &type, &format, &nitems, &bytesafter, &data) ;
648 			if (data != NULL)
649 				XtFree((char *)data) ;
650 			if (type != None)
651 				break ;
652 		}
653 		if (!XQueryTree (pDisplay, win, &root, &parent, &children, &nchildren))
654 			break ;
655 		if (nchildren > 0)
656 			XtFree((char *)children) ;
657 		if (root == parent)
658 			break ;
659 		win = parent ;
660     }
661     return win;
662 }
663 
664 /*	��������ƤӽФ���� Method��
665  */
666 Widget
TRootWindowFrame_Create(Widget wgParent,ArgList arglist,Cardinal nArglist)667 TRootWindowFrame_Create (
668 	Widget			wgParent,
669 	ArgList			arglist,
670 	Cardinal		nArglist)
671 {
672 	return	XtCreateWidget ("RootWindow", trootWindowWidgetClass, wgParent, arglist, nArglist) ;
673 }
674 
675