26 #include FT_FREETYPE_H
36 #include "gdk/gdkkeysyms.h"
65 #define XDND_PROTOCOL_VERSION 5
67 #define IDC_HAND MAKEINTRESOURCE(32649)
71 void gdk_win32_draw_rectangle (GdkDrawable *drawable,
78 void gdk_win32_draw_arc (GdkDrawable *drawable,
87 void gdk_win32_draw_polygon (GdkDrawable *drawable,
92 void gdk_win32_draw_text (GdkDrawable *drawable,
99 void gdk_win32_draw_points (GdkDrawable *drawable,
103 void gdk_win32_draw_segments (GdkDrawable *drawable,
107 void gdk_win32_draw_lines (GdkDrawable *drawable,
120 GdkDrawable *drawing;
141 GdkAtom gClipboardAtom = GDK_NONE;
142 static XWindow_t *gCws;
143 static XWindow_t *gTws;
150 const Int_t kBIGGEST_RGB_VALUE = 65535;
160 const int kMAXGC = 7;
161 static GdkGC *gGClist[kMAXGC];
162 static GdkGC *gGCline;
163 static GdkGC *gGCmark;
164 static GdkGC *gGCfill;
165 static GdkGC *gGCtext;
166 static GdkGC *gGCinvt;
167 static GdkGC *gGCdash;
168 static GdkGC *gGCpxmp;
170 static GdkGC *gGCecho;
172 static Int_t gFillHollow;
173 static GdkPixmap *gFillPattern;
178 static const char *gTextFont =
"arial.ttf";
183 const Int_t kMAXMK = 100;
193 static int gLineWidth = 0;
194 static int gLineStyle = GDK_LINE_SOLID;
195 static int gCapStyle = GDK_CAP_BUTT;
196 static int gJoinStyle = GDK_JOIN_MITER;
197 static char gDashList[10];
198 static int gDashLength = 0;
199 static int gDashOffset = 0;
200 static int gDashSize = 0;
205 static ULong_t gMouseMask =
206 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK
207 | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK
208 | GDK_KEY_RELEASE_MASK;
209 static ULong_t gKeybdMask =
210 GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_ENTER_NOTIFY_MASK |
211 GDK_LEAVE_NOTIFY_MASK;
216 const char null_cursor_bits[] = {
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
221 static GdkCursor *gNullCursor;
223 static bool gdk_initialized =
false;
227 struct MWMHintsProperty_t {
230 Handle_t fDecorations;
236 const ULong_t kMWMHintsFunctions = BIT(0);
237 const ULong_t kMWMHintsDecorations = BIT(1);
238 const ULong_t kMWMHintsInputMode = BIT(2);
240 const Int_t kPropMotifWMHintsElements = 4;
241 const Int_t kPropMWMHintElements = kPropMotifWMHintsElements;
246 struct KeySymbolMap_t {
251 static const char *keyCodeToString[] = {
305 static KeySymbolMap_t gKeyMap[] = {
306 {GDK_Escape, kKey_Escape},
308 #ifndef GDK_ISO_Left_Tab
309 {0xFE20, kKey_Backtab},
311 {GDK_ISO_Left_Tab, kKey_Backtab},
313 {GDK_BackSpace, kKey_Backspace},
314 {GDK_Return, kKey_Return},
315 {GDK_Insert, kKey_Insert},
316 {GDK_Delete, kKey_Delete},
317 {GDK_Clear, kKey_Delete},
318 {GDK_Pause, kKey_Pause},
319 {GDK_Print, kKey_Print},
320 {0x1005FF60, kKey_SysReq},
321 {0x1007ff00, kKey_SysReq},
322 {GDK_Home, kKey_Home},
324 {GDK_Left, kKey_Left},
326 {GDK_Right, kKey_Right},
327 {GDK_Down, kKey_Down},
328 {GDK_Prior, kKey_Prior},
329 {GDK_Next, kKey_Next},
330 {GDK_Shift_L, kKey_Shift},
331 {GDK_Shift_R, kKey_Shift},
332 {GDK_Shift_Lock, kKey_Shift},
333 {GDK_Control_L, kKey_Control},
334 {GDK_Control_R, kKey_Control},
335 {GDK_Meta_L, kKey_Meta},
336 {GDK_Meta_R, kKey_Meta},
337 {GDK_Alt_L, kKey_Alt},
338 {GDK_Alt_R, kKey_Alt},
339 {GDK_Caps_Lock, kKey_CapsLock},
340 {GDK_Num_Lock, kKey_NumLock},
341 {GDK_Scroll_Lock, kKey_ScrollLock},
342 {GDK_KP_Space, kKey_Space},
343 {GDK_KP_Tab, kKey_Tab},
344 {GDK_KP_Enter, kKey_Enter},
345 {GDK_KP_Equal, kKey_Equal},
346 {GDK_KP_Multiply, kKey_Asterisk},
347 {GDK_KP_Add, kKey_Plus},
348 {GDK_KP_Separator, kKey_Comma},
349 {GDK_KP_Subtract, kKey_Minus},
350 {GDK_KP_Decimal, kKey_Period},
351 {GDK_KP_Divide, kKey_Slash},
359 static Int_t _lookup_string(Event_t * event,
char *buf, Int_t buflen)
362 int n =
event->fUser[1];
364 for (i = 0; i < n; i++) {
365 buf[i] =
event->fUser[2 + i];
371 if (event->fCode <= 0x20) {
372 strncpy(buf, keyCodeToString[event->fCode], buflen - 1);
379 inline void SplitLong(Long_t ll, Long_t & i1, Long_t & i2)
397 inline void AsmLong(Long_t i1, Long_t i2, Long_t & ll)
404 conv.i[0] = (Int_t) i1;
405 conv.i[1] = (Int_t) i2;
412 static BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
414 ::ShowWindow(hwndChild, SW_SHOWNORMAL);
415 GdkWindow *child = gdk_window_lookup(hwndChild);
417 ((GdkWindowPrivate *) child)->mapped = TRUE;
423 static void _ChangeProperty(HWND w,
char *np,
char *dp,
int n, Atom_t type)
428 hMem = ::GetProp(w, np);
432 hMem = ::GlobalAlloc(GHND, n +
sizeof(Atom_t));
433 p = (
char *) ::GlobalLock(hMem);
434 memcpy(p, &type,
sizeof(Atom_t));
435 memcpy(p +
sizeof(Atom_t), dp, n);
436 ::GlobalUnlock(hMem);
437 ::SetProp(w, np, hMem);
444 static void W32ChangeProperty(HWND w, Atom_t property, Atom_t type,
445 int format,
int mode,
const unsigned char *data,
453 if (mode == GDK_PROP_MODE_REPLACE || mode == GDK_PROP_MODE_PREPEND) {
454 len = (int) ::GlobalGetAtomName(property, buffer,
sizeof(buffer));
455 if ((atomName = (
char *) malloc(len + 1)) == NULL) {
458 strcpy(atomName, buffer);
460 sprintf(propName,
"#0x%0.4x", (
unsigned) atomName);
461 _ChangeProperty(w, propName, (
char *) data, nelements, type);
469 static int _GetWindowProperty(GdkWindow *
id, Atom_t property, Long_t long_offset,
470 Long_t long_length, Bool_t delete_it, Atom_t req_type,
471 Atom_t * actual_type_return,
472 Int_t * actual_format_return, ULong_t * nitems_return,
473 ULong_t * bytes_after_return, UChar_t ** prop_return)
477 char *data, *destPtr;
482 w = (HWND) GDK_DRAWABLE_XID(
id);
484 if (::IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(NULL)) {
485 handle = ::GetClipboardData(CF_TEXT);
486 if (handle != NULL) {
487 data = (
char *) ::GlobalLock(handle);
488 *nitems_return = strlen(data);
489 *prop_return = (UChar_t *) malloc(*nitems_return + 1);
490 destPtr = (
char *) *prop_return;
491 while (*data !=
'\0') {
499 ::GlobalUnlock(handle);
500 *actual_type_return = XA_STRING;
501 *bytes_after_return = 0;
507 ::RemoveProp(w, propName);
515 static ULong_t GetPixelImage(Drawable_t
id, Int_t x, Int_t y)
519 GdkImage *image = (GdkImage *)
id;
522 if (image->depth == 1) {
523 pixel = (((
char *) image->mem)[y * image->bpl + (x >> 3)] & (1 << (7 - (x & 0x7)))) != 0;
525 UChar_t *pixelp = (UChar_t *) image->mem + y * image->bpl + x * image->bpp;
526 switch (image->bpp) {
532 pixel = pixelp[0] | (pixelp[1] << 8);
535 pixel = pixelp[0] | (pixelp[1] << 8) | (pixelp[2] << 16);
538 pixel = pixelp[0] | (pixelp[1] << 8) | (pixelp[2] << 16);
548 static void CollectImageColors(ULong_t pixel, ULong_t * &orgcolors,
549 Int_t & ncolors, Int_t & maxcolors)
551 if (maxcolors == 0) {
554 orgcolors = (ULong_t*) ::
operator new(maxcolors*
sizeof(ULong_t));
557 for (
int i = 0; i < ncolors; i++) {
558 if (pixel == orgcolors[i])
return;
560 if (ncolors >= maxcolors) {
561 orgcolors = (ULong_t *) TStorage::ReAlloc(orgcolors,
568 orgcolors[ncolors++] = pixel;
574 static char *EventMask2String(UInt_t evmask)
576 static char bfr[500];
581 if (evmask & k##x##Mask) \
582 p += sprintf (p, "%s" #x, (p > bfr ? " " : ""))
584 BITmask(PointerMotion);
585 BITmask(ButtonMotion);
586 BITmask(ButtonPress);
587 BITmask(ButtonRelease);
590 BITmask(EnterWindow);
591 BITmask(LeaveWindow);
592 BITmask(FocusChange);
593 BITmask(StructureNotify);
600 class TGWin32MainThread {
605 static LPCRITICAL_SECTION fCritSec;
606 static LPCRITICAL_SECTION fMessageMutex;
609 ~TGWin32MainThread();
610 static void LockMSG();
611 static void UnlockMSG();
614 TGWin32MainThread *gMainThread = 0;
615 LPCRITICAL_SECTION TGWin32MainThread::fCritSec = 0;
616 LPCRITICAL_SECTION TGWin32MainThread::fMessageMutex = 0;
622 TGWin32MainThread::~TGWin32MainThread()
625 ::LeaveCriticalSection(fCritSec);
626 ::DeleteCriticalSection(fCritSec);
632 ::LeaveCriticalSection(fMessageMutex);
633 ::DeleteCriticalSection(fMessageMutex);
634 delete fMessageMutex;
639 ::PostThreadMessage(fId, WM_QUIT, 0, 0);
640 ::CloseHandle(fHandle);
648 void TGWin32MainThread::LockMSG()
650 if (fMessageMutex) ::EnterCriticalSection(fMessageMutex);
656 void TGWin32MainThread::UnlockMSG()
658 if (fMessageMutex) ::LeaveCriticalSection(fMessageMutex);
662 class TGWin32RefreshTimer :
public TTimer {
665 TGWin32RefreshTimer() : TTimer(10, kTRUE) {
if (gSystem) gSystem->AddTimer(
this); }
666 ~TGWin32RefreshTimer() {
if (gSystem) gSystem->RemoveTimer(
this); }
672 while (::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE)) {
673 ::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE);
677 ((TGWin32*)gVirtualX)->GUIThreadMessageFunc(&msg);
686 static DWORD WINAPI MessageProcessingLoop(void *p)
690 Bool_t endLoop = kFALSE;
691 TGWin32RefreshTimer *refersh = 0;
693 // force to create message queue
694 ::PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
696 // periodically we refresh windows
697 // Don't create refresh timer if the application has been created inside PVSS
699 TString arg = gSystem->BaseName(gApplication->Argv(0));
700 if (!arg.Contains("PVSS"))
701 refersh = new TGWin32RefreshTimer();
705 erret = ::GetMessage(&msg, NULL, NULL, NULL);
706 if (erret <= 0) endLoop = kTRUE;
707 endLoop = MessageProcessingFunc(&msg);
710 TGWin32::Instance()->CloseDisplay();
716 erret = ::GetLastError();
717 Error("MsgLoop", "Error in GetMessage");
726 Bool_t GUIThreadMessageWrapper(MSG* msg)
732 return ((TGWin32*)gVirtualX)->GUIThreadMessageFunc(msg);
738 TGWin32MainThread::TGWin32MainThread()
740 fCritSec =
new CRITICAL_SECTION;
741 ::InitializeCriticalSection(fCritSec);
742 fMessageMutex =
new CRITICAL_SECTION;
743 ::InitializeCriticalSection(fMessageMutex);
744 fHandle = ((TWinNTSystem*)gSystem)->GetGUIThreadHandle();
745 fId = ((TWinNTSystem*)gSystem)->GetGUIThreadId();
746 ((TWinNTSystem*)gSystem)->SetGUIThreadMsgHandler(GUIThreadMessageWrapper);
757 TGWin32::TGWin32(): fRefreshTimer(0)
767 TGWin32::TGWin32(
const char *name,
const char *title) : TVirtualX(name,title), fRefreshTimer(0)
770 fHasTTFonts = kFALSE;
771 fUseSysPointers = kFALSE;
780 fMaxNumberOfWindows = 10;
782 fFillColorModified = kFALSE;
783 fFillStyleModified = kFALSE;
784 fLineColorModified = kFALSE;
785 fPenModified = kFALSE;
786 fMarkerStyleModified = kFALSE;
787 fMarkerColorModified = kFALSE;
789 fWindows = (XWindow_t*) TStorage::Alloc(fMaxNumberOfWindows*
sizeof(XWindow_t));
790 for (
int i = 0; i < fMaxNumberOfWindows; i++) fWindows[i].open = 0;
792 fColors =
new TExMap;
795 TString arg = gSystem->BaseName(gApplication->Argv(0));
796 if (!arg.Contains(
"PVSS"))
797 fRefreshTimer =
new TGWin32RefreshTimer();
799 fRefreshTimer =
new TGWin32RefreshTimer();
803 if (!gROOT->IsBatch() && !gMainThread) {
804 gMainThread =
new TGWin32MainThread();
805 TGWin32ProxyBase::fgMainThreadId = ::GetCurrentThreadId();
806 TGWin32VirtualXProxy::fgRealObject =
this;
807 gPtr2VirtualX = &TGWin32VirtualXProxy::ProxyObject;
818 delete fRefreshTimer;
819 if (!fColors)
return;
821 TExMapIter it(fColors);
822 while (it.Next(key, value)) {
823 XColor_t *col = (XColor_t *) value;
832 VOID CALLBACK MyTimerProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
834 gSystem->ProcessEvents();
843 Bool_t TGWin32::GUIThreadMessageFunc(MSG* msg)
846 static Int_t m_timer = 0;
848 if ( (msg->message == WM_NCLBUTTONDOWN) ) {
850 m_timer = SetTimer(NULL, 1, 20, (TIMERPROC) MyTimerProc);
852 else if (msg->message == WM_NCMOUSELEAVE ) {
854 KillTimer(NULL, m_timer);
859 if (msg->message == TGWin32ProxyBase::fgPostMessageId) {
861 TGWin32ProxyBase *proxy = (TGWin32ProxyBase*)msg->wParam;
862 proxy->ExecuteCallBack(kTRUE);
866 }
else if (msg->message == TGWin32ProxyBase::fgPingMessageId) {
867 TGWin32ProxyBase::GlobalUnlock();
873 TGWin32MainThread::LockMSG();
874 TranslateMessage(msg);
875 DispatchMessage(msg);
876 TGWin32MainThread::UnlockMSG();
884 Bool_t TGWin32::IsCmdThread()
const
886 #ifdef OLD_THREAD_IMPLEMENTATION
887 return ((::GetCurrentThreadId() == TGWin32ProxyBase::fgMainThreadId) ||
888 (::GetCurrentThreadId() == TGWin32ProxyBase::fgUserThreadId));
897 void TGWin32::CloseDisplay()
900 TGWin32ProxyBase::GlobalLock();
904 gVirtualX = TGWin32VirtualXProxy::RealObject();
908 TGWin32MainThread *delThread = gMainThread;
914 TGWin32ProxyBase::fgMainThreadId = 0;
917 TWin32SplashThread *delSplash = gSplash;
923 if (fWindows) TStorage::Dealloc(fWindows);
926 if (fXEvent) gdk_event_free((GdkEvent*)fXEvent);
928 TGWin32ProxyBase::GlobalUnlock();
930 gROOT->SetBatch(kTRUE);
938 if (gMainThread && gMainThread->fCritSec) ::EnterCriticalSection(gMainThread->fCritSec);
944 void TGWin32::Unlock()
946 if (gMainThread && gMainThread->fCritSec) ::LeaveCriticalSection(gMainThread->fCritSec);
952 Bool_t TGWin32::Init(
void *display)
954 if (!gdk_initialized) {
955 if (!gdk_init_check(NULL, NULL))
return kFALSE;
956 gdk_initialized =
true;
959 if (!gClipboardAtom) {
960 gClipboardAtom = gdk_atom_intern(
"CLIPBOARD", kFALSE);
969 Int_t TGWin32::OpenDisplay(
const char *dpyName)
971 GdkPixmap *pixmp1, *pixmp2;
977 if (!Init((
void*)dpyName)) {
982 gdk_debug_level = gDebug;
987 fore.red = fore.green = fore.blue = 0;
988 back.red = back.green = back.blue = 0;
989 color.red = color.green = color.blue = 0;
992 fVisual = gdk_visual_get_best();
993 fColormap = gdk_colormap_get_system();
994 fDepth = gdk_visual_get_best_depth();
996 GetColor(1).fDefined = kTRUE;
997 gdk_color_black((GdkColormap *)fColormap, &GetColor(1).color);
999 GetColor(0).fDefined = kTRUE;
1000 gdk_color_white((GdkColormap *)fColormap, &GetColor(0).color);
1003 for (i = 0; i < kMAXGC; i++) {
1004 gGClist[i] = gdk_gc_new(GDK_ROOT_PARENT());
1005 gdk_gc_set_foreground(gGClist[i], &GetColor(1).color);
1006 gdk_gc_set_background(gGClist[i], &GetColor(0).color);
1009 gGCline = gGClist[0];
1010 gGCmark = gGClist[1];
1011 gGCfill = gGClist[2];
1012 gGCtext = gGClist[3];
1013 gGCinvt = gGClist[4];
1014 gGCdash = gGClist[5];
1015 gGCpxmp = gGClist[6];
1017 gdk_gc_get_values(gGCtext, &gcvals);
1018 gdk_gc_set_foreground(gGCinvt, &gcvals.background);
1019 gdk_gc_set_background(gGCinvt, &gcvals.foreground);
1023 gdk_color_black(fColormap, &echov.foreground);
1024 gdk_color_white(fColormap, &echov.background);
1025 echov.function = GDK_INVERT;
1026 echov.subwindow_mode = GDK_CLIP_BY_CHILDREN;
1028 gdk_gc_new_with_values((GdkWindow *) GDK_ROOT_PARENT(), &echov,
1029 (GdkGCValuesMask) (GDK_GC_FOREGROUND |
1034 pixmp1 = gdk_bitmap_create_from_data(GDK_ROOT_PARENT(),
1035 (
const char *)null_cursor_bits, 16,16);
1037 pixmp2 = gdk_bitmap_create_from_data(GDK_ROOT_PARENT(),
1038 (
const char *)null_cursor_bits, 16, 16);
1040 gNullCursor = gdk_cursor_new_from_pixmap((GdkDrawable *)pixmp1, (GdkDrawable *)pixmp2,
1041 &fore, &back, 0, 0);
1043 if (gEnv->GetValue(
"Win32.UseSysPointers", 0)) {
1044 fUseSysPointers = kTRUE;
1045 fCursors[kBottomLeft] = gdk_syscursor_new((ULong_t)IDC_SIZENESW);
1046 fCursors[kBottomRight] = gdk_syscursor_new((ULong_t)IDC_SIZENWSE);
1047 fCursors[kTopLeft] = gdk_syscursor_new((ULong_t)IDC_SIZENWSE);
1048 fCursors[kTopRight] = gdk_syscursor_new((ULong_t)IDC_SIZENESW);
1049 fCursors[kBottomSide] = gdk_syscursor_new((ULong_t)IDC_SIZENS);
1050 fCursors[kLeftSide] = gdk_syscursor_new((ULong_t)IDC_SIZEWE);
1051 fCursors[kTopSide] = gdk_syscursor_new((ULong_t)IDC_SIZENS);
1052 fCursors[kRightSide] = gdk_syscursor_new((ULong_t)IDC_SIZEWE);
1053 fCursors[kMove] = gdk_syscursor_new((ULong_t)IDC_SIZEALL);
1054 fCursors[kCross] =gdk_syscursor_new((ULong_t)IDC_CROSS);
1055 fCursors[kArrowHor] = gdk_syscursor_new((ULong_t)IDC_SIZEWE);
1056 fCursors[kArrowVer] = gdk_syscursor_new((ULong_t)IDC_SIZENS);
1057 fCursors[kHand] = gdk_syscursor_new((ULong_t)IDC_HAND);
1058 fCursors[kPointer] = gdk_syscursor_new((ULong_t)IDC_ARROW);
1059 fCursors[kCaret] = gdk_syscursor_new((ULong_t)IDC_IBEAM);
1060 fCursors[kWatch] = gdk_syscursor_new((ULong_t)IDC_WAIT);
1061 fCursors[kNoDrop] = gdk_syscursor_new((ULong_t)IDC_NO);
1064 fUseSysPointers = kFALSE;
1065 fCursors[kBottomLeft] = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
1066 fCursors[kBottomRight] = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
1067 fCursors[kTopLeft] = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
1068 fCursors[kTopRight] = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
1069 fCursors[kBottomSide] = gdk_cursor_new(GDK_BOTTOM_SIDE);
1070 fCursors[kLeftSide] = gdk_cursor_new(GDK_LEFT_SIDE);
1071 fCursors[kTopSide] = gdk_cursor_new(GDK_TOP_SIDE);
1072 fCursors[kRightSide] = gdk_cursor_new(GDK_RIGHT_SIDE);
1073 fCursors[kMove] = gdk_cursor_new(GDK_FLEUR);
1074 fCursors[kCross] =gdk_cursor_new(GDK_CROSSHAIR);
1075 fCursors[kArrowHor] = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
1076 fCursors[kArrowVer] = gdk_cursor_new(GDK_SB_V_DOUBLE_ARROW);
1077 fCursors[kHand] = gdk_cursor_new(GDK_HAND2);
1078 fCursors[kPointer] = gdk_cursor_new(GDK_LEFT_PTR);
1079 fCursors[kCaret] = gdk_cursor_new(GDK_XTERM);
1081 fCursors[kWatch] = gdk_cursor_new(GDK_BUSY);
1082 fCursors[kNoDrop] = gdk_cursor_new(GDK_PIRATE);
1084 fCursors[kRotate] = gdk_cursor_new(GDK_EXCHANGE);
1085 fCursors[kArrowRight] = gdk_cursor_new(GDK_ARROW);
1088 fRedDiv = fGreenDiv = fBlueDiv = fRedShift = fGreenShift = fBlueShift = -1;
1090 if ( gdk_visual_get_best_type() == GDK_VISUAL_TRUE_COLOR) {
1092 for (i = 0; i < int(
sizeof(fVisual->blue_mask)*kBitsPerByte); i++) {
1093 if (fBlueShift == -1 && ((fVisual->blue_mask >> i) & 1)) {
1096 if ((fVisual->blue_mask >> i) == 1) {
1097 fBlueDiv =
sizeof(UShort_t)*kBitsPerByte - i - 1 + fBlueShift;
1101 for (i = 0; i < int(
sizeof(fVisual->green_mask)*kBitsPerByte); i++) {
1102 if (fGreenShift == -1 && ((fVisual->green_mask >> i) & 1)) {
1105 if ((fVisual->green_mask >> i) == 1) {
1106 fGreenDiv =
sizeof(UShort_t)*kBitsPerByte - i - 1 + fGreenShift;
1110 for (i = 0; i < int(
sizeof(fVisual->red_mask)*kBitsPerByte); i++) {
1111 if (fRedShift == -1 && ((fVisual->red_mask >> i) & 1)) {
1114 if ((fVisual->red_mask >> i) == 1) {
1115 fRedDiv =
sizeof(UShort_t)*kBitsPerByte - i - 1 + fRedShift;
1121 SetName(
"Win32TTF");
1122 SetTitle(
"ROOT interface to Win32 with TrueType fonts");
1124 if (!TTF::IsInitialized()) TTF::Init();
1127 TTF::SetSmoothing(kTRUE);
1129 TTF::SetSmoothing(kFALSE);
1132 TGWin32VirtualXProxy::fMaxResponseTime = 1000;
1133 fHasTTFonts = kTRUE;
1153 Bool_t TGWin32::AllocColor(GdkColormap *cmap, GdkColor *color)
1155 if (fRedDiv == -1) {
1156 if ( gdk_color_alloc((GdkColormap *)cmap, (GdkColor *)color) )
return kTRUE;
1158 color->pixel = (color->red >> fRedDiv) << fRedShift |
1159 (color->green >> fGreenDiv) << fGreenShift |
1160 (color->blue >> fBlueDiv) << fBlueShift;
1170 void TGWin32::QueryColors(GdkColormap *cmap, GdkColor *color, Int_t ncolors)
1174 if (fRedDiv == -1) {
1175 GdkColorContext *cc = gdk_color_context_new(gdk_visual_get_system(), cmap);
1176 gdk_color_context_query_colors(cc, color, ncolors);
1177 gdk_color_context_free(cc);
1179 for (Int_t i = 0; i < ncolors; i++) {
1180 r = (color[i].pixel & fVisual->red_mask) >> fRedShift;
1181 color[i].red = UShort_t(r*kBIGGEST_RGB_VALUE/(fVisual->red_mask >> fRedShift));
1183 g = (color[i].pixel & fVisual->green_mask) >> fGreenShift;
1184 color[i].green = UShort_t(g*kBIGGEST_RGB_VALUE/(fVisual->green_mask >> fGreenShift));
1186 b = (color[i].pixel & fVisual->blue_mask) >> fBlueShift;
1187 color[i].blue = UShort_t(b*kBIGGEST_RGB_VALUE/(fVisual->blue_mask >> fBlueShift));
1197 void TGWin32::Align(
void)
1199 EAlign align = (EAlign) fTextAlign;
1202 if (align == kTLeft || align == kTCenter || align == kTRight) {
1203 fAlign.y = TTF::GetAscent();
1204 }
else if (align == kMLeft || align == kMCenter || align == kMRight) {
1205 fAlign.y = TTF::GetAscent()/2;
1210 if (align == kTRight || align == kMRight || align == kBRight) {
1211 fAlign.x = TTF::GetWidth();
1212 }
else if (align == kTCenter || align == kMCenter || align == kBCenter) {
1213 fAlign.x = TTF::GetWidth()/2;
1218 FT_Vector_Transform(&fAlign, TTF::GetRotMatrix());
1219 fAlign.x = fAlign.x >> 6;
1220 fAlign.y = fAlign.y >> 6;
1227 void TGWin32::DrawImage(FT_Bitmap *source, ULong_t fore, ULong_t back,
1228 GdkImage *xim, Int_t bx, Int_t by)
1230 UChar_t d = 0, *s = source->buffer;
1232 if (TTF::GetSmoothing()) {
1234 static GdkColor col[5];
1235 GdkColor *bcol = 0, *bc;
1240 if (back == (ULong_t) -1 && (UInt_t)source->width) {
1243 const Int_t maxdots = 50000;
1245 dots = Int_t(source->width * source->rows);
1246 dots = dots > maxdots ? maxdots : dots;
1247 bcol =
new GdkColor[dots];
1252 for (y = 0; y < (int) source->rows; y++) {
1253 for (x = 0; x < (int) source->width; x++, bc++) {
1254 bc->pixel = GetPixelImage((Drawable_t)xim, bx + x, by + y);
1255 if (++dotcnt >= maxdots)
break;
1258 QueryColors(fColormap, bcol, dots);
1262 for (y = 0; y < (int) source->rows; y++) {
1263 for (x = 0; x < (int) source->width; x++, bc++) {
1267 if (++dotcnt >= maxdots)
break;
1276 if (bc->red == r && bc->green == g && bc->blue == b) {
1280 bc->red = (UShort_t) r;
1281 bc->green = (UShort_t) g;
1282 bc->blue = (UShort_t) b;
1290 if (fore != col[4].pixel || back != col[0].pixel) {
1291 col[4].pixel = fore;
1292 if (back != (ULong_t) -1) {
1293 col[3].pixel = back;
1294 QueryColors(fColormap, &col[3], 2);
1297 QueryColors(fColormap, &col[4], 1);
1301 for (x = 3; x > 0; x--) {
1302 col[x].red = (col[4].red *x + col[0].red *(4-x)) /4;
1303 col[x].green = (col[4].green*x + col[0].green*(4-x)) /4;
1304 col[x].blue = (col[4].blue *x + col[0].blue *(4-x)) /4;
1305 if (!AllocColor(fColormap, &col[x])) {
1306 Warning(
"DrawImage",
"cannot allocate smoothing color");
1307 col[x].pixel = col[x+1].pixel;
1314 for (y = 0; y < (int) source->rows; y++) {
1315 for (x = 0; x < (int) source->width; x++) {
1317 d = ((d + 10) * 5) / 256;
1319 if (d && x < (
int) source->width) {
1320 ULong_t p = col[d].pixel;
1321 PutPixel((Drawable_t)xim, bx + x, by + y, p);
1328 for (
int y = 0; y < (int) source->rows; y++) {
1331 for (
int x = 0; x < (int) source->width; x++) {
1332 if (n == 0) d = *s++;
1333 if (TESTBIT(d,7-n)) {
1334 PutPixel((Drawable_t)xim, bx + x, by + y, fore);
1336 if (++n == (
int) kBitsPerByte) n = 0;
1338 row += source->pitch;
1347 void TGWin32::DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn,
1348 const char *text, ETextMode mode)
1350 if (!TTF::IsInitialized()) TTF::Init();
1351 TTF::SetRotationMatrix(angle);
1352 TTF::PrepareString(text);
1353 TTF::LayoutGlyphs();
1355 RenderString(x, y, mode);
1362 void TGWin32::DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn,
1363 const wchar_t *text, ETextMode mode)
1365 if (!TTF::IsInitialized()) TTF::Init();
1366 TTF::SetRotationMatrix(angle);
1367 TTF::PrepareString(text);
1368 TTF::LayoutGlyphs();
1370 RenderString(x, y, mode);
1376 GdkImage *TGWin32::GetBackground(Int_t x, Int_t y, UInt_t w, UInt_t h)
1378 Window_t cws = GetCurrentWindow();
1382 gVirtualX->GetWindowSize(cws, xy, xy, width, height);
1393 if (x+w > width) w = width - x;
1394 if (y+h > height) h = height - y;
1396 return gdk_image_get((GdkDrawable*)cws, x, y, w, h);
1402 Bool_t TGWin32::IsVisible(Int_t x, Int_t y, UInt_t w, UInt_t h)
1404 Window_t cws = GetCurrentWindow();
1408 gVirtualX->GetWindowSize(cws, xy, xy, width, height);
1411 if ((
int)w == 0 || (
int)h == 0)
return kFALSE;
1414 if (x + (
int)w <= 0 || x >= (
int)width)
return kFALSE;
1415 if (y + (
int)h <= 0 || y >= (
int)height)
return kFALSE;
1424 void TGWin32::RenderString(Int_t x, Int_t y, ETextMode mode)
1426 TTF::TTGlyph* glyph = TTF::GetGlyphs();
1430 Int_t Xoff = 0;
if (TTF::GetBox().xMin < 0) Xoff = -TTF::GetBox().xMin;
1431 Int_t Yoff = 0;
if (TTF::GetBox().yMin < 0) Yoff = -TTF::GetBox().yMin;
1432 Int_t w = TTF::GetBox().xMax + Xoff;
1433 Int_t h = TTF::GetBox().yMax + Yoff;
1434 Int_t x1 = x-Xoff-fAlign.x;
1435 Int_t y1 = y+Yoff+fAlign.y-h;
1437 if (!IsVisible(x1, y1, w, h)) {
1442 UInt_t depth = fDepth;
1443 GdkImage *xim = gdk_image_new(GDK_IMAGE_SHARED, gdk_visual_get_best(), w, h);
1452 gdk_gc_get_values((GdkGC*)GetGC(3), &gcvals);
1455 if (mode == kClear) {
1457 GdkImage *bim = GetBackground(x1, y1, w, h);
1459 Error(
"DrawText",
"error getting background image");
1464 Int_t xo = 0, yo = 0;
1465 if (x1 < 0) xo = -x1;
1466 if (y1 < 0) yo = -y1;
1468 for (
int yp = 0; yp < (int) bim->height; yp++) {
1469 for (
int xp = 0; xp < (int) bim->width; xp++) {
1470 pixel = GetPixelImage((Drawable_t)bim, xp, yp);
1471 PutPixel((Drawable_t)xim, xo+xp, yo+yp, pixel);
1475 gdk_image_unref((GdkImage *)bim);
1481 GdkImage *bim = GetBackground(x1, y1, w, h);
1483 pixel = gcvals.background.pixel;
1485 pixel = GetPixelImage((Drawable_t)bim, 0, 0);
1487 Int_t xo = 0, yo = 0;
1488 if (x1 < 0) xo = -x1;
1489 if (y1 < 0) yo = -y1;
1491 for (
int yp = 0; yp < h; yp++) {
1492 for (
int xp = 0; xp < (int) w; xp++) {
1493 PutPixel((Drawable_t)xim, xo+xp, yo+yp, pixel);
1497 gdk_image_unref((GdkImage *)bim);
1505 glyph = TTF::GetGlyphs();
1506 for (
int n = 0; n < TTF::GetNumGlyphs(); n++, glyph++) {
1507 if (FT_Glyph_To_Bitmap(&glyph->fImage,
1508 TTF::GetSmoothing() ? ft_render_mode_normal
1509 : ft_render_mode_mono,
1511 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->fImage;
1512 FT_Bitmap* source = &bitmap->bitmap;
1515 bx = bitmap->left+Xoff;
1516 by = h - bitmap->top-Yoff;
1517 DrawImage(source, gcvals.foreground.pixel, bg, xim, bx, by);
1521 Window_t cws = GetCurrentWindow();
1522 gdk_draw_image((GdkDrawable *)cws, GetGC(6), xim, 0, 0, x1, y1, w, h);
1524 gdk_image_unref(xim);
1530 void TGWin32::SetTextFont(Font_t fontnumber)
1532 fTextFont = fontnumber;
1533 TTF::SetTextFont(fontnumber);
1546 Int_t TGWin32::SetTextFont(
char *fontname, ETextSetMode mode)
1548 return TTF::SetTextFont(fontname);
1554 void TGWin32::SetTextSize(Float_t textsize)
1556 fTextSize = textsize;
1557 TTF::SetTextSize(textsize);
1563 void TGWin32::ClearWindow()
1565 if (!fWindows)
return;
1567 if (!gCws->ispixmap && !gCws->double_buffer) {
1568 gdk_window_set_background(gCws->drawing, (GdkColor *) & GetColor(0).color);
1569 gdk_window_clear(gCws->drawing);
1572 SetColor(gGCpxmp, 0);
1573 gdk_win32_draw_rectangle(gCws->drawing, gGCpxmp, 1,
1574 0, 0, gCws->width, gCws->height);
1575 SetColor(gGCpxmp, 1);
1582 void TGWin32::ClosePixmap()
1590 void TGWin32::CloseWindow()
1598 void TGWin32::CloseWindow1()
1602 if (gCws->ispixmap) {
1603 gdk_pixmap_unref(gCws->window);
1605 gdk_window_destroy(gCws->window, kTRUE);
1609 gdk_pixmap_unref(gCws->buffer);
1611 if (gCws->new_colors) {
1612 gdk_colormap_free_colors((GdkColormap *) fColormap,
1613 (GdkColor *)gCws->new_colors, gCws->ncolors);
1615 delete [] gCws->new_colors;
1616 gCws->new_colors = 0;
1622 if (!fWindows)
return;
1625 for (wid = 0; wid < fMaxNumberOfWindows; wid++) {
1626 if (fWindows[wid].open) {
1627 gCws = &fWindows[wid];
1637 void TGWin32::CopyPixmap(
int wid,
int xpos,
int ypos)
1639 if (!fWindows)
return;
1641 gTws = &fWindows[wid];
1642 gdk_window_copy_area(gCws->drawing, gGCpxmp, xpos, ypos, gTws->drawing,
1643 0, 0, gTws->width, gTws->height);
1652 void TGWin32::DrawBox(
int x1,
int y1,
int x2,
int y2, EBoxMode mode)
1654 if (!fWindows)
return;
1656 Int_t x = TMath::Min(x1, x2);
1657 Int_t y = TMath::Min(y1, y2);
1658 Int_t w = TMath::Abs(x2 - x1);
1659 Int_t h = TMath::Abs(y2 - y1);
1664 if (fLineColorModified) UpdateLineColor();
1665 if (fPenModified) UpdateLineStyle();
1666 gdk_win32_draw_rectangle(gCws->drawing, gGCline, 0, x, y, w, h);
1670 if (fFillStyleModified) UpdateFillStyle();
1671 if (fFillColorModified) UpdateFillColor();
1672 gdk_win32_draw_rectangle(gCws->drawing, gGCfill, 1, x, y, w, h);
1691 void TGWin32::DrawCellArray(Int_t x1, Int_t y1, Int_t x2, Int_t y2,
1692 Int_t nx, Int_t ny, Int_t *ic)
1694 int i, j, icol, ix, iy, w, h, current_icol;
1696 if (!fWindows)
return;
1699 w = TMath::Max((x2 - x1) / (nx), 1);
1700 h = TMath::Max((y1 - y2) / (ny), 1);
1703 if (fFillStyleModified) UpdateFillStyle();
1704 if (fFillColorModified) UpdateFillColor();
1706 for (i = 0; i < nx; i++) {
1708 for (j = 0; j < ny; j++) {
1709 icol = ic[i + (nx * j)];
1710 if (icol != current_icol) {
1711 gdk_gc_set_foreground(gGCfill, (GdkColor *) & GetColor(icol).color);
1712 current_icol = icol;
1715 gdk_win32_draw_rectangle(gCws->drawing, gGCfill, kTRUE, ix, iy, w, h);
1727 void TGWin32::DrawFillArea(
int n, TPoint *xyt)
1730 static int lastn = 0;
1731 static GdkPoint *xy = 0;
1733 if (!fWindows)
return;
1735 if (fFillStyleModified) UpdateFillStyle();
1736 if (fFillColorModified) UpdateFillColor();
1739 delete [] (GdkPoint *)xy;
1740 xy =
new GdkPoint[n];
1743 for (i = 0; i < n; i++) {
1744 xy[i].x = xyt[i].fX;
1745 xy[i].y = xyt[i].fY;
1749 gdk_win32_draw_lines(gCws->drawing, gGCfill, xy, n);
1751 gdk_win32_draw_polygon(gCws->drawing, gGCfill, 1, xy, n);
1760 void TGWin32::DrawLine(
int x1,
int y1,
int x2,
int y2)
1762 if (!fWindows)
return;
1764 if (fLineColorModified) UpdateLineColor();
1765 if (fPenModified) UpdateLineStyle();
1767 if (gLineStyle == GDK_LINE_SOLID) {
1768 gdk_draw_line(gCws->drawing, gGCline, x1, y1, x2, y2);
1772 for (i = 0; i < gDashSize; i++) {
1773 dashes[i] = (gint8) gDashList[i];
1775 for (i = gDashSize; i < 32; i++) {
1776 dashes[i] = (gint8) 0;
1778 gdk_gc_set_dashes(gGCdash, gDashOffset, dashes, gDashSize);
1779 gdk_draw_line(gCws->drawing, gGCdash, x1, y1, x2, y2);
1788 void TGWin32::DrawPolyLine(
int n, TPoint * xyt)
1792 if (!fWindows)
return;
1794 Point_t *xy =
new Point_t[n];
1796 for (i = 0; i < n; i++) {
1797 xy[i].fX = xyt[i].fX;
1798 xy[i].fY = xyt[i].fY;
1801 if (fLineColorModified) UpdateLineColor();
1802 if (fPenModified) UpdateLineStyle();
1805 if (gLineStyle == GDK_LINE_SOLID) {
1806 gdk_win32_draw_lines(gCws->drawing, gGCline, (GdkPoint *)xy, n);
1811 for (i = 0; i < gDashSize; i++) {
1812 dashes[i] = (gint8) gDashList[i];
1814 for (i = gDashSize; i < 32; i++) {
1815 dashes[i] = (gint8) 0;
1818 gdk_gc_set_dashes(gGCdash, gDashOffset, dashes, gDashSize);
1819 gdk_win32_draw_lines(gCws->drawing, (GdkGC*)gGCdash, (GdkPoint *)xy, n);
1822 for (i = 1; i < n; i++) {
1823 int dx = xy[i].fX - xy[i - 1].fX;
1824 int dy = xy[i].fY - xy[i - 1].fY;
1826 if (dx < 0) dx = -dx;
1827 if (dy < 0) dy = -dy;
1828 gDashOffset += dx > dy ? dx : dy;
1830 gDashOffset %= gDashLength;
1833 gdk_win32_draw_points( gCws->drawing, gLineStyle == GDK_LINE_SOLID ?
1834 gGCline : gGCdash, (GdkPoint *)xy,1);
1844 void TGWin32::DrawPolyMarker(
int n, TPoint *xyt)
1847 static int lastn = 0;
1848 static GdkPoint *xy = 0;
1850 if (!fWindows)
return;
1852 if (fMarkerStyleModified) UpdateMarkerStyle();
1853 if (fMarkerColorModified) UpdateMarkerColor();
1856 delete [] (GdkPoint *)xy;
1857 xy =
new GdkPoint[n];
1861 for (i = 0; i < n; i++) {
1862 xy[i].x = xyt[i].fX;
1863 xy[i].y = xyt[i].fY;
1866 if (gMarker.n <= 0) {
1867 gdk_win32_draw_points(gCws->drawing, gGCmark, xy, n);
1869 int r = gMarker.n / 2;
1872 for (m = 0; m < n; m++) {
1874 switch (gMarker.type) {
1878 gdk_win32_draw_arc(gCws->drawing, gGCmark, kFALSE, xy[m].x-r, xy[m].y-r,
1879 gMarker.n, gMarker.n, 0, 23040);
1883 gdk_win32_draw_arc(gCws->drawing, gGCmark, kTRUE, xy[m].x-r, xy[m].y-r,
1884 gMarker.n, gMarker.n, 0, 23040);
1890 for (i = 0; i < gMarker.n; i++) {
1891 gMarker.xy[i].x += xy[m].x;
1892 gMarker.xy[i].y += xy[m].y;
1895 gdk_win32_draw_lines(gCws->drawing, gGCmark, (GdkPoint *)gMarker.xy, gMarker.n);
1897 gdk_win32_draw_polygon(gCws->drawing, gGCmark, 1, (GdkPoint *)gMarker.xy, gMarker.n);
1899 for (i = 0; i < gMarker.n; i++) {
1900 gMarker.xy[i].x -= xy[m].x;
1901 gMarker.xy[i].y -= xy[m].y;
1906 for (i = 0; i < gMarker.n; i += 2) {
1907 gdk_draw_line(gCws->drawing, gGCmark,
1908 xy[m].x + gMarker.xy[i].x,
1909 xy[m].y + gMarker.xy[i].y,
1910 xy[m].x + gMarker.xy[i + 1].x,
1911 xy[m].y + gMarker.xy[i + 1].y);
1922 void TGWin32::GetCharacterUp(Float_t & chupx, Float_t & chupy)
1924 chupx = fCharacterUpX;
1925 chupy = fCharacterUpY;
1932 XColor_t &TGWin32::GetColor(Int_t cid)
1934 XColor_t *col = (XColor_t*) fColors->GetValue(cid);
1937 fColors->Add(cid, (Long_t) col);
1945 Window_t TGWin32::GetCurrentWindow()
const
1947 return (Window_t)(gCws ? gCws->drawing : 0);
1954 GdkGC *TGWin32::GetGC(Int_t which)
const
1956 if (which >= kMAXGC || which < 0) {
1957 Error(
"GetGC",
"trying to get illegal GdkGC (which = %d)", which);
1961 return gGClist[which];
1967 Int_t TGWin32::GetDoubleBuffer(
int wid)
1969 if (!fWindows)
return 0;
1971 gTws = &fWindows[wid];
1976 return gTws->double_buffer;
1987 void TGWin32::GetGeometry(
int wid,
int &x,
int &y,
unsigned int &w,
1990 if (!fWindows)
return;
1996 w = gdk_screen_width();
1997 h = gdk_screen_height();
2002 gTws = &fWindows[wid];
2003 gdk_window_get_geometry((GdkDrawable *) gTws->window, &x, &y,
2004 &width, &height, &depth);
2006 gdk_window_get_deskrelative_origin((GdkDrawable *) gTws->window, &x, &y);
2008 if (width > 0 && height > 0) {
2009 gTws->width = width;
2010 gTws->height = height;
2020 const char *TGWin32::DisplayName(
const char *dpyName)
2028 void TGWin32::GetPlanes(
int &nplanes)
2030 nplanes = gdk_visual_get_best_depth();
2036 void TGWin32::GetRGB(
int index,
float &r,
float &g,
float &b)
2040 }
else if (index == 1) {
2043 XColor_t &col = GetColor(index);
2044 r = ((float) col.color.red) / ((float) kBIGGEST_RGB_VALUE);
2045 g = ((float) col.color.green) / ((float) kBIGGEST_RGB_VALUE);
2046 b = ((float) col.color.blue) / ((float) kBIGGEST_RGB_VALUE);
2056 void TGWin32::GetTextExtent(
unsigned int &w,
unsigned int &h,
char *mess)
2058 TTF::SetTextFont(gTextFont);
2059 TTF::SetTextSize(fTextSize);
2060 TTF::GetTextExtent(w, h, mess);
2067 Window_t TGWin32::GetWindowID(
int wid)
2069 if (!fWindows)
return 0;
2070 return (Window_t) fWindows[wid].window;
2079 void TGWin32::MoveWindow(
int wid,
int x,
int y)
2081 if (!fWindows)
return;
2083 gTws = &fWindows[wid];
2084 if (!gTws->open)
return;
2086 gdk_window_move((GdkDrawable *) gTws->window, x, y);
2093 Int_t TGWin32::OpenPixmap(
unsigned int w,
unsigned int h)
2103 for (wid = 0; wid < fMaxNumberOfWindows; wid++) {
2104 if (!fWindows[wid].open) {
2105 fWindows[wid].open = 1;
2106 gCws = &fWindows[wid];
2110 if (wid == fMaxNumberOfWindows) {
2111 int newsize = fMaxNumberOfWindows + 10;
2112 fWindows = (XWindow_t *) TStorage::ReAlloc(fWindows,
2113 newsize *
sizeof(XWindow_t),
2114 fMaxNumberOfWindows *
2117 for (i = fMaxNumberOfWindows; i < newsize; i++) fWindows[i].open = 0;
2118 fMaxNumberOfWindows = newsize;
2122 depth =gdk_visual_get_best_depth();
2123 gCws->window = (GdkPixmap *) gdk_pixmap_new(GDK_ROOT_PARENT(),wval,hval,depth);
2124 gdk_drawable_get_size((GdkDrawable *) gCws->window, &ww, &hh);
2126 for (i = 0; i < kMAXGC; i++) {
2127 gdk_gc_set_clip_mask((GdkGC *) gGClist[i], (GdkDrawable *)None);
2130 SetColor(gGCpxmp, 0);
2131 gdk_win32_draw_rectangle(gCws->window,(GdkGC *)gGCpxmp, kTRUE,
2133 SetColor(gGCpxmp, 1);
2136 gCws->drawing = gCws->window;
2138 gCws->double_buffer = 0;
2142 gCws->height = hval;
2143 gCws->new_colors = 0;
2152 Int_t TGWin32::InitWindow(ULong_t win)
2154 GdkWindowAttr attributes;
2155 unsigned long attr_mask = 0;
2158 int wval, hval, depth;
2160 GdkWindow *wind = (GdkWindow *) win;
2162 gdk_window_get_geometry(wind, &xval, &yval, &wval, &hval, &depth);
2167 for (wid = 0; wid < fMaxNumberOfWindows; wid++) {
2168 if (!fWindows[wid].open) {
2169 fWindows[wid].open = 1;
2170 fWindows[wid].double_buffer = 0;
2171 gCws = &fWindows[wid];
2176 if (wid == fMaxNumberOfWindows) {
2177 int newsize = fMaxNumberOfWindows + 10;
2179 (XWindow_t *) TStorage::ReAlloc(fWindows,
2180 newsize *
sizeof(XWindow_t),
2181 fMaxNumberOfWindows *
2184 for (
int i = fMaxNumberOfWindows; i < newsize; i++) {
2185 fWindows[i].open = 0;
2188 fMaxNumberOfWindows = newsize;
2192 attributes.wclass = GDK_INPUT_OUTPUT;
2193 attributes.event_mask = 0L;
2194 attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK |
2195 GDK_PROPERTY_CHANGE_MASK;
2198 attributes.x = xval;
2200 attributes.x = -1.0 * xval;
2204 attributes.y = yval;
2206 attributes.y = -1.0 * yval;
2208 attributes.width = wval;
2209 attributes.height = hval;
2210 attributes.colormap = gdk_colormap_get_system();
2211 attributes.visual = gdk_window_get_visual(wind);
2212 attributes.override_redirect = TRUE;
2214 if ((attributes.y > 0) && (attributes.x > 0)) {
2215 attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_COLORMAP |
2216 GDK_WA_WMCLASS | GDK_WA_NOREDIR;
2218 attr_mask = GDK_WA_COLORMAP | GDK_WA_WMCLASS | GDK_WA_NOREDIR;
2221 if (attributes.visual != NULL) {
2222 attr_mask |= GDK_WA_VISUAL;
2224 attributes.window_type = GDK_WINDOW_CHILD;
2225 gCws->window = gdk_window_new(wind, &attributes, attr_mask);
2226 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)gCws->window);
2227 ::ShowWindow(window, SW_SHOWNORMAL);
2228 ::ShowWindow(window, SW_RESTORE);
2229 ::BringWindowToTop(window);
2231 if (!fUseSysPointers) {
2232 ::SetClassLong(window, GCL_HCURSOR,
2233 (LONG)GDK_CURSOR_XID(fCursors[kPointer]));
2238 gCws->drawing = gCws->window;
2240 gCws->double_buffer = 0;
2244 gCws->height = hval;
2245 gCws->new_colors = 0;
2256 void TGWin32::QueryPointer(
int &ix,
int &iy)
2270 void TGWin32::RemovePixmap(GdkDrawable *pix)
2272 gdk_pixmap_unref((GdkPixmap *)pix);
2301 Int_t TGWin32::RequestLocator(Int_t mode, Int_t ctyp, Int_t & x, Int_t & y)
2303 static int xloc = 0;
2304 static int yloc = 0;
2305 static int xlocp = 0;
2306 static int ylocp = 0;
2307 static GdkCursor *cursor = NULL;
2315 if (cursor == NULL) {
2317 gdk_window_set_cursor((GdkWindow *)gCws->window, (GdkCursor *)gNullCursor);
2318 gdk_gc_set_foreground((GdkGC *) gGCecho, &GetColor(0).color);
2320 if (fUseSysPointers)
2321 cursor = gdk_syscursor_new((ULong_t)IDC_CROSS);
2323 cursor = gdk_cursor_new((GdkCursorType)GDK_CROSSHAIR);
2324 gdk_window_set_cursor((GdkWindow *)gCws->window, (GdkCursor *)cursor);
2333 TGWin32VirtualXProxy::fMaxResponseTime = 120000;
2334 while (button_press == 0) {
2335 event = gdk_event_get();
2343 gdk_draw_line(gCws->window, gGCecho, xloc, 0, xloc, gCws->height);
2344 gdk_draw_line(gCws->window, gGCecho, 0, yloc, gCws->width, yloc);
2348 radius = (int) TMath::Sqrt((
double)((xloc - xlocp) * (xloc - xlocp) +
2349 (yloc - ylocp) * (yloc - ylocp)));
2351 gdk_win32_draw_arc(gCws->window, gGCecho, kFALSE,
2352 xlocp - radius, ylocp - radius,
2353 2 * radius, 2 * radius, 0, 23040);
2357 gdk_draw_line(gCws->window, gGCecho, xlocp, ylocp, xloc, yloc);
2361 gdk_win32_draw_rectangle( gCws->window, gGCecho, kFALSE,
2362 TMath::Min(xlocp, xloc), TMath::Min(ylocp, yloc),
2363 TMath::Abs(xloc - xlocp), TMath::Abs(yloc - ylocp));
2370 xloc =
event->button.x;
2371 yloc =
event->button.y;
2373 switch (event->type) {
2375 case GDK_LEAVE_NOTIFY:
2378 event = gdk_event_get();
2380 if (event->type == GDK_ENTER_NOTIFY) {
2381 gdk_event_free(event);
2384 gdk_event_free(event);
2391 case GDK_BUTTON_PRESS:
2392 button_press =
event->button.button;
2393 xlocp =
event->button.x;
2394 ylocp =
event->button.y;
2395 gdk_cursor_unref(cursor);
2399 case GDK_BUTTON_RELEASE:
2401 button_press = 10 +
event->button.button;
2402 xlocp =
event->button.x;
2403 ylocp =
event->button.y;
2409 button_press =
event->key.keyval;
2410 xlocp =
event->button.x;
2411 ylocp =
event->button.y;
2415 case GDK_KEY_RELEASE:
2417 button_press = -1 * (int)(event->key.keyval);
2418 xlocp =
event->button.x;
2419 ylocp =
event->button.y;
2427 xtmp =
event->button.x;
2428 ytmp =
event->button.y;
2430 gdk_event_free(event);
2433 if (button_press == 0) {
2439 TGWin32VirtualXProxy::fMaxResponseTime = 1000;
2444 return button_press;
2456 Int_t TGWin32::RequestString(
int x,
int y,
char *text)
2458 static GdkCursor *cursor = NULL;
2459 static int percent = 0;
2460 static GdkWindow *CurWnd;
2465 int len_text = strlen(text);
2469 CurWnd = (GdkWindow *)gCws->window;
2471 if (cursor == NULL) {
2472 if (fUseSysPointers)
2473 cursor = gdk_syscursor_new((ULong_t)IDC_HELP);
2475 cursor = gdk_cursor_new((GdkCursorType)GDK_QUESTION_ARROW);
2478 gdk_window_set_cursor(CurWnd, cursor);
2480 for (nt = len_text; nt > 0 && text[nt - 1] ==
' '; nt--);
2483 focuswindow = ::SetFocus((HWND)GDK_DRAWABLE_XID(CurWnd));
2487 TGWin32VirtualXProxy::fMaxResponseTime = 120000;
2488 TTF::SetTextFont(gTextFont);
2489 TTF::SetTextSize(fTextSize);
2497 if (EventsPending()) {
2498 event = gdk_event_get();
2500 gSystem->ProcessEvents();
2501 ::SleepEx(10, kTRUE);
2505 DrawText(x, y, 0.0, 1.0, text, kOpaque);
2506 TTF::GetTextExtent(dx, h, text);
2507 DrawText(x+dx, y, 0.0, 1.0,
" ", kOpaque);
2512 char *stmp =
new char[pt+1];
2513 strncpy(stmp, text, pt);
2515 TTF::GetTextExtent(ddx, h, stmp);
2520 if (pt < len_text) {
2523 DrawText(x+dx, y, 0.0, 1.0, tmp, kOpaque);
2525 DrawText(x+dx, y, 0.0, 1.0,
" ", kOpaque);
2528 if (event != NULL) {
2529 switch (event->type) {
2530 case GDK_BUTTON_PRESS:
2531 case GDK_ENTER_NOTIFY:
2532 focuswindow = ::SetFocus((HWND)GDK_DRAWABLE_XID(CurWnd));
2535 case GDK_LEAVE_NOTIFY:
2536 ::SetFocus(focuswindow);
2539 nbytes =
event->key.length;
2540 for (i = 0; i < nbytes; i++) {
2541 keybuf[i] =
event->key.string[i];
2543 keysym =
event->key.keyval;
2579 if (isascii(keybuf[0]) && isprint(keybuf[0])) {
2581 if (nt < len_text) {
2584 for (i = nt - 1; i > pt; i--) {
2585 text[i] = text[i - 1];
2587 if (pt < len_text) {
2588 text[pt] = keybuf[0];
2592 switch (keybuf[0]) {
2599 for (i = pt; i < nt; i++) {
2600 text[i - 1] = text[i];
2620 for (i = pt; i < nt; i++) {
2621 text[i - 1] = text[i];
2640 for (i = pt; i < nt; i++)
2648 text[pt] = text[pt - 1];
2667 SetInputFocus((Window_t)gCws->window);
2670 gdk_event_free(event);
2673 TGWin32VirtualXProxy::fMaxResponseTime = 1000;
2674 ::SetFocus(focuswindow);
2675 SetInputFocus((Window_t)CurWnd);
2677 gdk_window_set_cursor(CurWnd, (GdkCursor *)fCursors[kPointer]);
2679 gdk_cursor_unref(cursor);
2692 void TGWin32::RescaleWindow(
int wid,
unsigned int w,
unsigned int h)
2696 if (!fWindows)
return;
2698 gTws = &fWindows[wid];
2703 if (gTws->width == w && gTws->height == h)
2706 gdk_window_resize((GdkWindow *) gTws->window, w, h);
2710 if (gTws->width < w || gTws->height < h) {
2711 gdk_pixmap_unref(gTws->buffer);
2712 gTws->buffer = gdk_pixmap_new(GDK_ROOT_PARENT(),
2713 w, h, gdk_visual_get_best_depth());
2715 for (i = 0; i < kMAXGC; i++) {
2716 gdk_gc_set_clip_mask(gGClist[i], None);
2718 SetColor(gGCpxmp, 0);
2719 gdk_win32_draw_rectangle(gTws->buffer, gGCpxmp, 1, 0, 0, w, h);
2720 SetColor(gGCpxmp, 1);
2722 if (gTws->double_buffer) gTws->drawing = gTws->buffer;
2733 int TGWin32::ResizePixmap(
int wid,
unsigned int w,
unsigned int h)
2741 if (!fWindows)
return 0;
2743 gTws = &fWindows[wid];
2750 if (gTws->width >= wval - 1 && gTws->width <= wval + 1 &&
2751 gTws->height >= hval - 1 && gTws->height <= hval + 1)
2755 if (gTws->width < wval || gTws->height < hval) {
2756 gdk_pixmap_unref((GdkPixmap *)gTws->window);
2757 depth = gdk_visual_get_best_depth();
2758 gTws->window = gdk_pixmap_new(GDK_ROOT_PARENT(), wval, hval, depth);
2761 gdk_drawable_get_size(gTws->window, &ww, &hh);
2763 for (i = 0; i < kMAXGC; i++) {
2764 gdk_gc_set_clip_mask((GdkGC *) gGClist[i], (GdkDrawable *)None);
2767 SetColor(gGCpxmp, 0);
2768 gdk_win32_draw_rectangle(gTws->window,(GdkGC *)gGCpxmp, kTRUE, 0, 0, ww, hh);
2769 SetColor(gGCpxmp, 1);
2772 gTws->drawing = gTws->window;
2774 gTws->height = hval;
2781 void TGWin32::ResizeWindow(
int wid)
2784 int xval = 0, yval = 0;
2785 GdkWindow *win, *root = NULL;
2786 int wval = 0, hval = 0, depth = 0;
2788 if (!fWindows)
return;
2790 gTws = &fWindows[wid];
2792 win = (GdkWindow *) gTws->window;
2793 gdk_window_get_geometry(win, &xval, &yval,
2794 &wval, &hval, &depth);
2797 if (gTws->width == wval && gTws->height == hval) {
2801 gdk_window_resize((GdkWindow *) gTws->window, wval, hval);
2804 if (gTws->width < wval || gTws->height < hval) {
2805 gdk_pixmap_unref((GdkPixmap *)gTws->buffer);
2806 depth = gdk_visual_get_best_depth();
2807 gTws->buffer = (GdkPixmap *) gdk_pixmap_new(GDK_ROOT_PARENT(),
2811 for (i = 0; i < kMAXGC; i++) {
2812 gdk_gc_set_clip_mask((GdkGC *) gGClist[i], (GdkDrawable *)None);
2815 SetColor(gGCpxmp, 0);
2816 gdk_win32_draw_rectangle(gTws->buffer,(GdkGC *)gGCpxmp, kTRUE, 0, 0, wval, hval);
2818 SetColor(gGCpxmp, 1);
2820 if (gTws->double_buffer) gTws->drawing = gTws->buffer;
2824 gTws->height = hval;
2830 void TGWin32::SelectWindow(
int wid)
2835 if (!fWindows || wid < 0 || wid >= fMaxNumberOfWindows || !fWindows[wid].open) {
2839 gCws = &fWindows[wid];
2841 if (gCws->clip && !gCws->ispixmap && !gCws->double_buffer) {
2842 rect.x = gCws->xclip;
2843 rect.y = gCws->yclip;
2844 rect.width = gCws->wclip;
2845 rect.height = gCws->hclip;
2847 for (i = 0; i < kMAXGC; i++) {
2848 gdk_gc_set_clip_rectangle((GdkGC *) gGClist[i], &rect);
2851 for (i = 0; i < kMAXGC; i++) {
2852 gdk_gc_set_clip_mask((GdkGC *) gGClist[i], (GdkDrawable *)None);
2860 void TGWin32::SetCharacterUp(Float_t chupx, Float_t chupy)
2862 if (chupx == fCharacterUpX && chupy == fCharacterUpY)
return;
2864 if (chupx == 0 && chupy == 0) {
2866 }
else if (chupx == 0 && chupy == 1) {
2868 }
else if (chupx == -1 && chupy == 0) {
2870 }
else if (chupx == 0 && chupy == -1) {
2872 }
else if (chupx == 1 && chupy == 0) {
2877 ACos(chupx / TMath::Sqrt(chupx * chupx + chupy * chupy)) *
2878 180.) / 3.14159) - 90;
2879 if (chupy < 0) fTextAngle = 180 - fTextAngle;
2880 if (TMath::Abs(fTextAngle) <= 0.01) fTextAngle = 0;
2882 fCharacterUpX = chupx;
2883 fCharacterUpY = chupy;
2889 void TGWin32::SetClipOFF(
int wid)
2891 if (!fWindows)
return;
2893 gTws = &fWindows[wid];
2896 for (
int i = 0; i < kMAXGC; i++) {
2897 gdk_gc_set_clip_mask((GdkGC *) gGClist[i], (GdkDrawable *)None);
2907 void TGWin32::SetClipRegion(
int wid,
int x,
int y,
unsigned int w,
2910 if (!fWindows)
return;
2912 gTws = &fWindows[wid];
2920 if (gTws->clip && !gTws->ispixmap && !gTws->double_buffer) {
2921 rect.x = gTws->xclip;
2922 rect.y = gTws->yclip;
2923 rect.width = gTws->wclip;
2924 rect.height = gTws->hclip;
2926 for (
int i = 0; i < kMAXGC; i++) {
2927 gdk_gc_set_clip_rectangle((GdkGC *)gGClist[i], &rect);
2935 ULong_t TGWin32::GetPixel(Color_t ci)
2937 TColor *color = gROOT->GetColor(ci);
2939 SetRGB(ci, color->GetRed(), color->GetGreen(), color->GetBlue());
2940 XColor_t &col = GetColor(ci);
2941 return col.color.pixel;
2947 void TGWin32::SetColor(GdkGC *gc,
int ci)
2954 TColor *clr = gROOT->GetColor(ci);
2956 SetRGB(ci, clr->GetRed(), clr->GetGreen(), clr->GetBlue());
2958 XColor_t &col = GetColor(ci);
2959 if (fColormap && !col.fDefined) {
2961 }
else if (!fColormap && (ci < 0 || ci > 1)) {
2965 if (fDrawMode == kXor) {
2966 gdk_gc_get_values(gc, &gcvals);
2968 color.pixel = col.color.pixel ^ gcvals.background.pixel;
2969 color.red = GetRValue(color.pixel);
2970 color.green = GetGValue(color.pixel);
2971 color.blue = GetBValue(color.pixel);
2972 gdk_gc_set_foreground(gc, &color);
2975 gdk_gc_set_foreground(gc, &col.color);
2978 gdk_gc_get_values(gc, &gcvals);
2980 if (gcvals.foreground.pixel != gcvals.background.pixel) {
2981 gdk_gc_set_background(gc, &GetColor(!ci).color);
2989 void TGWin32::SetCursor(
int wid, ECursor cursor)
2991 if (!fWindows)
return;
2993 gTws = &fWindows[wid];
2994 gdk_window_set_cursor((GdkWindow *)gTws->window, (GdkCursor *)fCursors[cursor]);
3000 void TGWin32::SetCursor(Window_t
id, Cursor_t curid)
3004 static GdkWindow *lid = 0;
3005 static GdkCursor *lcur = 0;
3007 if ((lid == (GdkWindow *)
id) && (lcur==(GdkCursor *)curid))
return;
3008 lid = (GdkWindow *)
id;
3009 lcur = (GdkCursor *)curid;
3011 gdk_window_set_cursor((GdkWindow *)
id, (GdkCursor *)curid);
3021 void TGWin32::SetDoubleBuffer(
int wid,
int mode)
3023 if (!fWindows)
return;
3026 for (
int i = 0; i < fMaxNumberOfWindows; i++) {
3027 gTws = &fWindows[i];
3031 SetDoubleBufferON();
3034 SetDoubleBufferOFF();
3040 gTws = &fWindows[wid];
3041 if (!gTws->open)
return;
3045 SetDoubleBufferON();
3048 SetDoubleBufferOFF();
3057 void TGWin32::SetDoubleBufferOFF()
3059 if (!gTws->double_buffer)
return;
3060 gTws->double_buffer = 0;
3061 gTws->drawing = gTws->window;
3067 void TGWin32::SetDoubleBufferON()
3069 if (!fWindows || gTws->double_buffer || gTws->ispixmap)
return;
3071 if (!gTws->buffer) {
3072 gTws->buffer = gdk_pixmap_new(GDK_ROOT_PARENT(),
3073 gTws->width, gTws->height,
3074 gdk_visual_get_best_depth());
3075 SetColor(gGCpxmp, 0);
3076 gdk_win32_draw_rectangle(gTws->buffer, gGCpxmp, 1, 0, 0, gTws->width,
3078 SetColor(gGCpxmp, 1);
3080 for (
int i = 0; i < kMAXGC; i++) {
3081 gdk_gc_set_clip_mask(gGClist[i], None);
3083 gTws->double_buffer = 1;
3084 gTws->drawing = gTws->buffer;
3096 void TGWin32::SetDrawMode(EDrawMode mode)
3102 for (i = 0; i < kMAXGC; i++) {
3103 gdk_gc_set_function(gGClist[i], GDK_COPY);
3108 for (i = 0; i < kMAXGC; i++) {
3109 gdk_gc_set_function(gGClist[i], GDK_XOR);
3114 for (i = 0; i < kMAXGC; i++) {
3115 gdk_gc_set_function(gGClist[i], GDK_INVERT);
3125 void TGWin32::SetFillColor(Color_t cindex)
3127 Int_t indx = Int_t(cindex);
3129 if (!gStyle->GetFillColor() && cindex > 1) {
3134 fFillColorModified = kTRUE;
3140 void TGWin32::UpdateFillColor()
3142 if (fFillColor >= 0) {
3143 SetColor(gGCfill, fFillColor);
3147 if (gFillPattern != NULL) {
3148 gdk_pixmap_unref(gFillPattern);
3149 gFillPattern = NULL;
3151 fFillColorModified = kFALSE;
3159 void TGWin32::SetFillStyle(Style_t fstyle)
3161 if (fFillStyle==fstyle)
return;
3163 fFillStyle = fstyle;
3164 fFillStyleModified = kTRUE;
3170 void TGWin32::UpdateFillStyle()
3172 static int current_fasi = 0;
3174 Int_t style = fFillStyle / 1000;
3175 Int_t fasi = fFillStyle % 1000;
3181 gdk_gc_set_fill(gGCfill, GDK_SOLID);
3190 gdk_gc_set_fill(gGCfill, GDK_STIPPLED);
3192 if (fasi != current_fasi) {
3193 if (gFillPattern != NULL) {
3194 gdk_pixmap_unref(gFillPattern);
3195 gFillPattern = NULL;
3197 int stn = (fasi >= 1 && fasi <=25) ? fasi : 2;
3198 gFillPattern = gdk_bitmap_create_from_data(GDK_ROOT_PARENT(),
3199 (
const char *)gStipples[stn], 16, 16);
3200 gdk_gc_set_stipple(gGCfill, gFillPattern);
3201 current_fasi = fasi;
3209 fFillStyleModified = kFALSE;
3215 void TGWin32::SetInput(
int inp)
3217 EnableWindow((HWND) GDK_DRAWABLE_XID(gCws->window), inp);
3223 void TGWin32::SetLineColor(Color_t cindex)
3225 if ((cindex < 0) || (cindex==fLineColor))
return;
3227 fLineColor = cindex;
3228 fLineColorModified = kTRUE;
3234 void TGWin32::UpdateLineColor()
3236 SetColor(gGCline, Int_t(fLineColor));
3237 SetColor(gGCdash, Int_t(fLineColor));
3238 fLineColorModified = kFALSE;
3251 void TGWin32::SetLineType(
int n,
int *dash)
3254 gLineStyle = GDK_LINE_SOLID;
3255 gdk_gc_set_line_attributes(gGCline, gLineWidth,
3256 (GdkLineStyle)gLineStyle,
3257 (GdkCapStyle) gCapStyle,
3258 (GdkJoinStyle) gJoinStyle);
3261 gDashSize = TMath::Min((
int)
sizeof(gDashList),n);
3263 for (i = 0; i < gDashSize; i++) {
3264 gDashList[i] = dash[i];
3265 gDashLength += gDashList[i];
3268 gLineStyle = GDK_LINE_ON_OFF_DASH;
3269 if (gLineWidth == 0) gLineWidth =1;
3270 gdk_gc_set_line_attributes(gGCdash, gLineWidth,
3271 (GdkLineStyle) gLineStyle,
3272 (GdkCapStyle) gCapStyle,
3273 (GdkJoinStyle) gJoinStyle);
3275 fPenModified = kFALSE;
3281 void TGWin32::SetLineStyle(Style_t lstyle)
3283 if (fLineStyle == lstyle)
return;
3285 fLineStyle = lstyle;
3286 fPenModified = kTRUE;
3292 void TGWin32::UpdateLineStyle()
3294 static Int_t dashed[2] = { 3, 3 };
3295 static Int_t dotted[2] = { 1, 2 };
3296 static Int_t dasheddotted[4] = { 3, 4, 1, 4 };
3298 if (fLineStyle <= 1) {
3300 }
else if (fLineStyle == 2) {
3301 SetLineType(2, dashed);
3302 }
else if (fLineStyle == 3) {
3303 SetLineType(2, dotted);
3304 }
else if (fLineStyle == 4) {
3305 SetLineType(4, dasheddotted);
3307 TString st = (TString)gStyle->GetLineStyleString(fLineStyle);
3308 TObjArray *tokens = st.Tokenize(
" ");
3310 nt = tokens->GetEntries();
3311 Int_t *linestyle =
new Int_t[nt];
3312 for (Int_t j = 0; j<nt; j++) {
3314 sscanf(((TObjString*)tokens->At(j))->GetName(),
"%d", &it);
3315 linestyle[j] = (Int_t)(it/4);
3317 SetLineType(nt,linestyle);
3318 delete [] linestyle;
3321 fPenModified = kFALSE;
3328 void TGWin32::SetLineWidth(Width_t width)
3330 if (fLineWidth == width)
return;
3333 if (width == 1 && gLineStyle == GDK_LINE_SOLID) gLineWidth = 0;
3334 else gLineWidth = width;
3336 fPenModified = kTRUE;
3342 void TGWin32::SetMarkerColor(Color_t cindex)
3344 if ((cindex<0) || (cindex==fMarkerColor))
return;
3345 fMarkerColor = cindex;
3346 fMarkerColorModified = kTRUE;
3352 void TGWin32::UpdateMarkerColor()
3354 SetColor(gGCmark, Int_t(fMarkerColor));
3355 fMarkerColorModified = kFALSE;
3362 void TGWin32::SetMarkerSize(Float_t msize)
3364 if ((msize==fMarkerSize) || (msize<0))
return;
3366 fMarkerSize = msize;
3367 SetMarkerStyle(-fMarkerStyle);
3384 void TGWin32::SetMarkerType(
int type,
int n, GdkPoint * xy)
3386 gMarker.type = type;
3387 gMarker.n = n < kMAXMK ? n : kMAXMK;
3388 if (gMarker.type >= 2) {
3389 for (
int i = 0; i < gMarker.n; i++) {
3390 gMarker.xy[i] = xy[i];
3398 void TGWin32::SetMarkerStyle(Style_t markerstyle)
3400 if ((fMarkerStyle == markerstyle) || (markerstyle >= 50))
return;
3401 fMarkerStyle = TMath::Abs(markerstyle);
3402 fMarkerStyleModified = kTRUE;
3408 void TGWin32::UpdateMarkerStyle()
3410 static GdkPoint shape[30];
3412 Int_t im = Int_t(4 * fMarkerSize + 0.5);
3414 if (fMarkerStyle == 2) {
3424 SetMarkerType(4, 4, shape);
3425 }
else if (fMarkerStyle == 3 || fMarkerStyle == 31) {
3435 im = Int_t(0.707 * Float_t(im) + 0.5);
3444 SetMarkerType(4, 8, shape);
3445 }
else if (fMarkerStyle == 4 || fMarkerStyle == 24) {
3447 SetMarkerType(0, im * 2, shape);
3448 }
else if (fMarkerStyle == 5) {
3450 im = Int_t(0.707 * Float_t(im) + 0.5);
3459 SetMarkerType(4, 4, shape);
3460 }
else if (fMarkerStyle == 6) {
3470 SetMarkerType(4, 4, shape);
3471 }
else if (fMarkerStyle == 7) {
3485 SetMarkerType(4, 6, shape);
3486 }
else if (fMarkerStyle == 8 || fMarkerStyle == 20) {
3488 SetMarkerType(1, im * 2, shape);
3489 }
else if (fMarkerStyle == 21) {
3501 SetMarkerType(3, 5, shape);
3502 }
else if (fMarkerStyle == 22) {
3512 SetMarkerType(3, 4, shape);
3513 }
else if (fMarkerStyle == 23) {
3523 SetMarkerType(3, 4, shape);
3524 }
else if (fMarkerStyle == 25) {
3536 SetMarkerType(2, 5, shape);
3537 }
else if (fMarkerStyle == 26) {
3547 SetMarkerType(2, 4, shape);
3548 }
else if (fMarkerStyle == 27) {
3550 Int_t imx = Int_t(2.66 * fMarkerSize + 0.5);
3561 SetMarkerType(2, 5, shape);
3562 }
else if (fMarkerStyle == 28) {
3564 Int_t imx = Int_t(1.33 * fMarkerSize + 0.5);
3591 SetMarkerType(2, 13, shape);
3592 }
else if (fMarkerStyle == 29) {
3594 Int_t im1 = Int_t(0.66 * fMarkerSize + 0.5);
3595 Int_t im2 = Int_t(2.00 * fMarkerSize + 0.5);
3596 Int_t im3 = Int_t(2.66 * fMarkerSize + 0.5);
3597 Int_t im4 = Int_t(1.33 * fMarkerSize + 0.5);
3620 SetMarkerType(3, 11, shape);
3621 }
else if (fMarkerStyle == 30) {
3623 Int_t im1 = Int_t(0.66 * fMarkerSize + 0.5);
3624 Int_t im2 = Int_t(2.00 * fMarkerSize + 0.5);
3625 Int_t im3 = Int_t(2.66 * fMarkerSize + 0.5);
3626 Int_t im4 = Int_t(1.33 * fMarkerSize + 0.5);
3649 SetMarkerType(2, 11, shape);
3650 }
else if (fMarkerStyle == 32) {
3652 shape[0].x = 0; shape[0].y = im;
3653 shape[1].x = im; shape[1].y = -im;
3654 shape[2].x = -im; shape[2].y = -im;
3655 shape[3].x = 0; shape[3].y = im;
3656 SetMarkerType(2,4,shape);
3657 }
else if (fMarkerStyle == 33) {
3659 Int_t imx = Int_t(2.66*fMarkerSize + 0.5);
3660 shape[0].x =-imx; shape[0].y = 0;
3661 shape[1].x = 0; shape[1].y = -im;
3662 shape[2].x = imx; shape[2].y = 0;
3663 shape[3].x = 0; shape[3].y = im;
3664 shape[4].x =-imx; shape[4].y = 0;
3665 SetMarkerType(3,5,shape);
3666 }
else if (fMarkerStyle == 34) {
3668 Int_t imx = Int_t(1.33*fMarkerSize + 0.5);
3669 shape[0].x = -im; shape[0].y =-imx;
3670 shape[1].x =-imx; shape[1].y =-imx;
3671 shape[2].x =-imx; shape[2].y = -im;
3672 shape[3].x = imx; shape[3].y = -im;
3673 shape[4].x = imx; shape[4].y =-imx;
3674 shape[5].x = im; shape[5].y =-imx;
3675 shape[6].x = im; shape[6].y = imx;
3676 shape[7].x = imx; shape[7].y = imx;
3677 shape[8].x = imx; shape[8].y = im;
3678 shape[9].x =-imx; shape[9].y = im;
3679 shape[10].x=-imx; shape[10].y= imx;
3680 shape[11].x= -im; shape[11].y= imx;
3681 shape[12].x= -im; shape[12].y=-imx;
3682 SetMarkerType(3,13,shape);
3683 }
else if (fMarkerStyle == 35) {
3685 shape[0].x = -im; shape[0].y = -im;
3686 shape[1].x = im; shape[1].y = -im;
3687 shape[2].x = im; shape[2].y = im;
3688 shape[3].x = -im; shape[3].y = im;
3689 shape[4].x = -im; shape[4].y = -im;
3690 shape[5].x = im; shape[5].y = im;
3691 shape[6].x = -im; shape[6].y = im;
3692 shape[7].x = im; shape[7].y = -im;
3693 SetMarkerType(2,8,shape);
3694 }
else if (fMarkerStyle == 36) {
3696 shape[0].x =-im; shape[0].y = 0;
3697 shape[1].x = 0; shape[1].y = -im;
3698 shape[2].x = im; shape[2].y = 0;
3699 shape[3].x = 0; shape[3].y = im;
3700 shape[4].x =-im; shape[4].y = 0;
3701 shape[5].x = im; shape[5].y = 0;
3702 shape[6].x = 0; shape[6].y = im;
3703 shape[7].x = 0; shape[7].y =-im;
3704 SetMarkerType(2,8,shape);
3705 }
else if (fMarkerStyle == 37) {
3707 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3708 shape[0].x = 0; shape[0].y = 0;
3709 shape[1].x =-im2; shape[1].y = im;
3710 shape[2].x = -im; shape[2].y = 0;
3711 shape[3].x = 0; shape[3].y = 0;
3712 shape[4].x =-im2; shape[4].y = -im;
3713 shape[5].x = im2; shape[5].y = -im;
3714 shape[6].x = 0; shape[6].y = 0;
3715 shape[7].x = im; shape[7].y = 0;
3716 shape[8].x = im2; shape[8].y = im;
3717 shape[9].x = 0; shape[9].y = 0;
3718 SetMarkerType(2,10,shape);
3719 }
else if (fMarkerStyle == 38) {
3721 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3722 shape[0].x = -im; shape[0].y = 0;
3723 shape[1].x = -im; shape[1].y =-im2;
3724 shape[2].x =-im2; shape[2].y =-im;
3725 shape[3].x = im2; shape[3].y = -im;
3726 shape[4].x = im; shape[4].y =-im2;
3727 shape[5].x = im; shape[5].y = im2;
3728 shape[6].x = im2; shape[6].y = im;
3729 shape[7].x =-im2; shape[7].y = im;
3730 shape[8].x = -im; shape[8].y = im2;
3731 shape[9].x = -im; shape[9].y = 0;
3732 shape[10].x = im; shape[10].y = 0;
3733 shape[11].x = 0; shape[11].y = 0;
3734 shape[12].x = 0; shape[12].y = -im;
3735 shape[13].x = 0; shape[13].y = im;
3736 shape[14].x = 0; shape[14].y = 0;
3737 SetMarkerType(2,15,shape);
3738 }
else if (fMarkerStyle == 39) {
3740 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3741 shape[0].x = 0; shape[0].y = 0;
3742 shape[1].x =-im2; shape[1].y = im;
3743 shape[2].x = -im; shape[2].y = 0;
3744 shape[3].x = 0; shape[3].y = 0;
3745 shape[4].x =-im2; shape[4].y = -im;
3746 shape[5].x = im2; shape[5].y = -im;
3747 shape[6].x = 0; shape[6].y = 0;
3748 shape[7].x = im; shape[7].y = 0;
3749 shape[8].x = im2; shape[8].y = im;
3750 SetMarkerType(3,9,shape);
3751 }
else if (fMarkerStyle == 40) {
3753 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3754 shape[0].x = 0; shape[0].y = 0;
3755 shape[1].x = im2; shape[1].y = im;
3756 shape[2].x = im; shape[2].y = im2;
3757 shape[3].x = 0; shape[3].y = 0;
3758 shape[4].x = im; shape[4].y = -im2;
3759 shape[5].x = im2; shape[5].y = -im;
3760 shape[6].x = 0; shape[6].y = 0;
3761 shape[7].x = -im2; shape[7].y = -im;
3762 shape[8].x = -im; shape[8].y = -im2;
3763 shape[9].x = 0; shape[9].y = 0;
3764 shape[10].x = -im; shape[10].y = im2;
3765 shape[11].x = -im2; shape[11].y = im;
3766 shape[12].x = 0; shape[12].y = 0;
3767 SetMarkerType(2,13,shape);
3768 }
else if (fMarkerStyle == 41) {
3770 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3771 shape[0].x = 0; shape[0].y = 0;
3772 shape[1].x = im2; shape[1].y = im;
3773 shape[2].x = im; shape[2].y = im2;
3774 shape[3].x = 0; shape[3].y = 0;
3775 shape[4].x = im; shape[4].y = -im2;
3776 shape[5].x = im2; shape[5].y = -im;
3777 shape[6].x = 0; shape[6].y = 0;
3778 shape[7].x = -im2; shape[7].y = -im;
3779 shape[8].x = -im; shape[8].y = -im2;
3780 shape[9].x = 0; shape[9].y = 0;
3781 shape[10].x = -im; shape[10].y = im2;
3782 shape[11].x = -im2; shape[11].y = im;
3783 shape[12].x = 0; shape[12].y = 0;
3784 SetMarkerType(3,13,shape);
3785 }
else if (fMarkerStyle == 42) {
3787 Int_t imx = Int_t(fMarkerSize + 0.5);
3788 shape[0].x= 0; shape[0].y= im;
3789 shape[1].x= -imx; shape[1].y= imx;
3790 shape[2].x = -im; shape[2].y = 0;
3791 shape[3].x = -imx; shape[3].y = -imx;
3792 shape[4].x = 0; shape[4].y = -im;
3793 shape[5].x = imx; shape[5].y = -imx;
3794 shape[6].x = im; shape[6].y = 0;
3795 shape[7].x= imx; shape[7].y= imx;
3796 shape[8].x= 0; shape[8].y= im;
3797 SetMarkerType(2,9,shape);
3798 }
else if (fMarkerStyle == 43) {
3800 Int_t imx = Int_t(fMarkerSize + 0.5);
3801 shape[0].x = 0; shape[0].y = im;
3802 shape[1].x = -imx; shape[1].y = imx;
3803 shape[2].x = -im; shape[2].y = 0;
3804 shape[3].x = -imx; shape[3].y = -imx;
3805 shape[4].x = 0; shape[4].y = -im;
3806 shape[5].x = imx; shape[5].y = -imx;
3807 shape[6].x = im; shape[6].y = 0;
3808 shape[7].x = imx; shape[7].y = imx;
3809 shape[8].x = 0; shape[8].y = im;
3810 SetMarkerType(3,9,shape);
3811 }
else if (fMarkerStyle == 44) {
3813 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3814 shape[0].x = 0; shape[0].y = 0;
3815 shape[1].x = im2; shape[1].y = im;
3816 shape[2].x = -im2; shape[2].y = im;
3817 shape[3].x = im2; shape[3].y = -im;
3818 shape[4].x = -im2; shape[4].y = -im;
3819 shape[5].x = 0; shape[5].y = 0;
3820 shape[6].x = im; shape[6].y = im2;
3821 shape[7].x = im; shape[7].y = -im2;
3822 shape[8].x = -im; shape[8].y = im2;
3823 shape[9].x = -im; shape[9].y = -im2;
3824 shape[10].x = 0; shape[10].y = 0;
3825 SetMarkerType(2,11,shape);
3826 }
else if (fMarkerStyle == 45) {
3828 Int_t im0 = Int_t(0.4*fMarkerSize + 0.5);
3829 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3830 shape[0].x = im0; shape[0].y = im0;
3831 shape[1].x = im2; shape[1].y = im;
3832 shape[2].x = -im2; shape[2].y = im;
3833 shape[3].x = -im0; shape[3].y = im0;
3834 shape[4].x = -im; shape[4].y = im2;
3835 shape[5].x = -im; shape[5].y = -im2;
3836 shape[6].x = -im0; shape[6].y = -im0;
3837 shape[7].x = -im2; shape[7].y = -im;
3838 shape[8].x = im2; shape[8].y = -im;
3839 shape[9].x = im0; shape[9].y = -im0;
3840 shape[10].x = im; shape[10].y = -im2;
3841 shape[11].x = im; shape[11].y = im2;
3842 shape[12].x = im0; shape[12].y = im0;
3843 SetMarkerType(3,13,shape);
3844 }
else if (fMarkerStyle == 46) {
3846 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3847 shape[0].x = 0; shape[0].y = im2;
3848 shape[1].x = -im2; shape[1].y = im;
3849 shape[2].x = -im; shape[2].y = im2;
3850 shape[3].x = -im2; shape[3].y = 0;
3851 shape[4].x = -im; shape[4].y = -im2;
3852 shape[5].x = -im2; shape[5].y = -im;
3853 shape[6].x = 0; shape[6].y = -im2;
3854 shape[7].x = im2; shape[7].y = -im;
3855 shape[8].x = im; shape[8].y = -im2;
3856 shape[9].x = im2; shape[9].y = 0;
3857 shape[10].x = im; shape[10].y = im2;
3858 shape[11].x = im2; shape[11].y = im;
3859 shape[12].x = 0; shape[12].y = im2;
3860 SetMarkerType(2,13,shape);
3861 }
else if (fMarkerStyle == 47) {
3863 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3864 shape[0].x = 0; shape[0].y = im2;
3865 shape[1].x = -im2; shape[1].y = im;
3866 shape[2].x = -im; shape[2].y = im2;
3867 shape[3].x = -im2; shape[3].y = 0;
3868 shape[4].x = -im; shape[4].y = -im2;
3869 shape[5].x = -im2; shape[5].y = -im;
3870 shape[6].x = 0; shape[6].y = -im2;
3871 shape[7].x = im2; shape[7].y = -im;
3872 shape[8].x = im; shape[8].y = -im2;
3873 shape[9].x = im2; shape[9].y = 0;
3874 shape[10].x = im; shape[10].y = im2;
3875 shape[11].x = im2; shape[11].y = im;
3876 shape[12].x = 0; shape[12].y = im2;
3877 SetMarkerType(3,13,shape);
3878 }
else if (fMarkerStyle == 48) {
3880 Int_t im2 = Int_t(2.0*fMarkerSize + 0.5);
3881 shape[0].x = 0; shape[0].y = im2*1.005;
3882 shape[1].x = -im2; shape[1].y = im;
3883 shape[2].x = -im; shape[2].y = im2;
3884 shape[3].x = -im2; shape[3].y = 0;
3885 shape[4].x = -im; shape[4].y = -im2;
3886 shape[5].x = -im2; shape[5].y = -im;
3887 shape[6].x = 0; shape[6].y = -im2;
3888 shape[7].x = im2; shape[7].y = -im;
3889 shape[8].x = im; shape[8].y = -im2;
3890 shape[9].x = im2; shape[9].y = 0;
3891 shape[10].x = im; shape[10].y = im2;
3892 shape[11].x = im2; shape[11].y = im;
3893 shape[12].x = 0; shape[12].y = im2*0.995;
3894 shape[13].x = im2*0.995; shape[13].y = 0;
3895 shape[14].x = 0; shape[14].y = -im2*0.995;
3896 shape[15].x = -im2*0.995; shape[15].y = 0;
3897 shape[16].x = 0; shape[16].y = im2*0.995;
3898 SetMarkerType(3,16,shape);
3899 }
else if (fMarkerStyle == 49) {
3901 Int_t imx = Int_t(1.33*fMarkerSize + 0.5);
3902 shape[0].x =-imx; shape[0].y =-imx*1.005;
3903 shape[1].x =-imx; shape[1].y = -im;
3904 shape[2].x = imx; shape[2].y = -im;
3905 shape[3].x = imx; shape[3].y =-imx;
3906 shape[4].x = im; shape[4].y =-imx;
3907 shape[5].x = im; shape[5].y = imx;
3908 shape[6].x = imx; shape[6].y = imx;
3909 shape[7].x = imx; shape[7].y = im;
3910 shape[8].x =-imx; shape[8].y = im;
3911 shape[9].x =-imx; shape[9].y = imx;
3912 shape[10].x = -im; shape[10].y = imx;
3913 shape[11].x = -im; shape[11].y =-imx;
3914 shape[12].x =-imx; shape[12].y =-imx*0.995;
3915 shape[13].x =-imx; shape[13].y = imx;
3916 shape[14].x = imx; shape[14].y = imx;
3917 shape[15].x = imx; shape[15].y =-imx;
3918 shape[16].x =-imx; shape[16].y =-imx*1.005;
3919 SetMarkerType(3,17,shape);
3922 SetMarkerType(0, 0, shape);
3924 fMarkerStyleModified = kFALSE;
3934 void TGWin32::SetOpacity(Int_t percent)
3936 Int_t depth = gdk_visual_get_best_depth();
3938 if (depth <= 8)
return;
3939 if (percent == 0)
return;
3942 ULong_t *orgcolors = 0, *tmpc = 0;
3943 Int_t maxcolors = 0, ncolors, ntmpc = 0;
3946 if (gCws->new_colors) {
3947 tmpc = gCws->new_colors;
3948 ntmpc = gCws->ncolors;
3951 GdkImage *image = gdk_image_get((GdkDrawable*)gCws->drawing, 0, 0,
3952 gCws->width, gCws->height);
3956 for (y = 0; y < (int) gCws->height; y++) {
3957 for (x = 0; x < (int) gCws->width; x++) {
3958 ULong_t pixel = GetPixelImage((Drawable_t)image, x, y);
3959 CollectImageColors(pixel, orgcolors, ncolors, maxcolors);
3963 gdk_image_unref(image);
3964 ::operator
delete(orgcolors);
3968 MakeOpaqueColors(percent, orgcolors, ncolors);
3971 for (y = 0; y < (int) gCws->height; y++) {
3972 for (x = 0; x < (int) gCws->width; x++) {
3973 ULong_t pixel = GetPixelImage((Drawable_t)image, x, y);
3974 Int_t idx = FindColor(pixel, orgcolors, ncolors);
3975 PutPixel((Drawable_t)image, x, y, gCws->new_colors[idx]);
3980 gdk_draw_image(gCws->drawing, gGCpxmp, (GdkImage *)image,
3981 0, 0, 0, 0, gCws->width, gCws->height);
3986 gdk_colors_free((GdkColormap *)fColormap, tmpc, ntmpc, 0);
3989 gdk_image_unref(image);
3990 ::operator
delete(orgcolors);
3997 void TGWin32::MakeOpaqueColors(Int_t percent, ULong_t *orgcolors, Int_t ncolors)
4000 if (ncolors <= 0)
return;
4001 GdkColor *xcol =
new GdkColor[ncolors];
4004 for (i = 0; i < ncolors; i++) {
4005 xcol[i].pixel = orgcolors[i];
4006 xcol[i].red = xcol[i].green = xcol[i].blue = 0;
4009 GdkColorContext *cc;
4010 cc = gdk_color_context_new(gdk_visual_get_system(), (GdkColormap *)fColormap);
4011 gdk_color_context_query_colors(cc, xcol, ncolors);
4012 gdk_color_context_free(cc);
4014 UShort_t add = percent * kBIGGEST_RGB_VALUE / 100;
4017 for (i = 0; i < ncolors; i++) {
4018 val = xcol[i].red + add;
4019 if (val > kBIGGEST_RGB_VALUE) {
4020 val = kBIGGEST_RGB_VALUE;
4022 xcol[i].red = (UShort_t) val;
4023 val = xcol[i].green + add;
4024 if (val > kBIGGEST_RGB_VALUE) {
4025 val = kBIGGEST_RGB_VALUE;
4027 xcol[i].green = (UShort_t) val;
4028 val = xcol[i].blue + add;
4029 if (val > kBIGGEST_RGB_VALUE) {
4030 val = kBIGGEST_RGB_VALUE;
4032 xcol[i].blue = (UShort_t) val;
4034 ret = gdk_color_alloc((GdkColormap *)fColormap, &xcol[i]);
4037 Warning(
"MakeOpaqueColors",
4038 "failed to allocate color %hd, %hd, %hd", xcol[i].red,
4039 xcol[i].green, xcol[i].blue);
4044 gCws->new_colors =
new ULong_t[ncolors];
4045 gCws->ncolors = ncolors;
4047 for (i = 0; i < ncolors; i++) {
4048 gCws->new_colors[i] = xcol[i].pixel;
4057 Int_t TGWin32::FindColor(ULong_t pixel, ULong_t * orgcolors, Int_t ncolors)
4059 for (
int i = 0; i < ncolors; i++) {
4060 if (pixel == orgcolors[i])
return i;
4062 Error(
"FindColor",
"did not find color, should never happen!");
4072 void TGWin32::SetRGB(
int cindex,
float r,
float g,
float b)
4076 if (fColormap && cindex >= 0) {
4077 xcol.red = (
unsigned short) (r * kBIGGEST_RGB_VALUE);
4078 xcol.green = (
unsigned short) (g * kBIGGEST_RGB_VALUE);
4079 xcol.blue = (
unsigned short) (b * kBIGGEST_RGB_VALUE);
4080 xcol.pixel = RGB(xcol.red, xcol.green, xcol.blue);
4082 XColor_t &col = GetColor(cindex);
4085 if (col.color.red == xcol.red && col.color.green == xcol.green &&
4086 col.color.blue == xcol.blue)
4088 col.fDefined = kFALSE;
4089 gdk_colormap_free_colors((GdkColormap *) fColormap,
4090 (GdkColor *)&col, 1);
4093 Int_t ret = gdk_colormap_alloc_color(fColormap, &xcol, 1, 1);
4095 col.fDefined = kTRUE;
4096 col.color.pixel = xcol.pixel;
4097 col.color.red = xcol.red;
4098 col.color.green = xcol.green;
4099 col.color.blue = xcol.blue;
4109 void TGWin32::SetTextAlign(Short_t talign)
4111 static Short_t current = 0;
4112 if (talign==current)
return;
4115 Int_t txalh = talign / 10;
4116 Int_t txalv = talign % 10;
4117 fTextAlignH = txalh;
4118 fTextAlignV = txalv;
4163 TAttText::SetTextAlign(fTextAlign);
4169 void TGWin32::SetTextColor(Color_t cindex)
4171 static Int_t current = 0;
4173 if ((cindex < 0) || (Int_t(cindex)==current))
return;
4175 TAttText::SetTextColor(cindex);
4177 SetColor(gGCtext, Int_t(cindex));
4178 gdk_gc_get_values(gGCtext, &values);
4179 gdk_gc_set_foreground(gGCinvt, &values.background);
4180 gdk_gc_set_background(gGCinvt, &values.foreground);
4181 gdk_gc_set_background(gGCtext, (GdkColor *) & GetColor(0).color);
4182 current = Int_t(cindex);
4187 void TGWin32::Sync(
int mode)
4200 void TGWin32::UpdateWindow(
int mode)
4202 if (gCws && gCws->double_buffer) {
4203 gdk_window_copy_area(gCws->window, gGCpxmp, 0, 0,
4204 gCws->drawing, 0, 0, gCws->width, gCws->height);
4216 void TGWin32::Warp(
int ix,
int iy, Window_t
id)
4223 dw = (HWND) GDK_DRAWABLE_XID((GdkWindow *)gCws->window);
4225 dw = (HWND) GDK_DRAWABLE_XID((GdkWindow *)id);
4227 tmp.x = ix > 0 ? ix : cpt.x;
4228 tmp.y = iy > 0 ? iy : cpt.y;
4229 ClientToScreen(dw, &tmp);
4230 SetCursorPos(tmp.x, tmp.y);
4240 void TGWin32::WritePixmap(
int wid,
unsigned int w,
unsigned int h,
4247 if (!fWindows)
return;
4248 gTws = &fWindows[wid];
4257 static FILE *gGifFile;
4258 static GdkImage *gGifImage = 0;
4261 int GIFquantize(UInt_t width, UInt_t height, Int_t * ncol, Byte_t * red,
4262 Byte_t * green, Byte_t * blue, Byte_t * outputBuf,
4263 Byte_t * outputCmap);
4264 long GIFencode(
int Width,
int Height, Int_t Ncol, Byte_t R[],
4265 Byte_t G[], Byte_t B[], Byte_t ScLine[],
4266 void (*get_scline) (
int,
int, Byte_t *),
4267 void (*pb) (Byte_t));
4268 int GIFdecode(Byte_t * GIFarr, Byte_t * PIXarr,
int *Width,
int *Height,
4269 int *Ncols, Byte_t * R, Byte_t * G, Byte_t * B);
4270 int GIFinfo(Byte_t * GIFarr,
int *Width,
int *Height,
int *Ncols);
4277 static void GetPixel(
int y,
int width, Byte_t * scline)
4279 for (
int i = 0; i < width; i++) {
4280 scline[i] = Byte_t(GetPixelImage((Drawable_t)gGifImage, i, y));
4287 static void PutByte(Byte_t b)
4289 if (ferror(gGifFile) == 0) fputc(b, gGifFile);
4301 void TGWin32::ImgPickPalette(GdkImage * image, Int_t & ncol, Int_t * &R,
4302 Int_t * &G, Int_t * &B)
4304 ULong_t *orgcolors = 0;
4305 Int_t maxcolors = 0, ncolors;
4309 for (x = 0; x < (int) gCws->width; x++) {
4310 for (y = 0; y < (int) gCws->height; y++) {
4311 ULong_t pixel = GetPixelImage((Drawable_t)image, x, y);
4312 CollectImageColors(pixel, orgcolors, ncolors, maxcolors);
4317 GdkColor *xcol =
new GdkColor[ncolors];
4320 for (i = 0; i < ncolors; i++) {
4321 xcol[i].pixel = orgcolors[i];
4323 xcol[i].red = GetRValue(xcol[i].pixel);
4324 xcol[i].green = GetGValue(xcol[i].pixel);
4325 xcol[i].blue = GetBValue(xcol[i].pixel);
4328 GdkColorContext *cc;
4329 cc = gdk_color_context_new(gdk_visual_get_system(), (GdkColormap *)fColormap);
4330 gdk_color_context_query_colors(cc, xcol, ncolors);
4331 gdk_color_context_free(cc);
4335 R =
new Int_t[ncolors];
4336 G =
new Int_t[ncolors];
4337 B =
new Int_t[ncolors];
4339 for (i = 0; i < ncolors; i++) {
4341 G[i] = xcol[i].green;
4342 B[i] = xcol[i].blue;
4347 for (x = 0; x < (int) gCws->width; x++) {
4348 for (y = 0; y < (int) gCws->height; y++) {
4349 ULong_t pixel = GetPixelImage((Drawable_t)image, x, y);
4350 Int_t idx = FindColor(pixel, orgcolors, ncolors);
4351 PutPixel((Drawable_t)image, x, y, idx);
4357 ::operator
delete(orgcolors);
4363 Int_t TGWin32::WriteGIF(
char *name)
4365 Byte_t scline[2000], r[256], b[256], g[256];
4367 Int_t ncol, maxcol, i;
4370 gdk_image_unref((GdkImage *)gGifImage);
4373 gGifImage = gdk_image_get((GdkDrawable*)gCws->drawing, 0, 0,
4374 gCws->width, gCws->height);
4376 ImgPickPalette(gGifImage, ncol, R, G, B);
4381 "can not create GIF of image containing more than 256 colors");
4389 for (i = 0; i < ncol; i++) {
4390 if (maxcol < R[i]) maxcol = R[i];
4391 if (maxcol < G[i]) maxcol = G[i];
4392 if (maxcol < B[i]) maxcol = B[i];
4398 for (i = 0; i < ncol; i++) {
4399 r[i] = R[i] * 255 / maxcol;
4400 g[i] = G[i] * 255 / maxcol;
4401 b[i] = B[i] * 255 / maxcol;
4405 gGifFile = fopen(name,
"wb");
4408 GIFencode(gCws->width, gCws->height,
4409 ncol, r, g, b, scline, ::GetPixel, PutByte);
4413 Error(
"WriteGIF",
"cannot write file: %s",name);
4426 void TGWin32::PutImage(
int offset,
int itran,
int x0,
int y0,
int nx,
4427 int ny,
int xmin,
int ymin,
int xmax,
int ymax,
4428 unsigned char *image, Drawable_t wid)
4430 const int MAX_SEGMENT = 20;
4431 int i, n, x, y, xcur, x1, x2, y1, y2;
4432 unsigned char *jimg, *jbase, icol;
4434 GdkSegment lines[256][MAX_SEGMENT];
4438 id = (GdkDrawable*)wid;
4443 for (i = 0; i < 256; i++) nlines[i] = 0;
4446 y1 = y0 + ny - ymax - 1;
4448 y2 = y0 + ny - ymin - 1;
4449 jbase = image + (ymin - 1) * nx + xmin;
4451 for (y = y2; y >= y1; y--) {
4454 for (jimg = jbase, icol = *jimg++, x = x1 + 1; x <= x2; jimg++, x++) {
4455 if (icol != *jimg) {
4456 if (icol != itran) {
4458 lines[icol][n].x1 = xcur;
4459 lines[icol][n].y1 = y;
4460 lines[icol][n].x2 = x - 1;
4461 lines[icol][n].y2 = y;
4462 if (nlines[icol] == MAX_SEGMENT) {
4463 SetColor(gGCline, (
int) icol + offset);
4464 gdk_win32_draw_segments(
id, (GdkGC *) gGCline,
4465 (GdkSegment *) &lines[icol][0], MAX_SEGMENT);
4473 if (icol != itran) {
4475 lines[icol][n].x1 = xcur;
4476 lines[icol][n].y1 = y;
4477 lines[icol][n].x2 = x - 1;
4478 lines[icol][n].y2 = y;
4479 if (nlines[icol] == MAX_SEGMENT) {
4480 SetColor(gGCline, (
int) icol + offset);
4481 gdk_win32_draw_segments(
id, (GdkGC *) gGCline,
4482 (GdkSegment *)&lines[icol][0], MAX_SEGMENT);
4488 for (i = 0; i < 256; i++) {
4489 if (nlines[i] != 0) {
4490 SetColor(gGCline, i + offset);
4491 gdk_win32_draw_segments(
id, (GdkGC *) gGCline,
4492 (GdkSegment *)&lines[icol][0], nlines[i]);
4501 Pixmap_t TGWin32::ReadGIF(
int x0,
int y0,
const char *file, Window_t
id)
4505 unsigned char *GIFarr, *PIXarr, R[256], G[256], B[256], *j1, *j2, icol;
4506 int i, j, k, width, height, ncolor, irep, offset;
4510 fd = fopen(file,
"r+b");
4512 Error(
"ReadGIF",
"unable to open GIF file");
4517 filesize = Seek_t(ftell(fd));
4520 if (!(GIFarr = (
unsigned char *) calloc(filesize + 256, 1))) {
4522 Error(
"ReadGIF",
"unable to allocate array for gif");
4526 if (fread(GIFarr, filesize, 1, fd) != 1) {
4528 Error(
"ReadGIF",
"GIF file read failed");
4534 irep = GIFinfo(GIFarr, &width, &height, &ncolor);
4539 if (!(PIXarr = (
unsigned char *) calloc((width * height), 1))) {
4540 Error(
"ReadGIF",
"unable to allocate array for image");
4544 irep = GIFdecode(GIFarr, PIXarr, &width, &height, &ncolor, R, G, B);
4552 for (i = 0; i < ncolor; i++) {
4557 SetRGB(j, rr, gg, bb);
4562 for (i = 1; i <= height / 2; i++) {
4563 j1 = PIXarr + (i - 1) * width;
4564 j2 = PIXarr + (height - i) * width;
4565 for (k = 0; k < width; k++) {
4572 if (
id) pic = CreatePixmap(
id, width, height);
4573 PutImage(offset, -1, x0, y0, width, height, 0, 0, width-1, height-1, PIXarr, pic);
4575 if (pic)
return pic;
4576 else if (gCws->drawing)
return (Pixmap_t)gCws->drawing;
4584 void TGWin32::MapWindow(Window_t
id)
4588 gdk_window_show((GdkWindow *)
id);
4589 if ((GDK_DRAWABLE_TYPE((GdkWindow *)
id) != GDK_WINDOW_TEMP) &&
4590 (GetParent(
id) == GetDefaultRootWindow())) {
4591 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
4592 ::SetForegroundWindow(window);
4599 void TGWin32::MapSubwindows(Window_t
id)
4603 EnumChildWindows((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id),
4604 EnumChildProc, (LPARAM) NULL);
4610 void TGWin32::MapRaised(Window_t
id)
4614 HWND hwnd = ::GetForegroundWindow();
4615 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
4616 gdk_window_show((GdkWindow *)
id);
4617 if (GDK_DRAWABLE_TYPE((GdkWindow *)
id) != GDK_WINDOW_TEMP) {
4618 ::BringWindowToTop(window);
4619 if (GDK_DRAWABLE_TYPE((GdkWindow *)
id) != GDK_WINDOW_CHILD)
4620 ::SetForegroundWindow(window);
4623 if (gConsoleWindow && (hwnd == (HWND)gConsoleWindow)) {
4625 ::GetWindowRect((HWND)gConsoleWindow, &r1);
4626 HWND fore = ::GetForegroundWindow();
4627 ::GetWindowRect(fore, &r2);
4628 if (!::IntersectRect(&r3, &r2, &r1)) {
4629 ::SetForegroundWindow((HWND)gConsoleWindow);
4637 void TGWin32::UnmapWindow(Window_t
id)
4641 gdk_window_hide((GdkWindow *)
id);
4647 void TGWin32::DestroyWindow(Window_t
id)
4653 gdk_window_hide((GdkWindow *)
id);
4654 gdk_window_destroy((GdkDrawable *)
id, kTRUE);
4660 void TGWin32::DestroySubwindows(Window_t
id)
4664 gdk_window_destroy((GdkDrawable *)
id, kFALSE);
4670 void TGWin32::RaiseWindow(Window_t
id)
4674 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
4675 if (GDK_DRAWABLE_TYPE((GdkWindow *)
id) == GDK_WINDOW_TEMP) {
4676 ::SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0,
4677 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
4680 ::BringWindowToTop(window);
4681 if (GDK_DRAWABLE_TYPE((GdkWindow *)
id) != GDK_WINDOW_CHILD)
4682 ::SetForegroundWindow(window);
4689 void TGWin32::LowerWindow(Window_t
id)
4693 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
4694 ::SetWindowPos(window, HWND_BOTTOM, 0, 0, 0, 0,
4695 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
4701 void TGWin32::MoveWindow(Window_t
id, Int_t x, Int_t y)
4705 gdk_window_move((GdkDrawable *)
id, x, y);
4711 void TGWin32::MoveResizeWindow(Window_t
id, Int_t x, Int_t y, UInt_t w,
4716 gdk_window_move_resize((GdkWindow *)
id, x, y, w, h);
4722 void TGWin32::ResizeWindow(Window_t
id, UInt_t w, UInt_t h)
4727 if (w >= (UInt_t)INT_MAX || h >= (UInt_t)INT_MAX)
4729 gdk_window_resize((GdkWindow *)
id, w, h);
4735 void TGWin32::IconifyWindow(Window_t
id)
4739 gdk_window_lower((GdkWindow *)
id);
4740 ::CloseWindow((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id));
4747 void TGWin32::ReparentWindow(Window_t
id, Window_t pid, Int_t x, Int_t y)
4751 gdk_window_reparent((GdkWindow *)
id, (GdkWindow *)pid, x, y);
4757 void TGWin32::SetWindowBackground(Window_t
id, ULong_t color)
4763 back.red = GetRValue(color);
4764 back.green = GetGValue(color);
4765 back.blue = GetBValue(color);
4767 gdk_window_set_background((GdkWindow *)
id, &back);
4773 void TGWin32::SetWindowBackgroundPixmap(Window_t
id, Pixmap_t pxm)
4777 gdk_window_set_back_pixmap((GdkWindow *)
id, (GdkPixmap *) pxm, 0);
4783 Window_t TGWin32::CreateWindow(Window_t parent, Int_t x, Int_t y,
4784 UInt_t w, UInt_t h, UInt_t border,
4785 Int_t depth, UInt_t clss,
4786 void *visual, SetWindowAttributes_t * attr,
4789 GdkWindowAttr xattr;
4791 GdkColor background_color;
4795 MapSetWindowAttributes(attr, xmask, xattr);
4796 xattr.window_type = GDK_WINDOW_CHILD;
4797 if (wtype & kMainFrame) {
4798 xattr.window_type = GDK_WINDOW_TOPLEVEL;
4800 if (wtype & kTransientFrame) {
4801 xattr.window_type = GDK_WINDOW_DIALOG;
4803 if (wtype & kTempFrame) {
4804 xattr.window_type = GDK_WINDOW_TEMP;
4806 newWin = gdk_window_new((GdkWindow *) parent, &xattr, xmask);
4810 xattr.wclass = GDK_INPUT_OUTPUT;
4811 xattr.event_mask = 0L;
4812 xattr.event_mask |= GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK |
4813 GDK_PROPERTY_CHANGE_MASK;
4825 xattr.colormap = gdk_colormap_get_system();
4826 xattr.cursor = NULL;
4827 xattr.override_redirect = TRUE;
4828 if ((xattr.y > 0) && (xattr.x > 0)) {
4829 xmask = GDK_WA_X | GDK_WA_Y | GDK_WA_COLORMAP |
4830 GDK_WA_WMCLASS | GDK_WA_NOREDIR;
4832 xmask = GDK_WA_COLORMAP | GDK_WA_WMCLASS | GDK_WA_NOREDIR;
4834 if (visual != NULL) {
4835 xattr.visual = (GdkVisual *) visual;
4836 xmask |= GDK_WA_VISUAL;
4838 xattr.visual = gdk_visual_get_system();
4839 xmask |= GDK_WA_VISUAL;
4841 xattr.window_type = GDK_WINDOW_CHILD;
4842 if (wtype & kMainFrame) {
4843 xattr.window_type = GDK_WINDOW_TOPLEVEL;
4845 if (wtype & kTransientFrame) {
4846 xattr.window_type = GDK_WINDOW_DIALOG;
4848 if (wtype & kTempFrame) {
4849 xattr.window_type = GDK_WINDOW_TEMP;
4851 newWin = gdk_window_new((GdkWindow *) parent, &xattr, xmask);
4852 gdk_window_set_events(newWin, (GdkEventMask) 0L);
4855 gdk_window_set_decorations(newWin,
4856 (GdkWMDecoration) GDK_DECOR_BORDER);
4859 if ((attr->fMask & kWABackPixmap)) {
4860 if (attr->fBackgroundPixmap == kNone) {
4861 gdk_window_set_back_pixmap(newWin, (GdkPixmap *) GDK_NONE, 0);
4862 }
else if (attr->fBackgroundPixmap == kParentRelative) {
4863 gdk_window_set_back_pixmap(newWin, (GdkPixmap *) GDK_NONE, 1);
4865 gdk_window_set_back_pixmap(newWin,
4866 (GdkPixmap *) attr->
4867 fBackgroundPixmap, 0);
4870 if ((attr->fMask & kWABackPixel)) {
4871 background_color.pixel = attr->fBackgroundPixel;
4872 background_color.red = GetRValue(attr->fBackgroundPixel);
4873 background_color.green = GetGValue(attr->fBackgroundPixel);
4874 background_color.blue = GetBValue(attr->fBackgroundPixel);
4875 gdk_window_set_background(newWin, &background_color);
4878 if (!fUseSysPointers) {
4879 ::SetClassLong((HWND)GDK_DRAWABLE_XID(newWin), GCL_HCURSOR,
4880 (LONG)GDK_CURSOR_XID(fCursors[kPointer]));
4882 return (Window_t) newWin;
4888 void TGWin32::MapEventMask(UInt_t & emask, UInt_t & xemask, Bool_t tox)
4891 Long_t lxemask = 0L;
4892 if ((emask & kKeyPressMask)) {
4893 lxemask |= GDK_KEY_PRESS_MASK;
4895 if ((emask & kKeyReleaseMask)) {
4896 lxemask |= GDK_KEY_RELEASE_MASK;
4898 if ((emask & kButtonPressMask)) {
4899 lxemask |= GDK_BUTTON_PRESS_MASK;
4901 if ((emask & kButtonReleaseMask)) {
4902 lxemask |= GDK_BUTTON_RELEASE_MASK;
4904 if ((emask & kPointerMotionMask)) {
4905 lxemask |= GDK_POINTER_MOTION_MASK;
4907 if ((emask & kButtonMotionMask)) {
4908 lxemask |= GDK_BUTTON_MOTION_MASK;
4910 if ((emask & kExposureMask)) {
4911 lxemask |= GDK_EXPOSURE_MASK;
4913 if ((emask & kStructureNotifyMask)) {
4914 lxemask |= GDK_STRUCTURE_MASK;
4916 if ((emask & kEnterWindowMask)) {
4917 lxemask |= GDK_ENTER_NOTIFY_MASK;
4919 if ((emask & kLeaveWindowMask)) {
4920 lxemask |= GDK_LEAVE_NOTIFY_MASK;
4922 if ((emask & kFocusChangeMask)) {
4923 lxemask |= GDK_FOCUS_CHANGE_MASK;
4925 xemask = (UInt_t) lxemask;
4928 if ((xemask & GDK_KEY_PRESS_MASK)) {
4929 emask |= kKeyPressMask;
4931 if ((xemask & GDK_KEY_RELEASE_MASK)) {
4932 emask |= kKeyReleaseMask;
4934 if ((xemask & GDK_BUTTON_PRESS_MASK)) {
4935 emask |= kButtonPressMask;
4937 if ((xemask & GDK_BUTTON_RELEASE_MASK)) {
4938 emask |= kButtonReleaseMask;
4940 if ((xemask & GDK_POINTER_MOTION_MASK)) {
4941 emask |= kPointerMotionMask;
4943 if ((xemask & GDK_BUTTON_MOTION_MASK)) {
4944 emask |= kButtonMotionMask;
4946 if ((xemask & GDK_EXPOSURE_MASK)) {
4947 emask |= kExposureMask;
4949 if ((xemask & GDK_STRUCTURE_MASK)) {
4950 emask |= kStructureNotifyMask;
4952 if ((xemask & GDK_ENTER_NOTIFY_MASK)) {
4953 emask |= kEnterWindowMask;
4955 if ((xemask & GDK_LEAVE_NOTIFY_MASK)) {
4956 emask |= kLeaveWindowMask;
4958 if ((xemask & GDK_FOCUS_CHANGE_MASK)) {
4959 emask |= kFocusChangeMask;
4967 void TGWin32::MapSetWindowAttributes(SetWindowAttributes_t * attr,
4969 GdkWindowAttr & xattr)
4971 Mask_t mask = attr->fMask;
4974 if ((mask & kWAOverrideRedirect)) {
4975 xmask |= GDK_WA_NOREDIR;
4976 xattr.override_redirect = attr->fOverrideRedirect;
4978 if ((mask & kWAEventMask)) {
4979 UInt_t xmsk, msk = (UInt_t) attr->fEventMask;
4980 MapEventMask(msk, xmsk, kTRUE);
4981 xattr.event_mask = xmsk;
4983 if ((mask & kWAColormap)) {
4984 xmask |= GDK_WA_COLORMAP;
4985 xattr.colormap = (GdkColormap *) attr->fColormap;
4987 if ((mask & kWACursor)) {
4988 xmask |= GDK_WA_CURSOR;
4989 if (attr->fCursor != kNone) {
4990 xattr.cursor = (GdkCursor *) attr->fCursor;
4993 xattr.wclass = GDK_INPUT_OUTPUT;
5000 void TGWin32::MapGCValues(GCValues_t & gval,
5001 ULong_t & xmask, GdkGCValues & xgval, Bool_t tox)
5005 Mask_t mask = gval.fMask;
5008 if ((mask & kGCFunction)) {
5009 xmask |= GDK_GC_FUNCTION;
5010 switch (gval.fFunction) {
5012 xgval.function = GDK_CLEAR;
5015 xgval.function = GDK_AND;
5018 xgval.function = GDK_AND_REVERSE;
5021 xgval.function = GDK_COPY;
5023 case kGXandInverted:
5024 xgval.function = GDK_AND_INVERT;
5027 xgval.function = GDK_NOOP;
5030 xgval.function = GDK_XOR;
5033 xgval.function = GDK_OR;
5036 xgval.function = GDK_EQUIV;
5039 xgval.function = GDK_INVERT;
5042 xgval.function = GDK_OR_REVERSE;
5044 case kGXcopyInverted:
5045 xgval.function = GDK_COPY_INVERT;
5048 xgval.function = GDK_OR_INVERT;
5051 xgval.function = GDK_NAND;
5054 xgval.function = GDK_SET;
5058 if (mask & kGCSubwindowMode) {
5059 xmask |= GDK_GC_SUBWINDOW;
5060 if (gval.fSubwindowMode == kIncludeInferiors) {
5061 xgval.subwindow_mode = GDK_INCLUDE_INFERIORS;
5063 xgval.subwindow_mode = GDK_CLIP_BY_CHILDREN;
5066 if (mask & kGCForeground) {
5067 xmask |= GDK_GC_FOREGROUND;
5068 xgval.foreground.pixel = gval.fForeground;
5069 xgval.foreground.red = GetRValue(gval.fForeground);
5070 xgval.foreground.green = GetGValue(gval.fForeground);
5071 xgval.foreground.blue = GetBValue(gval.fForeground);
5073 if (mask & kGCBackground) {
5074 xmask |= GDK_GC_BACKGROUND;
5075 xgval.background.pixel = gval.fBackground;
5076 xgval.background.red = GetRValue(gval.fBackground);
5077 xgval.background.green = GetGValue(gval.fBackground);
5078 xgval.background.blue = GetBValue(gval.fBackground);
5080 if (mask & kGCLineWidth) {
5081 xmask |= GDK_GC_LINE_WIDTH;
5082 xgval.line_width = gval.fLineWidth;
5084 if (mask & kGCLineStyle) {
5085 xmask |= GDK_GC_LINE_STYLE;
5086 xgval.line_style = (GdkLineStyle) gval.fLineStyle;
5088 if (mask & kGCCapStyle) {
5089 xmask |= GDK_GC_CAP_STYLE;
5090 xgval.cap_style = (GdkCapStyle) gval.fCapStyle;
5092 if (mask & kGCJoinStyle) {
5093 xmask |= GDK_GC_JOIN_STYLE;
5094 xgval.join_style = (GdkJoinStyle) gval.fJoinStyle;
5096 if ((mask & kGCFillStyle)) {
5097 xmask |= GDK_GC_FILL;
5098 xgval.fill = (GdkFill) gval.fFillStyle;
5100 if ((mask & kGCTile)) {
5101 xmask |= GDK_GC_TILE;
5102 xgval.tile = (GdkPixmap *) gval.fTile;
5104 if ((mask & kGCStipple)) {
5105 xmask |= GDK_GC_STIPPLE;
5106 xgval.stipple = (GdkPixmap *) gval.fStipple;
5108 if ((mask & kGCTileStipXOrigin)) {
5109 xmask |= GDK_GC_TS_X_ORIGIN;
5110 xgval.ts_x_origin = gval.fTsXOrigin;
5112 if ((mask & kGCTileStipYOrigin)) {
5113 xmask |= GDK_GC_TS_Y_ORIGIN;
5114 xgval.ts_y_origin = gval.fTsYOrigin;
5116 if ((mask & kGCFont)) {
5117 xmask |= GDK_GC_FONT;
5118 xgval.font = (GdkFont *) gval.fFont;
5120 if ((mask & kGCGraphicsExposures)) {
5121 xmask |= GDK_GC_EXPOSURES;
5122 xgval.graphics_exposures = gval.fGraphicsExposures;
5124 if ((mask & kGCClipXOrigin)) {
5125 xmask |= GDK_GC_CLIP_X_ORIGIN;
5126 xgval.clip_x_origin = gval.fClipXOrigin;
5128 if ((mask & kGCClipYOrigin)) {
5129 xmask |= GDK_GC_CLIP_Y_ORIGIN;
5130 xgval.clip_y_origin = gval.fClipYOrigin;
5132 if ((mask & kGCClipMask)) {
5133 xmask |= GDK_GC_CLIP_MASK;
5134 xgval.clip_mask = (GdkPixmap *) gval.fClipMask;
5140 if ((xmask & GDK_GC_FUNCTION)) {
5141 mask |= kGCFunction;
5142 gval.fFunction = (EGraphicsFunction) xgval.function;
5143 switch (xgval.function) {
5145 gval.fFunction = kGXclear;
5148 gval.fFunction = kGXand;
5150 case GDK_AND_REVERSE:
5151 gval.fFunction = kGXandReverse;
5154 gval.fFunction = kGXcopy;
5156 case GDK_AND_INVERT:
5157 gval.fFunction = kGXandInverted;
5160 gval.fFunction = kGXnoop;
5163 gval.fFunction = kGXxor;
5166 gval.fFunction = kGXor;
5169 gval.fFunction = kGXequiv;
5172 gval.fFunction = kGXinvert;
5174 case GDK_OR_REVERSE:
5175 gval.fFunction = kGXorReverse;
5177 case GDK_COPY_INVERT:
5178 gval.fFunction = kGXcopyInverted;
5181 gval.fFunction = kGXorInverted;
5184 gval.fFunction = kGXnand;
5187 gval.fFunction = kGXset;
5191 if (xmask & GDK_GC_SUBWINDOW) {
5192 mask |= kGCSubwindowMode;
5193 if (xgval.subwindow_mode == GDK_INCLUDE_INFERIORS)
5194 gval.fSubwindowMode = kIncludeInferiors;
5196 gval.fSubwindowMode = kClipByChildren;
5198 if ((xmask & GDK_GC_FOREGROUND)) {
5199 mask |= kGCForeground;
5200 gval.fForeground = xgval.foreground.pixel;
5202 if ((xmask & GDK_GC_BACKGROUND)) {
5203 mask |= kGCBackground;
5204 gval.fBackground = xgval.background.pixel;
5206 if ((xmask & GDK_GC_LINE_WIDTH)) {
5207 mask |= kGCLineWidth;
5208 gval.fLineWidth = xgval.line_width;
5210 if ((xmask & GDK_GC_LINE_STYLE)) {
5211 mask |= kGCLineStyle;
5212 gval.fLineStyle = xgval.line_style;
5214 if ((xmask & GDK_GC_CAP_STYLE)) {
5215 mask |= kGCCapStyle;
5216 gval.fCapStyle = xgval.cap_style;
5218 if ((xmask & GDK_GC_JOIN_STYLE)) {
5219 mask |= kGCJoinStyle;
5220 gval.fJoinStyle = xgval.join_style;
5222 if ((xmask & GDK_GC_FILL)) {
5223 mask |= kGCFillStyle;
5224 gval.fFillStyle = xgval.fill;
5226 if ((xmask & GDK_GC_TILE)) {
5228 gval.fTile = (Pixmap_t) xgval.tile;
5230 if ((xmask & GDK_GC_STIPPLE)) {
5232 gval.fStipple = (Pixmap_t) xgval.stipple;
5234 if ((xmask & GDK_GC_TS_X_ORIGIN)) {
5235 mask |= kGCTileStipXOrigin;
5236 gval.fTsXOrigin = xgval.ts_x_origin;
5238 if ((xmask & GDK_GC_TS_Y_ORIGIN)) {
5239 mask |= kGCTileStipYOrigin;
5240 gval.fTsYOrigin = xgval.ts_y_origin;
5242 if ((xmask & GDK_GC_FONT)) {
5244 gval.fFont = (FontH_t) xgval.font;
5246 if ((xmask & GDK_GC_EXPOSURES)) {
5247 mask |= kGCGraphicsExposures;
5248 gval.fGraphicsExposures = (Bool_t) xgval.graphics_exposures;
5250 if ((xmask & GDK_GC_CLIP_X_ORIGIN)) {
5251 mask |= kGCClipXOrigin;
5252 gval.fClipXOrigin = xgval.clip_x_origin;
5254 if ((xmask & GDK_GC_CLIP_Y_ORIGIN)) {
5255 mask |= kGCClipYOrigin;
5256 gval.fClipYOrigin = xgval.clip_y_origin;
5258 if ((xmask & GDK_GC_CLIP_MASK)) {
5259 mask |= kGCClipMask;
5260 gval.fClipMask = (Pixmap_t) xgval.clip_mask;
5269 void TGWin32::GetWindowAttributes(Window_t
id, WindowAttributes_t & attr)
5273 RECT rcClient, rcWind;
5274 ::GetClientRect((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id), &rcClient);
5275 ::GetWindowRect((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id), &rcWind);
5277 gdk_window_get_geometry((GdkWindow *)
id, &attr.fX, &attr.fY,
5278 &attr.fWidth, &attr.fHeight, &attr.fDepth);
5279 attr.fX = ((rcWind.right - rcWind.left) - rcClient.right) / 2;
5280 attr.fY = ((rcWind.bottom - rcWind.top) - rcClient.bottom) - attr.fX;
5282 attr.fRoot = (Window_t) GDK_ROOT_PARENT();
5283 attr.fColormap = (Colormap_t) gdk_window_get_colormap((GdkWindow *) id);
5284 attr.fBorderWidth = 0;
5285 attr.fVisual = gdk_window_get_visual((GdkWindow *)
id);
5286 attr.fClass = kInputOutput;
5287 attr.fBackingStore = kNotUseful;
5288 attr.fSaveUnder = kFALSE;
5289 attr.fMapInstalled = kTRUE;
5290 attr.fOverrideRedirect = kFALSE;
5292 if (!gdk_window_is_visible((GdkWindow *)
id)) {
5293 attr.fMapState = kIsUnmapped;
5294 }
else if (!gdk_window_is_viewable((GdkWindow *)
id)) {
5295 attr.fMapState = kIsUnviewable;
5297 attr.fMapState = kIsViewable;
5300 UInt_t tmp_mask = (UInt_t)gdk_window_get_events((GdkWindow *) id);
5302 MapEventMask(evmask, tmp_mask, kFALSE);
5304 attr.fYourEventMask = evmask;
5310 Display_t TGWin32::GetDisplay()
const
5318 Int_t TGWin32::GetDepth()
const
5320 return gdk_visual_get_best_depth();
5328 Atom_t TGWin32::InternAtom(
const char *atom_name, Bool_t only_if_exist)
5330 GdkAtom a = gdk_atom_intern((
const gchar *) atom_name, only_if_exist);
5332 if (a == None)
return kNone;
5340 Window_t TGWin32::GetDefaultRootWindow()
const
5342 return (Window_t) GDK_ROOT_PARENT();
5348 Window_t TGWin32::GetParent(Window_t
id)
const
5350 if (!
id)
return (Window_t)0;
5352 return (Window_t)gdk_window_get_parent((GdkWindow *)
id);
5360 FontStruct_t TGWin32::LoadQueryFont(
const char *font_name)
5362 char family[100], weight[32], slant[32], fontname[256];
5363 Int_t n1, pixel, numfields;
5365 numfields = sscanf(font_name,
"%s -%d%n", family, &pixel, &n1);
5366 if (numfields == 2) {
5367 sprintf(weight,
"medium");
5368 if (strstr(font_name,
"bold"))
5369 sprintf(weight,
"bold");
5371 if (strstr(font_name,
"italic"))
5373 sprintf(fontname,
"-*-%s-%s-%s-*-*-%d-*-*-*-*-*-iso8859-1",
5374 family, weight, slant, pixel);
5377 sprintf(fontname,
"%s", font_name);
5378 return (FontStruct_t) gdk_font_load(fontname);
5384 FontH_t TGWin32::GetFontHandle(FontStruct_t fs)
5387 return (FontH_t)gdk_font_ref((GdkFont *) fs);
5395 void TGWin32::DeleteFont(FontStruct_t fs)
5397 gdk_font_unref((GdkFont *) fs);
5404 GContext_t TGWin32::CreateGC(Drawable_t
id, GCValues_t *gval)
5406 if (!
id)
return (GContext_t)0;
5411 if (gval) MapGCValues(*gval, xmask, xgval, kTRUE);
5413 xgval.subwindow_mode = GDK_CLIP_BY_CHILDREN;
5415 GdkGC *gc = gdk_gc_new_with_values((GdkDrawable *)
id,
5416 &xgval, (GdkGCValuesMask)xmask);
5417 return (GContext_t) gc;
5423 void TGWin32::ChangeGC(GContext_t gc, GCValues_t * gval)
5431 MapGCValues(*gval, xmask, xgval, kTRUE);
5433 if (mask & kGCForeground) {
5434 gdk_gc_set_foreground((GdkGC *) gc, &xgval.foreground);
5436 if (mask & kGCBackground) {
5437 gdk_gc_set_background((GdkGC *) gc, &xgval.background);
5439 if (mask & kGCFont) {
5440 gdk_gc_set_font((GdkGC *) gc, xgval.font);
5442 if (mask & kGCFunction) {
5443 gdk_gc_set_function((GdkGC *) gc, xgval.function);
5445 if (mask & kGCFillStyle) {
5446 gdk_gc_set_fill((GdkGC *) gc, xgval.fill);
5448 if (mask & kGCTile) {
5449 gdk_gc_set_tile((GdkGC *) gc, xgval.tile);
5451 if (mask & kGCStipple) {
5452 gdk_gc_set_stipple((GdkGC *) gc, xgval.stipple);
5454 if ((mask & kGCTileStipXOrigin) || (mask & kGCTileStipYOrigin)) {
5455 gdk_gc_set_ts_origin((GdkGC *) gc, xgval.ts_x_origin,
5458 if ((mask & kGCClipXOrigin) || (mask & kGCClipYOrigin)) {
5459 gdk_gc_set_clip_origin((GdkGC *) gc, xgval.clip_x_origin,
5460 xgval.clip_y_origin);
5462 if (mask & kGCClipMask) {
5463 gdk_gc_set_clip_mask((GdkGC *) gc, xgval.clip_mask);
5465 if (mask & kGCGraphicsExposures) {
5466 gdk_gc_set_exposures((GdkGC *) gc, xgval.graphics_exposures);
5468 if (mask & kGCLineWidth) {
5469 gdk_gc_set_values((GdkGC *) gc, &xgval, GDK_GC_LINE_WIDTH);
5471 if (mask & kGCLineStyle) {
5472 gdk_gc_set_values((GdkGC *) gc, &xgval, GDK_GC_LINE_STYLE);
5474 if (mask & kGCCapStyle) {
5475 gdk_gc_set_values((GdkGC *) gc, &xgval, GDK_GC_CAP_STYLE);
5477 if (mask & kGCJoinStyle) {
5478 gdk_gc_set_values((GdkGC *) gc, &xgval, GDK_GC_JOIN_STYLE);
5480 if (mask & kGCSubwindowMode) {
5481 gdk_gc_set_subwindow((GdkGC *) gc, xgval.subwindow_mode);
5489 void TGWin32::CopyGC(GContext_t org, GContext_t dest, Mask_t mask)
5497 mask = (Mask_t) - 1;
5501 MapGCValues(gval, xmask, xgval, kTRUE);
5503 gdk_gc_copy((GdkGC *) dest, (GdkGC *) org);
5509 void TGWin32::DeleteGC(GContext_t gc)
5511 gdk_gc_unref((GdkGC *) gc);
5517 Cursor_t TGWin32::CreateCursor(ECursor cursor)
5519 return (Cursor_t) fCursors[cursor];
5526 Pixmap_t TGWin32::CreatePixmap(Drawable_t
id, UInt_t w, UInt_t h)
5528 GdkWindow *wid = (GdkWindow *)
id;
5529 if (!
id) wid = GDK_ROOT_PARENT();
5531 return (Pixmap_t) gdk_pixmap_new(wid, w, h, gdk_visual_get_best_depth());
5538 Pixmap_t TGWin32::CreatePixmap(Drawable_t
id,
const char *bitmap,
5539 UInt_t width, UInt_t height,
5540 ULong_t forecolor, ULong_t backcolor,
5543 GdkColor fore, back;
5544 fore.pixel = forecolor;
5545 fore.red = GetRValue(forecolor);
5546 fore.green = GetGValue(forecolor);
5547 fore.blue = GetBValue(forecolor);
5549 back.pixel = backcolor;
5550 back.red = GetRValue(backcolor);
5551 back.green = GetGValue(backcolor);
5552 back.blue = GetBValue(backcolor);
5554 GdkWindow *wid = (GdkWindow *)
id;
5555 if (!
id) wid = GDK_ROOT_PARENT();
5557 return (Pixmap_t) gdk_pixmap_create_from_data(wid, (
char *) bitmap, width,
5558 height, depth, &fore, &back);
5564 Pixmap_t TGWin32::CreateBitmap(Drawable_t
id,
const char *bitmap,
5565 UInt_t width, UInt_t height)
5567 GdkWindow *wid = (GdkWindow *)
id;
5568 if (!
id) wid = GDK_ROOT_PARENT();
5570 Pixmap_t ret = (Pixmap_t) gdk_bitmap_create_from_data(wid,
5571 (
char *)bitmap, width, height);
5578 void TGWin32::DeletePixmap(Pixmap_t pmap)
5580 gdk_pixmap_unref((GdkPixmap *) pmap);
5588 Bool_t TGWin32::CreatePictureFromFile(Drawable_t
id,
const char *filename,
5590 Pixmap_t & pict_mask,
5591 PictureAttributes_t & attr)
5593 GdkBitmap *gdk_pixmap_mask;
5594 if (strstr(filename,
".xpm") || strstr(filename,
".XPM")) {
5595 GdkWindow *wid = (GdkWindow *)
id;
5596 if (!
id) wid = GDK_ROOT_PARENT();
5598 pict = (Pixmap_t) gdk_pixmap_create_from_xpm(wid, &gdk_pixmap_mask, 0,
5600 pict_mask = (Pixmap_t) gdk_pixmap_mask;
5601 }
else if (strstr(filename,
".gif") || strstr(filename,
".GIF")) {
5602 pict = ReadGIF(0, 0, filename,
id);
5606 gdk_drawable_get_size((GdkPixmap *) pict, (
int *) &attr.fWidth,
5607 (
int *) &attr.fHeight);
5622 Bool_t TGWin32::CreatePictureFromData(Drawable_t
id,
char **data,
5624 Pixmap_t & pict_mask,
5625 PictureAttributes_t & attr)
5627 GdkBitmap *gdk_pixmap_mask;
5628 GdkWindow *wid = (GdkWindow *)
id;
5629 if (!
id) wid = GDK_ROOT_PARENT();
5631 pict = (Pixmap_t) gdk_pixmap_create_from_xpm_d(wid, &gdk_pixmap_mask, 0,
5633 pict_mask = (Pixmap_t) gdk_pixmap_mask;
5648 Bool_t TGWin32::ReadPictureDataFromFile(
const char *filename,
char ***ret_data)
5650 Bool_t ret = kFALSE;
5651 GdkPixmap *pxm = gdk_pixmap_create_from_xpm(NULL, NULL, NULL, filename);
5654 if (pxm==NULL)
return kFALSE;
5656 HBITMAP hbm = (HBITMAP)GDK_DRAWABLE_XID(pxm);
5659 ret = ::GetObject(hbm,
sizeof(HBITMAP), (LPVOID)&bitmap);
5660 ret_data = (
char ***)&bitmap.bmBits;
5661 gdk_pixmap_unref(pxm);
5668 void TGWin32::DeletePictureData(
void *data)
5678 void TGWin32::SetDashes(GContext_t gc, Int_t offset,
const char *dash_list,
5683 for (i = 0; i < n; i++) {
5684 dashes[i] = (gint8) dash_list[i];
5686 for (i = n; i < 32; i++) {
5687 dashes[i] = (gint8) 0;
5690 gdk_gc_set_dashes((GdkGC *) gc, offset, dashes, n);
5696 void TGWin32::MapColorStruct(ColorStruct_t * color, GdkColor & xcolor)
5698 xcolor.pixel = color->fPixel;
5699 xcolor.red = color->fRed;
5700 xcolor.green = color->fGreen;
5701 xcolor.blue = color->fBlue;
5711 Bool_t TGWin32::ParseColor(Colormap_t cmap,
const char *cname,
5712 ColorStruct_t & color)
5716 if (gdk_color_parse((
char *)cname, &xc)) {
5717 color.fPixel = xc.pixel = RGB(xc.red, xc.green, xc.blue);
5718 color.fRed = xc.red;
5719 color.fGreen = xc.green;
5720 color.fBlue = xc.blue;
5731 Bool_t TGWin32::AllocColor(Colormap_t cmap, ColorStruct_t & color)
5736 xc.red = color.fRed;
5737 xc.green = color.fGreen;
5738 xc.blue = color.fBlue;
5740 status = gdk_colormap_alloc_color((GdkColormap *) cmap, &xc, FALSE, TRUE);
5741 color.fPixel = xc.pixel;
5751 void TGWin32::QueryColor(Colormap_t cmap, ColorStruct_t & color)
5754 xc.pixel = color.fPixel;
5756 GdkColorContext *cc = gdk_color_context_new(gdk_visual_get_system(), fColormap);
5757 gdk_color_context_query_color(cc, &xc);
5758 gdk_color_context_free(cc);
5760 color.fPixel = xc.pixel;
5761 color.fRed = xc.red;
5762 color.fGreen = xc.green;
5763 color.fBlue = xc.blue;
5769 void TGWin32::FreeColor(Colormap_t cmap, ULong_t pixel)
5779 Bool_t TGWin32::CheckEvent(Window_t
id, EGEventType type, Event_t & ev)
5781 if (!
id)
return kFALSE;
5787 tev.fWindow = (Window_t)
id;
5789 tev.fX = tev.fY = 0;
5790 tev.fXRoot = tev.fYRoot = 0;
5793 tev.fWidth = tev.fHeight = 0;
5795 tev.fSendEvent = kFALSE;
5798 tev.fUser[0] = tev.fUser[1] = tev.fUser[2] = tev.fUser[3] = tev.fUser[4] = 0L;
5800 TGWin32MainThread::LockMSG();
5801 MapEvent(tev, xev, kTRUE);
5802 Bool_t r = gdk_check_typed_window_event((GdkWindow *)
id, xev.type, &xev);
5804 if (r) MapEvent(ev, xev, kFALSE);
5805 TGWin32MainThread::UnlockMSG();
5807 return r ? kTRUE : kFALSE;
5813 void TGWin32::SendEvent(Window_t
id, Event_t * ev)
5815 if (!ev || !
id)
return;
5817 TGWin32MainThread::LockMSG();
5819 MapEvent(*ev, xev, kTRUE);
5820 gdk_event_put(&xev);
5821 TGWin32MainThread::UnlockMSG();
5827 Int_t TGWin32::EventsPending()
5831 TGWin32MainThread::LockMSG();
5832 ret = (Int_t)gdk_event_queue_find_first();
5833 TGWin32MainThread::UnlockMSG();
5843 void TGWin32::NextEvent(Event_t & event)
5845 TGWin32MainThread::LockMSG();
5846 GdkEvent *xev = gdk_event_unqueue();
5849 event.fType = kOtherEvent;
5851 TGWin32MainThread::UnlockMSG();
5854 MapEvent(event, *xev, kFALSE);
5855 gdk_event_free (xev);
5856 TGWin32MainThread::UnlockMSG();
5862 void TGWin32::MapModifierState(UInt_t & state, UInt_t & xstate, Bool_t tox)
5866 if (state & kAnyModifier) {
5867 xstate = GDK_MODIFIER_MASK;
5874 static void _set_event_time(GdkEvent &event, UInt_t time)
5878 switch (event.type) {
5879 case GDK_MOTION_NOTIFY:
5880 event.motion.time = time;
5881 case GDK_BUTTON_PRESS:
5882 case GDK_2BUTTON_PRESS:
5883 case GDK_3BUTTON_PRESS:
5884 case GDK_BUTTON_RELEASE:
5886 event.button.time = time;
5888 case GDK_KEY_RELEASE:
5889 event.key.time = time;
5890 case GDK_ENTER_NOTIFY:
5891 case GDK_LEAVE_NOTIFY:
5892 event.crossing.time = time;
5893 case GDK_PROPERTY_NOTIFY:
5894 event.property.time = time;
5895 case GDK_SELECTION_CLEAR:
5896 case GDK_SELECTION_REQUEST:
5897 case GDK_SELECTION_NOTIFY:
5898 event.selection.time = time;
5899 case GDK_PROXIMITY_IN:
5900 case GDK_PROXIMITY_OUT:
5901 event.proximity.time = time;
5902 case GDK_DRAG_ENTER:
5903 case GDK_DRAG_LEAVE:
5904 case GDK_DRAG_MOTION:
5905 case GDK_DRAG_STATUS:
5906 case GDK_DROP_START:
5907 case GDK_DROP_FINISHED:
5908 event.dnd.time = time;
5918 void TGWin32::MapEvent(Event_t & ev, GdkEvent & xev, Bool_t tox)
5922 xev.type = GDK_NOTHING;
5923 if (ev.fType == kGKeyPress)
5924 xev.type = GDK_KEY_PRESS;
5925 if (ev.fType == kKeyRelease)
5926 xev.type = GDK_KEY_RELEASE;
5927 if (ev.fType == kButtonPress)
5928 xev.type = GDK_BUTTON_PRESS;
5929 if (ev.fType == kButtonRelease)
5930 xev.type = GDK_BUTTON_RELEASE;
5931 if (ev.fType == kMotionNotify)
5932 xev.type = GDK_MOTION_NOTIFY;
5933 if (ev.fType == kEnterNotify)
5934 xev.type = GDK_ENTER_NOTIFY;
5935 if (ev.fType == kLeaveNotify)
5936 xev.type = GDK_LEAVE_NOTIFY;
5937 if (ev.fType == kExpose)
5938 xev.type = GDK_EXPOSE;
5939 if (ev.fType == kConfigureNotify)
5940 xev.type = GDK_CONFIGURE;
5941 if (ev.fType == kMapNotify)
5943 if (ev.fType == kUnmapNotify)
5944 xev.type = GDK_UNMAP;
5945 if (ev.fType == kDestroyNotify)
5946 xev.type = GDK_DESTROY;
5947 if (ev.fType == kClientMessage)
5948 xev.type = GDK_CLIENT_EVENT;
5949 if (ev.fType == kSelectionClear)
5950 xev.type = GDK_SELECTION_CLEAR;
5951 if (ev.fType == kSelectionRequest)
5952 xev.type = GDK_SELECTION_REQUEST;
5953 if (ev.fType == kSelectionNotify)
5954 xev.type = GDK_SELECTION_NOTIFY;
5956 xev.any.type = xev.type;
5957 xev.any.send_event = ev.fSendEvent;
5958 if (ev.fType == kDestroyNotify) {
5959 xev.any.window = (GdkWindow *) ev.fWindow;
5961 if (ev.fType == kFocusIn) {
5962 xev.type = GDK_FOCUS_CHANGE;
5963 xev.focus_change.type = xev.type;
5964 xev.focus_change.window = (GdkWindow *) ev.fWindow;
5965 xev.focus_change.in = TRUE;
5967 if (ev.fType == kFocusOut) {
5968 xev.type = GDK_FOCUS_CHANGE;
5969 xev.focus_change.type = xev.type;
5970 xev.focus_change.window = (GdkWindow *) ev.fWindow;
5971 xev.focus_change.in = FALSE;
5973 if (ev.fType == kGKeyPress || ev.fType == kKeyRelease) {
5974 xev.key.window = (GdkWindow *) ev.fWindow;
5975 xev.key.type = xev.type;
5976 MapModifierState(ev.fState, xev.key.state, kTRUE);
5977 xev.key.keyval = ev.fCode;
5979 if (ev.fType == kButtonPress || ev.fType == kButtonRelease) {
5980 xev.button.window = (GdkWindow *) ev.fWindow;
5981 xev.button.type = xev.type;
5982 xev.button.x = ev.fX;
5983 xev.button.y = ev.fY;
5984 xev.button.x_root = ev.fXRoot;
5985 xev.button.y_root = ev.fYRoot;
5986 MapModifierState(ev.fState, xev.button.state, kTRUE);
5987 xev.button.button = ev.fCode;
5989 if (ev.fType == kSelectionNotify) {
5990 xev.selection.window = (GdkWindow *) ev.fUser[0];
5991 xev.selection.requestor = (guint32) ev.fUser[0];
5992 xev.selection.selection = (GdkAtom) ev.fUser[1];
5993 xev.selection.target = (GdkAtom) ev.fUser[2];
5994 xev.selection.property = (GdkAtom) ev.fUser[3];
5995 xev.selection.type = xev.type;
5997 if (ev.fType == kClientMessage) {
5998 if ((ev.fFormat == 32) && (ev.fHandle == gWM_DELETE_WINDOW)) {
5999 xev.type = GDK_DELETE;
6000 xev.any.type = xev.type;
6001 xev.any.window = (GdkWindow *) ev.fWindow;
6003 xev.client.window = (GdkWindow *) ev.fWindow;
6004 xev.client.type = xev.type;
6005 xev.client.message_type = (GdkAtom) ev.fHandle;
6006 xev.client.data_format = ev.fFormat;
6007 xev.client.data.l[0] = ev.fUser[0];
6008 if (
sizeof(ev.fUser[0]) > 4) {
6009 SplitLong(ev.fUser[1], xev.client.data.l[1],
6010 xev.client.data.l[3]);
6011 SplitLong(ev.fUser[2], xev.client.data.l[2],
6012 xev.client.data.l[4]);
6014 xev.client.data.l[1] = ev.fUser[1];
6015 xev.client.data.l[2] = ev.fUser[2];
6016 xev.client.data.l[3] = ev.fUser[3];
6017 xev.client.data.l[4] = ev.fUser[4];
6021 if (ev.fType == kMotionNotify) {
6022 xev.motion.window = (GdkWindow *) ev.fWindow;
6023 xev.motion.type = xev.type;
6024 xev.motion.x = ev.fX;
6025 xev.motion.y = ev.fY;
6026 xev.motion.x_root = ev.fXRoot;
6027 xev.motion.y_root = ev.fYRoot;
6029 if ((ev.fType == kEnterNotify) || (ev.fType == kLeaveNotify)) {
6030 xev.crossing.window = (GdkWindow *) ev.fWindow;
6031 xev.crossing.type = xev.type;
6032 xev.crossing.x = ev.fX;
6033 xev.crossing.y = ev.fY;
6034 xev.crossing.x_root = ev.fXRoot;
6035 xev.crossing.y_root = ev.fYRoot;
6036 xev.crossing.mode = (GdkCrossingMode) ev.fCode;
6037 MapModifierState(ev.fState, xev.crossing.state, kTRUE);
6039 if (ev.fType == kExpose) {
6040 xev.expose.window = (GdkWindow *) ev.fWindow;
6041 xev.expose.type = xev.type;
6042 xev.expose.area.x = ev.fX;
6043 xev.expose.area.y = ev.fY;
6044 xev.expose.area.width = ev.fWidth;
6045 xev.expose.area.height = ev.fHeight;
6046 xev.expose.count = ev.fCount;
6048 if (ev.fType == kConfigureNotify) {
6049 xev.configure.window = (GdkWindow *) ev.fWindow;
6050 xev.configure.type = xev.type;
6051 xev.configure.x = ev.fX;
6052 xev.configure.y = ev.fY;
6053 xev.configure.width = ev.fWidth;
6054 xev.configure.height = ev.fHeight;
6056 if (ev.fType == kSelectionClear) {
6057 xev.selection.window = (GdkWindow *) ev.fWindow;
6058 xev.selection.type = xev.type;
6059 xev.selection.selection = ev.fUser[0];
6061 if (ev.fType == kSelectionRequest) {
6062 xev.selection.window = (GdkWindow *) ev.fUser[0];
6063 xev.selection.type = xev.type;
6064 xev.selection.selection = ev.fUser[1];
6065 xev.selection.target = ev.fUser[2];
6066 xev.selection.property = ev.fUser[3];
6068 if ((ev.fType == kMapNotify) || (ev.fType == kUnmapNotify)) {
6069 xev.any.window = (GdkWindow *) ev.fWindow;
6071 if (xev.type != GDK_CLIENT_EVENT)
6072 _set_event_time(xev, ev.fTime);
6075 ev.fType = kOtherEvent;
6076 if (xev.type == GDK_KEY_PRESS)
6077 ev.fType = kGKeyPress;
6078 if (xev.type == GDK_KEY_RELEASE)
6079 ev.fType = kKeyRelease;
6080 if (xev.type == GDK_BUTTON_PRESS)
6081 ev.fType = kButtonPress;
6082 if (xev.type == GDK_BUTTON_RELEASE)
6083 ev.fType = kButtonRelease;
6084 if (xev.type == GDK_MOTION_NOTIFY)
6085 ev.fType = kMotionNotify;
6086 if (xev.type == GDK_ENTER_NOTIFY)
6087 ev.fType = kEnterNotify;
6088 if (xev.type == GDK_LEAVE_NOTIFY)
6089 ev.fType = kLeaveNotify;
6090 if (xev.type == GDK_EXPOSE)
6092 if (xev.type == GDK_CONFIGURE)
6093 ev.fType = kConfigureNotify;
6094 if (xev.type == GDK_MAP)
6095 ev.fType = kMapNotify;
6096 if (xev.type == GDK_UNMAP)
6097 ev.fType = kUnmapNotify;
6098 if (xev.type == GDK_DESTROY)
6099 ev.fType = kDestroyNotify;
6100 if (xev.type == GDK_SELECTION_CLEAR)
6101 ev.fType = kSelectionClear;
6102 if (xev.type == GDK_SELECTION_REQUEST)
6103 ev.fType = kSelectionRequest;
6104 if (xev.type == GDK_SELECTION_NOTIFY)
6105 ev.fType = kSelectionNotify;
6107 ev.fSendEvent = kFALSE;
6108 ev.fTime = gdk_event_get_time((GdkEvent *)&xev);
6109 ev.fWindow = (Window_t) xev.any.window;
6111 if ((xev.type == GDK_MAP) || (xev.type == GDK_UNMAP)) {
6112 ev.fWindow = (Window_t) xev.any.window;
6114 if (xev.type == GDK_DELETE) {
6115 ev.fWindow = (Window_t) xev.any.window;
6116 ev.fType = kClientMessage;
6118 ev.fHandle = gWM_DELETE_WINDOW;
6119 ev.fUser[0] = (Long_t) gWM_DELETE_WINDOW;
6120 if (
sizeof(ev.fUser[0]) > 4) {
6121 AsmLong(xev.client.data.l[1], xev.client.data.l[3],
6123 AsmLong(xev.client.data.l[2], xev.client.data.l[4],
6132 if (xev.type == GDK_DESTROY) {
6133 ev.fType = kDestroyNotify;
6134 ev.fHandle = (Window_t) xev.any.window;
6135 ev.fWindow = (Window_t) xev.any.window;
6137 if (xev.type == GDK_FOCUS_CHANGE) {
6138 ev.fWindow = (Window_t) xev.focus_change.window;
6139 ev.fCode = kNotifyNormal;
6141 if (xev.focus_change.in == TRUE) {
6142 ev.fType = kFocusIn;
6144 ev.fType = kFocusOut;
6147 if (ev.fType == kGKeyPress || ev.fType == kKeyRelease) {
6148 ev.fWindow = (Window_t) xev.key.window;
6149 MapModifierState(ev.fState, xev.key.state, kFALSE);
6150 ev.fCode = xev.key.keyval;
6151 ev.fUser[1] = xev.key.length;
6152 if (xev.key.length > 0) ev.fUser[2] = xev.key.string[0];
6153 if (xev.key.length > 1) ev.fUser[3] = xev.key.string[1];
6154 if (xev.key.length > 2) ev.fUser[4] = xev.key.string[2];
6155 HWND tmpwin = (HWND) GetWindow((HWND) GDK_DRAWABLE_XID((GdkWindow *)xev.key.window), GW_CHILD);
6157 ev.fUser[0] = (ULong_t) gdk_xid_table_lookup((HANDLE)tmpwin);
6159 ev.fUser[0] = (ULong_t) xev.key.window;
6162 if (ev.fType == kButtonPress || ev.fType == kButtonRelease) {
6163 ev.fWindow = (Window_t) xev.button.window;
6164 ev.fX = xev.button.x;
6165 ev.fY = xev.button.y;
6166 ev.fXRoot = xev.button.x_root;
6167 ev.fYRoot = xev.button.y_root;
6168 MapModifierState(ev.fState, xev.button.state, kFALSE);
6169 ev.fCode = xev.button.button;
6171 tpoint.x = xev.button.x;
6172 tpoint.y = xev.button.y;
6173 HWND tmpwin = ChildWindowFromPoint((HWND) GDK_DRAWABLE_XID((GdkWindow *)xev.button.window), tpoint);
6175 ev.fUser[0] = (ULong_t) gdk_xid_table_lookup((HANDLE)tmpwin);
6177 ev.fUser[0] = (ULong_t) 0;
6180 if (ev.fType == kMotionNotify) {
6181 ev.fWindow = (Window_t) xev.motion.window;
6182 ev.fX = xev.motion.x;
6183 ev.fY = xev.motion.y;
6184 ev.fXRoot = xev.motion.x_root;
6185 ev.fYRoot = xev.motion.y_root;
6186 MapModifierState(ev.fState, xev.motion.state, kFALSE);
6189 tpoint.x = xev.button.x;
6190 tpoint.y = xev.button.y;
6191 HWND tmpwin = ChildWindowFromPoint((HWND) GDK_DRAWABLE_XID((GdkWindow *)xev.motion.window), tpoint);
6193 ev.fUser[0] = (ULong_t)gdk_xid_table_lookup((HANDLE)tmpwin);
6195 ev.fUser[0] = (ULong_t) xev.motion.window;
6198 if (ev.fType == kEnterNotify || ev.fType == kLeaveNotify) {
6199 ev.fWindow = (Window_t) xev.crossing.window;
6200 ev.fX = xev.crossing.x;
6201 ev.fY = xev.crossing.y;
6202 ev.fXRoot = xev.crossing.x_root;
6203 ev.fYRoot = xev.crossing.y_root;
6204 ev.fCode = xev.crossing.mode;
6205 MapModifierState(ev.fState, xev.crossing.state, kFALSE);
6207 if (ev.fType == kExpose) {
6208 ev.fWindow = (Window_t) xev.expose.window;
6209 ev.fX = xev.expose.area.x;
6210 ev.fY = xev.expose.area.y;
6211 ev.fWidth = xev.expose.area.width;
6212 ev.fHeight = xev.expose.area.height;
6213 ev.fCount = xev.expose.count;
6215 if (ev.fType == kConfigureNotify) {
6216 ev.fWindow = (Window_t) xev.configure.window;
6217 ev.fX = xev.configure.x;
6218 ev.fY = xev.configure.y;
6219 ev.fWidth = xev.configure.width;
6220 ev.fHeight = xev.configure.height;
6222 if (xev.type == GDK_CLIENT_EVENT) {
6223 ev.fWindow = (Window_t) xev.client.window;
6224 ev.fType = kClientMessage;
6225 ev.fHandle = xev.client.message_type;
6226 ev.fFormat = xev.client.data_format;
6227 ev.fUser[0] = xev.client.data.l[0];
6228 if (
sizeof(ev.fUser[0]) > 4) {
6229 AsmLong(xev.client.data.l[1], xev.client.data.l[3],
6231 AsmLong(xev.client.data.l[2], xev.client.data.l[4],
6234 ev.fUser[1] = xev.client.data.l[1];
6235 ev.fUser[2] = xev.client.data.l[2];
6236 ev.fUser[3] = xev.client.data.l[3];
6237 ev.fUser[4] = xev.client.data.l[4];
6240 if (ev.fType == kSelectionClear) {
6241 ev.fWindow = (Window_t) xev.selection.window;
6242 ev.fUser[0] = xev.selection.selection;
6244 if (ev.fType == kSelectionRequest) {
6245 ev.fWindow = (Window_t) xev.selection.window;
6246 ev.fUser[0] = (ULong_t) xev.selection.window;
6247 ev.fUser[1] = xev.selection.selection;
6248 ev.fUser[2] = xev.selection.target;
6249 ev.fUser[3] = xev.selection.property;
6251 if (ev.fType == kSelectionNotify) {
6252 ev.fWindow = (Window_t) xev.selection.window;
6253 ev.fUser[0] = (ULong_t) xev.selection.window;
6254 ev.fUser[1] = xev.selection.selection;
6255 ev.fUser[2] = xev.selection.target;
6256 ev.fUser[3] = xev.selection.property;
6258 if (xev.type == GDK_SCROLL) {
6259 ev.fType = kButtonRelease;
6260 if (xev.scroll.direction == GDK_SCROLL_UP) {
6261 ev.fCode = kButton4;
6262 }
else if (xev.scroll.direction == GDK_SCROLL_DOWN) {
6263 ev.fCode = kButton5;
6265 ev.fWindow = (Window_t) xev.scroll.window;
6266 ev.fX = xev.scroll.x;
6267 ev.fY = xev.scroll.y;
6268 ev.fXRoot = xev.scroll.x_root;
6269 ev.fYRoot = xev.scroll.y_root;
6271 tpoint.x = xev.scroll.x;
6272 tpoint.y = xev.scroll.y;
6273 HWND tmpwin = ChildWindowFromPoint((HWND) GDK_DRAWABLE_XID((GdkWindow *)xev.scroll.window), tpoint);
6275 ev.fUser[0] = (ULong_t)gdk_xid_table_lookup((HANDLE)tmpwin);
6277 ev.fUser[0] = (ULong_t) 0;
6286 void TGWin32::Bell(Int_t percent)
6296 void TGWin32::CopyArea(Drawable_t src, Drawable_t dest, GContext_t gc,
6297 Int_t src_x, Int_t src_y, UInt_t width,
6298 UInt_t height, Int_t dest_x, Int_t dest_y)
6300 if (!src || !dest)
return;
6302 gdk_window_copy_area((GdkDrawable *) dest, (GdkGC *) gc, dest_x, dest_y,
6303 (GdkDrawable *) src, src_x, src_y, width, height);
6309 void TGWin32::ChangeWindowAttributes(Window_t
id, SetWindowAttributes_t * attr)
6317 if (attr && (attr->fMask & kWAEventMask)) {
6318 evmask = (Mask_t) attr->fEventMask;
6319 MapEventMask(evmask, xevmask);
6320 gdk_window_set_events((GdkWindow *)
id, (GdkEventMask) xevmask);
6322 if (attr && (attr->fMask & kWABackPixel)) {
6323 color.pixel = attr->fBackgroundPixel;
6324 color.red = GetRValue(attr->fBackgroundPixel);
6325 color.green = GetGValue(attr->fBackgroundPixel);
6326 color.blue = GetBValue(attr->fBackgroundPixel);
6327 gdk_window_set_background((GdkWindow *)
id, &color);
6331 if (attr && (attr->fMask & kWABackPixmap)) {
6332 gdk_window_set_back_pixmap((GdkWindow *)
id,
6333 (GdkPixmap *) attr->fBackgroundPixmap, 0);
6335 if (attr && (attr->fMask & kWACursor)) {
6336 gdk_window_set_cursor((GdkWindow *)
id, (GdkCursor *) attr->fCursor);
6338 if (attr && (attr->fMask & kWAColormap)) {
6339 gdk_window_set_colormap((GdkWindow *)
id,(GdkColormap *) attr->fColormap);
6341 if (attr && (attr->fMask & kWABorderWidth)) {
6342 if (attr->fBorderWidth > 0) {
6343 gdk_window_set_decorations((GdkWindow *)
id,
6344 (GdkWMDecoration) GDK_DECOR_BORDER);
6354 void TGWin32::ChangeProperty(Window_t
id, Atom_t property, Atom_t type,
6355 UChar_t * data, Int_t len)
6359 gdk_property_change((GdkWindow *)
id, (GdkAtom) property,
6360 (GdkAtom) type, 8, GDK_PROP_MODE_REPLACE, data,len);
6366 void TGWin32::DrawLine(Drawable_t
id, GContext_t gc, Int_t x1, Int_t y1,
6371 gdk_draw_line((GdkDrawable *)
id, (GdkGC *) gc, x1, y1, x2, y2);
6377 void TGWin32::ClearArea(Window_t
id, Int_t x, Int_t y, UInt_t w, UInt_t h)
6381 gdk_window_clear_area((GdkWindow *)
id, x, y, w, h);
6387 void TGWin32::WMDeleteNotify(Window_t
id)
6392 prop = (Atom_t) gdk_atom_intern(
"WM_DELETE_WINDOW", FALSE);
6394 W32ChangeProperty((HWND) GDK_DRAWABLE_XID((GdkWindow *)
id),
6395 prop, XA_ATOM, 32, GDK_PROP_MODE_REPLACE,
6396 (
unsigned char *) &gWM_DELETE_WINDOW, 1);
6402 void TGWin32::SetKeyAutoRepeat(Bool_t on)
6405 gdk_key_repeat_restore();
6407 gdk_key_repeat_disable();
6417 void TGWin32::GrabKey(Window_t
id, Int_t keycode, UInt_t modifier, Bool_t grab)
6421 MapModifierState(modifier, xmod);
6424 gdk_key_grab(keycode, (GdkEventMask)xmod, (GdkWindow *)
id);
6426 gdk_key_ungrab(keycode, (GdkEventMask)xmod, (GdkWindow *)
id);
6436 void TGWin32::GrabButton(Window_t
id, EMouseButton button, UInt_t modifier,
6437 UInt_t evmask, Window_t confine, Cursor_t cursor,
6445 MapModifierState(modifier, xmod);
6448 MapEventMask(evmask, xevmask);
6449 gdk_button_grab(button, xmod, ( GdkWindow *)
id, 1, (GdkEventMask)xevmask,
6450 (GdkWindow*)confine, (GdkCursor*)cursor);
6452 gdk_button_ungrab(button, xmod, ( GdkWindow *)
id);
6461 void TGWin32::GrabPointer(Window_t
id, UInt_t evmask, Window_t confine,
6462 Cursor_t cursor, Bool_t grab, Bool_t owner_events)
6465 MapEventMask(evmask, xevmask);
6468 if(!::IsWindowVisible((HWND)GDK_DRAWABLE_XID(
id)))
return;
6469 gdk_pointer_grab((GdkWindow *)
id, owner_events, (GdkEventMask) xevmask,
6470 (GdkWindow *) confine, (GdkCursor *) cursor,
6473 gdk_pointer_ungrab(GDK_CURRENT_TIME);
6474 ::SetCursor((HCURSOR)GDK_CURSOR_XID(fCursors[kPointer]));
6481 void TGWin32::SetWindowName(Window_t
id,
char *name)
6485 gdk_window_set_title((GdkWindow *)
id, name);
6491 void TGWin32::SetIconName(Window_t
id,
char *name)
6495 gdk_window_set_icon_name((GdkWindow *)
id, name);
6501 void TGWin32::SetIconPixmap(Window_t
id, Pixmap_t pic)
6505 gdk_window_set_icon((GdkWindow *)
id, NULL, (GdkPixmap *)pic, (GdkPixmap *)pic);
6508 #define safestrlen(s) ((s) ? strlen(s) : 0)
6513 void TGWin32::SetClassHints(Window_t
id,
char *className,
char *resourceName)
6522 prop = gdk_atom_intern(
"WM_CLASS", kFALSE);
6524 len_nm = safestrlen(resourceName);
6525 len_cl = safestrlen(className);
6527 if ((class_string = s =
6528 (
char *) malloc((
unsigned) (len_nm + len_cl + 2)))) {
6530 strcpy(s, resourceName);
6535 strcpy(s, className);
6540 W32ChangeProperty((HWND) GDK_DRAWABLE_XID((GdkWindow *)
id),
6541 (Atom) XA_WM_CLASS, (Atom) XA_WM_CLASS, 8,
6542 GDK_PROP_MODE_REPLACE,
6543 (
unsigned char *) class_string,
6544 len_nm + len_cl + 2);
6552 void TGWin32::SetMWMHints(Window_t
id, UInt_t value, UInt_t funcs,
6557 gdk_window_set_decorations((GdkDrawable *)
id, (GdkWMDecoration) value);
6558 gdk_window_set_functions((GdkDrawable *)
id, (GdkWMFunction) funcs);
6564 void TGWin32::SetWMPosition(Window_t
id, Int_t x, Int_t y)
6568 gdk_window_move((GdkDrawable *)
id, x, y);
6574 void TGWin32::SetWMSize(Window_t
id, UInt_t w, UInt_t h)
6578 gdk_window_resize((GdkWindow *)
id, w, h);
6585 void TGWin32::SetWMSizeHints(Window_t
id, UInt_t wmin, UInt_t hmin,
6586 UInt_t wmax, UInt_t hmax,
6587 UInt_t winc, UInt_t hinc)
6592 GdkWindowHints flags;
6594 flags = (GdkWindowHints) (GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE |
6595 GDK_HINT_RESIZE_INC);
6596 hints.min_width = (Int_t) wmin;
6597 hints.max_width = (Int_t) wmax;
6598 hints.min_height = (Int_t) hmin;
6599 hints.max_height = (Int_t) hmax;
6600 hints.width_inc = (Int_t) winc;
6601 hints.height_inc = (Int_t) hinc;
6603 gdk_window_set_geometry_hints((GdkWindow *)
id, (GdkGeometry *) &hints,
6604 (GdkWindowHints) flags);
6610 void TGWin32::SetWMState(Window_t
id, EInitialState state)
6616 Int_t xstate = NormalState;
6618 if (state == kNormalState)
6619 xstate = NormalState;
6620 if (state == kIconicState)
6621 xstate = IconicState;
6623 hints.flags = StateHint;
6624 hints.initial_state = xstate;
6626 XSetWMHints((GdkWindow *)
id, &hints);
6633 void TGWin32::SetWMTransientHint(Window_t
id, Window_t main_id)
6637 gdk_window_set_transient_for((GdkWindow *)
id, (GdkWindow *) main_id);
6643 void TGWin32::DrawString(Drawable_t
id, GContext_t gc, Int_t x, Int_t y,
6644 const char *s, Int_t len)
6649 gdk_gc_get_values((GdkGC *) gc, &values);
6650 gdk_win32_draw_text((GdkDrawable *)
id, (GdkFont *) values.font,
6651 (GdkGC *) gc, x, y, (
const gchar *)s, len);
6657 Int_t TGWin32::TextWidth(FontStruct_t font,
const char *s, Int_t len)
6659 return gdk_text_width((GdkFont *)font, s, len);
6665 void TGWin32::GetFontProperties(FontStruct_t font, Int_t & max_ascent,
6666 Int_t & max_descent)
6668 GdkFont *f = (GdkFont *) font;
6669 max_ascent = f->ascent;
6670 max_descent = f->descent;
6677 void TGWin32::GetGCValues(GContext_t gc, GCValues_t & gval)
6682 MapGCValues(gval, xmask, xgval, kTRUE);
6683 gdk_gc_get_values((GdkGC *) gc, &xgval);
6684 MapGCValues(gval, xmask, xgval, kFALSE);
6691 FontStruct_t TGWin32::GetFontStruct(FontH_t fh)
6693 return (FontStruct_t) gdk_font_ref((GdkFont *) fh);
6699 void TGWin32::FreeFontStruct(FontStruct_t fs)
6701 gdk_font_unref((GdkFont *) fs);
6707 void TGWin32::ClearWindow(Window_t
id)
6711 gdk_window_clear((GdkDrawable *)
id);
6719 Int_t TGWin32::KeysymToKeycode(UInt_t keysym)
6722 MapKeySym(keysym, xkeysym);
6729 void TGWin32::FillRectangle(Drawable_t
id, GContext_t gc, Int_t x, Int_t y,
6734 gdk_win32_draw_rectangle((GdkDrawable *)
id, (GdkGC *) gc, kTRUE, x, y, w, h);
6740 void TGWin32::DrawRectangle(Drawable_t
id, GContext_t gc, Int_t x, Int_t y,
6745 gdk_win32_draw_rectangle((GdkDrawable *)
id, (GdkGC *) gc, kFALSE, x, y, w, h);
6751 void TGWin32::DrawSegments(Drawable_t
id, GContext_t gc, Segment_t * seg,
6756 gdk_win32_draw_segments((GdkDrawable *)
id, (GdkGC *) gc, (GdkSegment *)seg, nseg);
6765 void TGWin32::SelectInput(Window_t
id, UInt_t evmask)
6770 MapEventMask(evmask, xevmask, kTRUE);
6771 gdk_window_set_events((GdkWindow *)
id, (GdkEventMask)xevmask);
6777 Window_t TGWin32::GetInputFocus()
6779 HWND hwnd = ::GetFocus();
6780 return (Window_t) gdk_xid_table_lookup(hwnd);
6786 void TGWin32::SetInputFocus(Window_t
id)
6790 HWND hwnd = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
6798 Window_t TGWin32::GetPrimarySelectionOwner()
6800 return (Window_t)gdk_selection_owner_get(gClipboardAtom);
6807 void TGWin32::SetPrimarySelectionOwner(Window_t
id)
6811 gdk_selection_owner_set((GdkWindow *)
id, gClipboardAtom, GDK_CURRENT_TIME, 0);
6825 void TGWin32::ConvertPrimarySelection(Window_t
id, Atom_t clipboard, Time_t when)
6829 gdk_selection_convert((GdkWindow *)
id, clipboard,
6830 gdk_atom_intern(
"GDK_TARGET_STRING", 0), when);
6839 void TGWin32::LookupString(Event_t * event,
char *buf, Int_t buflen,
6842 _lookup_string(event, buf, buflen);
6843 UInt_t ks, xks = (UInt_t) event->fCode;
6844 MapKeySym(ks, xks, kFALSE);
6845 keysym = (Int_t) ks;
6852 void TGWin32::MapKeySym(UInt_t & keysym, UInt_t & xkeysym, Bool_t tox)
6855 xkeysym = GDK_VoidSymbol;
6858 }
else if (keysym >= kKey_F1 && keysym <= kKey_F35) {
6859 xkeysym = GDK_F1 + (keysym - (UInt_t) kKey_F1);
6861 for (
int i = 0; gKeyMap[i].fKeySym; i++) {
6862 if (keysym == (UInt_t) gKeyMap[i].fKeySym) {
6863 xkeysym = (UInt_t) gKeyMap[i].fXKeySym;
6869 keysym = kKey_Unknown;
6871 if (xkeysym < 127) {
6873 }
else if (xkeysym >= GDK_F1 && xkeysym <= GDK_F35) {
6874 keysym = kKey_F1 + (xkeysym - GDK_F1);
6875 }
else if (xkeysym >= GDK_KP_0 && xkeysym <= GDK_KP_9) {
6876 keysym = kKey_0 + (xkeysym - GDK_KP_0);
6878 for (
int i = 0; gKeyMap[i].fXKeySym; i++) {
6879 if (xkeysym == gKeyMap[i].fXKeySym) {
6880 keysym = (UInt_t) gKeyMap[i].fKeySym;
6892 void TGWin32::GetPasteBuffer(Window_t
id, Atom_t atom, TString & text,
6893 Int_t & nchar, Bool_t del)
6898 int nread, actual_format;
6900 nread = gdk_selection_property_get((GdkWindow *)
id,
6901 (
unsigned char **) &data,
6902 (GdkAtom *) & atom, &actual_format);
6904 if ((nread == 0) || (data == NULL)) {
6909 text.Insert(0, (
const char *) data);
6914 gdk_property_delete((GdkWindow *)
id,
6915 gdk_atom_intern(
"GDK_SELECTION", FALSE));
6924 void TGWin32::TranslateCoordinates(Window_t src, Window_t dest,
6925 Int_t src_x, Int_t src_y,
6926 Int_t &dest_x, Int_t &dest_y,
6929 if (!src || !dest)
return;
6931 HWND sw, dw, ch = NULL;
6933 sw = (HWND)GDK_DRAWABLE_XID((GdkWindow *)src);
6934 dw = (HWND)GDK_DRAWABLE_XID((GdkWindow *)dest);
6937 ::MapWindowPoints(sw,
6941 ch = ::ChildWindowFromPointEx(dw, point, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE);
6942 child = (Window_t)gdk_xid_table_lookup(ch);
6945 child = (Window_t) 0;
6955 void TGWin32::GetWindowSize(Drawable_t
id, Int_t & x, Int_t & y,
6956 UInt_t & w, UInt_t & h)
6961 if (GDK_DRAWABLE_TYPE(
id) == GDK_DRAWABLE_PIXMAP) {
6963 gdk_drawable_get_size((GdkDrawable *)
id, (
int*)&w, (
int*)&h);
6966 gdk_window_get_geometry((GdkDrawable *)
id, &x, &y, (
int*)&w,
6979 void TGWin32::FillPolygon(Window_t
id, GContext_t gc, Point_t * points,
6984 gdk_win32_draw_polygon((GdkWindow *)
id, (GdkGC *) gc, 1, (GdkPoint *) points, npnt);
6996 void TGWin32::QueryPointer(Window_t
id, Window_t &rootw,
6997 Window_t &childw, Int_t &root_x,
6998 Int_t &root_y, Int_t &win_x, Int_t &win_y,
7008 window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)id);
7009 rootw = (Window_t)GDK_ROOT_PARENT();
7010 ::GetCursorPos(&currPt);
7011 chw = ::WindowFromPoint(currPt);
7012 childw = (Window_t)gdk_xid_table_lookup(chw);
7016 ::ScreenToClient(window, &currPt);
7020 ::GetKeyboardState (kbd);
7022 if (kbd[VK_SHIFT] & 0x80) {
7023 umask |= GDK_SHIFT_MASK;
7025 if (kbd[VK_CAPITAL] & 0x80) {
7026 umask |= GDK_LOCK_MASK;
7028 if (kbd[VK_CONTROL] & 0x80) {
7029 umask |= GDK_CONTROL_MASK;
7031 if (kbd[VK_MENU] & 0x80) {
7032 umask |= GDK_MOD1_MASK;
7034 if (kbd[VK_LBUTTON] & 0x80) {
7035 umask |= GDK_BUTTON1_MASK;
7037 if (kbd[VK_MBUTTON] & 0x80) {
7038 umask |= GDK_BUTTON2_MASK;
7040 if (kbd[VK_RBUTTON] & 0x80) {
7041 umask |= GDK_BUTTON3_MASK;
7044 MapModifierState(mask, umask, kFALSE);
7051 void TGWin32::SetForeground(GContext_t gc, ULong_t foreground)
7054 fore.pixel = foreground;
7055 fore.red = GetRValue(foreground);
7056 fore.green = GetGValue(foreground);
7057 fore.blue = GetBValue(foreground);
7058 gdk_gc_set_foreground((GdkGC *) gc, &fore);
7066 void TGWin32::SetClipRectangles(GContext_t gc, Int_t x, Int_t y,
7067 Rectangle_t * recs, Int_t n)
7070 GdkRectangle *grects =
new GdkRectangle[n];
7072 for (i = 0; i < n; i++) {
7073 grects[i].x = x+recs[i].fX;
7074 grects[i].y = y+recs[i].fY;
7075 grects[i].width = recs[i].fWidth;
7076 grects[i].height = recs[i].fHeight;
7079 for (i = 0; i < n; i++) {
7080 gdk_gc_set_clip_rectangle((GdkGC *)gc, (GdkRectangle*)recs);
7090 void TGWin32::Update(Int_t mode)
7098 Region_t TGWin32::CreateRegion()
7100 return (Region_t) gdk_region_new();
7106 void TGWin32::DestroyRegion(Region_t reg)
7108 gdk_region_destroy((GdkRegion *) reg);
7114 void TGWin32::UnionRectWithRegion(Rectangle_t * rect, Region_t src, Region_t dest)
7119 r.width = rect->fWidth;
7120 r.height = rect->fHeight;
7121 dest = (Region_t) gdk_region_union_with_rect((GdkRegion *) src, &r);
7128 Region_t TGWin32::PolygonRegion(Point_t * points, Int_t np, Bool_t winding)
7130 return (Region_t) gdk_region_polygon((GdkPoint*)points, np,
7131 winding ? GDK_WINDING_RULE : GDK_EVEN_ODD_RULE);
7138 void TGWin32::UnionRegion(Region_t rega, Region_t regb, Region_t result)
7140 result = (Region_t) gdk_regions_union((GdkRegion *) rega, (GdkRegion *) regb);
7147 void TGWin32::IntersectRegion(Region_t rega, Region_t regb,
7150 result = (Region_t) gdk_regions_intersect((GdkRegion *) rega,(GdkRegion *) regb);
7156 void TGWin32::SubtractRegion(Region_t rega, Region_t regb, Region_t result)
7158 result = (Region_t)gdk_regions_subtract((GdkRegion *) rega,(GdkRegion *) regb);
7165 void TGWin32::XorRegion(Region_t rega, Region_t regb, Region_t result)
7167 result = (Region_t) gdk_regions_xor((GdkRegion *) rega, (GdkRegion *) regb);
7173 Bool_t TGWin32::EmptyRegion(Region_t reg)
7175 return (Bool_t) gdk_region_empty((GdkRegion *) reg);
7181 Bool_t TGWin32::PointInRegion(Int_t x, Int_t y, Region_t reg)
7183 return (Bool_t) gdk_region_point_in((GdkRegion *) reg, x, y);
7189 Bool_t TGWin32::EqualRegion(Region_t rega, Region_t regb)
7191 return (Bool_t) gdk_region_equal((GdkRegion *) rega, (GdkRegion *) regb);
7197 void TGWin32::GetRegionBox(Region_t reg, Rectangle_t * rect)
7200 gdk_region_get_clipbox((GdkRegion *) reg, &r);
7203 rect->fWidth = r.width;
7204 rect->fHeight = r.height;
7210 char **TGWin32::ListFonts(
const char *fontname, Int_t , Int_t &count)
7212 char foundry[32], family[100], weight[32], slant[32], font_name[256];
7214 Int_t n1, fontcount = 0;
7216 sscanf(fontname,
"-%30[^-]-%100[^-]-%30[^-]-%30[^-]-%n",
7217 foundry, family, weight, slant, &n1);
7219 if(!stricmp(weight,
"medium")) {
7220 sprintf(weight,
"normal");
7223 sprintf(font_name,
"-%s-%s-%s-%s-*", foundry, family, weight, slant);
7224 fontlist = gdk_font_list_new(font_name, &fontcount);
7227 if (fontcount > 0)
return fontlist;
7234 void TGWin32::FreeFontNames(
char **fontlist)
7236 gdk_font_list_free(fontlist);
7242 Drawable_t TGWin32::CreateImage(UInt_t width, UInt_t height)
7244 return (Drawable_t) gdk_image_new(GDK_IMAGE_SHARED, gdk_visual_get_best(),
7251 void TGWin32::GetImageSize(Drawable_t
id, UInt_t &width, UInt_t &height)
7253 width = ((GdkImage*)
id)->width;
7254 height = ((GdkImage*)
id)->height;
7260 void TGWin32::PutPixel(Drawable_t
id, Int_t x, Int_t y, ULong_t pixel)
7264 GdkImage *image = (GdkImage *)
id;
7265 if (image->depth == 1) {
7267 ((UChar_t *) image->mem)[y * image->bpl + (x >> 3)] |= (1 << (7 - (x & 0x7)));
7269 ((UChar_t *) image->mem)[y * image->bpl + (x >> 3)] &= ~(1 << (7 - (x & 0x7)));
7272 UChar_t *pixelp = (UChar_t *) image->mem + y * image->bpl + x * image->bpp;
7274 switch (image->bpp) {
7278 pixelp[2] = ((pixel >> 16) & 0xFF);
7280 pixelp[1] = ((pixel >> 8) & 0xFF);
7282 pixelp[0] = (pixel & 0xFF);
7290 void TGWin32::PutImage(Drawable_t
id, GContext_t gc, Drawable_t img, Int_t dx,
7291 Int_t dy, Int_t x, Int_t y, UInt_t w, UInt_t h)
7295 gdk_draw_image((GdkDrawable *)
id, (GdkGC *)gc, (GdkImage *)img,
7296 x, y, dx, dy, w, h);
7303 void TGWin32::DeleteImage(Drawable_t img)
7305 gdk_image_unref((GdkImage *)img);
7318 unsigned char *TGWin32::GetColorBits(Drawable_t wid, Int_t x, Int_t y,
7319 UInt_t width, UInt_t height)
7323 HGDIOBJ oldbitmap1, oldbitmap2;
7327 unsigned char *ret = 0;
7329 if (GDK_DRAWABLE_TYPE(wid) == GDK_DRAWABLE_PIXMAP) {
7330 hdc = ::CreateCompatibleDC(NULL);
7331 oldbitmap1 = ::SelectObject(hdc, GDK_DRAWABLE_XID(wid));
7332 ::GetObject(GDK_DRAWABLE_XID(wid),
sizeof(BITMAP), &bm);
7334 hdc = ::GetDC((HWND)GDK_DRAWABLE_XID(wid));
7336 memdc = ::CreateCompatibleDC(hdc);
7338 bmi.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
7339 bmi.bmiHeader.biWidth = width;
7340 bmi.bmiHeader.biHeight = -1 * (int)(height);
7341 bmi.bmiHeader.biPlanes = 1;
7342 bmi.bmiHeader.biBitCount = 32;
7343 bmi.bmiHeader.biCompression = BI_RGB;
7344 bmi.bmiHeader.biSizeImage = 0;
7345 bmi.bmiHeader.biXPelsPerMeter = bmi.bmiHeader.biYPelsPerMeter = 0;
7346 bmi.bmiHeader.biClrUsed = 0;
7347 bmi.bmiHeader.biClrImportant = 0;
7349 ximage = ::CreateDIBSection(hdc, (BITMAPINFO *) &bmi, DIB_RGB_COLORS, &bmbits, NULL, 0);
7351 if (ximage && bmbits) {
7352 oldbitmap2 = ::SelectObject(memdc, ximage);
7353 ::BitBlt(memdc, x, y, width, height, hdc, 0, 0, SRCCOPY);
7354 ::SelectObject(memdc, oldbitmap2);
7357 if (GDK_DRAWABLE_TYPE(wid) == GDK_DRAWABLE_PIXMAP) {
7358 ::SelectObject(hdc, oldbitmap1);
7361 ::ReleaseDC((HWND)GDK_DRAWABLE_XID(wid), hdc);
7363 if (ximage && bmbits) {
7364 ULong_t sz = width*height*4;
7365 ret =
new unsigned char[sz];
7366 memcpy(ret, bmbits, sz);
7367 ::DeleteObject(ximage);
7379 Pixmap_t TGWin32::CreatePixmapFromData(
unsigned char *bits, UInt_t width, UInt_t height)
7381 BITMAPINFO bmp_info;
7382 bmp_info.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
7383 bmp_info.bmiHeader.biWidth = width;
7384 bmp_info.bmiHeader.biHeight = -1 * (int)(height);
7385 bmp_info.bmiHeader.biPlanes = 1;
7386 bmp_info.bmiHeader.biBitCount = 32;
7387 bmp_info.bmiHeader.biCompression = BI_RGB;
7388 bmp_info.bmiHeader.biSizeImage = 0;
7389 bmp_info.bmiHeader.biClrUsed = 0;
7390 bmp_info.bmiHeader.biXPelsPerMeter = 0L;
7391 bmp_info.bmiHeader.biYPelsPerMeter = 0L;
7392 bmp_info.bmiHeader.biClrImportant = 0;
7393 bmp_info.bmiColors[0].rgbRed = 0;
7394 bmp_info.bmiColors[0].rgbGreen = 0;
7395 bmp_info.bmiColors[0].rgbBlue = 0;
7396 bmp_info.bmiColors[0].rgbReserved = 0;
7398 HDC hdc = ::GetDC(NULL);
7399 HBITMAP hbitmap = ::CreateDIBitmap(hdc, &bmp_info.bmiHeader, CBM_INIT,
7400 (
void *)bits, &bmp_info, DIB_RGB_COLORS);
7401 ::ReleaseDC(NULL, hdc);
7407 ::SetBitmapDimensionEx(hbitmap,width, height, &size);
7409 return (Pixmap_t)gdk_pixmap_foreign_new((guint32)hbitmap);
7415 Int_t TGWin32::AddPixmap(ULong_t pix, UInt_t w, UInt_t h)
7417 HBITMAP hBmp =
reinterpret_cast<HBITMAP
>(pix);
7420 SetBitmapDimensionEx(hBmp, w, h, &sz);
7421 GdkPixmap *newPix = gdk_pixmap_foreign_new(reinterpret_cast<guint32>(hBmp));
7424 for(; wid < fMaxNumberOfWindows; ++wid)
7425 if (!fWindows[wid].open)
7428 if (wid == fMaxNumberOfWindows) {
7429 Int_t newSize = fMaxNumberOfWindows + 10;
7431 fWindows = (XWindow_t *)TStorage::ReAlloc(fWindows, newSize *
sizeof(XWindow_t),
7432 fMaxNumberOfWindows *
sizeof(XWindow_t));
7434 for (Int_t i = fMaxNumberOfWindows; i < newSize; ++i)
7435 fWindows[i].open = 0;
7437 fMaxNumberOfWindows = newSize;
7440 fWindows[wid].open = 1;
7441 gCws = fWindows + wid;
7442 gCws->window = newPix;
7443 gCws->drawing = gCws->window;
7445 gCws->double_buffer = 0;
7450 gCws->new_colors = 0;
7458 Int_t TGWin32::AddWindow(ULong_t qwid, UInt_t w, UInt_t h)
7464 for (wid = 0; wid < fMaxNumberOfWindows; wid++) {
7465 if (!fWindows[wid].open) {
7466 fWindows[wid].open = 1;
7467 fWindows[wid].double_buffer = 0;
7468 gCws = &fWindows[wid];
7473 if (wid == fMaxNumberOfWindows) {
7474 int newsize = fMaxNumberOfWindows + 10;
7476 (XWindow_t *) TStorage::ReAlloc(fWindows,
7477 newsize *
sizeof(XWindow_t),
7478 fMaxNumberOfWindows *
7481 for (
int i = fMaxNumberOfWindows; i < newsize; i++) {
7482 fWindows[i].open = 0;
7485 fMaxNumberOfWindows = newsize;
7489 gCws->window = gdk_window_foreign_new((guint32)qwid);
7491 gCws->drawing = gCws->window;
7493 gCws->double_buffer = 0;
7498 gCws->new_colors = 0;
7506 void TGWin32::RemoveWindow(ULong_t qwid)
7510 SelectWindow((
int)qwid);
7513 gdk_pixmap_unref(gCws->buffer);
7515 if (gCws->new_colors) {
7516 gdk_colormap_free_colors((GdkColormap *) fColormap,
7517 (GdkColor *)gCws->new_colors, gCws->ncolors);
7519 delete [] gCws->new_colors;
7520 gCws->new_colors = 0;
7526 if (!fWindows)
return;
7529 for (wid = 0; wid < fMaxNumberOfWindows; wid++) {
7530 if (fWindows[wid].open) {
7531 gCws = &fWindows[wid];
7543 void TGWin32::ShapeCombineMask(Window_t
id, Int_t x, Int_t y, Pixmap_t mask)
7545 gdk_window_shape_combine_mask((GdkWindow *)
id, (GdkBitmap *) mask, x, y);
7551 UInt_t TGWin32::ScreenWidthMM()
const
7553 return (UInt_t)gdk_screen_width_mm();
7561 void TGWin32::DeleteProperty(Window_t win, Atom_t& prop)
7563 HWND hWnd = (HWND)GDK_DRAWABLE_XID((GdkWindow *)win);
7564 Atom_t atom = (Atom_t)GetProp(hWnd,(LPCTSTR)MAKELONG(prop,0));
7566 GlobalDeleteAtom(atom);
7568 RemoveProp(hWnd,(LPCTSTR)MAKELONG(prop,0));
7575 Int_t TGWin32::GetProperty(Window_t win, Atom_t prop, Long_t offset, Long_t len,
7576 Bool_t del, Atom_t req_type, Atom_t *act_type,
7577 Int_t *act_format, ULong_t *nitems, ULong_t *bytes,
7578 unsigned char **prop_list)
7581 UChar_t *ptr, *data;
7582 UInt_t i, n, length;
7584 HWND hWnd = (HWND)GDK_DRAWABLE_XID((GdkWindow *)win);
7588 Atom_t dndproxy = InternAtom(
"XdndProxy", kFALSE);
7589 Atom_t dndtypelist = InternAtom(
"XdndTypeList", kFALSE);
7591 if (prop == dndproxy)
7593 if (prop == dndtypelist) {
7594 *act_type = XA_ATOM;
7595 *prop_list = (
unsigned char *)GetProp(hWnd, (LPCTSTR)MAKELONG(prop,0));
7596 for (n = 0; prop_list[n]; n++);
7601 if (!OpenClipboard((HWND)GDK_DRAWABLE_XID((GdkWindow *)win))) {
7604 hdata = GetClipboardData(CF_PRIVATEFIRST);
7605 ptr = (UChar_t *)GlobalLock(hdata);
7606 length = GlobalSize(hdata);
7607 data = (UChar_t *)malloc(length + 1);
7608 for (i = 0; i < length; i++) {
7611 GlobalUnlock(hdata);
7614 *bytes = *nitems = length;
7623 void TGWin32::ChangeActivePointerGrab(Window_t win, UInt_t mask, Cursor_t cur)
7626 MapEventMask(mask, xevmask);
7628 gdk_window_set_cursor((GdkWindow *) win, fCursors[kHand]);
7630 gdk_window_set_cursor((GdkWindow *) win, (GdkCursor *)cur);
7636 void TGWin32::ConvertSelection(Window_t win, Atom_t &sel, Atom_t &target,
7637 Atom_t &prop, Time_t &stamp)
7641 static UINT gdk_selection_notify_msg =
7642 RegisterWindowMessage(
"gdk-selection-notify");
7643 HWND hWnd = (HWND)GDK_DRAWABLE_XID((GdkWindow *)win);
7644 if (!OpenClipboard((HWND)GDK_DRAWABLE_XID((GdkWindow *)win))) {
7647 hdata = GetClipboardData(CF_PRIVATEFIRST);
7654 PostMessage(hWnd, gdk_selection_notify_msg, sel, target);
7660 Bool_t TGWin32::SetSelectionOwner(Window_t owner, Atom_t &sel)
7662 static UINT gdk_selection_request_msg =
7663 RegisterWindowMessage(
"gdk-selection-request");
7664 HWND hWnd = (HWND)GDK_DRAWABLE_XID((GdkWindow *)owner);
7665 OpenClipboard(hWnd);
7669 ::PostMessage(hWnd, gdk_selection_request_msg, sel, 0);
7677 void TGWin32::ChangeProperties(Window_t
id, Atom_t property, Atom_t type,
7678 Int_t format, UChar_t *data, Int_t len)
7684 if (data == 0 || len == 0)
7686 if (!OpenClipboard((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id))) {
7689 hdata = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, len + 1);
7690 ptr = (UChar_t *)GlobalLock(hdata);
7691 for (i = 0; i < len; i++) {
7694 GlobalUnlock(hdata);
7695 SetClipboardData(CF_PRIVATEFIRST, hdata);
7702 void TGWin32::SetTypeList(Window_t win, Atom_t prop, Atom_t *typelist)
7704 SetProp((HWND)GDK_DRAWABLE_XID((GdkWindow *)win),
7705 (LPCTSTR)MAKELONG(prop,0),
7714 Window_t TGWin32::FindRWindow(Window_t root, Window_t dragwin, Window_t input,
7715 int x,
int y,
int maxd)
7722 Window_t win, retwin = kNone;
7724 Atom_t dndaware = InternAtom(
"XdndAware", kFALSE);
7728 hwnd = ::ChildWindowFromPointEx((HWND)GDK_DRAWABLE_XID((GdkWindow *)root),
7731 GetWindowRect(hwnd, &rect);
7732 if (PtInRect(&rect, cpt)) {
7733 if (GetProp(hwnd,(LPCTSTR)MAKELONG(dndaware,0))) {
7734 win = (Window_t) gdk_xid_table_lookup(hwnd);
7735 if (win && win != dragwin && win != input)
7738 Bool_t done = kFALSE;
7742 ::MapWindowPoints(NULL, hwndt, &point, 1);
7743 hwndc = ChildWindowFromPoint (hwndt, point);
7744 if (GetProp(hwnd,(LPCTSTR)MAKELONG(dndaware,0))) {
7745 win = (Window_t) gdk_xid_table_lookup(hwndc);
7746 if (win && win != dragwin && win != input)
7751 else if (hwndc == hwndt)
7755 if (GetProp(hwndt,(LPCTSTR)MAKELONG(dndaware,0))) {
7756 win = (Window_t) gdk_xid_table_lookup(hwndt);
7757 if (win && win != dragwin && win != input)
7762 hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
7771 Bool_t TGWin32::IsDNDAware(Window_t win, Atom_t *typelist)
7773 if (!win)
return kFALSE;
7776 Atom_t dndaware = InternAtom(
"XdndAware", kFALSE);
7777 HWND window = (HWND)GDK_DRAWABLE_XID((GdkWindow *)win);
7779 version = (Atom_t)GetProp(window,(LPCTSTR)MAKELONG(dndaware,0));
7780 if (version)
return kTRUE;
7781 window = ::GetParent(window);
7790 void TGWin32::SetDNDAware(Window_t
id, Atom_t *typelist)
7795 DWORD dwStyle = GetWindowLong((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id),
7797 SetWindowLong((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id), GWL_EXSTYLE,
7798 dwStyle | WS_EX_ACCEPTFILES);
7799 Atom_t dndaware = InternAtom(
"XdndAware", kFALSE);
7800 SetProp((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id),
7801 (LPCTSTR)MAKELONG(dndaware,0),
7802 (HANDLE)XDND_PROTOCOL_VERSION);
7806 for (n = 0; typelist[n]; n++);
7807 Atom_t dndtypelist = InternAtom(
"XdndTypeList", kFALSE);
7808 SetProp((HWND)GDK_DRAWABLE_XID((GdkWindow *)
id),
7809 (LPCTSTR)MAKELONG(dndtypelist,0),
7818 void TGWin32::SetUserThreadId(ULong_t
id)
7821 TGWin32ProxyBase::fgMainThreadId = ((TWinNTSystem*)gSystem)->GetGUIThreadId();
7824 TGWin32ProxyBase::fgUserThreadId = id;