]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/gdicmn.cpp
partially working wxTaskBarIcon for X11
[wxWidgets.git] / src / common / gdicmn.cpp
index 2c62bcefdad4c750685e71b1cc3285fad4896aff..1539beb7bae8cd1c76c98e23f789b37559d464ef 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by:
 // Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
+// Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #endif
 #endif
 
+#ifdef __WXX11__
+#include "X11/Xlib.h"
+#endif
+
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#include "wx/mac/uma.h"
+#endif
 IMPLEMENT_CLASS(wxColourDatabase, wxList)
 IMPLEMENT_DYNAMIC_CLASS(wxFontList, wxList)
 IMPLEMENT_DYNAMIC_CLASS(wxPenList, wxList)
@@ -113,6 +121,29 @@ wxRect wxRect::operator + (const wxRect& rect) const
     return wxRect(x1, y1, x2-x1, y2-y1);
 }
 
+wxRect& wxRect::Inflate(wxCoord dx, wxCoord dy)
+{
+    x -= dx;
+    y -= dy;
+    width += 2*dx;
+    height += 2*dy;
+
+    // check that we didn't make the rectangle invalid by accident (you almost
+    // never want to have negative coords and never want negative size)
+    if ( x < 0 )
+        x = 0;
+    if ( y < 0 )
+        y = 0;
+
+    // what else can we do?
+    if ( width < 0 )
+        width = 0;
+    if ( height < 0 )
+        height = 0;
+
+    return *this;
+}
+
 bool wxRect::Inside(int cx, int cy) const
 {
     return ( (cx >= x) && (cy >= y)
@@ -121,6 +152,40 @@ bool wxRect::Inside(int cx, int cy) const
           );
 }
 
+wxRect& wxRect::Intersect(const wxRect& rect)
+{
+    int x2 = GetRight(),
+        y2 = GetBottom();
+
+    if ( x < rect.x )
+        x = rect.x;
+    if ( y < rect.y )
+        y = rect.y;
+    if ( x2 > rect.GetRight() )
+        x2 = rect.GetRight();
+    if ( y2 > rect.GetBottom() )
+        y2 = rect.GetBottom();
+
+    width = x2 - x + 1;
+    height = y2 - y + 1;
+
+    if ( width <= 0 || height <= 0 )
+    {
+        width =
+        height = 0;
+    }
+
+    return *this;
+}
+
+bool wxRect::Intersects(const wxRect& rect) const
+{
+    wxRect r = Intersect(rect);
+
+    // if there is no intersection, both width and height are 0
+    return r.width != 0;
+}
+
 wxColourDatabase::wxColourDatabase (int type) : wxList (type)
 {
 }
@@ -128,11 +193,11 @@ wxColourDatabase::wxColourDatabase (int type) : wxList (type)
 wxColourDatabase::~wxColourDatabase ()
 {
   // Cleanup Colour allocated in Initialize()
-  wxNode *node = First ();
+  wxNode *node = GetFirst ();
   while (node)
     {
-      wxColour *col = (wxColour *) node->Data ();
-      wxNode *next = node->Next ();
+      wxColour *col = (wxColour *) node->GetData ();
+      wxNode *next = node->GetNext ();
       delete col;
       node = next;
     }
@@ -265,16 +330,16 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
     if ( !colName2.Replace(_T("GRAY"), _T("GREY")) )
         colName2.clear();
 
-    wxNode *node = First();
+    wxNode *node = GetFirst();
     while ( node )
     {
         const wxChar *key = node->GetKeyString();
         if ( colName == key || colName2 == key )
         {
-            return (wxColour *)node->Data();
+            return (wxColour *)node->GetData();
         }
 
-        node = node->Next();
+        node = node->GetNext();
     }
 
 #ifdef __WXMSW__
@@ -283,6 +348,9 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXPM__
   return NULL;
 #endif
+#ifdef __WXMGL__
+  return NULL;
+#endif
 
 // TODO for other implementations. This should really go into
 // platform-specific directories.
@@ -296,7 +364,8 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXGTK__
   wxColour *col = new wxColour( colour );
 
-  if (!(col->Ok())) {
+  if (!(col->Ok()))
+  {
       delete col;
       return (wxColour *) NULL;
   }
@@ -310,19 +379,22 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXMOTIF__
     Display *display = XtDisplay((Widget) wxTheApp->GetTopLevelWidget()) ;
 #endif
-#ifdef __XVIEW__
-    Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
-    Xv_opaque root_window = xv_get(screen, XV_ROOT);
-    Display *display = (Display *)xv_get(root_window, XV_DISPLAY);
+#ifdef __WXX11__
+    Display* display = (Display*) wxGetDisplay();
 #endif
-
     /* MATTHEW: [4] Use wxGetMainColormap */
-    if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour,&xcolour))
+    if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour.ToAscii() ,&xcolour))
       return NULL;
 
