Clean-up, speed-up and bug-fix for wxListCtrl drawing,
Removed overlay things from wxScreenDC, Added test for bitmaps clipping with regions. Updates to changes.txt git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6424 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,13 +1,29 @@
|
|||||||
|
12th March '2000: wxWindows 2.1.14 released
|
||||||
|
|
||||||
20th February '2000: wxWindows 2.1.14 released
|
Added wxDragImage class for dragging easily images.
|
||||||
|
|
||||||
Minor changes to socket code.
|
The DEB and RPM packages now conform better to various
|
||||||
|
standards.
|
||||||
|
|
||||||
|
Renamed wx-config to wxgtk-config so that motif can be co-installed
|
||||||
|
on the same machine (with wxmotif-config).
|
||||||
|
|
||||||
|
Speed up for drawing by resuing once created DCs instead of
|
||||||
|
creating and destroying them all the time.
|
||||||
|
|
||||||
|
Corrections to clipping region code (among others related to
|
||||||
|
simultaneous bitmap clipping).
|
||||||
|
|
||||||
|
A few more improvements to tab traversal.
|
||||||
|
|
||||||
|
A number of changes to socket code.
|
||||||
|
|
||||||
Added code for rotating images.
|
Added code for rotating images.
|
||||||
|
|
||||||
Much work on the new grid class has been done.
|
Much work on the new grid class has been done. Very cool now.
|
||||||
|
|
||||||
wxPlotWindow is now useful and works.
|
wxPlotWindow is now useful and works. Added on-off lines useful for
|
||||||
|
displaying trigger signals.
|
||||||
|
|
||||||
Corrected one more bug in the TIFF handler.
|
Corrected one more bug in the TIFF handler.
|
||||||
|
|
||||||
@@ -20,7 +36,8 @@ Added default keyboard handling to wxScrolledWindow.
|
|||||||
Fixed slightly overoptimized window colour and style handling.
|
Fixed slightly overoptimized window colour and style handling.
|
||||||
This will expose a bug in the GtkPixmap theme, or more exactly
|
This will expose a bug in the GtkPixmap theme, or more exactly
|
||||||
in ImLib's image cashing so that wxGTK currently doesn't work
|
in ImLib's image cashing so that wxGTK currently doesn't work
|
||||||
well with pixamp themes.
|
well with pixmap themes. As a result, wxGTK will disable all
|
||||||
|
widget settings when using this theme.
|
||||||
|
|
||||||
Fixed bug in drawing code that made GTK pick the wrong pen
|
Fixed bug in drawing code that made GTK pick the wrong pen
|
||||||
style when using the default.
|
style when using the default.
|
||||||
|
@@ -581,14 +581,11 @@ void MyCanvas::DrawDefault(wxDC& dc)
|
|||||||
dc.FloodFill(0, 0, wxColour(255, 0, 0));
|
dc.FloodFill(0, 0, wxColour(255, 0, 0));
|
||||||
#endif //
|
#endif //
|
||||||
|
|
||||||
dc.DrawIcon( wxICON(mondrian), 40, 40 );
|
|
||||||
|
|
||||||
dc.DrawCheckMark(5, 80, 15, 15);
|
dc.DrawCheckMark(5, 80, 15, 15);
|
||||||
dc.DrawCheckMark(25, 80, 30, 30);
|
dc.DrawCheckMark(25, 80, 30, 30);
|
||||||
dc.DrawCheckMark(60, 80, 60, 60);
|
dc.DrawCheckMark(60, 80, 60, 60);
|
||||||
|
|
||||||
// this is the test for "blitting bitmap into DC damages selected brush" bug
|
// this is the test for "blitting bitmap into DC damages selected brush" bug
|
||||||
wxIcon m_std_icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
|
|
||||||
wxCoord rectSize = m_std_icon.GetWidth() + 10;
|
wxCoord rectSize = m_std_icon.GetWidth() + 10;
|
||||||
wxCoord x = 100;
|
wxCoord x = 100;
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
@@ -911,6 +908,14 @@ void MyCanvas::DrawRegions(wxDC& dc)
|
|||||||
|
|
||||||
dc.SetBrush( *wxGREY_BRUSH );
|
dc.SetBrush( *wxGREY_BRUSH );
|
||||||
dc.DrawRectangle( 10,10,310,310 );
|
dc.DrawRectangle( 10,10,310,310 );
|
||||||
|
|
||||||
|
if (m_smile_bmp.Ok())
|
||||||
|
{
|
||||||
|
dc.DrawBitmap( m_smile_bmp, 140, 20, TRUE );
|
||||||
|
dc.DrawBitmap( m_smile_bmp, 140, 290, TRUE );
|
||||||
|
dc.DrawBitmap( m_smile_bmp, 110, 80, TRUE );
|
||||||
|
dc.DrawBitmap( m_smile_bmp, 210, 80, TRUE );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event))
|
void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event))
|
||||||
|
@@ -620,15 +620,42 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
|
|||||||
case wxLC_ICON:
|
case wxLC_ICON:
|
||||||
{
|
{
|
||||||
m_bound_all.width = m_spacing;
|
m_bound_all.width = m_spacing;
|
||||||
m_bound_all.height = m_spacing+13;
|
|
||||||
wxNode *node = m_items.First();
|
wxNode *node = m_items.First();
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
wxListItemData *item = (wxListItemData*)node->Data();
|
||||||
wxString s = item->GetText();
|
wxString s = item->GetText();
|
||||||
|
if (s.IsEmpty()) s = wxT("H");
|
||||||
wxCoord lw,lh;
|
wxCoord lw,lh;
|
||||||
dc->GetTextExtent( s, &lw, &lh );
|
dc->GetTextExtent( s, &lw, &lh );
|
||||||
|
if (lh < 15) lh = 15;
|
||||||
|
lw += 4;
|
||||||
|
lh += 3;
|
||||||
|
|
||||||
|
m_bound_all.height = m_spacing+lh;
|
||||||
if (lw > m_spacing) m_bound_all.width = lw;
|
if (lw > m_spacing) m_bound_all.width = lw;
|
||||||
|
m_bound_label.width = lw;
|
||||||
|
m_bound_label.height = lh;
|
||||||
|
|
||||||
|
if (item->HasImage())
|
||||||
|
{
|
||||||
|
int w = 0;
|
||||||
|
int h = 0;
|
||||||
|
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||||
|
m_bound_icon.width = w + 8;
|
||||||
|
m_bound_icon.height = h + 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!item->HasText())
|
||||||
|
{
|
||||||
|
m_bound_hilight.width = m_bound_icon.width;
|
||||||
|
m_bound_hilight.height = m_bound_icon.height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_bound_hilight.width = m_bound_label.width;
|
||||||
|
m_bound_hilight.height = m_bound_label.height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -638,24 +665,34 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
|
|||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
wxListItemData *item = (wxListItemData*)node->Data();
|
||||||
|
|
||||||
wxString s = item->GetText();
|
wxString s = item->GetText();
|
||||||
|
if (s.IsEmpty()) s = wxT("H");
|
||||||
wxCoord lw,lh;
|
wxCoord lw,lh;
|
||||||
dc->GetTextExtent( s, &lw, &lh );
|
dc->GetTextExtent( s, &lw, &lh );
|
||||||
|
if (lh < 15) lh = 15;
|
||||||
|
lw += 4;
|
||||||
|
lh += 3;
|
||||||
|
m_bound_label.width = lw;
|
||||||
|
m_bound_label.height = lh;
|
||||||
|
|
||||||
m_bound_all.width = lw;
|
m_bound_all.width = lw;
|
||||||
m_bound_all.height = lh;
|
m_bound_all.height = lh;
|
||||||
|
|
||||||
if (item->HasImage())
|
if (item->HasImage())
|
||||||
{
|
{
|
||||||
#ifdef __WIN16__
|
|
||||||
int w = 0;
|
int w = 0;
|
||||||
int h = 0;
|
int h = 0;
|
||||||
#else
|
|
||||||
wxCoord w = 0;
|
|
||||||
wxCoord h = 0;
|
|
||||||
#endif
|
|
||||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||||
|
m_bound_icon.width = w;
|
||||||
|
m_bound_icon.height = h;
|
||||||
|
|
||||||
m_bound_all.width += 4 + w;
|
m_bound_all.width += 4 + w;
|
||||||
if (h > m_bound_all.height) m_bound_all.height = h;
|
if (h > m_bound_all.height) m_bound_all.height = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_bound_hilight.width = m_bound_all.width;
|
||||||
|
m_bound_hilight.height = m_bound_all.height;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -667,12 +704,14 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
wxListItemData *item = (wxListItemData*)node->Data();
|
||||||
wxString s;
|
wxString s = item->GetText();
|
||||||
item->GetText( s );
|
if (s.IsEmpty()) s = wxT("H");
|
||||||
if (s.IsNull()) s = "H";
|
|
||||||
wxCoord lw,lh;
|
wxCoord lw,lh;
|
||||||
dc->GetTextExtent( s, &lw, &lh );
|
dc->GetTextExtent( s, &lw, &lh );
|
||||||
if (lh < 15) lh = 15;
|
if (lh < 15) lh = 15;
|
||||||
|
lw += 4;
|
||||||
|
lh += 3;
|
||||||
|
|
||||||
item->SetSize( item->GetWidth(), lh );
|
item->SetSize( item->GetWidth(), lh );
|
||||||
m_bound_all.width += lw;
|
m_bound_all.width += lw;
|
||||||
m_bound_all.height = lh;
|
m_bound_all.height = lh;
|
||||||
@@ -691,63 +730,38 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
|
|||||||
{
|
{
|
||||||
case wxLC_ICON:
|
case wxLC_ICON:
|
||||||
{
|
{
|
||||||
AssignRect( m_bound_icon, 0, 0, 0, 0 );
|
|
||||||
AssignRect( m_bound_label, 0, 0, 0, 0 );
|
|
||||||
AssignRect( m_bound_hilight, m_bound_all );
|
|
||||||
wxNode *node = m_items.First();
|
wxNode *node = m_items.First();
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
wxListItemData *item = (wxListItemData*)node->Data();
|
||||||
if (item->HasImage())
|
if (item->HasImage())
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
m_bound_icon.x = m_bound_all.x + 4 + (m_spacing/2) - (m_bound_icon.width/2);
|
||||||
int w = 0;
|
m_bound_icon.y = m_bound_all.y + 4;
|
||||||
int h = 0;
|
|
||||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
|
||||||
m_bound_icon.x = m_bound_all.x + (m_spacing/2) - (w/2);
|
|
||||||
m_bound_icon.y = m_bound_all.y + m_spacing - h - 5;
|
|
||||||
m_bound_icon.width = w;
|
|
||||||
m_bound_icon.height = h;
|
|
||||||
if (!item->HasText())
|
|
||||||
{
|
|
||||||
AssignRect( m_bound_hilight, m_bound_icon );
|
|
||||||
m_bound_hilight.x -= 5;
|
|
||||||
m_bound_hilight.y -= 5;
|
|
||||||
m_bound_hilight.width += 9;
|
|
||||||
m_bound_hilight.height += 9;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (item->HasText())
|
if (item->HasText())
|
||||||
{
|
{
|
||||||
wxString s;
|
|
||||||
item->GetText( s );
|
|
||||||
wxCoord lw,lh;
|
|
||||||
dc->GetTextExtent( s, &lw, &lh );
|
|
||||||
if (m_bound_all.width > m_spacing)
|
if (m_bound_all.width > m_spacing)
|
||||||
m_bound_label.x = m_bound_all.x;
|
m_bound_label.x = m_bound_all.x + 2;
|
||||||
else
|
else
|
||||||
m_bound_label.x = m_bound_all.x + (m_spacing/2) - lw/2;
|
m_bound_label.x = m_bound_all.x + 2 + (m_spacing/2) - (m_bound_label.width/2);
|
||||||
m_bound_label.y = m_bound_all.y + m_bound_all.height - lh;
|
m_bound_label.y = m_bound_all.y + m_bound_all.height + 2 - m_bound_label.height;
|
||||||
m_bound_label.width = lw;
|
m_bound_hilight.x = m_bound_label.x - 2;
|
||||||
m_bound_label.height = lh;
|
m_bound_hilight.y = m_bound_label.y - 2;
|
||||||
AssignRect( m_bound_hilight, m_bound_label );
|
}
|
||||||
m_bound_hilight.x -= 2;
|
else
|
||||||
m_bound_hilight.y -= 2;
|
{
|
||||||
m_bound_hilight.width += 4;
|
m_bound_hilight.x = m_bound_icon.x - 4;
|
||||||
m_bound_hilight.height += 4;
|
m_bound_hilight.y = m_bound_icon.y - 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wxLC_LIST:
|
case wxLC_LIST:
|
||||||
{
|
{
|
||||||
AssignRect( m_bound_label, m_bound_all );
|
m_bound_hilight.x = m_bound_all.x;
|
||||||
m_bound_all.x -= 2;
|
m_bound_hilight.y = m_bound_all.y;
|
||||||
m_bound_all.y -= 2;
|
m_bound_label.y = m_bound_all.y + 2;
|
||||||
m_bound_all.width += 4;
|
|
||||||
m_bound_all.height += 3;
|
|
||||||
AssignRect( m_bound_hilight, m_bound_all );
|
|
||||||
AssignRect( m_bound_icon, 0, 0, 0, 0 );
|
|
||||||
wxNode *node = m_items.First();
|
wxNode *node = m_items.First();
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
@@ -756,51 +770,31 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
|
|||||||
{
|
{
|
||||||
m_bound_icon.x = m_bound_all.x + 2;
|
m_bound_icon.x = m_bound_all.x + 2;
|
||||||
m_bound_icon.y = m_bound_all.y + 2;
|
m_bound_icon.y = m_bound_all.y + 2;
|
||||||
int w;
|
m_bound_label.x = m_bound_all.x + 6 + m_bound_icon.width;
|
||||||
int h;
|
}
|
||||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
else
|
||||||
m_bound_icon.width = w;
|
{
|
||||||
m_bound_icon.height = h;
|
m_bound_label.x = m_bound_all.x + 2;
|
||||||
m_bound_label.x += 4 + w;
|
|
||||||
m_bound_label.width -= 4 + w;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wxLC_REPORT:
|
case wxLC_REPORT:
|
||||||
{
|
{
|
||||||
wxCoord lw,lh;
|
|
||||||
dc->GetTextExtent( "H", &lw, &lh );
|
|
||||||
if (lh < 15) lh = 15;
|
|
||||||
m_bound_all.x = 0;
|
m_bound_all.x = 0;
|
||||||
m_bound_all.y -= 0;
|
|
||||||
m_bound_all.height = lh+3;
|
|
||||||
m_bound_all.width = window_width;
|
m_bound_all.width = window_width;
|
||||||
AssignRect( m_bound_hilight, m_bound_all );
|
AssignRect( m_bound_hilight, m_bound_all );
|
||||||
AssignRect( m_bound_label, m_bound_all );
|
m_bound_label.x = m_bound_all.x + 2;
|
||||||
AssignRect( m_bound_icon, 0, 0, 0, 0 );
|
m_bound_label.y = m_bound_all.y + 2;
|
||||||
wxNode *node = m_items.First();
|
wxNode *node = m_items.First();
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
wxListItemData *item = (wxListItemData*)node->Data();
|
wxListItemData *item = (wxListItemData*)node->Data();
|
||||||
wxString s;
|
|
||||||
item->GetText( s );
|
|
||||||
if (s.IsEmpty()) s = wxT("H");
|
|
||||||
wxCoord lw,lh;
|
|
||||||
dc->GetTextExtent( s, &lw, &lh );
|
|
||||||
if (lh < 15) lh = 15;
|
|
||||||
m_bound_label.width = lw;
|
|
||||||
m_bound_label.height = lh;
|
|
||||||
if (item->HasImage())
|
if (item->HasImage())
|
||||||
{
|
{
|
||||||
m_bound_icon.x = m_bound_all.x + 2;
|
m_bound_icon.x = m_bound_all.x + 2;
|
||||||
m_bound_icon.y = m_bound_all.y + 2;
|
m_bound_icon.y = m_bound_all.y + 2;
|
||||||
int w;
|
m_bound_label.x += 4 + m_bound_icon.width;
|
||||||
int h;
|
|
||||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
|
||||||
m_bound_icon.width = w;
|
|
||||||
m_bound_icon.height = h;
|
|
||||||
m_bound_label.x += 4 + w;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -2586,7 +2580,7 @@ void wxListMainWindow::CalculatePositions()
|
|||||||
line->CalculateSize( &dc, iconSpacing );
|
line->CalculateSize( &dc, iconSpacing );
|
||||||
int dummy = 0;
|
int dummy = 0;
|
||||||
line->GetSize( dummy, lineSpacing );
|
line->GetSize( dummy, lineSpacing );
|
||||||
lineSpacing += 4;
|
lineSpacing += 1;
|
||||||
|
|
||||||
int clientWidth = 0;
|
int clientWidth = 0;
|
||||||
int clientHeight = 0;
|
int clientHeight = 0;
|
||||||
@@ -2643,8 +2637,8 @@ void wxListMainWindow::CalculatePositions()
|
|||||||
for (int tries = 0; tries < 2; tries++)
|
for (int tries = 0; tries < 2; tries++)
|
||||||
{
|
{
|
||||||
entireWidth = 0;
|
entireWidth = 0;
|
||||||
int x = 5; // painting is done at x-2
|
int x = 2;
|
||||||
int y = 5; // painting is done at y-2
|
int y = 2;
|
||||||
int maxWidth = 0;
|
int maxWidth = 0;
|
||||||
m_visibleLines = 0;
|
m_visibleLines = 0;
|
||||||
int m_currentVisibleLines = 0;
|
int m_currentVisibleLines = 0;
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -25,219 +26,6 @@ GdkWindow *wxScreenDC::sm_overlayWindow = (GdkWindow*) NULL;
|
|||||||
int wxScreenDC::sm_overlayWindowX = 0;
|
int wxScreenDC::sm_overlayWindowX = 0;
|
||||||
int wxScreenDC::sm_overlayWindowY = 0;
|
int wxScreenDC::sm_overlayWindowY = 0;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// create X window
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
#include <gdk/gdkprivate.h>
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
|
|
||||||
int my_nevent_masks = 17;
|
|
||||||
int my_event_masks_table[19] =
|
|
||||||
{
|
|
||||||
ExposureMask,
|
|
||||||
PointerMotionMask,
|
|
||||||
PointerMotionHintMask,
|
|
||||||
ButtonMotionMask,
|
|
||||||
Button1MotionMask,
|
|
||||||
Button2MotionMask,
|
|
||||||
Button3MotionMask,
|
|
||||||
ButtonPressMask | OwnerGrabButtonMask,
|
|
||||||
ButtonReleaseMask | OwnerGrabButtonMask,
|
|
||||||
KeyPressMask,
|
|
||||||
KeyReleaseMask,
|
|
||||||
EnterWindowMask,
|
|
||||||
LeaveWindowMask,
|
|
||||||
FocusChangeMask,
|
|
||||||
StructureNotifyMask,
|
|
||||||
PropertyChangeMask,
|
|
||||||
VisibilityChangeMask,
|
|
||||||
0, /* PROXIMITY_IN */
|
|
||||||
0 /* PROXIMTY_OUT */
|
|
||||||
};
|
|
||||||
|
|
||||||
GdkWindow*
|
|
||||||
gdk_window_transparent_new ( GdkWindow *parent,
|
|
||||||
GdkWindowAttr *attributes,
|
|
||||||
gint attributes_mask)
|
|
||||||
{
|
|
||||||
GdkWindow *window;
|
|
||||||
GdkWindowPrivate *gprivate;
|
|
||||||
GdkWindowPrivate *parent_private;
|
|
||||||
GdkVisual *visual;
|
|
||||||
Display *parent_display;
|
|
||||||
Window xparent;
|
|
||||||
Visual *xvisual;
|
|
||||||
XSetWindowAttributes xattributes;
|
|
||||||
long xattributes_mask;
|
|
||||||
XSizeHints size_hints;
|
|
||||||
XWMHints wm_hints;
|
|
||||||
XClassHint *class_hint;
|
|
||||||
int x, y, depth;
|
|
||||||
unsigned int gclass;
|
|
||||||
char *title;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_val_if_fail (attributes != NULL, NULL);
|
|
||||||
|
|
||||||
if (!parent)
|
|
||||||
parent = (GdkWindow*) &gdk_root_parent;
|
|
||||||
|
|
||||||
parent_private = (GdkWindowPrivate*) parent;
|
|
||||||
if (parent_private->destroyed)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
xparent = parent_private->xwindow;
|
|
||||||
parent_display = parent_private->xdisplay;
|
|
||||||
|
|
||||||
gprivate = g_new (GdkWindowPrivate, 1);
|
|
||||||
window = (GdkWindow*) gprivate;
|
|
||||||
|
|
||||||
gprivate->parent = parent;
|
|
||||||
|
|
||||||
if (parent_private != &gdk_root_parent)
|
|
||||||
parent_private->children = g_list_prepend (parent_private->children, window);
|
|
||||||
|
|
||||||
gprivate->xdisplay = parent_display;
|
|
||||||
gprivate->destroyed = FALSE;
|
|
||||||
gprivate->resize_count = 0;
|
|
||||||
gprivate->ref_count = 1;
|
|
||||||
xattributes_mask = 0;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_X)
|
|
||||||
x = attributes->x;
|
|
||||||
else
|
|
||||||
x = 0;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_Y)
|
|
||||||
y = attributes->y;
|
|
||||||
else
|
|
||||||
y = 0;
|
|
||||||
|
|
||||||
gprivate->x = x;
|
|
||||||
gprivate->y = y;
|
|
||||||
gprivate->width = (attributes->width > 1) ? (attributes->width) : (1);
|
|
||||||
gprivate->height = (attributes->height > 1) ? (attributes->height) : (1);
|
|
||||||
gprivate->window_type = attributes->window_type;
|
|
||||||
gprivate->extension_events = FALSE;
|
|
||||||
|
|
||||||
#if (GTK_MINOR_VERSION == 0)
|
|
||||||
gprivate->dnd_drag_data_type = None;
|
|
||||||
gprivate->dnd_drag_data_typesavail =
|
|
||||||
gprivate->dnd_drop_data_typesavail = NULL;
|
|
||||||
gprivate->dnd_drop_enabled = gprivate->dnd_drag_enabled =
|
|
||||||
gprivate->dnd_drag_accepted = gprivate->dnd_drag_datashow =
|
|
||||||
gprivate->dnd_drop_data_numtypesavail =
|
|
||||||
gprivate->dnd_drag_data_numtypesavail = 0;
|
|
||||||
gprivate->dnd_drag_eventmask = gprivate->dnd_drag_savedeventmask = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gprivate->filters = NULL;
|
|
||||||
gprivate->children = NULL;
|
|
||||||
|
|
||||||
window->user_data = NULL;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_VISUAL)
|
|
||||||
visual = attributes->visual;
|
|
||||||
else
|
|
||||||
visual = gdk_visual_get_system ();
|
|
||||||
xvisual = ((GdkVisualPrivate*) visual)->xvisual;
|
|
||||||
|
|
||||||
xattributes.event_mask = StructureNotifyMask;
|
|
||||||
for (i = 0; i < my_nevent_masks; i++)
|
|
||||||
{
|
|
||||||
if (attributes->event_mask & (1 << (i + 1)))
|
|
||||||
xattributes.event_mask |= my_event_masks_table[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xattributes.event_mask)
|
|
||||||
xattributes_mask |= CWEventMask;
|
|
||||||
|
|
||||||
if(attributes_mask & GDK_WA_NOREDIR) {
|
|
||||||
xattributes.override_redirect =
|
|
||||||
(attributes->override_redirect == FALSE)?False:True;
|
|
||||||
xattributes_mask |= CWOverrideRedirect;
|
|
||||||
} else
|
|
||||||
xattributes.override_redirect = False;
|
|
||||||
|
|
||||||
gclass = InputOutput;
|
|
||||||
depth = visual->depth;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_COLORMAP)
|
|
||||||
gprivate->colormap = attributes->colormap;
|
|
||||||
else
|
|
||||||
gprivate->colormap = gdk_colormap_get_system ();
|
|
||||||
|
|
||||||
xattributes.colormap = ((GdkColormapPrivate*) gprivate->colormap)->xcolormap;
|
|
||||||
xattributes_mask |= CWColormap;
|
|
||||||
|
|
||||||
xparent = gdk_root_window;
|
|
||||||
|
|
||||||
xattributes.save_under = True;
|
|
||||||
xattributes.override_redirect = True;
|
|
||||||
xattributes.cursor = None;
|
|
||||||
xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
|
|
||||||
|
|
||||||
gprivate->xwindow = XCreateWindow (gprivate->xdisplay, xparent,
|
|
||||||
x, y, gprivate->width, gprivate->height,
|
|
||||||
0, depth, gclass, xvisual,
|
|
||||||
xattributes_mask, &xattributes);
|
|
||||||
gdk_window_ref (window);
|
|
||||||
gdk_xid_table_insert (&gprivate->xwindow, window);
|
|
||||||
|
|
||||||
if (gprivate->colormap)
|
|
||||||
gdk_colormap_ref (gprivate->colormap);
|
|
||||||
|
|
||||||
XSetWMProtocols (gprivate->xdisplay, gprivate->xwindow, gdk_wm_window_protocols, 2);
|
|
||||||
|
|
||||||
size_hints.flags = PSize;
|
|
||||||
size_hints.width = gprivate->width;
|
|
||||||
size_hints.height = gprivate->height;
|
|
||||||
|
|
||||||
wm_hints.flags = InputHint | StateHint | WindowGroupHint;
|
|
||||||
wm_hints.window_group = gdk_leader_window;
|
|
||||||
wm_hints.input = True;
|
|
||||||
wm_hints.initial_state = NormalState;
|
|
||||||
|
|
||||||
/* FIXME: Is there any point in doing this? Do any WM's pay
|
|
||||||
* attention to PSize, and even if they do, is this the
|
|
||||||
* correct value???
|
|
||||||
*/
|
|
||||||
XSetWMNormalHints (gprivate->xdisplay, gprivate->xwindow, &size_hints);
|
|
||||||
|
|
||||||
XSetWMHints (gprivate->xdisplay, gprivate->xwindow, &wm_hints);
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_TITLE)
|
|
||||||
title = attributes->title;
|
|
||||||
else
|
|
||||||
#if (GTK_MINOR_VERSION > 0)
|
|
||||||
title = "Unknown"; // GLH: Well I don't know for the moment what to write here.
|
|
||||||
#else
|
|
||||||
title = gdk_progname;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
XmbSetWMProperties (gprivate->xdisplay, gprivate->xwindow,
|
|
||||||
title, title,
|
|
||||||
NULL, 0,
|
|
||||||
NULL, NULL, NULL);
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_WMCLASS)
|
|
||||||
{
|
|
||||||
class_hint = XAllocClassHint ();
|
|
||||||
class_hint->res_name = attributes->wmclass_name;
|
|
||||||
class_hint->res_class = attributes->wmclass_class;
|
|
||||||
XSetClassHint (gprivate->xdisplay, gprivate->xwindow, class_hint);
|
|
||||||
XFree (class_hint);
|
|
||||||
}
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxScreenDC
|
// wxScreenDC
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -247,19 +35,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC)
|
|||||||
wxScreenDC::wxScreenDC()
|
wxScreenDC::wxScreenDC()
|
||||||
{
|
{
|
||||||
m_ok = FALSE;
|
m_ok = FALSE;
|
||||||
m_window = (GdkWindow *) NULL;
|
|
||||||
m_cmap = gdk_colormap_get_system();
|
m_cmap = gdk_colormap_get_system();
|
||||||
|
m_window = GDK_ROOT_PARENT();
|
||||||
if (sm_overlayWindow)
|
|
||||||
{
|
|
||||||
m_window = sm_overlayWindow;
|
|
||||||
m_deviceOriginX = - sm_overlayWindowX;
|
|
||||||
m_deviceOriginY = - sm_overlayWindowY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_window = GDK_ROOT_PARENT();
|
|
||||||
}
|
|
||||||
|
|
||||||
SetUpDC();
|
SetUpDC();
|
||||||
|
|
||||||
@@ -271,6 +48,11 @@ wxScreenDC::wxScreenDC()
|
|||||||
|
|
||||||
wxScreenDC::~wxScreenDC()
|
wxScreenDC::~wxScreenDC()
|
||||||
{
|
{
|
||||||
|
gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_brushGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_textGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_bgGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
|
||||||
EndDrawingOnTop();
|
EndDrawingOnTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,47 +79,23 @@ bool wxScreenDC::StartDrawingOnTop( wxWindow *window )
|
|||||||
|
|
||||||
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
|
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
int width = gdk_screen_width();
|
int width = gdk_screen_width();
|
||||||
int height = gdk_screen_height();
|
int height = gdk_screen_height();
|
||||||
if (rect)
|
if (rect)
|
||||||
{
|
{
|
||||||
x = rect->x;
|
x = rect->x;
|
||||||
y = rect->y;
|
y = rect->y;
|
||||||
width = rect->width;
|
width = rect->width;
|
||||||
height = rect->height;
|
height = rect->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm_overlayWindowX = x;
|
|
||||||
sm_overlayWindowY = y;
|
|
||||||
|
|
||||||
GdkWindowAttr attr;
|
|
||||||
attr.x = x;
|
|
||||||
attr.y = y;
|
|
||||||
attr.width = width;
|
|
||||||
attr.height = height;
|
|
||||||
attr.override_redirect = TRUE;
|
|
||||||
attr.wclass = GDK_INPUT_OUTPUT;
|
|
||||||
attr.event_mask = 0;
|
|
||||||
attr.window_type = GDK_WINDOW_TEMP;
|
|
||||||
|
|
||||||
// GTK cannot set transparent backgrounds. :-(
|
|
||||||
sm_overlayWindow = gdk_window_transparent_new( NULL, &attr, GDK_WA_NOREDIR | GDK_WA_X | GDK_WA_Y );
|
|
||||||
|
|
||||||
if (sm_overlayWindow) gdk_window_show( sm_overlayWindow );
|
|
||||||
|
|
||||||
return (sm_overlayWindow != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxScreenDC::EndDrawingOnTop()
|
|
||||||
{
|
|
||||||
if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
|
|
||||||
|
|
||||||
sm_overlayWindow = NULL;
|
|
||||||
sm_overlayWindowX = 0;
|
|
||||||
sm_overlayWindowY = 0;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxScreenDC::EndDrawingOnTop()
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -25,219 +26,6 @@ GdkWindow *wxScreenDC::sm_overlayWindow = (GdkWindow*) NULL;
|
|||||||
int wxScreenDC::sm_overlayWindowX = 0;
|
int wxScreenDC::sm_overlayWindowX = 0;
|
||||||
int wxScreenDC::sm_overlayWindowY = 0;
|
int wxScreenDC::sm_overlayWindowY = 0;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// create X window
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
#include <gdk/gdkprivate.h>
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
|
|
||||||
int my_nevent_masks = 17;
|
|
||||||
int my_event_masks_table[19] =
|
|
||||||
{
|
|
||||||
ExposureMask,
|
|
||||||
PointerMotionMask,
|
|
||||||
PointerMotionHintMask,
|
|
||||||
ButtonMotionMask,
|
|
||||||
Button1MotionMask,
|
|
||||||
Button2MotionMask,
|
|
||||||
Button3MotionMask,
|
|
||||||
ButtonPressMask | OwnerGrabButtonMask,
|
|
||||||
ButtonReleaseMask | OwnerGrabButtonMask,
|
|
||||||
KeyPressMask,
|
|
||||||
KeyReleaseMask,
|
|
||||||
EnterWindowMask,
|
|
||||||
LeaveWindowMask,
|
|
||||||
FocusChangeMask,
|
|
||||||
StructureNotifyMask,
|
|
||||||
PropertyChangeMask,
|
|
||||||
VisibilityChangeMask,
|
|
||||||
0, /* PROXIMITY_IN */
|
|
||||||
0 /* PROXIMTY_OUT */
|
|
||||||
};
|
|
||||||
|
|
||||||
GdkWindow*
|
|
||||||
gdk_window_transparent_new ( GdkWindow *parent,
|
|
||||||
GdkWindowAttr *attributes,
|
|
||||||
gint attributes_mask)
|
|
||||||
{
|
|
||||||
GdkWindow *window;
|
|
||||||
GdkWindowPrivate *gprivate;
|
|
||||||
GdkWindowPrivate *parent_private;
|
|
||||||
GdkVisual *visual;
|
|
||||||
Display *parent_display;
|
|
||||||
Window xparent;
|
|
||||||
Visual *xvisual;
|
|
||||||
XSetWindowAttributes xattributes;
|
|
||||||
long xattributes_mask;
|
|
||||||
XSizeHints size_hints;
|
|
||||||
XWMHints wm_hints;
|
|
||||||
XClassHint *class_hint;
|
|
||||||
int x, y, depth;
|
|
||||||
unsigned int gclass;
|
|
||||||
char *title;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_val_if_fail (attributes != NULL, NULL);
|
|
||||||
|
|
||||||
if (!parent)
|
|
||||||
parent = (GdkWindow*) &gdk_root_parent;
|
|
||||||
|
|
||||||
parent_private = (GdkWindowPrivate*) parent;
|
|
||||||
if (parent_private->destroyed)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
xparent = parent_private->xwindow;
|
|
||||||
parent_display = parent_private->xdisplay;
|
|
||||||
|
|
||||||
gprivate = g_new (GdkWindowPrivate, 1);
|
|
||||||
window = (GdkWindow*) gprivate;
|
|
||||||
|
|
||||||
gprivate->parent = parent;
|
|
||||||
|
|
||||||
if (parent_private != &gdk_root_parent)
|
|
||||||
parent_private->children = g_list_prepend (parent_private->children, window);
|
|
||||||
|
|
||||||
gprivate->xdisplay = parent_display;
|
|
||||||
gprivate->destroyed = FALSE;
|
|
||||||
gprivate->resize_count = 0;
|
|
||||||
gprivate->ref_count = 1;
|
|
||||||
xattributes_mask = 0;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_X)
|
|
||||||
x = attributes->x;
|
|
||||||
else
|
|
||||||
x = 0;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_Y)
|
|
||||||
y = attributes->y;
|
|
||||||
else
|
|
||||||
y = 0;
|
|
||||||
|
|
||||||
gprivate->x = x;
|
|
||||||
gprivate->y = y;
|
|
||||||
gprivate->width = (attributes->width > 1) ? (attributes->width) : (1);
|
|
||||||
gprivate->height = (attributes->height > 1) ? (attributes->height) : (1);
|
|
||||||
gprivate->window_type = attributes->window_type;
|
|
||||||
gprivate->extension_events = FALSE;
|
|
||||||
|
|
||||||
#if (GTK_MINOR_VERSION == 0)
|
|
||||||
gprivate->dnd_drag_data_type = None;
|
|
||||||
gprivate->dnd_drag_data_typesavail =
|
|
||||||
gprivate->dnd_drop_data_typesavail = NULL;
|
|
||||||
gprivate->dnd_drop_enabled = gprivate->dnd_drag_enabled =
|
|
||||||
gprivate->dnd_drag_accepted = gprivate->dnd_drag_datashow =
|
|
||||||
gprivate->dnd_drop_data_numtypesavail =
|
|
||||||
gprivate->dnd_drag_data_numtypesavail = 0;
|
|
||||||
gprivate->dnd_drag_eventmask = gprivate->dnd_drag_savedeventmask = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gprivate->filters = NULL;
|
|
||||||
gprivate->children = NULL;
|
|
||||||
|
|
||||||
window->user_data = NULL;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_VISUAL)
|
|
||||||
visual = attributes->visual;
|
|
||||||
else
|
|
||||||
visual = gdk_visual_get_system ();
|
|
||||||
xvisual = ((GdkVisualPrivate*) visual)->xvisual;
|
|
||||||
|
|
||||||
xattributes.event_mask = StructureNotifyMask;
|
|
||||||
for (i = 0; i < my_nevent_masks; i++)
|
|
||||||
{
|
|
||||||
if (attributes->event_mask & (1 << (i + 1)))
|
|
||||||
xattributes.event_mask |= my_event_masks_table[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xattributes.event_mask)
|
|
||||||
xattributes_mask |= CWEventMask;
|
|
||||||
|
|
||||||
if(attributes_mask & GDK_WA_NOREDIR) {
|
|
||||||
xattributes.override_redirect =
|
|
||||||
(attributes->override_redirect == FALSE)?False:True;
|
|
||||||
xattributes_mask |= CWOverrideRedirect;
|
|
||||||
} else
|
|
||||||
xattributes.override_redirect = False;
|
|
||||||
|
|
||||||
gclass = InputOutput;
|
|
||||||
depth = visual->depth;
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_COLORMAP)
|
|
||||||
gprivate->colormap = attributes->colormap;
|
|
||||||
else
|
|
||||||
gprivate->colormap = gdk_colormap_get_system ();
|
|
||||||
|
|
||||||
xattributes.colormap = ((GdkColormapPrivate*) gprivate->colormap)->xcolormap;
|
|
||||||
xattributes_mask |= CWColormap;
|
|
||||||
|
|
||||||
xparent = gdk_root_window;
|
|
||||||
|
|
||||||
xattributes.save_under = True;
|
|
||||||
xattributes.override_redirect = True;
|
|
||||||
xattributes.cursor = None;
|
|
||||||
xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
|
|
||||||
|
|
||||||
gprivate->xwindow = XCreateWindow (gprivate->xdisplay, xparent,
|
|
||||||
x, y, gprivate->width, gprivate->height,
|
|
||||||
0, depth, gclass, xvisual,
|
|
||||||
xattributes_mask, &xattributes);
|
|
||||||
gdk_window_ref (window);
|
|
||||||
gdk_xid_table_insert (&gprivate->xwindow, window);
|
|
||||||
|
|
||||||
if (gprivate->colormap)
|
|
||||||
gdk_colormap_ref (gprivate->colormap);
|
|
||||||
|
|
||||||
XSetWMProtocols (gprivate->xdisplay, gprivate->xwindow, gdk_wm_window_protocols, 2);
|
|
||||||
|
|
||||||
size_hints.flags = PSize;
|
|
||||||
size_hints.width = gprivate->width;
|
|
||||||
size_hints.height = gprivate->height;
|
|
||||||
|
|
||||||
wm_hints.flags = InputHint | StateHint | WindowGroupHint;
|
|
||||||
wm_hints.window_group = gdk_leader_window;
|
|
||||||
wm_hints.input = True;
|
|
||||||
wm_hints.initial_state = NormalState;
|
|
||||||
|
|
||||||
/* FIXME: Is there any point in doing this? Do any WM's pay
|
|
||||||
* attention to PSize, and even if they do, is this the
|
|
||||||
* correct value???
|
|
||||||
*/
|
|
||||||
XSetWMNormalHints (gprivate->xdisplay, gprivate->xwindow, &size_hints);
|
|
||||||
|
|
||||||
XSetWMHints (gprivate->xdisplay, gprivate->xwindow, &wm_hints);
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_TITLE)
|
|
||||||
title = attributes->title;
|
|
||||||
else
|
|
||||||
#if (GTK_MINOR_VERSION > 0)
|
|
||||||
title = "Unknown"; // GLH: Well I don't know for the moment what to write here.
|
|
||||||
#else
|
|
||||||
title = gdk_progname;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
XmbSetWMProperties (gprivate->xdisplay, gprivate->xwindow,
|
|
||||||
title, title,
|
|
||||||
NULL, 0,
|
|
||||||
NULL, NULL, NULL);
|
|
||||||
|
|
||||||
if (attributes_mask & GDK_WA_WMCLASS)
|
|
||||||
{
|
|
||||||
class_hint = XAllocClassHint ();
|
|
||||||
class_hint->res_name = attributes->wmclass_name;
|
|
||||||
class_hint->res_class = attributes->wmclass_class;
|
|
||||||
XSetClassHint (gprivate->xdisplay, gprivate->xwindow, class_hint);
|
|
||||||
XFree (class_hint);
|
|
||||||
}
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxScreenDC
|
// wxScreenDC
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -247,19 +35,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC)
|
|||||||
wxScreenDC::wxScreenDC()
|
wxScreenDC::wxScreenDC()
|
||||||
{
|
{
|
||||||
m_ok = FALSE;
|
m_ok = FALSE;
|
||||||
m_window = (GdkWindow *) NULL;
|
|
||||||
m_cmap = gdk_colormap_get_system();
|
m_cmap = gdk_colormap_get_system();
|
||||||
|
m_window = GDK_ROOT_PARENT();
|
||||||
if (sm_overlayWindow)
|
|
||||||
{
|
|
||||||
m_window = sm_overlayWindow;
|
|
||||||
m_deviceOriginX = - sm_overlayWindowX;
|
|
||||||
m_deviceOriginY = - sm_overlayWindowY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_window = GDK_ROOT_PARENT();
|
|
||||||
}
|
|
||||||
|
|
||||||
SetUpDC();
|
SetUpDC();
|
||||||
|
|
||||||
@@ -271,6 +48,11 @@ wxScreenDC::wxScreenDC()
|
|||||||
|
|
||||||
wxScreenDC::~wxScreenDC()
|
wxScreenDC::~wxScreenDC()
|
||||||
{
|
{
|
||||||
|
gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_brushGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_textGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
gdk_gc_set_subwindow( m_bgGC, GDK_CLIP_BY_CHILDREN );
|
||||||
|
|
||||||
EndDrawingOnTop();
|
EndDrawingOnTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,47 +79,23 @@ bool wxScreenDC::StartDrawingOnTop( wxWindow *window )
|
|||||||
|
|
||||||
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
|
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
int width = gdk_screen_width();
|
int width = gdk_screen_width();
|
||||||
int height = gdk_screen_height();
|
int height = gdk_screen_height();
|
||||||
if (rect)
|
if (rect)
|
||||||
{
|
{
|
||||||
x = rect->x;
|
x = rect->x;
|
||||||
y = rect->y;
|
y = rect->y;
|
||||||
width = rect->width;
|
width = rect->width;
|
||||||
height = rect->height;
|
height = rect->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm_overlayWindowX = x;
|
|
||||||
sm_overlayWindowY = y;
|
|
||||||
|
|
||||||
GdkWindowAttr attr;
|
|
||||||
attr.x = x;
|
|
||||||
attr.y = y;
|
|
||||||
attr.width = width;
|
|
||||||
attr.height = height;
|
|
||||||
attr.override_redirect = TRUE;
|
|
||||||
attr.wclass = GDK_INPUT_OUTPUT;
|
|
||||||
attr.event_mask = 0;
|
|
||||||
attr.window_type = GDK_WINDOW_TEMP;
|
|
||||||
|
|
||||||
// GTK cannot set transparent backgrounds. :-(
|
|
||||||
sm_overlayWindow = gdk_window_transparent_new( NULL, &attr, GDK_WA_NOREDIR | GDK_WA_X | GDK_WA_Y );
|
|
||||||
|
|
||||||
if (sm_overlayWindow) gdk_window_show( sm_overlayWindow );
|
|
||||||
|
|
||||||
return (sm_overlayWindow != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxScreenDC::EndDrawingOnTop()
|
|
||||||
{
|
|
||||||
if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
|
|
||||||
|
|
||||||
sm_overlayWindow = NULL;
|
|
||||||
sm_overlayWindowX = 0;
|
|
||||||
sm_overlayWindowY = 0;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxScreenDC::EndDrawingOnTop()
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user