X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dbf858b5d69f53efd3950cae99322f54355aa983..a9e2e6e52b9c2371413597a92ccc4f8352963c32:/src/gtk/dcscreen.cpp diff --git a/src/gtk/dcscreen.cpp b/src/gtk/dcscreen.cpp index ed085d15d7..e32427f51e 100644 --- a/src/gtk/dcscreen.cpp +++ b/src/gtk/dcscreen.cpp @@ -1,333 +1,70 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcscreen.cpp +// Name: src/gtk/dcscreen.cpp // Purpose: // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "dcscreen.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/dcscreen.h" -#include "wx/window.h" +#include "wx/gtk/dcscreen.h" -//----------------------------------------------------------------------------- -// global data initialization -//----------------------------------------------------------------------------- +#ifndef WX_PRECOMP + #include "wx/window.h" +#endif -GdkWindow *wxScreenDC::sm_overlayWindow = (GdkWindow*) NULL; - int wxScreenDC::sm_overlayWindowX = 0; - int wxScreenDC::sm_overlayWindowY = 0; +#include +#include +#include - //----------------------------------------------------------------------------- -// create X window +// wxScreenDCImpl //----------------------------------------------------------------------------- -extern "C" { - -#include "gdk/gdk.h" -#include "gdk/gdkprivate.h" -#include "gdk/gdkx.h" -#include - -int nevent_masks = 17; -int event_mask_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; - 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; - - 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 < nevent_masks; i++) - { - if (attributes->event_mask & (1 << (i + 1))) - xattributes.event_mask |= event_mask_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; +IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl) - 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 - title = gdk_progname; - - 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; +wxScreenDCImpl::wxScreenDCImpl( wxScreenDC *owner ) + : wxWindowDCImpl( owner ) +{ + Init(); } -} // extern "C" +void wxScreenDCImpl::Init() +{ + m_ok = false; + m_cmap = gdk_colormap_get_system(); + m_gdkwindow = gdk_get_default_root_window(); -//----------------------------------------------------------------------------- -// wxScreenDC -//----------------------------------------------------------------------------- + m_context = gdk_pango_context_get(); + // Note: The Sun customised version of Pango shipping with Solaris 10 + // crashes if the language is left NULL (see bug 1374114) + pango_context_set_language( m_context, gtk_get_default_language() ); + m_layout = pango_layout_new( m_context ); +// m_fontdesc = pango_font_description_copy( widget->style->font_desc ); -IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC) + m_isScreenDC = true; -wxScreenDC::wxScreenDC(void) -{ - m_ok = FALSE; - m_window = (GdkWindow *) NULL; - m_cmap = gdk_colormap_get_system(); - - if (sm_overlayWindow) - { - m_window = sm_overlayWindow; - m_deviceOriginX = - sm_overlayWindowX; - m_deviceOriginY = - sm_overlayWindowY; - } - else - m_window = GDK_ROOT_PARENT(); - - SetUpDC(); - - gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS ); - gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS ); - gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS ); - gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS ); -} + SetUpDC(); -wxScreenDC::~wxScreenDC(void) -{ - EndDrawingOnTop(); + gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS ); + gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS ); + gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS ); + gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS ); } -bool wxScreenDC::StartDrawingOnTop( wxWindow *window ) +wxScreenDCImpl::~wxScreenDCImpl() { - if (!window) return StartDrawingOnTop(); - - int x = 0; - int y = 0; - window->GetPosition( &x, &y ); - int w = 0; - int h = 0; - window->GetSize( &w, &h ); - window->ClientToScreen( &x, &y ); - - wxRectangle rect; - rect.x = x; - rect.y = y; - rect.width = 0; - rect.height = 0; - - return StartDrawingOnTop( &rect ); + 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 ); } -bool wxScreenDC::StartDrawingOnTop( wxRectangle *rect ) +void wxScreenDCImpl::DoGetSize(int *width, int *height) const { - int x = 0; - int y = 0; - int width = gdk_screen_width(); - int height = gdk_screen_height(); - if (rect) - { - x = rect->x; - y = rect->y; - width = rect->width; - 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); -} - -bool wxScreenDC::EndDrawingOnTop(void) -{ - if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow ); - - sm_overlayWindow = NULL; - sm_overlayWindowX = 0; - sm_overlayWindowY = 0; - - return TRUE; + wxDisplaySize(width, height); } -