+#if wxUSE_NANOX
+    unsigned char r = (unsigned char)(xcolour.red);
+    unsigned char g = (unsigned char)(xcolour.green);
+    unsigned char b = (unsigned char)(xcolour.blue);
+#else
     unsigned char r = (unsigned char)(xcolour.red >> 8);
     unsigned char g = (unsigned char)(xcolour.green >> 8);
     unsigned char b = (unsigned char)(xcolour.blue >> 8);
+#endif
 
     wxColour *col = new wxColour(r, g, b);
     Append(colour, col);
@@ -339,9 +411,9 @@ wxString wxColourDatabase::FindName (const wxColour& colour) const
     unsigned char green = colour.Green ();
     unsigned char blue = colour.Blue ();
 
-    for (wxNode * node = First (); node; node = node->Next ())
+    for (wxNode * node = GetFirst (); node; node = node->GetNext ())
     {
-        wxColour *col = (wxColour *) node->Data ();
+        wxColour *col = (wxColour *) node->GetData ();
 
         if (col->Red () == red && col->Green () == green && col->Blue () == blue)
         {
@@ -358,7 +430,8 @@ wxString wxColourDatabase::FindName (const wxColour& colour) const
     return name;
 }
 
-void wxInitializeStockLists () {
+void wxInitializeStockLists()
+{
   wxTheBrushList = new wxBrushList;
   wxThePenList = new wxPenList;
   wxTheFontList = new wxFontList;
@@ -381,47 +454,72 @@ void wxInitializeStockObjects ()
 #else
 #endif
 */
-#if defined(__WXPM__) || defined(__WXMAC__)
+#if defined(__WXMAC__)
+    int sizeFont = 12;
+
+    Str255 fontName ;
+    SInt16 fontSize ;
+    Style fontStyle ;
+
+       GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+       sizeFont = fontSize ;
+    wxSWISS_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , wxMacMakeStringFromPascal(fontName) );
+#elif defined(__WXPM__)
   static const int sizeFont = 12;
-  wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
 #else
-  wxNORMAL_FONT = new wxFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+  wxNORMAL_FONT = new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
   static const int sizeFont = wxNORMAL_FONT->GetPointSize();
 #endif
 
+#if defined(__WXPM__)
+  /*
+  // Basic OS/2 has a fairly limited number of fonts and these are as good
+  // as I can do to get something that looks halfway "wx" normal
+  */
+  wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxBOLD);
+  wxSMALL_FONT = new wxFont (sizeFont - 4, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
+  wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
+  wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
+#elif defined(__WXMAC__)
+    wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
+    wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
+       GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+    wxSMALL_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , wxMacMakeStringFromPascal( fontName ) );
+#else
   wxSMALL_FONT = new wxFont (sizeFont - 2, wxSWISS, wxNORMAL, wxNORMAL);
   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL);
+#endif
 
