1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
11 #pragma implementation "dcscreen.h"
14 #include "wx/dcscreen.h"
15 #include "wx/window.h"
17 //-----------------------------------------------------------------------------
18 // global data initialization
19 //-----------------------------------------------------------------------------
21 GdkWindow
*wxScreenDC::sm_overlayWindow
= (GdkWindow
*) NULL
;
22 int wxScreenDC::sm_overlayWindowX
= 0;
23 int wxScreenDC::sm_overlayWindowY
= 0;
26 //-----------------------------------------------------------------------------
28 //-----------------------------------------------------------------------------
33 #include "gdk/gdkprivate.h"
35 #include <netinet/in.h>
37 int my_nevent_masks
= 17;
38 int my_event_masks_table
[19] =
42 PointerMotionHintMask
,
47 ButtonPressMask
| OwnerGrabButtonMask
,
48 ButtonReleaseMask
| OwnerGrabButtonMask
,
62 gdk_window_transparent_new ( GdkWindow
*parent
,
63 GdkWindowAttr
*attributes
,
67 GdkWindowPrivate
*gprivate
;
68 GdkWindowPrivate
*parent_private
;
70 Display
*parent_display
;
73 XSetWindowAttributes xattributes
;
74 long xattributes_mask
;
75 XSizeHints size_hints
;
77 XClassHint
*class_hint
;
83 g_return_val_if_fail (attributes
!= NULL
, NULL
);
86 parent
= (GdkWindow
*) &gdk_root_parent
;
88 parent_private
= (GdkWindowPrivate
*) parent
;
89 if (parent_private
->destroyed
)
92 xparent
= parent_private
->xwindow
;
93 parent_display
= parent_private
->xdisplay
;
95 gprivate
= g_new (GdkWindowPrivate
, 1);
96 window
= (GdkWindow
*) gprivate
;
98 gprivate
->parent
= parent
;
100 if (parent_private
!= &gdk_root_parent
)
101 parent_private
->children
= g_list_prepend (parent_private
->children
, window
);
103 gprivate
->xdisplay
= parent_display
;
104 gprivate
->destroyed
= FALSE
;
105 gprivate
->resize_count
= 0;
106 gprivate
->ref_count
= 1;
107 xattributes_mask
= 0;
109 if (attributes_mask
& GDK_WA_X
)
114 if (attributes_mask
& GDK_WA_Y
)
121 gprivate
->width
= (attributes
->width
> 1) ? (attributes
->width
) : (1);
122 gprivate
->height
= (attributes
->height
> 1) ? (attributes
->height
) : (1);
123 gprivate
->window_type
= attributes
->window_type
;
124 gprivate
->extension_events
= FALSE
;
126 #ifndef NEW_GTK_DND_CODE
127 gprivate
->dnd_drag_data_type
= None
;
128 gprivate
->dnd_drag_data_typesavail
=
129 gprivate
->dnd_drop_data_typesavail
= NULL
;
130 gprivate
->dnd_drop_enabled
= gprivate
->dnd_drag_enabled
=
131 gprivate
->dnd_drag_accepted
= gprivate
->dnd_drag_datashow
=
132 gprivate
->dnd_drop_data_numtypesavail
=
133 gprivate
->dnd_drag_data_numtypesavail
= 0;
134 gprivate
->dnd_drag_eventmask
= gprivate
->dnd_drag_savedeventmask
= 0;
137 gprivate
->filters
= NULL
;
138 gprivate
->children
= NULL
;
140 window
->user_data
= NULL
;
142 if (attributes_mask
& GDK_WA_VISUAL
)
143 visual
= attributes
->visual
;
145 visual
= gdk_visual_get_system ();
146 xvisual
= ((GdkVisualPrivate
*) visual
)->xvisual
;
148 xattributes
.event_mask
= StructureNotifyMask
;
149 for (i
= 0; i
< my_nevent_masks
; i
++)
151 if (attributes
->event_mask
& (1 << (i
+ 1)))
152 xattributes
.event_mask
|= my_event_masks_table
[i
];
155 if (xattributes
.event_mask
)
156 xattributes_mask
|= CWEventMask
;
158 if(attributes_mask
& GDK_WA_NOREDIR
) {
159 xattributes
.override_redirect
=
160 (attributes
->override_redirect
== FALSE
)?False
:True
;
161 xattributes_mask
|= CWOverrideRedirect
;
163 xattributes
.override_redirect
= False
;
165 gclass
= InputOutput
;
166 depth
= visual
->depth
;
168 if (attributes_mask
& GDK_WA_COLORMAP
)
169 gprivate
->colormap
= attributes
->colormap
;
171 gprivate
->colormap
= gdk_colormap_get_system ();
173 xattributes
.colormap
= ((GdkColormapPrivate
*) gprivate
->colormap
)->xcolormap
;
174 xattributes_mask
|= CWColormap
;
176 xparent
= gdk_root_window
;
178 xattributes
.save_under
= True
;
179 xattributes
.override_redirect
= True
;
180 xattributes
.cursor
= None
;
181 xattributes_mask
|= CWSaveUnder
| CWOverrideRedirect
;
183 gprivate
->xwindow
= XCreateWindow (gprivate
->xdisplay
, xparent
,
184 x
, y
, gprivate
->width
, gprivate
->height
,
185 0, depth
, gclass
, xvisual
,
186 xattributes_mask
, &xattributes
);
187 gdk_window_ref (window
);
188 gdk_xid_table_insert (&gprivate
->xwindow
, window
);
190 if (gprivate
->colormap
)
191 gdk_colormap_ref (gprivate
->colormap
);
193 XSetWMProtocols (gprivate
->xdisplay
, gprivate
->xwindow
, gdk_wm_window_protocols
, 2);
195 size_hints
.flags
= PSize
;
196 size_hints
.width
= gprivate
->width
;
197 size_hints
.height
= gprivate
->height
;
199 wm_hints
.flags
= InputHint
| StateHint
| WindowGroupHint
;
200 wm_hints
.window_group
= gdk_leader_window
;
201 wm_hints
.input
= True
;
202 wm_hints
.initial_state
= NormalState
;
204 /* FIXME: Is there any point in doing this? Do any WM's pay
205 * attention to PSize, and even if they do, is this the
208 XSetWMNormalHints (gprivate
->xdisplay
, gprivate
->xwindow
, &size_hints
);
210 XSetWMHints (gprivate
->xdisplay
, gprivate
->xwindow
, &wm_hints
);
212 if (attributes_mask
& GDK_WA_TITLE
)
213 title
= attributes
->title
;
215 #if (GTK_MINOR_VERSION == 1)
216 title
= "Unknown"; // GLH: Well I don't know for the moment what to write here.
218 title
= gdk_progname
;
221 XmbSetWMProperties (gprivate
->xdisplay
, gprivate
->xwindow
,
226 if (attributes_mask
& GDK_WA_WMCLASS
)
228 class_hint
= XAllocClassHint ();
229 class_hint
->res_name
= attributes
->wmclass_name
;
230 class_hint
->res_class
= attributes
->wmclass_class
;
231 XSetClassHint (gprivate
->xdisplay
, gprivate
->xwindow
, class_hint
);
240 //-----------------------------------------------------------------------------
242 //-----------------------------------------------------------------------------
244 IMPLEMENT_DYNAMIC_CLASS(wxScreenDC
,wxPaintDC
)
246 wxScreenDC::wxScreenDC(void)
249 m_window
= (GdkWindow
*) NULL
;
250 m_cmap
= gdk_colormap_get_system();
252 if (sm_overlayWindow
)
254 m_window
= sm_overlayWindow
;
255 m_deviceOriginX
= - sm_overlayWindowX
;
256 m_deviceOriginY
= - sm_overlayWindowY
;
259 m_window
= GDK_ROOT_PARENT();
263 gdk_gc_set_subwindow( m_penGC
, GDK_INCLUDE_INFERIORS
);
264 gdk_gc_set_subwindow( m_brushGC
, GDK_INCLUDE_INFERIORS
);
265 gdk_gc_set_subwindow( m_textGC
, GDK_INCLUDE_INFERIORS
);
266 gdk_gc_set_subwindow( m_bgGC
, GDK_INCLUDE_INFERIORS
);
269 wxScreenDC::~wxScreenDC(void)
274 bool wxScreenDC::StartDrawingOnTop( wxWindow
*window
)
276 if (!window
) return StartDrawingOnTop();
280 window
->GetPosition( &x
, &y
);
283 window
->GetSize( &w
, &h
);
284 window
->ClientToScreen( &x
, &y
);
292 return StartDrawingOnTop( &rect
);
295 bool wxScreenDC::StartDrawingOnTop( wxRectangle
*rect
)
299 int width
= gdk_screen_width();
300 int height
= gdk_screen_height();
306 height
= rect
->height
;
309 sm_overlayWindowX
= x
;
310 sm_overlayWindowY
= y
;
316 attr
.height
= height
;
317 attr
.override_redirect
= TRUE
;
318 attr
.wclass
= GDK_INPUT_OUTPUT
;
320 attr
.window_type
= GDK_WINDOW_TEMP
;
322 // GTK cannot set transparent backgrounds. :-(
323 sm_overlayWindow
= gdk_window_transparent_new( NULL
, &attr
, GDK_WA_NOREDIR
| GDK_WA_X
| GDK_WA_Y
);
325 if (sm_overlayWindow
) gdk_window_show( sm_overlayWindow
);
327 return (sm_overlayWindow
);
330 bool wxScreenDC::EndDrawingOnTop(void)
332 if (sm_overlayWindow
) gdk_window_destroy( sm_overlayWindow
);
334 sm_overlayWindow
= NULL
;
335 sm_overlayWindowX
= 0;
336 sm_overlayWindowY
= 0;