void wxSetFullScreenStateX11(WXDisplay* display, WXWindow rootWindow, WXWindow window, bool show, wxRect *origRect, wxX11FullScreenMethod method) { // NB: please see the comment under "Fullscreen mode:" title above // for implications of changing this code. Window wnd = WindowCast(window); Window root = WindowCast(rootWindow); Display *disp = (Display*)display; if (method == wxX11_FS_AUTODETECT) method = wxGetFullScreenMethodX11(display, rootWindow); switch (method) { case wxX11_FS_WMSPEC: wxWMspecSetFullscreen(disp, root, wnd, show); break; case wxX11_FS_KDE: wxSetKDEFullscreen(disp, root, wnd, show, origRect); break; default: wxWinHintsSetLayer(disp, root, wnd, show ? WIN_LAYER_ABOVE_DOCK : WIN_LAYER_NORMAL); break; } }
wxX11FullScreenMethod wxGetFullScreenMethodX11(WXDisplay* display, WXWindow rootWindow) { Window root = WindowCast(rootWindow); Display *disp = (Display*)display; // if WM supports _NET_WM_STATE_FULLSCREEN from wm-spec 1.2, use it: wxMAKE_ATOM(_NET_WM_STATE_FULLSCREEN, disp); if (wxQueryWMspecSupport(disp, root, _NET_WM_STATE_FULLSCREEN)) { wxLogTrace(wxT("fullscreen"), wxT("detected _NET_WM_STATE_FULLSCREEN support")); return wxX11_FS_WMSPEC; } // if the user is running KDE's kwin WM, use a legacy hack because // kwin doesn't understand any other method: if (wxKwinRunning(disp, root)) { wxLogTrace(wxT("fullscreen"), wxT("detected kwin")); return wxX11_FS_KDE; } // finally, fall back to ICCCM heuristic method: wxLogTrace(wxT("fullscreen"), wxT("unknown WM, using _WIN_LAYER")); return wxX11_FS_GENERIC; }
void wxSetIconsX11(WXDisplay* display, WXWindow window, const wxIconBundle& ib) { size_t size = 0; const size_t numIcons = ib.GetIconCount(); for ( size_t i = 0; i < numIcons; ++i ) { const wxIcon icon = ib.GetIconByIndex(i); size += 2 + icon.GetWidth() * icon.GetHeight(); } wxMAKE_ATOM(_NET_WM_ICON, (Display*)display); if ( size > 0 ) { unsigned long* data = new unsigned long[size]; unsigned long* ptr = data; for ( size_t i = 0; i < numIcons; ++i ) { const wxImage image = ib.GetIconByIndex(i).ConvertToImage(); int width = image.GetWidth(), height = image.GetHeight(); unsigned char* imageData = image.GetData(); unsigned char* imageDataEnd = imageData + ( width * height * 3 ); bool hasMask = image.HasMask(); unsigned char rMask, gMask, bMask; unsigned char r, g, b, a; if( hasMask ) { rMask = image.GetMaskRed(); gMask = image.GetMaskGreen(); bMask = image.GetMaskBlue(); } else // no mask, but still init the variables to avoid warnings { rMask = gMask = bMask = 0; } *ptr++ = width; *ptr++ = height; while ( imageData < imageDataEnd ) { r = imageData[0]; g = imageData[1]; b = imageData[2]; if( hasMask && r == rMask && g == gMask && b == bMask ) a = 0; else a = 255; *ptr++ = ( a << 24 ) | ( r << 16 ) | ( g << 8 ) | b; imageData += 3; } } XChangeProperty( (Display*)display, WindowCast(window), _NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)data, size ); delete[] data; } else { XDeleteProperty( (Display*)display, WindowCast(window), _NET_WM_ICON ); } }
void wxSetIconsX11( WXDisplay* display, WXWindow window, const wxIconBundle& ib ) { #if !wxUSE_NANOX size_t size = 0; size_t i, max = ib.m_icons.GetCount(); for( i = 0; i < max; ++i ) if( ib.m_icons[i].Ok() ) size += 2 + ib.m_icons[i].GetWidth() * ib.m_icons[i].GetHeight(); wxMAKE_ATOM(_NET_WM_ICON, (Display*)display); if( size > 0 ) { // The code below is correct for 64-bit machines also. // wxUint32* data = new wxUint32[size]; // wxUint32* ptr = data; unsigned long* data = new unsigned long[size]; unsigned long* ptr = data; for( i = 0; i < max; ++i ) { const wxImage image = ib.m_icons[i].ConvertToImage(); int width = image.GetWidth(), height = image.GetHeight(); unsigned char* imageData = image.GetData(); unsigned char* imageDataEnd = imageData + ( width * height * 3 ); bool hasMask = image.HasMask(); unsigned char rMask, gMask, bMask; unsigned char r, g, b, a; if( hasMask ) { rMask = image.GetMaskRed(); gMask = image.GetMaskGreen(); bMask = image.GetMaskBlue(); } else // no mask, but still init the variables to avoid warnings { rMask = gMask = bMask = 0; } *ptr++ = width; *ptr++ = height; while( imageData < imageDataEnd ) { r = imageData[0]; g = imageData[1]; b = imageData[2]; if( hasMask && r == rMask && g == gMask && b == bMask ) a = 0; else a = 255; *ptr++ = ( a << 24 ) | ( r << 16 ) | ( g << 8 ) | b; imageData += 3; } } XChangeProperty( (Display*)display, WindowCast(window), _NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)data, size ); delete[] data; } else { XDeleteProperty( (Display*)display, WindowCast(window), _NET_WM_ICON ); } #endif // !wxUSE_NANOX }