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