]> git.saurik.com Git - wxWidgets.git/blame - src/x11/window.cpp
Some fixes for wxURLDataObject when wxUSE_UNICODE==1
[wxWidgets.git] / src / x11 / window.cpp
CommitLineData
83df96d6
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: windows.cpp
3// Purpose: wxWindow
4// Author: Julian Smart
5// Modified by:
6// Created: 17/09/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20#ifdef __GNUG__
21 #pragma implementation "window.h"
22#endif
23
83df96d6
JS
24#include "wx/setup.h"
25#include "wx/menu.h"
26#include "wx/dc.h"
27#include "wx/dcclient.h"
28#include "wx/utils.h"
29#include "wx/app.h"
30#include "wx/panel.h"
31#include "wx/layout.h"
32#include "wx/dialog.h"
33#include "wx/listbox.h"
34#include "wx/button.h"
35#include "wx/settings.h"
36#include "wx/msgdlg.h"
37#include "wx/frame.h"
38#include "wx/scrolwin.h"
39#include "wx/module.h"
40#include "wx/menuitem.h"
41#include "wx/log.h"
42
43#if wxUSE_DRAG_AND_DROP
44 #include "wx/dnd.h"
45#endif
46
bc797f4c 47#include "wx/x11/private.h"
7266b672 48#include "X11/Xutil.h"
83df96d6 49
461e93f9
JS
50#if wxUSE_NANOX
51// For wxGetLocalTime, used by XButtonEventGetTime
52#include "wx/timer.h"
53#endif
54
83df96d6
JS
55#include <string.h>
56
83df96d6
JS
57// ----------------------------------------------------------------------------
58// global variables for this module
59// ----------------------------------------------------------------------------
60
61extern wxHashTable *wxWidgetHashTable;
62static wxWindow* g_captureWindow = NULL;
63
83df96d6
JS
64// ----------------------------------------------------------------------------
65// macros
66// ----------------------------------------------------------------------------
67
68#define event_left_is_down(x) ((x)->xbutton.state & Button1Mask)
69#define event_middle_is_down(x) ((x)->xbutton.state & Button2Mask)
70#define event_right_is_down(x) ((x)->xbutton.state & Button3Mask)
71
72// ----------------------------------------------------------------------------
73// event tables
74// ----------------------------------------------------------------------------
75
8354aa92 76IMPLEMENT_ABSTRACT_CLASS(wxWindowX11, wxWindowBase)
83df96d6 77
bc797f4c
JS
78BEGIN_EVENT_TABLE(wxWindowX11, wxWindowBase)
79 EVT_SYS_COLOUR_CHANGED(wxWindowX11::OnSysColourChanged)
bc797f4c 80END_EVENT_TABLE()
83df96d6
JS
81
82// ============================================================================
83// implementation
84// ============================================================================
85
86// ----------------------------------------------------------------------------
87// helper functions
88// ----------------------------------------------------------------------------
89
83df96d6
JS
90// ----------------------------------------------------------------------------
91// constructors
92// ----------------------------------------------------------------------------
93
bc797f4c 94void wxWindowX11::Init()
83df96d6
JS
95{
96 // generic initializations first
97 InitBase();
98
7266b672 99 // X11-specific
7266b672 100 m_mainWidget = (WXWindow) 0;
83df96d6 101 m_winCaptured = FALSE;
3a0b23eb 102 m_needsInputFocus = FALSE;
83df96d6
JS
103 m_isShown = TRUE;
104 m_isBeingDeleted = FALSE;
83df96d6
JS
105 m_lastTS = 0;
106 m_lastButton = 0;
83df96d6
JS
107}
108
109// real construction (Init() must have been called before!)
bc797f4c 110bool wxWindowX11::Create(wxWindow *parent, wxWindowID id,
83df96d6
JS
111 const wxPoint& pos,
112 const wxSize& size,
113 long style,
114 const wxString& name)
115{
116 wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" );
117
118 CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
119
3cd0b8c5 120 parent->AddChild(this);
83df96d6 121
b513212d
JS
122 int w = size.GetWidth();
123 int h = size.GetHeight();
124 int x = size.GetX();
125 int y = size.GetY();
178572bb
RR
126 if (w == -1) w = 20;
127 if (h == -1) h = 20;
b513212d
JS
128 if (x == -1) x = 0;
129 if (y == -1) y = 0;
83df96d6 130
3cd0b8c5
RR
131 Display *xdisplay = (Display*) wxGlobalDisplay();
132 int xscreen = DefaultScreen( xdisplay );
7e4501ee 133 Visual *xvisual = DefaultVisual( xdisplay, xscreen );
3cd0b8c5 134 Colormap cm = DefaultColormap( xdisplay, xscreen );
b513212d 135
3cd0b8c5
RR
136 m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
137 m_backgroundColour.CalcPixel( (WXColormap) cm );
138
139 m_foregroundColour = *wxBLACK;
140 m_foregroundColour.CalcPixel( (WXColormap) cm );
3cd0b8c5 141
7e4501ee 142 Window xparent = (Window) parent->GetMainWindow();
b513212d 143
461e93f9 144#if !wxUSE_NANOX
7e4501ee
RR
145 XSetWindowAttributes xattributes;
146
147 long xattributes_mask =
148 CWEventMask |
149 CWBorderPixel | CWBackPixel;
150
151 xattributes.background_pixel = m_backgroundColour.GetPixel();
152 xattributes.border_pixel = BlackPixel( xdisplay, xscreen );
153
154 xattributes.event_mask =
155 ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
156 ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
157 KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
158 PropertyChangeMask;
461e93f9 159#endif
7e4501ee 160
15c69343
JS
161 wxSize size2(size);
162 if (size2.x == -1)
7e4501ee 163 size2.x = 20;
15c69343 164 if (size2.y == -1)
7e4501ee 165 size2.y = 20;
15c69343
JS
166
167 wxPoint pos2(pos);
168 if (pos2.x == -1)
7e4501ee 169 pos2.x = 0;
15c69343 170 if (pos2.y == -1)
7e4501ee 171 pos2.y = 0;
15c69343 172
461e93f9
JS
173#if wxUSE_NANOX
174 int extraFlags = GR_EVENT_MASK_CLOSE_REQ;
175
176 long backColor, foreColor;
177 backColor = GR_RGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue());
178 foreColor = GR_RGB(m_foregroundColour.Red(), m_foregroundColour.Green(), m_foregroundColour.Blue());
179
180 Window xwindow = XCreateWindowWithColor( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y,
181 0, 0, InputOutput, xvisual, backColor, foreColor);
182 XSelectInput( xdisplay, xwindow,
183 extraFlags | ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
184 ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
185 KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
186 PropertyChangeMask );
187
188#else
189
7e4501ee
RR
190 Window xwindow = XCreateWindow( xdisplay, xparent, pos2.x, pos2.y, size2.x, size2.y,
191 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
461e93f9
JS
192
193#endif
194
ba696cfa 195 m_mainWidget = (WXWindow) xwindow;
b513212d 196
ba696cfa 197 wxAddWindowToTable( xwindow, (wxWindow*) this );
b513212d 198
b28d3abf
JS
199 // Is a subwindow, so map immediately
200 m_isShown = TRUE;
ba696cfa 201 XMapWindow( xdisplay, xwindow );
83df96d6
JS
202
203 // Without this, the cursor may not be restored properly (e.g. in splitter
204 // sample).
205 SetCursor(*wxSTANDARD_CURSOR);
206 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
ba696cfa
RR
207
208 // Set background to None which will prevent X11 from clearing the
209 // background comletely.
210 XSetWindowBackgroundPixmap( xdisplay, xwindow, None );
15c69343
JS
211
212 // Don't call this, it can have nasty repercussions for composite controls,
213 // for example
214 // SetSize(pos.x, pos.y, size.x, size.y);
83df96d6
JS
215
216 return TRUE;
217}
218
219// Destructor
7266b672 220wxWindowX11::~wxWindowX11()
83df96d6
JS
221{
222 if (g_captureWindow == this)
223 g_captureWindow = NULL;
224
225 m_isBeingDeleted = TRUE;
226
7266b672 227 // X11-specific actions first
7e4501ee 228 Window xwindow = (Window) m_mainWidget;
83df96d6 229
d02cb44e 230 if (m_parent)
83df96d6
JS
231 m_parent->RemoveChild( this );
232
d02cb44e 233 DestroyChildren();
83df96d6
JS
234
235 // Destroy the window
7e4501ee 236 if (xwindow)
83df96d6 237 {
7e4501ee
RR
238 XSelectInput( wxGlobalDisplay(), xwindow, NoEventMask);
239 wxDeleteWindowFromTable( xwindow );
240 XDestroyWindow( wxGlobalDisplay(), xwindow );
d02cb44e 241 m_mainWidget = NULL;
83df96d6 242 }
83df96d6
JS
243}
244
245// ---------------------------------------------------------------------------
246// basic operations
247// ---------------------------------------------------------------------------
248
bc797f4c 249void wxWindowX11::SetFocus()
83df96d6 250{
86fd8bda
RR
251 Window xwindow = (Window) GetMainWindow();
252
253 wxCHECK_RET( xwindow, wxT("invalid window") );
9b8270da
RR
254
255 wxCHECK_RET( AcceptsFocus(), wxT("set focus on window that doesn't accept the focus") );
256
257#if 0
258 if (GetName() == "scrollBar")
259 {
260 char *crash = NULL;
261 *crash = 0;
262 }
263#endif
264
3a0b23eb
JS
265 if (wxWindowIsVisible(xwindow))
266 {
79ad56d0 267 XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime );
ba696cfa 268 m_needsInputFocus = FALSE;
3a0b23eb
JS
269 }
270 else
271 {
ba696cfa 272 m_needsInputFocus = TRUE;
3a0b23eb 273 }
83df96d6
JS
274}
275
276// Get the window with the focus
277wxWindow *wxWindowBase::FindFocus()
278{
86fd8bda 279 Window xfocus = (Window) 0;
b513212d 280 int revert = 0;
bc797f4c 281
86fd8bda
RR
282 XGetInputFocus( wxGlobalDisplay(), &xfocus, &revert);
283 if (xfocus)
83df96d6 284 {
86fd8bda 285 wxWindow *win = wxGetWindowFromTable( xfocus );
b513212d
JS
286
287 return win;
83df96d6
JS
288 }
289
b513212d 290 return NULL;
83df96d6
JS
291}
292
fc9be1cf
RR
293wxWindow *wxWindowX11::GetFocusWidget()
294{
295 wxWindow *win = (wxWindow*) this;
296 while (!win->IsTopLevel())
297 {
298 win = win->GetParent();
299 if (!win)
300 return (wxWindow*) NULL;
301 }
302
303 return win;
304}
305
b513212d
JS
306// Enabling/disabling handled by event loop, and not sending events
307// if disabled.
bc797f4c 308bool wxWindowX11::Enable(bool enable)
83df96d6
JS
309{
310 if ( !wxWindowBase::Enable(enable) )
311 return FALSE;
b513212d 312
83df96d6
JS
313 return TRUE;
314}
315
bc797f4c 316bool wxWindowX11::Show(bool show)
83df96d6 317{
7edcafa4 318 wxWindowBase::Show(show);
83df96d6 319
83df96d6
JS
320 Window xwin = (Window) GetXWindow();
321 Display *xdisp = (Display*) GetXDisplay();
322 if (show)
b513212d 323 {
7e4501ee 324 // wxLogDebug( "Mapping window of type %s", GetName().c_str() );
83df96d6 325 XMapWindow(xdisp, xwin);
256d631a 326 XSync(xdisp, False);
b513212d 327 }
83df96d6 328 else
b513212d 329 {
7e4501ee 330 // wxLogDebug( "Unmapping window of type %s", GetName().c_str() );
83df96d6 331 XUnmapWindow(xdisp, xwin);
b513212d 332 }
83df96d6
JS
333
334 return TRUE;
335}
336
337// Raise the window to the top of the Z order
bc797f4c 338void wxWindowX11::Raise()
83df96d6 339{
d02cb44e
RR
340 if (m_mainWidget)
341 XRaiseWindow( wxGlobalDisplay(), (Window) m_mainWidget );
83df96d6
JS
342}
343
344// Lower the window to the bottom of the Z order
bc797f4c 345void wxWindowX11::Lower()
83df96d6 346{
d02cb44e
RR
347 if (m_mainWidget)
348 XLowerWindow( wxGlobalDisplay(), (Window) m_mainWidget );
83df96d6
JS
349}
350
bc797f4c 351void wxWindowX11::DoCaptureMouse()
83df96d6 352{
7edcafa4
JS
353 if ((g_captureWindow != NULL) && (g_captureWindow != this))
354 {
346d4fcd 355 wxASSERT_MSG(FALSE, "Trying to capture before mouse released.");
7edcafa4 356
346d4fcd
RR
357 // Core dump now
358 int *tmp = NULL;
359 (*tmp) = 1;
360 return;
7edcafa4
JS
361 }
362
346d4fcd 363 if (m_winCaptured)
83df96d6
JS
364 return;
365
346d4fcd
RR
366 Window xwindow = (Window) GetMainWindow();
367
86fd8bda
RR
368 wxCHECK_RET( xwindow, wxT("invalid window") );
369
7edcafa4
JS
370 g_captureWindow = (wxWindow*) this;
371
346d4fcd 372 if (xwindow)
b513212d 373 {
346d4fcd 374 int res = XGrabPointer(wxGlobalDisplay(), xwindow,
b513212d
JS
375 FALSE,
376 ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask,
377 GrabModeAsync,
378 GrabModeAsync,
379 None,
380 None, /* cursor */ // TODO: This may need to be set to the cursor of this window
346d4fcd 381 CurrentTime );
b513212d 382
b28d3abf 383 if (res != GrabSuccess)
b513212d 384 {
346d4fcd
RR
385 wxString msg;
386 msg.Printf("Failed to grab pointer for window %s", this->GetClassInfo()->GetClassName());
387 wxLogDebug(msg);
388 if (res == GrabNotViewable)
389 {
390 wxLogDebug("This is not a viewable window - perhaps not shown yet?");
391 }
392 g_captureWindow = NULL;
b28d3abf 393 return;
b513212d 394 }
346d4fcd 395
9691c806 396 // wxLogDebug("Grabbed pointer in %s", GetName().c_str() );
b28d3abf 397
7edcafa4 398#if 0
b28d3abf
JS
399 res = XGrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
400 (Window) GetMainWindow(),
401 FALSE,
402 ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
403 GrabModeAsync,
404 GrabModeAsync,
405 None,
406 None);
7edcafa4 407
b28d3abf
JS
408 if (res != GrabSuccess)
409 {
410 wxLogDebug("Failed to grab mouse buttons.");
411 XUngrabPointer(wxGlobalDisplay(), CurrentTime);
412 return;
413 }
7edcafa4 414#endif
b28d3abf 415
7edcafa4 416#if 0
b28d3abf 417 res = XGrabKeyboard(wxGlobalDisplay(), (Window) GetMainWindow(),
1b0b798d 418 ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask,
b28d3abf 419 FALSE,
b28d3abf
JS
420 GrabModeAsync,
421 GrabModeAsync,
422 CurrentTime);
423
424 if (res != GrabSuccess)
425 {
426 wxLogDebug("Failed to grab keyboard.");
427 XUngrabPointer(wxGlobalDisplay(), CurrentTime);
428 XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
429 (Window) GetMainWindow());
430 return;
431 }
7edcafa4
JS
432#endif
433
b28d3abf 434 m_winCaptured = TRUE;
b513212d 435 }
83df96d6
JS
436}
437
bc797f4c 438void wxWindowX11::DoReleaseMouse()
83df96d6
JS
439{
440 g_captureWindow = NULL;
346d4fcd 441
83df96d6
JS
442 if ( !m_winCaptured )
443 return;
444
346d4fcd 445 Window xwindow = (Window) GetMainWindow();
b513212d 446
346d4fcd 447 if (xwindow)
b28d3abf 448 {
346d4fcd 449 XUngrabPointer( wxGlobalDisplay(), CurrentTime );
7edcafa4 450#if 0
346d4fcd
RR
451 XUngrabButton( wxGlobalDisplay(), AnyButton, AnyModifier, xwindow);
452 XUngrabKeyboard( wxGlobalDisplay(), CurrentTime );
7edcafa4 453#endif
b28d3abf 454 }
887dd52f 455
9691c806 456 // wxLogDebug( "Ungrabbed pointer in %s", GetName().c_str() );
83df96d6
JS
457
458 m_winCaptured = FALSE;
459}
460
bc797f4c 461bool wxWindowX11::SetFont(const wxFont& font)
83df96d6
JS
462{
463 if ( !wxWindowBase::SetFont(font) )
464 {
465 // nothing to do
466 return FALSE;
467 }
468
83df96d6
JS
469 return TRUE;
470}
471
bc797f4c 472bool wxWindowX11::SetCursor(const wxCursor& cursor)
83df96d6
JS
473{
474 if ( !wxWindowBase::SetCursor(cursor) )
475 {
476 // no change
477 return FALSE;
478 }
479
86fd8bda
RR
480 Window xwindow = (Window) GetMainWindow();
481
482 wxCHECK_MSG( xwindow, FALSE, wxT("invalid window") );
483
484 wxCursor cursorToUse;
83df96d6 485 if (m_cursor.Ok())
86fd8bda 486 cursorToUse = m_cursor;
83df96d6 487 else
86fd8bda 488 cursorToUse = *wxSTANDARD_CURSOR;
83df96d6 489
86fd8bda 490 Cursor xcursor = (Cursor) cursorToUse.GetCursor();
83df96d6 491
e88be8c9 492 XDefineCursor( wxGlobalDisplay(), xwindow, xcursor );
83df96d6
JS
493
494 return TRUE;
495}
496
497// Coordinates relative to the window
bc797f4c 498void wxWindowX11::WarpPointer (int x, int y)
83df96d6 499{
86fd8bda
RR
500 Window xwindow = (Window) GetMainWindow();
501
502 wxCHECK_RET( xwindow, wxT("invalid window") );
503
504 XWarpPointer( wxGlobalDisplay(), None, xwindow, 0, 0, 0, 0, x, y);
83df96d6
JS
505}
506
83df96d6 507// Does a physical scroll
bc797f4c 508void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
83df96d6 509{
fc9be1cf
RR
510 // No scrolling requested.
511 if ((dx == 0) && (dy == 0)) return;
512
513 if (!m_updateRegion.IsEmpty())
514 {
515 m_updateRegion.Offset( dx, dy );
516
517 int cw = 0;
518 int ch = 0;
519 GetSize( &cw, &ch ); // GetClientSize() ??
520 m_updateRegion.Intersect( 0, 0, cw, ch );
521 }
522
523 if (!m_clearRegion.IsEmpty())
524 {
525 m_clearRegion.Offset( dx, dy );
526
527 int cw = 0;
528 int ch = 0;
529 GetSize( &cw, &ch ); // GetClientSize() ??
530 m_clearRegion.Intersect( 0, 0, cw, ch );
531 }
532
7e085304
RR
533 Window xwindow = (Window) GetMainWindow();
534
535 wxCHECK_RET( xwindow, wxT("invalid window") );
536
537 Display *xdisplay = wxGlobalDisplay();
538
539 GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL );
540 XSetGraphicsExposures( xdisplay, xgc, True );
541
e88be8c9
RR
542 int s_x = 0;
543 int s_y = 0;
4125131b
RR
544 int cw;
545 int ch;
546 if (rect)
547 {
548 s_x = rect->x;
549 s_y = rect->y;
e88be8c9 550
4125131b
RR
551 cw = rect->width;
552 ch = rect->height;
553 }
554 else
555 {
556 s_x = 0;
557 s_y = 0;
558 GetClientSize( &cw, &ch );
559 }
560
561 wxPoint offset = GetClientAreaOrigin();
562 s_x += offset.x;
563 s_y += offset.y;
e88be8c9 564
7e085304
RR
565 int w = cw - abs(dx);
566 int h = ch - abs(dy);
4125131b 567
7e085304 568 if ((h < 0) || (w < 0))
83df96d6 569 {
7e085304 570 Refresh();
83df96d6
JS
571 }
572 else
573 {
4125131b 574 wxRect rect;
f809133f
RR
575 if (dx < 0) rect.x = cw+dx + offset.x; else rect.x = s_x;
576 if (dy < 0) rect.y = ch+dy + offset.y; else rect.y = s_y;
4125131b
RR
577 if (dy != 0) rect.width = cw; else rect.width = abs(dx);
578 if (dx != 0) rect.height = ch; else rect.height = abs(dy);
579
580 int d_x = s_x;
581 int d_y = s_y;
e88be8c9 582
4125131b
RR
583 if (dx < 0) s_x += -dx;
584 if (dy < 0) s_y += -dy;
e88be8c9
RR
585 if (dx > 0) d_x = dx + offset.x;
586 if (dy > 0) d_y = dy + offset.y;
7e085304
RR
587
588 XCopyArea( xdisplay, xwindow, xwindow, xgc, s_x, s_y, w, h, d_x, d_y );
4125131b 589
e88be8c9 590 // wxLogDebug( "Copy: s_x %d s_y %d w %d h %d d_x %d d_y %d", s_x, s_y, w, h, d_x, d_y );
7e085304 591
e88be8c9 592 // wxLogDebug( "Update: %d %d %d %d", rect.x, rect.y, rect.width, rect.height );
7e085304
RR
593
594 m_updateRegion.Union( rect );
595 m_clearRegion.Union( rect );
83df96d6 596 }
bc797f4c 597
7e085304 598 XFreeGC( xdisplay, xgc );
83df96d6
JS
599}
600
601// ---------------------------------------------------------------------------
602// drag and drop
603// ---------------------------------------------------------------------------
604
605#if wxUSE_DRAG_AND_DROP
606
bc797f4c 607void wxWindowX11::SetDropTarget(wxDropTarget * WXUNUSED(pDropTarget))
83df96d6
JS
608{
609 // TODO
610}
611
612#endif
613
614// Old style file-manager drag&drop
bc797f4c 615void wxWindowX11::DragAcceptFiles(bool WXUNUSED(accept))
83df96d6
JS
616{
617 // TODO
618}
619
620// ----------------------------------------------------------------------------
621// tooltips
622// ----------------------------------------------------------------------------
623
624#if wxUSE_TOOLTIPS
625
bc797f4c 626void wxWindowX11::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
83df96d6
JS
627{
628 // TODO
629}
630
631#endif // wxUSE_TOOLTIPS
632
83df96d6
JS
633// ---------------------------------------------------------------------------
634// moving and resizing
635// ---------------------------------------------------------------------------
636
bc797f4c 637bool wxWindowX11::PreResize()
83df96d6
JS
638{
639 return TRUE;
640}
641
642// Get total size
bc797f4c 643void wxWindowX11::DoGetSize(int *x, int *y) const
83df96d6 644{
86fd8bda
RR
645 Window xwindow = (Window) GetMainWindow();
646
647 wxCHECK_RET( xwindow, wxT("invalid window") );
648
59db9cfa 649 //XSync(wxGlobalDisplay(), False);
e941874b 650
86fd8bda
RR
651 XWindowAttributes attr;
652 Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
653 wxASSERT(status);
b513212d 654
86fd8bda
RR
655 if (status)
656 {
657 *x = attr.width /* + 2*m_borderSize */ ;
658 *y = attr.height /* + 2*m_borderSize */ ;
83df96d6 659 }
83df96d6
JS
660}
661
bc797f4c 662void wxWindowX11::DoGetPosition(int *x, int *y) const
83df96d6 663{
d02cb44e 664 Window window = (Window) m_mainWidget;
b513212d 665 if (window)
83df96d6 666 {
59db9cfa 667 //XSync(wxGlobalDisplay(), False);
b513212d
JS
668 XWindowAttributes attr;
669 Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr);
670 wxASSERT(status);
671
672 if (status)
673 {
674 *x = attr.x;
675 *y = attr.y;
676
677 // We may be faking the client origin. So a window that's really at (0, 30)
678 // may appear (to wxWin apps) to be at (0, 0).
679 if (GetParent())
680 {
681 wxPoint pt(GetParent()->GetClientAreaOrigin());
682 *x -= pt.x;
683 *y -= pt.y;
684 }
685 }
83df96d6 686 }
83df96d6
JS
687}
688
bc797f4c 689void wxWindowX11::DoScreenToClient(int *x, int *y) const
83df96d6 690{
b513212d 691 Display *display = wxGlobalDisplay();
bc797f4c 692 Window rootWindow = RootWindowOfScreen(DefaultScreenOfDisplay(display));
d02cb44e 693 Window thisWindow = (Window) m_mainWidget;
83df96d6
JS
694
695 Window childWindow;
696 int xx = *x;
697 int yy = *y;
698 XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
699}
700
bc797f4c 701void wxWindowX11::DoClientToScreen(int *x, int *y) const
83df96d6 702{
b513212d 703 Display *display = wxGlobalDisplay();
bc797f4c 704 Window rootWindow = RootWindowOfScreen(DefaultScreenOfDisplay(display));
d02cb44e 705 Window thisWindow = (Window) m_mainWidget;
83df96d6
JS
706
707 Window childWindow;
708 int xx = *x;
709 int yy = *y;
710 XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow);
711}
712
713
714// Get size *available for subwindows* i.e. excluding menu bar etc.
bc797f4c 715void wxWindowX11::DoGetClientSize(int *x, int *y) const
83df96d6 716{
d02cb44e 717 Window window = (Window) m_mainWidget;
b513212d
JS
718
719 if (window)
720 {
59db9cfa 721 //XSync(wxGlobalDisplay(), False); // Is this really a good idea?
b513212d 722 XWindowAttributes attr;
3cd0b8c5 723 Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr );
b513212d
JS
724 wxASSERT(status);
725
726 if (status)
727 {
728 *x = attr.width ;
729 *y = attr.height ;
730 }
731 }
83df96d6
JS
732}
733
bc797f4c 734void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
83df96d6 735{
27398643 736 Window xwindow = (Window) GetMainWindow();
83df96d6 737
27398643
RR
738 wxCHECK_RET( xwindow, wxT("invalid window") );
739
740 XWindowAttributes attr;
741 Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
742 wxCHECK_RET( status, wxT("invalid window attributes") );
743
744 int new_x = attr.x;
745 int new_y = attr.y;
746 int new_w = attr.width;
747 int new_h = attr.height;
748
b513212d
JS
749
750 if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
83df96d6 751 {
27398643 752 int yy = 0;
e5053ade 753 AdjustForParentClientOrigin( x, yy, sizeFlags);
27398643 754 new_x = x;
83df96d6 755 }
b513212d 756 if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
83df96d6 757 {
27398643 758 int xx = 0;
e5053ade 759 AdjustForParentClientOrigin( xx, y, sizeFlags);
27398643 760 new_y = y;
83df96d6 761 }
27398643 762 if (width != -1)
83df96d6 763 {
27398643
RR
764 new_w = width;
765 if (new_w <= 0)
766 new_w = 20;
83df96d6 767 }
27398643 768 if (height != -1)
b513212d 769 {
27398643
RR
770 new_h = height;
771 if (new_h <= 0)
772 new_h = 20;
b513212d 773 }
27398643
RR
774
775 DoMoveWindow( new_x, new_y, new_w, new_h );
83df96d6
JS
776}
777
bc797f4c 778void wxWindowX11::DoSetClientSize(int width, int height)
83df96d6 779{
27398643 780 Window xwindow = (Window) GetMainWindow();
83df96d6 781
27398643 782 wxCHECK_RET( xwindow, wxT("invalid window") );
83df96d6 783
21689736
JS
784 XWindowChanges windowChanges;
785 windowChanges.width = width;
786 windowChanges.height = height;
787 windowChanges.stack_mode = 0;
788 int valueMask = CWWidth | CWHeight;
789
790 XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges );
791#if 0
27398643
RR
792 XWindowAttributes attr;
793 Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
794 wxCHECK_RET( status, wxT("invalid window attributes") );
795
796 int new_x = attr.x;
797 int new_y = attr.y;
798 int new_w = attr.width;
799 int new_h = attr.height;
800
b513212d 801 if (width != -1)
27398643
RR
802 new_w = width;
803
b513212d 804 if (height != -1)
27398643
RR
805 new_h = height;
806
807 DoMoveWindow( new_x, new_y, new_w, new_h );
21689736 808#endif
83df96d6
JS
809}
810
811// For implementation purposes - sometimes decorations make the client area
812// smaller
bc797f4c 813wxPoint wxWindowX11::GetClientAreaOrigin() const
83df96d6
JS
814{
815 return wxPoint(0, 0);
816}
817
bc797f4c 818void wxWindowX11::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH)
83df96d6
JS
819{
820 m_minWidth = minW;
821 m_minHeight = minH;
822 m_maxWidth = maxW;
823 m_maxHeight = maxH;
824
461e93f9 825#if !wxUSE_NANOX
b513212d
JS
826 XSizeHints sizeHints;
827 sizeHints.flags = 0;
828
829 if (minW > -1 && minH > -1)
83df96d6 830 {
b513212d
JS
831 sizeHints.flags |= PMinSize;
832 sizeHints.min_width = minW;
833 sizeHints.min_height = minH;
834 }
835 if (maxW > -1 && maxH > -1)
836 {
837 sizeHints.flags |= PMaxSize;
838 sizeHints.max_width = maxW;
839 sizeHints.max_height = maxH;
840 }
841 if (incW > -1 && incH > -1)
842 {
843 sizeHints.flags |= PResizeInc;
844 sizeHints.width_inc = incW;
845 sizeHints.height_inc = incH;
83df96d6
JS
846 }
847
178572bb 848 XSetWMNormalHints(wxGlobalDisplay(), (Window) GetMainWindow(), & sizeHints);
461e93f9 849#endif
83df96d6
JS
850}
851
bc797f4c 852void wxWindowX11::DoMoveWindow(int x, int y, int width, int height)
83df96d6 853{
27398643
RR
854 Window xwindow = (Window) GetMainWindow();
855
856 wxCHECK_RET( xwindow, wxT("invalid window") );
857
858 XWindowChanges windowChanges;
859 windowChanges.x = x;
860 windowChanges.y = y;
861 windowChanges.width = width;
862 windowChanges.height = height;
863 windowChanges.stack_mode = 0;
864 int valueMask = CWX | CWY | CWWidth | CWHeight;
865
866 XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges );
83df96d6
JS
867}
868
869// ---------------------------------------------------------------------------
870// text metrics
871// ---------------------------------------------------------------------------
872
bc797f4c 873int wxWindowX11::GetCharHeight() const
83df96d6
JS
874{
875 wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
876
877 WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay());
878
879 int direction, ascent, descent;
880 XCharStruct overall;
881 XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
882 &descent, &overall);
883
884 // return (overall.ascent + overall.descent);
885 return (ascent + descent);
886}
887
bc797f4c 888int wxWindowX11::GetCharWidth() const
83df96d6
JS
889{
890 wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
891
892 WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay());
893
894 int direction, ascent, descent;
895 XCharStruct overall;
896 XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
897 &descent, &overall);
898
899 return overall.width;
900}
901
bc797f4c 902void wxWindowX11::GetTextExtent(const wxString& string,
83df96d6
JS
903 int *x, int *y,
904 int *descent, int *externalLeading,
905 const wxFont *theFont) const
906{
0d1dff01
RR
907 wxFont fontToUse = m_font;
908 if (theFont) fontToUse = *theFont;
83df96d6 909
0d1dff01
RR
910 wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") );
911
912 WXFontStructPtr pFontStruct = fontToUse.GetFontStruct(1.0, GetXDisplay());
83df96d6
JS
913
914 int direction, ascent, descent2;
915 XCharStruct overall;
916 int slen = string.Len();
917
918#if 0
919 if (use16)
920 XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction,
921 &ascent, &descent2, &overall);
922#endif
923
461e93f9 924 XTextExtents((XFontStruct*) pFontStruct, (char*) string.c_str(), slen,
83df96d6
JS
925 &direction, &ascent, &descent2, &overall);
926
927 if ( x )
928 *x = (overall.width);
929 if ( y )
930 *y = (ascent + descent2);
931 if (descent)
932 *descent = descent2;
933 if (externalLeading)
934 *externalLeading = 0;
935
936}
937
938// ----------------------------------------------------------------------------
939// painting
940// ----------------------------------------------------------------------------
941
bc797f4c 942void wxWindowX11::Refresh(bool eraseBack, const wxRect *rect)
83df96d6 943{
d02cb44e
RR
944 if (eraseBack)
945 {
946 if (rect)
947 {
948 // Schedule for later Updating in ::Update() or ::OnInternalIdle().
949 m_clearRegion.Union( rect->x, rect->y, rect->width, rect->height );
950 }
951 else
952 {
953 int height,width;
954 GetSize( &width, &height );
955
956 // Schedule for later Updating in ::Update() or ::OnInternalIdle().
957 m_clearRegion.Clear();
958 m_clearRegion.Union( 0, 0, width, height );
959 }
960 }
83df96d6 961
83df96d6
JS
962 if (rect)
963 {
d02cb44e
RR
964 // Schedule for later Updating in ::Update() or ::OnInternalIdle().
965 m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
83df96d6
JS
966 }
967 else
968 {
0d1dff01
RR
969 int height,width;
970 GetSize( &width, &height );
d02cb44e
RR
971
972 // Schedule for later Updating in ::Update() or ::OnInternalIdle().
973 m_updateRegion.Clear();
974 m_updateRegion.Union( 0, 0, width, height );
83df96d6 975 }
d02cb44e 976}
83df96d6 977
d02cb44e
RR
978void wxWindowX11::Update()
979{
980 if (!m_updateRegion.IsEmpty())
83df96d6 981 {
0b5c0e1a 982 // wxLogDebug("wxWindowX11::Update: %s", GetClassInfo()->GetClassName());
887dd52f
RR
983 // Actually send erase events.
984 SendEraseEvents();
985
986 // Actually send paint events.
987 SendPaintEvents();
83df96d6 988 }
83df96d6
JS
989}
990
bc797f4c 991void wxWindowX11::Clear()
83df96d6 992{
7266b672 993 wxClientDC dc((wxWindow*) this);
83df96d6
JS
994 wxBrush brush(GetBackgroundColour(), wxSOLID);
995 dc.SetBackground(brush);
996 dc.Clear();
997}
998
887dd52f 999void wxWindowX11::SendEraseEvents()
83df96d6 1000{
ba696cfa 1001 if (!m_clearRegion.IsEmpty())
83df96d6 1002 {
887dd52f
RR
1003 m_clipPaintRegion = TRUE;
1004
1934d291
RR
1005 wxWindowDC dc( (wxWindow*)this );
1006 dc.SetClippingRegion( m_clearRegion );
1007
1008 wxEraseEvent erase_event( GetId(), &dc );
1009 erase_event.SetEventObject( this );
0b5c0e1a 1010
1934d291
RR
1011 if (!GetEventHandler()->ProcessEvent(erase_event))
1012 {
ba696cfa
RR
1013 Window xwindow = (Window) GetMainWindow();
1014 Display *xdisplay = wxGlobalDisplay();
1015 GC xgc = XCreateGC( xdisplay, xwindow, 0, NULL );
1016 XSetFillStyle( xdisplay, xgc, FillSolid );
1017 XSetForeground( xdisplay, xgc, m_backgroundColour.GetPixel() );
1934d291
RR
1018 wxRegionIterator upd( m_clearRegion );
1019 while (upd)
1020 {
ba696cfa
RR
1021 XFillRectangle( xdisplay, xwindow, xgc,
1022 upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
1934d291
RR
1023 upd ++;
1024 }
8ac7c509 1025 XFreeGC( xdisplay, xgc );
1934d291
RR
1026 }
1027 m_clearRegion.Clear();
887dd52f
RR
1028
1029 m_clipPaintRegion = FALSE;
83df96d6 1030 }
887dd52f
RR
1031}
1032
1033
1034void wxWindowX11::SendPaintEvents()
1035{
1036 m_clipPaintRegion = TRUE;
83df96d6 1037
1180fb81
RR
1038 wxNcPaintEvent nc_paint_event( GetId() );
1039 nc_paint_event.SetEventObject( this );
1040 GetEventHandler()->ProcessEvent( nc_paint_event );
83df96d6 1041
1934d291
RR
1042 wxPaintEvent paint_event( GetId() );
1043 paint_event.SetEventObject( this );
1044 GetEventHandler()->ProcessEvent( paint_event );
0d1dff01 1045
0b5c0e1a 1046 m_updateRegion.Clear();
1934d291 1047 m_clipPaintRegion = FALSE;
83df96d6
JS
1048}
1049
1050// ----------------------------------------------------------------------------
1051// event handlers
1052// ----------------------------------------------------------------------------
1053
1054// Responds to colour changes: passes event on to children.
bc797f4c 1055void wxWindowX11::OnSysColourChanged(wxSysColourChangedEvent& event)
83df96d6
JS
1056{
1057 wxWindowList::Node *node = GetChildren().GetFirst();
1058 while ( node )
1059 {
1060 // Only propagate to non-top-level windows
1061 wxWindow *win = node->GetData();
1062 if ( win->GetParent() )
1063 {
1064 wxSysColourChangedEvent event2;
1065 event.m_eventObject = win;
1066 win->GetEventHandler()->ProcessEvent(event2);
1067 }
1068
1069 node = node->GetNext();
1070 }
1071}
1072
0d1dff01 1073void wxWindowX11::OnInternalIdle()
83df96d6 1074{
0d1dff01
RR
1075 // Update invalidated regions.
1076 Update();
1077
83df96d6
JS
1078 // This calls the UI-update mechanism (querying windows for
1079 // menu/toolbar/control state information)
1080 UpdateWindowUI();
3a0b23eb
JS
1081
1082 // Set the input focus if couldn't do it before
1083 if (m_needsInputFocus)
ff6b424a 1084 {
3a0b23eb 1085 SetFocus();
ff6b424a 1086 }
83df96d6
JS
1087}
1088
83df96d6
JS
1089// ----------------------------------------------------------------------------
1090// function which maintain the global hash table mapping Widgets to wxWindows
1091// ----------------------------------------------------------------------------
1092
bc797f4c 1093bool wxAddWindowToTable(Window w, wxWindow *win)
83df96d6
JS
1094{
1095 wxWindow *oldItem = NULL;
1096 if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
1097 {
1098 wxLogDebug("Widget table clash: new widget is %ld, %s",
1099 (long)w, win->GetClassInfo()->GetClassName());
1100 return FALSE;
1101 }
1102
1103 wxWidgetHashTable->Put((long) w, win);
1104
bc797f4c 1105 wxLogTrace("widget", "XWindow 0x%08x <-> window %p (%s)",
83df96d6
JS
1106 w, win, win->GetClassInfo()->GetClassName());
1107
1108 return TRUE;
1109}
1110
bc797f4c 1111wxWindow *wxGetWindowFromTable(Window w)
83df96d6
JS
1112{
1113 return (wxWindow *)wxWidgetHashTable->Get((long) w);
1114}
1115
bc797f4c 1116void wxDeleteWindowFromTable(Window w)
83df96d6
JS
1117{
1118 wxWidgetHashTable->Delete((long)w);
1119}
1120
1121// ----------------------------------------------------------------------------
1122// add/remove window from the table
1123// ----------------------------------------------------------------------------
1124
83df96d6 1125// ----------------------------------------------------------------------------
bc797f4c 1126// X11-specific accessors
83df96d6
JS
1127// ----------------------------------------------------------------------------
1128
1129// Get the underlying X window
bc797f4c 1130WXWindow wxWindowX11::GetXWindow() const
83df96d6 1131{
bc797f4c 1132 return GetMainWindow();
83df96d6
JS
1133}
1134
1135// Get the underlying X display
bc797f4c 1136WXDisplay *wxWindowX11::GetXDisplay() const
83df96d6 1137{
bc797f4c 1138 return wxGetDisplay();
83df96d6
JS
1139}
1140
bc797f4c 1141WXWindow wxWindowX11::GetMainWindow() const
83df96d6 1142{
d02cb44e 1143 return m_mainWidget;
83df96d6
JS
1144}
1145
83df96d6
JS
1146// ----------------------------------------------------------------------------
1147// TranslateXXXEvent() functions
1148// ----------------------------------------------------------------------------
1149
1b0fb34b 1150bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Window window, XEvent *xevent)
83df96d6 1151{
461e93f9 1152 switch (XEventGetType(xevent))
83df96d6 1153 {
1b0fb34b
JS
1154 case EnterNotify:
1155 case LeaveNotify:
83df96d6
JS
1156 case ButtonPress:
1157 case ButtonRelease:
1158 case MotionNotify:
1159 {
1160 wxEventType eventType = wxEVT_NULL;
1161
461e93f9 1162 if (XEventGetType(xevent) == EnterNotify)
83df96d6 1163 {
1b0fb34b
JS
1164 //if (local_event.xcrossing.mode!=NotifyNormal)
1165 // return ; // Ignore grab events
1166 eventType = wxEVT_ENTER_WINDOW;
1167 // canvas->GetEventHandler()->OnSetFocus();
1168 }
461e93f9 1169 else if (XEventGetType(xevent) == LeaveNotify)
1b0fb34b
JS
1170 {
1171 //if (local_event.xcrossingr.mode!=NotifyNormal)
1172 // return ; // Ignore grab events
1173 eventType = wxEVT_LEAVE_WINDOW;
1174 // canvas->GetEventHandler()->OnKillFocus();
83df96d6 1175 }
461e93f9 1176 else if (XEventGetType(xevent) == MotionNotify)
83df96d6
JS
1177 {
1178 eventType = wxEVT_MOTION;
1179 }
461e93f9 1180 else if (XEventGetType(xevent) == ButtonPress)
83df96d6 1181 {
461e93f9 1182 wxevent.SetTimestamp(XButtonEventGetTime(xevent));
83df96d6 1183 int button = 0;
461e93f9 1184 if (XButtonEventLChanged(xevent))
83df96d6
JS
1185 {
1186 eventType = wxEVT_LEFT_DOWN;
83df96d6
JS
1187 button = 1;
1188 }
461e93f9 1189 else if (XButtonEventMChanged(xevent))
83df96d6
JS
1190 {
1191 eventType = wxEVT_MIDDLE_DOWN;
83df96d6
JS
1192 button = 2;
1193 }
461e93f9 1194 else if (XButtonEventRChanged(xevent))
83df96d6
JS
1195 {
1196 eventType = wxEVT_RIGHT_DOWN;
83df96d6
JS
1197 button = 3;
1198 }
1199
1200 // check for a double click
1b0fb34b 1201 // TODO: where can we get this value from?
b513212d 1202 //long dclickTime = XtGetMultiClickTime(wxGlobalDisplay());
7266b672 1203 long dclickTime = 200;
83df96d6
JS
1204 long ts = wxevent.GetTimestamp();
1205
1206 int buttonLast = win->GetLastClickedButton();
1207 long lastTS = win->GetLastClickTime();
1208 if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime )
1209 {
1210 // I have a dclick
1211 win->SetLastClick(0, ts);
1212 if ( eventType == wxEVT_LEFT_DOWN )
1213 eventType = wxEVT_LEFT_DCLICK;
1214 else if ( eventType == wxEVT_MIDDLE_DOWN )
1215 eventType = wxEVT_MIDDLE_DCLICK;
1216 else if ( eventType == wxEVT_RIGHT_DOWN )
1217 eventType = wxEVT_RIGHT_DCLICK;
1218 }
1219 else
1220 {
1221 // not fast enough or different button
1222 win->SetLastClick(button, ts);
1223 }
1224 }
461e93f9 1225 else if (XEventGetType(xevent) == ButtonRelease)
83df96d6 1226 {
461e93f9 1227 if (XButtonEventLChanged(xevent))
83df96d6
JS
1228 {
1229 eventType = wxEVT_LEFT_UP;
83df96d6 1230 }
461e93f9 1231 else if (XButtonEventMChanged(xevent))
83df96d6
JS
1232 {
1233 eventType = wxEVT_MIDDLE_UP;
83df96d6 1234 }
461e93f9 1235 else if (XButtonEventRChanged(xevent))
83df96d6
JS
1236 {
1237 eventType = wxEVT_RIGHT_UP;
83df96d6
JS
1238 }
1239 else return FALSE;
1240 }
1241 else
1242 {
1243 return FALSE;
1244 }
1245
1246 wxevent.SetEventType(eventType);
1247
461e93f9
JS
1248 wxevent.m_x = XButtonEventGetX(xevent);
1249 wxevent.m_y = XButtonEventGetY(xevent);
83df96d6
JS
1250
1251 wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN)
461e93f9 1252 || (XButtonEventLIsDown(xevent)
83df96d6
JS
1253 && (eventType != wxEVT_LEFT_UP)));
1254 wxevent.m_middleDown = ((eventType == wxEVT_MIDDLE_DOWN)
461e93f9 1255 || (XButtonEventMIsDown(xevent)
83df96d6
JS
1256 && (eventType != wxEVT_MIDDLE_UP)));
1257 wxevent.m_rightDown = ((eventType == wxEVT_RIGHT_DOWN)
461e93f9 1258 || (XButtonEventRIsDown (xevent)
83df96d6
JS
1259 && (eventType != wxEVT_RIGHT_UP)));
1260
461e93f9
JS
1261 wxevent.m_shiftDown = XButtonEventShiftIsDown(xevent);
1262 wxevent.m_controlDown = XButtonEventCtrlIsDown(xevent);
1263 wxevent.m_altDown = XButtonEventAltIsDown(xevent);
1264 wxevent.m_metaDown = XButtonEventMetaIsDown(xevent);
83df96d6
JS
1265
1266 wxevent.SetId(win->GetId());
1267 wxevent.SetEventObject(win);
1268
1269 return TRUE;
1270 }
1271 }
1272 return FALSE;
1273}
1274
7eaac9f5 1275bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Window WXUNUSED(win), XEvent *xevent)
83df96d6 1276{
461e93f9 1277 switch (XEventGetType(xevent))
83df96d6
JS
1278 {
1279 case KeyPress:
1280 case KeyRelease:
1281 {
1282 char buf[20];
1283
1284 KeySym keySym;
83df96d6
JS
1285 (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, NULL);
1286 int id = wxCharCodeXToWX (keySym);
1287
461e93f9
JS
1288 wxevent.m_shiftDown = XKeyEventShiftIsDown(xevent);
1289 wxevent.m_controlDown = XKeyEventCtrlIsDown(xevent);
1290 wxevent.m_altDown = XKeyEventAltIsDown(xevent);
1291 wxevent.m_metaDown = XKeyEventMetaIsDown(xevent);
83df96d6
JS
1292 wxevent.SetEventObject(win);
1293 wxevent.m_keyCode = id;
461e93f9 1294 wxevent.SetTimestamp(XKeyEventGetTime(xevent));
83df96d6 1295
461e93f9
JS
1296 wxevent.m_x = XKeyEventGetX(xevent);
1297 wxevent.m_y = XKeyEventGetY(xevent);
83df96d6
JS
1298
1299 if (id > -1)
1300 return TRUE;
1301 else
1302 return FALSE;
1303 break;
1304 }
1305 default:
1306 break;
1307 }
1308 return FALSE;
1309}
1310
1311// ----------------------------------------------------------------------------
1312// Colour stuff
1313// ----------------------------------------------------------------------------
1314
bc797f4c 1315bool wxWindowX11::SetBackgroundColour(const wxColour& col)
83df96d6 1316{
56cb684a 1317 wxWindowBase::SetBackgroundColour(col);
83df96d6 1318
3cd0b8c5
RR
1319 Display *xdisplay = (Display*) wxGlobalDisplay();
1320 int xscreen = DefaultScreen( xdisplay );
1321 Colormap cm = DefaultColormap( xdisplay, xscreen );
1322
ba696cfa 1323 m_backgroundColour.CalcPixel( (WXColormap) cm );
3cd0b8c5 1324
ba696cfa
RR
1325 if (!GetMainWindow())
1326 return FALSE;
1327
1328/*
b28d3abf 1329 XSetWindowAttributes attrib;
3cd0b8c5 1330 attrib.background_pixel = colour.GetPixel();
b28d3abf
JS
1331
1332 XChangeWindowAttributes(wxGlobalDisplay(),
1333 (Window) GetMainWindow(),
1334 CWBackPixel,
1335 & attrib);
ba696cfa 1336*/
b28d3abf 1337
83df96d6
JS
1338 return TRUE;
1339}
1340
bc797f4c 1341bool wxWindowX11::SetForegroundColour(const wxColour& col)
83df96d6
JS
1342{
1343 if ( !wxWindowBase::SetForegroundColour(col) )
1344 return FALSE;
1345
83df96d6
JS
1346 return TRUE;
1347}
1348
83df96d6
JS
1349// ----------------------------------------------------------------------------
1350// global functions
1351// ----------------------------------------------------------------------------
1352
1353wxWindow *wxGetActiveWindow()
1354{
1355 // TODO
1356 wxFAIL_MSG("Not implemented");
1357 return NULL;
1358}
1359
1360/* static */
1361wxWindow *wxWindowBase::GetCapture()
1362{
1363 return (wxWindow *)g_captureWindow;
1364}
1365
1366
1367// Find the wxWindow at the current mouse position, returning the mouse
1368// position.
1369wxWindow* wxFindWindowAtPointer(wxPoint& pt)
1370{
1371 return wxFindWindowAtPoint(wxGetMousePosition());
1372}
1373
1374// Get the current mouse position.
1375wxPoint wxGetMousePosition()
1376{
461e93f9
JS
1377#if wxUSE_NANOX
1378 /* TODO */
1379 return wxPoint(0, 0);
1380#else
b513212d 1381 Display *display = wxGlobalDisplay();
83df96d6
JS
1382 Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display));
1383 Window rootReturn, childReturn;
1384 int rootX, rootY, winX, winY;
1385 unsigned int maskReturn;
1386
1387 XQueryPointer (display,
1388 rootWindow,
1389 &rootReturn,
1390 &childReturn,
1391 &rootX, &rootY, &winX, &winY, &maskReturn);
1392 return wxPoint(rootX, rootY);
461e93f9 1393#endif
83df96d6
JS
1394}
1395
1396
1397// ----------------------------------------------------------------------------
1398// wxNoOptimize: switch off size optimization
1399// ----------------------------------------------------------------------------
1400
1401int wxNoOptimize::ms_count = 0;
1402