-  wxRED_PEN = new wxPen ("RED", 1, wxSOLID);
-  wxCYAN_PEN = new wxPen ("CYAN", 1, wxSOLID);
-  wxGREEN_PEN = new wxPen ("GREEN", 1, wxSOLID);
-  wxBLACK_PEN = new wxPen ("BLACK", 1, wxSOLID);
-  wxWHITE_PEN = new wxPen ("WHITE", 1, wxSOLID);
-  wxTRANSPARENT_PEN = new wxPen ("BLACK", 1, wxTRANSPARENT);
-  wxBLACK_DASHED_PEN = new wxPen ("BLACK", 1, wxSHORT_DASH);
-  wxGREY_PEN = new wxPen ("GREY", 1, wxSOLID);
-  wxMEDIUM_GREY_PEN = new wxPen ("MEDIUM GREY", 1, wxSOLID);
-  wxLIGHT_GREY_PEN = new wxPen ("LIGHT GREY", 1, wxSOLID);
-
-  wxBLUE_BRUSH = new wxBrush ("BLUE", wxSOLID);
-  wxGREEN_BRUSH = new wxBrush ("GREEN", wxSOLID);
-  wxWHITE_BRUSH = new wxBrush ("WHITE", wxSOLID);
-  wxBLACK_BRUSH = new wxBrush ("BLACK", wxSOLID);
-  wxTRANSPARENT_BRUSH = new wxBrush ("BLACK", wxTRANSPARENT);
-  wxCYAN_BRUSH = new wxBrush ("CYAN", wxSOLID);
-  wxRED_BRUSH = new wxBrush ("RED", wxSOLID);
-  wxGREY_BRUSH = new wxBrush ("GREY", wxSOLID);
-  wxMEDIUM_GREY_BRUSH = new wxBrush ("MEDIUM GREY", wxSOLID);
-  wxLIGHT_GREY_BRUSH = new wxBrush ("LIGHT GREY", wxSOLID);
-
-  wxBLACK = new wxColour ("BLACK");
-  wxWHITE = new wxColour ("WHITE");
-  wxRED = new wxColour ("RED");
-  wxBLUE = new wxColour ("BLUE");
-  wxGREEN = new wxColour ("GREEN");
-  wxCYAN = new wxColour ("CYAN");
-  wxLIGHT_GREY = new wxColour ("LIGHT GREY");
+  wxRED_PEN = new wxPen (wxT("RED"), 1, wxSOLID);
+  wxCYAN_PEN = new wxPen (wxT("CYAN"), 1, wxSOLID);
+  wxGREEN_PEN = new wxPen (wxT("GREEN"), 1, wxSOLID);
+  wxBLACK_PEN = new wxPen (wxT("BLACK"), 1, wxSOLID);
+  wxWHITE_PEN = new wxPen (wxT("WHITE"), 1, wxSOLID);
+  wxTRANSPARENT_PEN = new wxPen (wxT("BLACK"), 1, wxTRANSPARENT);
+  wxBLACK_DASHED_PEN = new wxPen (wxT("BLACK"), 1, wxSHORT_DASH);
+  wxGREY_PEN = new wxPen (wxT("GREY"), 1, wxSOLID);
+  wxMEDIUM_GREY_PEN = new wxPen (wxT("MEDIUM GREY"), 1, wxSOLID);
+  wxLIGHT_GREY_PEN = new wxPen (wxT("LIGHT GREY"), 1, wxSOLID);
+
+  wxBLUE_BRUSH = new wxBrush (wxT("BLUE"), wxSOLID);
+  wxGREEN_BRUSH = new wxBrush (wxT("GREEN"), wxSOLID);
+  wxWHITE_BRUSH = new wxBrush (wxT("WHITE"), wxSOLID);
+  wxBLACK_BRUSH = new wxBrush (wxT("BLACK"), wxSOLID);
+  wxTRANSPARENT_BRUSH = new wxBrush (wxT("BLACK"), wxTRANSPARENT);
+  wxCYAN_BRUSH = new wxBrush (wxT("CYAN"), wxSOLID);
+  wxRED_BRUSH = new wxBrush (wxT("RED"), wxSOLID);
+  wxGREY_BRUSH = new wxBrush (wxT("GREY"), wxSOLID);
+  wxMEDIUM_GREY_BRUSH = new wxBrush (wxT("MEDIUM GREY"), wxSOLID);
+  wxLIGHT_GREY_BRUSH = new wxBrush (wxT("LIGHT GREY"), wxSOLID);
+
+  wxBLACK = new wxColour (wxT("BLACK"));
+  wxWHITE = new wxColour (wxT("WHITE"));
+  wxRED = new wxColour (wxT("RED"));
+  wxBLUE = new wxColour (wxT("BLUE"));
+  wxGREEN = new wxColour (wxT("GREEN"));
+  wxCYAN = new wxColour (wxT("CYAN"));
+  wxLIGHT_GREY = new wxColour (wxT("LIGHT GREY"));
 
   wxSTANDARD_CURSOR = new wxCursor (wxCURSOR_ARROW);
   wxHOURGLASS_CURSOR = new wxCursor (wxCURSOR_WAIT);
@@ -470,24 +568,29 @@ void wxDeleteStockObjects ()
   wxDELETE(wxCROSS_CURSOR);
 }
 
-void wxDeleteStockLists() {
+void wxDeleteStockLists()
+{
   wxDELETE(wxTheBrushList);
   wxDELETE(wxThePenList);
   wxDELETE(wxTheFontList);
   wxDELETE(wxTheBitmapList);
 }
 
-wxBitmapList::wxBitmapList ()
+// ============================================================================
+// wxTheXXXList stuff (semi-obsolete)
+// ============================================================================
+
+wxBitmapList::wxBitmapList()
 {
 }
 
 wxBitmapList::~wxBitmapList ()
 {
-  wxNode *node = First ();
+  wxNode *node = GetFirst ();
   while (node)
     {
-      wxBitmap *bitmap = (wxBitmap *) node->Data ();
-      wxNode *next = node->Next ();
+      wxBitmap *bitmap = (wxBitmap *) node->GetData ();
+      wxNode *next = node->GetNext ();
       if (bitmap->GetVisible())
         delete bitmap;
       node = next;
@@ -497,11 +600,11 @@ wxBitmapList::~wxBitmapList ()
 // Pen and Brush lists
 wxPenList::~wxPenList ()
 {
-  wxNode *node = First ();
+  wxNode *node = GetFirst ();
   while (node)
     {
-      wxPen *pen = (wxPen *) node->Data ();
-      wxNode *next = node->Next ();
+      wxPen *pen = (wxPen *) node->GetData ();
+      wxNode *next = node->GetNext ();
       if (pen->GetVisible())
         delete pen;
       node = next;
@@ -520,9 +623,9 @@ void wxPenList::RemovePen (wxPen * pen)
 
 wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
 {
-    for (wxNode * node = First (); node; node = node->Next ())
+    for (wxNode * node = GetFirst (); node; node = node->GetNext ())
     {
-        wxPen *each_pen = (wxPen *) node->Data ();
+        wxPen *each_pen = (wxPen *) node->GetData ();
         if (each_pen &&
                 each_pen->GetVisible() &&
                 each_pen->GetWidth () == width &&
@@ -542,10 +645,9 @@ wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
         return NULL;
     }
 
-    // Yes, we can return a pointer to this in a later FindOrCreatePen call,
-    // because we created it within FindOrCreatePen. Safeguards against
-    // returning a pointer to an automatic variable and hanging on to it
-    // (dangling pointer).
+    AddPen(pen);
+
+    // we'll delete it ourselves later
     pen->SetVisible(TRUE);
 
     return pen;
@@ -553,12 +655,12 @@ wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
 
 wxBrushList::~wxBrushList ()
 {
-  wxNode *node = First ();
+  wxNode *node = GetFirst ();
   while (node)
     {
-      wxBrush *brush = (wxBrush *) node->Data ();
-      wxNode *next = node->Next ();
-      if (brush->GetVisible())
+      wxBrush *brush = (wxBrush *) node->GetData ();
+      wxNode *next = node->GetNext ();
+      if (brush && brush->GetVisible())
         delete brush;
       node = next;
     }
@@ -571,9 +673,9 @@ void wxBrushList::AddBrush (wxBrush * brush)
 
 wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style)
 {
-    for (wxNode * node = First (); node; node = node->Next ())
+    for (wxNode * node = GetFirst (); node; node = node->GetNext ())
     {
-        wxBrush *each_brush = (wxBrush *) node->Data ();
+        wxBrush *each_brush = (wxBrush *) node->GetData ();
         if (each_brush &&
                 each_brush->GetVisible() &&
                 each_brush->GetStyle () == style &&
@@ -593,12 +695,11 @@ wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style)
         return NULL;
     }
 
+    AddBrush(brush);
+
+    // we'll delete it ourselves later
     brush->SetVisible(TRUE);
 
-    // Yes, we can return a pointer to this in a later FindOrCreateBrush call,
-    // because we created it within FindOrCreateBrush. Safeguards against
-    // returning a pointer to an automatic variable and hanging on to it
-    // (dangling pointer).
     return brush;
 }
 
@@ -609,15 +710,15 @@ void wxBrushList::RemoveBrush (wxBrush * brush)
 
 wxFontList::~wxFontList ()
 {
-    wxNode *node = First ();
+    wxNode *node = GetFirst ();
     while (node)
     {
         // Only delete objects that are 'visible', i.e.
         // that have been created using FindOrCreate...,
         // where the pointers are expected to be shared
         // (and therefore not deleted by any one part of an app).
-        wxFont *font = (wxFont *) node->Data ();
-        wxNode *next = node->Next ();
+        wxFont *font = (wxFont *) node->GetData ();
+        wxNode *next = node->GetNext ();
         if (font->GetVisible())
             delete font;
         node = next;
@@ -644,9 +745,9 @@ wxFont *wxFontList::FindOrCreateFont(int pointSize,
 {
     wxFont *font = (wxFont *)NULL;
     wxNode *node;
-    for ( node = First(); node; node = node->Next() )
+    for ( node = GetFirst(); node; node = node->GetNext() )
     {
-        font = (wxFont *)node->Data();
+        font = (wxFont *)node->GetData();
         if ( font->GetVisible() &&
              font->Ok() &&
              font->GetPointSize () == pointSize &&
@@ -699,6 +800,8 @@ wxFont *wxFontList::FindOrCreateFont(int pointSize,
         font = new wxFont(pointSize, family, style, weight,
                           underline, facename, encoding);
 
+        AddFont(font);
+
         // and mark it as being cacheable
         font->SetVisible(TRUE);
     }
@@ -723,6 +826,13 @@ wxSize wxGetDisplaySize()
     return wxSize(x, y);
 }
 
+wxRect wxGetClientDisplayRect()
+{
+    int x, y, width, height;
+    wxClientDisplayRect(&x, &y, &width, &height);  // call plat-specific version
+    return wxRect(x, y, width, height);
+}
+
 wxSize wxGetDisplaySizeMM()
 {
     int x, y;
@@ -732,12 +842,12 @@ wxSize wxGetDisplaySizeMM()
 
 wxResourceCache::~wxResourceCache ()
 {
-    wxNode *node = First ();
+    wxNode *node = GetFirst ();
     while (node) {
-        wxObject *item = (wxObject *)node->Data();
+        wxObject *item = (wxObject *)node->GetData();
         delete item;
 
-        node = node->Next ();
+        node = node->GetNext ();
     }
 }