diff -ru svtools.orig/inc/svtools/svtools.hrc svtools/inc/svtools/svtools.hrc --- svtools/inc/svtools/svtools.hrc 2009-01-14 15:52:54.000000000 +0000 +++ svtools/inc/svtools/svtools.hrc 2009-01-14 15:53:18.000000000 +0000 @@ -73,6 +73,7 @@ #define RID_FILEOPEN_INVALIDFOLDER (RID_SVTOOLS_START + 34) #define RID_FILEOPEN_NOTEXISTENTFILE (RID_SVTOOLS_START + 35) #define STR_SVT_NOREMOVABLEDEVICE (RID_SVTOOLS_START + 36) +#define STR_SVT_ALLFORMATS (RID_SVTOOLS_START + 37) // doc template dialog #define DLG_DOCTEMPLATE (RID_SVTOOLS_START+50) diff -ru fpicker.orig/source/office/iodlg.src fpicker/source/office/iodlg.src --- fpicker/source/office/iodlg.src 2009-01-14 11:56:02.000000000 +0000 +++ fpicker/source/office/iodlg.src 2009-01-14 15:59:44.000000000 +0000 @@ -317,5 +312,10 @@ Text [ en-US ] = "No removable storage device detected.\nMake sure it is plugged in properly and try again." ; }; +String STR_SVT_ALLFORMATS +{ + Text [ en-US ] = "All Formats" ; +}; + //******************************************************************** EOF diff -ru fpicker.orig/source/unx/gnome/resourceprovider.cxx fpicker/source/unx/gnome/resourceprovider.cxx --- fpicker/source/unx/gnome/resourceprovider.cxx 2009-01-14 11:56:02.000000000 +0000 +++ fpicker/source/unx/gnome/resourceprovider.cxx 2009-01-14 15:42:26.000000000 +0000 @@ -85,7 +85,8 @@ { CHECKBOX_SELECTION, STR_SVT_FILEPICKER_SELECTION }, { FOLDERPICKER_TITLE, STR_SVT_FOLDERPICKER_DEFAULT_TITLE }, { FOLDER_PICKER_DEF_DESCRIPTION, STR_SVT_FOLDERPICKER_DEFAULT_DESCRIPTION }, - { FILE_PICKER_OVERWRITE, STR_SVT_ALREADYEXISTOVERWRITE } + { FILE_PICKER_OVERWRITE, STR_SVT_ALREADYEXISTOVERWRITE }, + { FILE_PICKER_ALLFORMATS, STR_SVT_ALLFORMATS } }; _Entry OtherCtrlIdToResIdTable[] = { diff -ru fpicker.orig/source/unx/gnome/resourceprovider.hxx fpicker/source/unx/gnome/resourceprovider.hxx --- fpicker/source/unx/gnome/resourceprovider.hxx 2009-01-14 11:56:02.000000000 +0000 +++ fpicker/source/unx/gnome/resourceprovider.hxx 2009-01-14 15:40:34.000000000 +0000 @@ -48,6 +48,7 @@ #define FILE_PICKER_TITLE_SAVE 503 #define FILE_PICKER_FILE_TYPE 504 #define FILE_PICKER_OVERWRITE 505 +#define FILE_PICKER_ALLFORMATS 506 //------------------------------------------------------------------------ // deklarations diff -ru fpicker.orig/source/unx/gnome/SalGtkFilePicker.cxx fpicker/source/unx/gnome/SalGtkFilePicker.cxx --- fpicker/source/unx/gnome/SalGtkFilePicker.cxx 2009-01-14 11:56:02.000000000 +0000 +++ fpicker/source/unx/gnome/SalGtkFilePicker.cxx 2009-01-14 15:42:05.000000000 +0000 @@ -52,6 +52,7 @@ #include <iostream> #include <algorithm> +#include <set> #include "resourceprovider.hxx" #ifndef _SV_RC_H #include <tools/rc.hxx> @@ -181,6 +182,7 @@ mbPreviewState( sal_False ), mHID_Preview( 0 ), m_pPreview( NULL ), + m_pPseudoFilter( NULL ), m_PreviewImageWidth( 256 ), m_PreviewImageHeight( 256 ) { @@ -692,7 +694,7 @@ m_pFilterList = new FilterList; // set the first filter to the current filter - if( ( !m_aCurrentFilter ) || ( !m_aCurrentFilter.getLength() ) ) + if ( !m_aCurrentFilter.getLength() ) m_aCurrentFilter = _rInitialCurrentFilter; } } @@ -715,7 +717,6 @@ // append the filter m_pFilterList->insert( m_pFilterList->end(), FilterEntry( aTitle, aFilter ) ); - // implAddFilter( aTitle, aFilter ); } //----------------------------------------------------------------------------------------- @@ -782,7 +783,10 @@ } else if( GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog))) { - updateCurrentFilterFromName(gtk_file_filter_get_name( filter )); + if (m_pPseudoFilter != filter) + updateCurrentFilterFromName(gtk_file_filter_get_name( filter )); + else + updateCurrentFilterFromName(OUStringToOString( m_aInitialFilter, RTL_TEXTENCODING_UTF8 ).getStr()); } } @@ -950,9 +954,15 @@ } } - const gchar* filtername = - gtk_file_filter_get_name( gtk_file_chooser_get_filter( GTK_FILE_CHOOSER( m_pDialog ) ) ); - sFilterName = OUString( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 ); + GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog)); + if (m_pPseudoFilter != filter) + { + const gchar* filtername = + gtk_file_filter_get_name( filter ); + sFilterName = OUString( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 ); + } + else + sFilterName = m_aInitialFilter; } OSL_TRACE( "2: current filter is %s\n", @@ -1917,7 +1927,7 @@ } } -int SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rType ) +GtkFileFilter* SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rType ) { GdkThreadLock aLock; @@ -1968,7 +1978,6 @@ gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( m_pDialog ), filter ); - int nAdded = 0; if (!bAllGlob) { GtkTreeIter iter; @@ -1979,30 +1988,67 @@ 2, aFilterName.getStr(), 3, OUStringToOString(rType, RTL_TEXTENCODING_UTF8).getStr(), -1); - nAdded = 1; } - return nAdded; + return filter; } -int SalGtkFilePicker::implAddFilterGroup( const OUString& /*_rFilter*/, const Sequence< StringPair >& _rFilters ) +void SalGtkFilePicker::implAddFilterGroup( const OUString& /*_rFilter*/, const Sequence< StringPair >& _rFilters ) { // Gtk+ has no filter group concept I think so ... // implAddFilter( _rFilter, String() ); - int nAdded = 0; const StringPair* pSubFilters = _rFilters.getConstArray(); const StringPair* pSubFiltersEnd = pSubFilters + _rFilters.getLength(); for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters ) - nAdded += implAddFilter( pSubFilters->First, pSubFilters->Second ); - return nAdded; + implAddFilter( pSubFilters->First, pSubFilters->Second ); } void SalGtkFilePicker::SetFilters() { - OSL_TRACE( "start setting filters\n"); - GdkThreadLock aLock; - int nAdded = 0; + if (!m_aInitialFilter.getLength()) + m_aInitialFilter = m_aCurrentFilter; + + rtl::OUString sPseudoFilter; + if( GTK_FILE_CHOOSER_ACTION_SAVE == gtk_file_chooser_get_action( GTK_FILE_CHOOSER( m_pDialog ) ) ) + { + std::set<OUString> aAllFormats; + if( m_pFilterList && !m_pFilterList->empty() ) + { + for ( FilterList::iterator aListIter = m_pFilterList->begin(); + aListIter != m_pFilterList->end(); + ++aListIter + ) + { + if( aListIter->hasSubFilters() ) + { // it's a filter group + UnoFilterList aSubFilters; + aListIter->getSubFilters( aSubFilters ); + const StringPair* pSubFilters = aSubFilters.getConstArray(); + const StringPair* pSubFiltersEnd = pSubFilters + aSubFilters.getLength(); + for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters ) + aAllFormats.insert(pSubFilters->Second); + } + else + aAllFormats.insert(aListIter->getFilter()); + } + } + if (aAllFormats.size() > 1) + { + rtl::OUString sAllFilter; + std::set<OUString>::const_iterator aEnd = aAllFormats.end(); + for (std::set<OUString>::const_iterator aIter = aAllFormats.begin(); aIter != aEnd; ++aIter) + { + if (sAllFilter.getLength()) + sAllFilter += OUString(sal_Unicode(';')); + sAllFilter += *aIter; + } + CResourceProvider aResProvider; + sPseudoFilter = aResProvider.getResString(FILE_PICKER_ALLFORMATS); + m_pPseudoFilter = implAddFilter( sPseudoFilter, sAllFilter ); + } + } + if( m_pFilterList && !m_pFilterList->empty() ) { for ( FilterList::iterator aListIter = m_pFilterList->begin(); @@ -2016,30 +2062,27 @@ UnoFilterList aSubFilters; aListIter->getSubFilters( aSubFilters ); - nAdded += implAddFilterGroup( aListIter->getTitle(), aSubFilters ); + implAddFilterGroup( aListIter->getTitle(), aSubFilters ); } else { // it's a single filter - nAdded += implAddFilter( aListIter->getTitle(), aListIter->getFilter() ); + implAddFilter( aListIter->getTitle(), aListIter->getFilter() ); } } } - if (nAdded) + if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_pFilterStore), NULL)) //If m_pFilterStore is not empty gtk_widget_show( m_pFilterExpander ); else gtk_widget_hide( m_pFilterExpander ); // set the default filter - if( m_aCurrentFilter && (m_aCurrentFilter.getLength() > 0) ) - { - OSL_TRACE( "Setting current filter to %s\n", - OUStringToOString( m_aCurrentFilter, RTL_TEXTENCODING_UTF8 ).getStr() ); - + if (sPseudoFilter.getLength()) + SetCurFilter( sPseudoFilter ); + else if(m_aCurrentFilter.getLength()) SetCurFilter( m_aCurrentFilter ); - } OSL_TRACE( "end setting filters\n"); } diff -ru fpicker.orig/source/unx/gnome/SalGtkFilePicker.hxx fpicker/source/unx/gnome/SalGtkFilePicker.hxx --- fpicker/source/unx/gnome/SalGtkFilePicker.hxx 2009-01-14 11:56:02.000000000 +0000 +++ fpicker/source/unx/gnome/SalGtkFilePicker.hxx 2009-01-14 15:34:41.000000000 +0000 @@ -317,11 +317,13 @@ gulong mnHID_SelectionChange; ::rtl::OUString m_aCurrentFilter; + ::rtl::OUString m_aInitialFilter; bool bVersionWidthUnset; sal_Bool mbPreviewState; gulong mHID_Preview; GtkWidget* m_pPreview; + GtkFileFilter* m_pPseudoFilter; sal_Int32 m_PreviewImageWidth; sal_Int32 m_PreviewImageHeight; @@ -332,8 +334,8 @@ void UpdateFilterfromUI(); void implChangeType( GtkTreeSelection *selection ); - int implAddFilter( const OUString& rFilter, const OUString& rType); - int implAddFilterGroup( const OUString& rFilter, + GtkFileFilter * implAddFilter( const OUString& rFilter, const OUString& rType ); + void implAddFilterGroup( const OUString& rFilter, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair>& _rFilters ); void updateCurrentFilterFromName(const gchar* filtername); void unselect_type(); --- vcl.orig/unx/gtk/window/gtkframe.cxx 2010-05-29 11:29:16.000000000 +0100 +++ vcl/unx/gtk/window/gtkframe.cxx 2010-05-29 12:02:19.000000000 +0100 @@ -79,6 +79,14 @@ #define GDK_META_MASK (1 << 28) #endif +#if GTK_CHECK_VERSION(2,90,0) +#define IS_WIDGET_REALIZED gtk_widget_get_realized +#define IS_WIDGET_MAPPED gtk_widget_get_mapped +#else +#define IS_WIDGET_REALIZED GTK_WIDGET_REALIZED +#define IS_WIDGET_MAPPED GTK_WIDGET_MAPPED +#endif + using namespace com::sun::star; int GtkSalFrame::m_nFloats = 0; @@ -428,12 +436,12 @@ getDisplay()->deregisterFrame( this ); if( m_pRegion ) - gdk_region_destroy( m_pRegion ); + gdk_region_destroy( m_pRegion ); if( m_hBackgroundPixmap ) { XSetWindowBackgroundPixmap( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), None ); XFreePixmap( getDisplay()->GetDisplay(), m_hBackgroundPixmap ); } @@ -592,7 +600,7 @@ SalDisplay* pDisp = GetX11SalData()->GetDisplay(); m_aSystemData.nSize = sizeof( SystemChildData ); m_aSystemData.pDisplay = pDisp->GetDisplay(); - m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(m_pWindow->window); + m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)); m_aSystemData.pSalFrame = this; m_aSystemData.pWidget = m_pWindow; m_aSystemData.pVisual = pDisp->GetVisual( m_nScreen ).GetVisual(); @@ -644,7 +652,7 @@ * some paint issues */ XSetWindowBackgroundPixmap( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_hBackgroundPixmap ); } @@ -678,7 +686,7 @@ else if( ! bBeforeRealize ) { Display* pDisplay = GetX11SalData()->GetDisplay()->GetDisplay(); - XLIB_Window aWindow = GDK_WINDOW_XWINDOW( GTK_WIDGET(pWindow)->window ); + XLIB_Window aWindow = GDK_WINDOW_XWINDOW( widget_get_window(GTK_WIDGET(pWindow)) ); XWMHints* pHints = XGetWMHints( pDisplay, aWindow ); if( ! pHints ) { @@ -863,7 +871,7 @@ nUserTime= getDisplay()->GetLastUserEventTime( true ); // nUserTime = gdk_x11_get_server_time(GTK_WIDGET (m_pWindow)->window); } - lcl_set_user_time(GTK_WIDGET(m_pWindow)->window, nUserTime); + lcl_set_user_time(widget_get_window(GTK_WIDGET(m_pWindow)), nUserTime); } if( bDecoHandling ) @@ -917,7 +925,8 @@ { m_pWindow = gtk_plug_new( pSysData->aWindow ); m_bWindowIsGtkPlug = true; - GTK_WIDGET_SET_FLAGS( m_pWindow, GTK_CAN_FOCUS | GTK_SENSITIVE | GTK_CAN_DEFAULT ); + widget_set_can_default( m_pWindow, true ); + widget_set_can_focus( m_pWindow, true ); gtk_widget_set_sensitive( m_pWindow, true ); } else @@ -942,7 +951,7 @@ if( ! m_bWindowIsGtkPlug ) { XReparentWindow( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), (XLIB_Window)pSysData->aWindow, 0, 0 ); } @@ -976,14 +985,14 @@ if( nStyle != m_nExtStyle && ! isChild() ) { m_nExtStyle = nStyle; - if( GTK_WIDGET_REALIZED( m_pWindow ) ) + if( IS_WIDGET_REALIZED( m_pWindow ) ) { XClassHint* pClass = XAllocClassHint(); rtl::OString aResHint = X11SalData::getFrameResName( m_nExtStyle ); pClass->res_name = const_cast<char*>(aResHint.getStr()); pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName()); XSetClassHint( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), pClass ); XFree( pClass ); } @@ -1007,7 +1016,7 @@ if( ! m_aGraphics[i].pGraphics ) { m_aGraphics[i].pGraphics = new GtkSalGraphics( m_pWindow ); - m_aGraphics[i].pGraphics->Init( this, GDK_WINDOW_XWINDOW(m_pWindow->window), m_nScreen ); + m_aGraphics[i].pGraphics->Init( this, GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_nScreen ); } return m_aGraphics[i].pGraphics; } @@ -1308,7 +1317,7 @@ setMinMaxSize(); // #i45160# switch to desktop where a dialog with parent will appear - if( m_pParent && m_pParent->m_nWorkArea != m_nWorkArea && GTK_WIDGET_MAPPED(m_pParent->m_pWindow) ) + if( m_pParent && m_pParent->m_nWorkArea != m_nWorkArea && IS_WIDGET_MAPPED(m_pParent->m_pWindow) ) getDisplay()->getWMAdaptor()->switchToWorkArea( m_pParent->m_nWorkArea ); if( isFloatGrabWindow() && @@ -1363,7 +1372,7 @@ nUserTime= getDisplay()->GetLastUserEventTime( true ); //nUserTime = gdk_x11_get_server_time(GTK_WIDGET (m_pWindow)->window); } - lcl_set_user_time( GTK_WIDGET(m_pWindow)->window, nUserTime ); + lcl_set_user_time( widget_get_window(GTK_WIDGET(m_pWindow)), nUserTime ); if( bHack && ! bNoActivate && (m_nStyle & SAL_FRAME_STYLE_TOOLWINDOW) ) m_bSetFocusOnMap = true; @@ -1472,7 +1481,7 @@ { m_aMaxSize = Size( nWidth, nHeight ); // Show does a setMinMaxSize - if( GTK_WIDGET_MAPPED( m_pWindow ) ) + if( IS_WIDGET_MAPPED( m_pWindow ) ) setMinMaxSize(); } } @@ -1485,7 +1494,7 @@ { gtk_widget_set_size_request( m_pWindow, nWidth, nHeight ); // Show does a setMinMaxSize - if( GTK_WIDGET_MAPPED( m_pWindow ) ) + if( IS_WIDGET_MAPPED( m_pWindow ) ) setMinMaxSize(); } } @@ -1737,7 +1746,7 @@ gtk_widget_realize( m_pWindow ); // update system data GtkSalDisplay* pDisp = getDisplay(); - m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(m_pWindow->window); + m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)); m_aSystemData.pVisual = pDisp->GetVisual( m_nScreen ).GetVisual(); m_aSystemData.nScreen = nScreen; m_aSystemData.nDepth = pDisp->GetVisual( m_nScreen ).GetDepth(); @@ -1748,7 +1757,7 @@ for( unsigned int i = 0; i < sizeof(m_aGraphics)/sizeof(m_aGraphics[0]); i++ ) { if( m_aGraphics[i].bInUse ) - m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(m_pWindow->window), m_nScreen ); + m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_nScreen ); } updateScreenNumber(); } @@ -1777,7 +1786,7 @@ Rectangle aOldScreenRect( pDisp->GetXineramaScreens()[maGeometry.nScreenNumber] ); Rectangle aNewScreenRect( pDisp->GetXineramaScreens()[nNewScreen] ); - bool bVisible = GTK_WIDGET_MAPPED(m_pWindow); + bool bVisible = IS_WIDGET_MAPPED(m_pWindow); if( bVisible ) Show( FALSE ); maGeometry.nX = aNewScreenRect.Left() + (maGeometry.nX - aOldScreenRect.Left()); @@ -1809,7 +1818,7 @@ { m_aRestorePosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ), Size( maGeometry.nWidth, maGeometry.nHeight ) ); - bool bVisible = GTK_WIDGET_MAPPED(m_pWindow); + bool bVisible = IS_WIDGET_MAPPED(m_pWindow); if( bVisible ) Show( FALSE ); m_nStyle |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN; @@ -1838,7 +1847,7 @@ } else { - bool bVisible = GTK_WIDGET_MAPPED(m_pWindow); + bool bVisible = IS_WIDGET_MAPPED(m_pWindow); if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) gtk_window_unfullscreen( GTK_WINDOW(m_pWindow) ); if( bVisible ) @@ -2052,7 +2061,7 @@ } #ifdef ENABLE_DBUS m_nGSMCookie = dbus_inhibit_gsm(g_get_application_name(), "presentation", - GDK_WINDOW_XID(m_pWindow->window)); + GDK_WINDOW_XID(widget_get_window(m_pWindow))); #endif } else @@ -2078,7 +2087,7 @@ { if( isChild( false, true ) ) gtk_widget_grab_focus( m_pWindow ); - else if( GTK_WIDGET_MAPPED( m_pWindow ) ) + else if( IS_WIDGET_MAPPED( m_pWindow ) ) { if( ! (nFlags & SAL_FRAME_TOTOP_GRABFOCUS_ONLY) ) gtk_window_present( GTK_WINDOW(m_pWindow) ); @@ -2087,7 +2096,7 @@ // gdk_window_focus( m_pWindow->window, gdk_x11_get_server_time(GTK_WIDGET (m_pWindow)->window) ); /* #i99360# ugly workaround an X11 library bug */ guint32 nUserTime= getDisplay()->GetLastUserEventTime( true ); - gdk_window_focus( m_pWindow->window, nUserTime ); + gdk_window_focus( widget_get_window(m_pWindow), nUserTime ); } /* need to do an XSetInputFocus here because * gdk_window_focus will ask a EWMH compliant WM to put the focus @@ -2099,7 +2108,7 @@ // sad but true: this can cause an XError, we need to catch that // to do this we need to synchronize with the XServer getDisplay()->GetXLib()->PushXErrorLevel( true ); - XSetInputFocus( getDisplay()->GetDisplay(), GDK_WINDOW_XWINDOW( m_pWindow->window ), RevertToParent, CurrentTime ); + XSetInputFocus( getDisplay()->GetDisplay(), GDK_WINDOW_XWINDOW( widget_get_window(m_pWindow) ), RevertToParent, CurrentTime ); XSync( getDisplay()->GetDisplay(), False ); getDisplay()->GetXLib()->PopXErrorLevel(); } @@ -2118,7 +2127,7 @@ { m_ePointerStyle = ePointerStyle; GdkCursor *pCursor = getDisplay()->getCursor( ePointerStyle ); - gdk_window_set_cursor( m_pWindow->window, pCursor ); + gdk_window_set_cursor( widget_get_window(m_pWindow), pCursor ); m_pCurrentCursor = pCursor; // #i80791# use grabPointer the same way as CaptureMouse, respective float grab @@ -2153,7 +2162,7 @@ { const int nMask = ( GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK ); - gdk_pointer_grab( m_pWindow->window, bOwnerEvents, + gdk_pointer_grab( widget_get_window(m_pWindow), bOwnerEvents, (GdkEventMask) nMask, NULL, m_pCurrentCursor, GDK_CURRENT_TIME ); } @@ -2166,7 +2175,7 @@ // this is of course a bad hack, especially as we cannot // set the right cursor this way XGrabPointer( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW( m_pWindow->window), + GDK_WINDOW_XWINDOW( widget_get_window(m_pWindow)), bOwnerEvents, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, @@ -2214,7 +2223,7 @@ // #i38648# ask for the next motion hint gint x, y; GdkModifierType mask; - gdk_window_get_pointer( pFrame->m_pWindow->window, &x, &y, &mask ); + gdk_window_get_pointer( widget_get_window(pFrame->m_pWindow) , &x, &y, &mask ); } void GtkSalFrame::Flush() @@ -2300,7 +2309,7 @@ return NULL; X11SalBitmap *pBmp = new X11SalBitmap; - GdkWindow *pWin = m_pWindow->window; + GdkWindow *pWin = widget_get_window(m_pWindow); if( pBmp->SnapShot( GDK_DISPLAY_XDISPLAY( getGdkDisplay() ), GDK_WINDOW_XID( pWin ) ) ) return pBmp; @@ -2362,7 +2371,7 @@ void GtkSalFrame::createNewWindow( XLIB_Window aNewParent, bool bXEmbed, int nScreen ) { - bool bWasVisible = GTK_WIDGET_MAPPED(m_pWindow); + bool bWasVisible = IS_WIDGET_MAPPED(m_pWindow); if( bWasVisible ) Show( FALSE ); @@ -2407,7 +2416,7 @@ m_pIMHandler = NULL; } if( m_pRegion ) - gdk_region_destroy( m_pRegion ); + gdk_region_destroy( m_pRegion ); if( m_pFixedContainer ) gtk_widget_destroy( GTK_WIDGET(m_pFixedContainer) ); if( m_pWindow ) @@ -2435,7 +2444,7 @@ { if( m_aGraphics[i].bInUse ) { - m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(m_pWindow->window), m_nScreen ); + m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_nScreen ); m_aGraphics[i].pGraphics->SetWindow( m_pWindow ); } } @@ -2465,14 +2474,14 @@ void GtkSalFrame::ResetClipRegion() { if( m_pWindow ) - gdk_window_shape_combine_region( m_pWindow->window, NULL, 0, 0 ); + gdk_window_shape_combine_region( widget_get_window(m_pWindow), NULL, 0, 0 ); } void GtkSalFrame::BeginSetClipRegion( ULONG ) { if( m_pRegion ) - gdk_region_destroy( m_pRegion ); - m_pRegion = gdk_region_new(); + gdk_region_destroy( m_pRegion ); + m_pRegion = gdk_region_new(); } void GtkSalFrame::UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) @@ -2485,14 +2494,14 @@ aRect.width = nWidth; aRect.height = nHeight; - gdk_region_union_with_rect( m_pRegion, &aRect ); + gdk_region_union_with_rect( m_pRegion, &aRect ); } } void GtkSalFrame::EndSetClipRegion() { if( m_pWindow && m_pRegion ) - gdk_window_shape_combine_region( m_pWindow->window, m_pRegion, 0, 0 ); + gdk_window_shape_combine_region( widget_get_window(m_pWindow), m_pRegion, 0, 0 ); } bool GtkSalFrame::Dispatch( const XEvent* pEvent ) @@ -2506,7 +2515,7 @@ if( pEvent->xproperty.atom == nDesktopAtom && pEvent->xproperty.state == PropertyNewValue ) { - m_nWorkArea = pAdaptor->getWindowWorkArea( GDK_WINDOW_XWINDOW( m_pWindow->window) ); + m_nWorkArea = pAdaptor->getWindowWorkArea( GDK_WINDOW_XWINDOW( widget_get_window(m_pWindow)) ); } } else if( pEvent->type == ConfigureNotify ) @@ -2533,7 +2542,7 @@ int x = 0, y = 0; XLIB_Window aChild; XTranslateCoordinates( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW( m_pWindow->window), + GDK_WINDOW_XWINDOW( widget_get_window(m_pWindow) ), getDisplay()->GetRootWindow( getDisplay()->GetDefaultScreenNumber() ), 0, 0, &x, &y, @@ -2548,7 +2557,7 @@ } else if( pEvent->type == ClientMessage && pEvent->xclient.message_type == getDisplay()->getWMAdaptor()->getAtom( vcl_sal::WMAdaptor::XEMBED ) && - pEvent->xclient.window == GDK_WINDOW_XWINDOW(m_pWindow->window) && + pEvent->xclient.window == GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)) && m_bWindowIsGtkPlug ) { @@ -2560,7 +2569,7 @@ { GdkEventFocus aEvent; aEvent.type = GDK_FOCUS_CHANGE; - aEvent.window = m_pWindow->window; + aEvent.window = widget_get_window(m_pWindow); aEvent.send_event = TRUE; aEvent.in = (pEvent->xclient.data.l[1] == 1); signalFocus( m_pWindow, &aEvent, this ); @@ -2575,7 +2584,7 @@ if( m_hBackgroundPixmap ) { XSetWindowBackgroundPixmap( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), None ); XFreePixmap( getDisplay()->GetDisplay(), m_hBackgroundPixmap ); m_hBackgroundPixmap = None; @@ -2588,7 +2597,7 @@ { m_hBackgroundPixmap = XCreatePixmap( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), aSize.Width(), aSize.Height(), getDisplay()->GetVisual(m_nScreen).GetDepth() ); @@ -2604,7 +2613,7 @@ aTwoRect, getDisplay()->GetCopyGC(m_nScreen) ); XSetWindowBackgroundPixmap( getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(m_pWindow->window), + GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_hBackgroundPixmap ); } } @@ -2777,7 +2786,7 @@ // ask for the next hint gint x, y; GdkModifierType mask; - gdk_window_get_pointer( GTK_WIDGET(pThis->m_pWindow)->window, &x, &y, &mask ); + gdk_window_get_pointer( widget_get_window(GTK_WIDGET(pThis->m_pWindow)), &x, &y, &mask ); } } @@ -2872,7 +2881,7 @@ if( bSetFocus ) { XSetInputFocus( pThis->getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW( GTK_WIDGET(pThis->m_pWindow)->window), + GDK_WINDOW_XWINDOW( widget_get_window(GTK_WIDGET(pThis->m_pWindow))), RevertToParent, CurrentTime ); } @@ -2920,7 +2929,7 @@ */ XLIB_Window aChild; XTranslateCoordinates( pThis->getDisplay()->GetDisplay(), - GDK_WINDOW_XWINDOW(GTK_WIDGET(pThis->m_pWindow)->window), + GDK_WINDOW_XWINDOW(widget_get_window(GTK_WIDGET(pThis->m_pWindow))), pThis->getDisplay()->GetRootWindow( pThis->getDisplay()->GetDefaultScreenNumber() ), 0, 0, &x, &y, @@ -2954,7 +2963,7 @@ if( ! (pThis->m_nStyle & SAL_FRAME_STYLE_PLUG) ) { GdkRectangle aRect; - gdk_window_get_frame_extents( GTK_WIDGET(pThis->m_pWindow)->window, &aRect ); + gdk_window_get_frame_extents( widget_get_window(GTK_WIDGET(pThis->m_pWindow)), &aRect ); pThis->maGeometry.nTopDecoration = y - aRect.y; pThis->maGeometry.nBottomDecoration = aRect.y + aRect.height - y - pEvent->height; pThis->maGeometry.nLeftDecoration = x - aRect.x; @@ -3165,7 +3174,7 @@ * some time on the Xserver as well as prevent * some paint issues */ - GdkWindow* pWin = GTK_WIDGET(pThis->getWindow())->window; + GdkWindow* pWin = widget_get_window(GTK_WIDGET(pThis->getWindow())); if( pWin ) { XLIB_Window aWin = GDK_WINDOW_XWINDOW(pWin); @@ -3269,7 +3278,7 @@ G_CALLBACK (signalIMPreeditEnd), this ); m_pFrame->getDisplay()->GetXLib()->PushXErrorLevel( true ); - gtk_im_context_set_client_window( m_pIMContext, GTK_WIDGET(m_pFrame->m_pWindow)->window ); + gtk_im_context_set_client_window( m_pIMContext, widget_get_window(GTK_WIDGET(m_pFrame->m_pWindow)) ); gtk_im_context_focus_in( m_pIMContext ); m_pFrame->getDisplay()->GetXLib()->PopXErrorLevel(); m_bFocused = true; --- fpicker.orig/source/unx/gnome/SalGtkFilePicker.cxx 2010-05-29 21:22:49.000000000 +0100 +++ fpicker/source/unx/gnome/SalGtkFilePicker.cxx 2010-05-29 21:26:05.000000000 +0100 @@ -602,7 +602,11 @@ g_return_if_fail( GTK_IS_DIALOG( pDialog ) ); GList *pChildren = +#if GTK_CHECK_VERSION(2,90,0) + gtk_container_get_children( GTK_CONTAINER( gtk_dialog_get_action_area(pDialog) ) ); +#else gtk_container_get_children( GTK_CONTAINER( pDialog->action_area ) ); +#endif for( GList *p = pChildren; p; p = p->next ) gtk_widget_destroy( GTK_WIDGET( p->data ) ); @@ -1600,7 +1604,7 @@ gtk_image_set_from_pixbuf( GTK_IMAGE( preview ), pixbuf ); if( pixbuf ) - gdk_pixbuf_unref( pixbuf ); + g_object_unref( pixbuf ); } --- libegg.orig/source/eggtrayicon.c 2010-05-29 21:27:29.000000000 +0100 +++ libegg/source/eggtrayicon.c 2010-05-30 12:53:27.000000000 +0100 @@ -230,6 +230,7 @@ { EggTrayIcon *icon = user_data; XEvent *xev = (XEvent *)xevent; + (void)event; if (xev->xany.type == ClientMessage && xev->xclient.message_type == icon->manager_atom && @@ -280,6 +281,36 @@ #endif } +static gboolean +gtk_widget_is_has_window(GtkWidget *widget) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_get_has_window(widget); +#else + return GTK_WIDGET_NO_WINDOW(widget); +#endif +} + +static gboolean +gtk_widget_is_app_paintable(GtkWidget *widget) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_get_app_paintable(widget); +#else + return GTK_WIDGET_APP_PAINTABLE(widget); +#endif +} + +static GdkWindow * +gtk_widget_window(GtkWidget *widget) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_get_window(widget); +#else + return widget->window; +#endif +} + #ifdef GDK_WINDOWING_X11 static void @@ -297,7 +328,7 @@ ev.window = window; ev.message_type = icon->system_tray_opcode_atom; ev.format = 32; - ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); + ev.data.l[0] = gdk_x11_get_server_time (gtk_widget_window(GTK_WIDGET(icon))); ev.data.l[1] = message; ev.data.l[2] = data1; ev.data.l[3] = data2; @@ -322,6 +353,16 @@ 0, 0); } +static gboolean +gtk_widget_is_realized(GtkWidget *widget) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_get_realized(widget); +#else + return GTK_WIDGET_REALIZED(widget); +#endif +} + static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, gboolean dock_if_realized) @@ -354,7 +395,7 @@ gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); - if (dock_if_realized && GTK_WIDGET_REALIZED (icon)) + if (dock_if_realized && gtk_widget_is_realized (GTK_WIDGET (icon))) egg_tray_icon_send_dock_request (icon); egg_tray_icon_get_orientation_property (icon); @@ -383,7 +424,8 @@ static gboolean transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { - gdk_window_clear_area (widget->window, event->area.x, event->area.y, + (void)user_data; + gdk_window_clear_area (gtk_widget_window(widget), event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } @@ -392,18 +434,21 @@ make_transparent_again (GtkWidget *widget, GtkStyle *previous_style, gpointer user_data) { - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); + (void)previous_style; + (void)user_data; + gdk_window_set_back_pixmap (gtk_widget_window(widget), NULL, TRUE); } static void make_transparent (GtkWidget *widget, gpointer user_data) { - if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) + if (gtk_widget_is_has_window (widget) || gtk_widget_is_app_paintable (widget)) return; + (void)user_data; gtk_widget_set_app_paintable (widget, TRUE); gtk_widget_set_double_buffered (widget, FALSE); - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); + gdk_window_set_back_pixmap (gtk_widget_window(widget), NULL, TRUE); g_signal_connect (widget, "expose_event", G_CALLBACK (transparent_expose_event), NULL); g_signal_connect_after (widget, "style_set", --- libegg.orig/source/eggtrayicon-impl.h 2010-05-29 21:27:29.000000000 +0100 +++ libegg/source/eggtrayicon-impl.h 2010-05-30 12:46:49.000000000 +0100 @@ -21,7 +21,7 @@ #ifndef __EGG_TRAY_ICON_IMPL_H__ #define __EGG_TRAY_ICON_IMPL_H__ -#include <gtk/gtkplug.h> +#include <gtk/gtk.h> #ifdef GDK_WINDOWING_X11 #include <gdk/gdkx.h> #endif --- sfx2.orig/source/appl/shutdowniconunx.cxx 2010-05-29 21:22:29.000000000 +0100 +++ sfx2/source/appl/shutdowniconunx.cxx 2010-05-30 12:59:35.000000000 +0100 @@ -302,18 +302,34 @@ gpointer ) { GtkRequisition req; - GtkWidget *ebox = GTK_BIN( pTrayIcon )->child; + GtkWidget *ebox = gtk_bin_get_child(GTK_BIN( pTrayIcon )); gtk_widget_size_request( GTK_WIDGET( menu ), &req ); +#if GTK_CHECK_VERSION(2,90,0) + gdk_window_get_origin( gtk_widget_get_window(ebox), x, y ); + + GtkAllocation allocation; + gtk_widget_get_allocation(ebox, &allocation); + + (*x) += allocation.x; + (*y) += allocation.y; +#else gdk_window_get_origin( ebox->window, x, y ); (*x) += ebox->allocation.x; (*y) += ebox->allocation.y; +#endif if (*y >= gdk_screen_get_height (gtk_widget_get_screen (ebox)) / 2) (*y) -= req.height; else + { +#if GTK_CHECK_VERSION(2,90,0) + (*y) += allocation.height; +#else (*y) += ebox->allocation.height; +#endif + } *push_in = TRUE; } @@ -372,8 +388,12 @@ pTrayIcon = egg_tray_icon_new( aLabel ); GtkWidget *pParent = gtk_event_box_new(); +#if GTK_CHECK_VERSION(2,90,0) + gtk_widget_set_tooltip_text (pParent, aLabel ); +#else GtkTooltips *pTooltips = gtk_tooltips_new(); gtk_tooltips_set_tip( GTK_TOOLTIPS( pTooltips ), pParent, aLabel, NULL ); +#endif GtkWidget *pIconImage = gtk_image_new(); gtk_container_add( GTK_CONTAINER( pParent ), pIconImage ); --- vcl.orig/unx/gtk/app/gtkdata.cxx 2010-06-14 19:51:39.500810695 +0100 +++ vcl/unx/gtk/app/gtkdata.cxx 2010-06-15 10:07:16.669799057 +0100 @@ -217,11 +217,12 @@ { gint nMonitors = gdk_screen_get_n_monitors(pScreen); m_aXineramaScreens = std::vector<Rectangle>(); + m_aXineramaScreenIndexMap = std::vector<int>(nMonitors); for (gint i = 0; i < nMonitors; ++i) { GdkRectangle dest; gdk_screen_get_monitor_geometry(pScreen, i, &dest); - addXineramaScreenUnique( dest.x, dest.y, dest.width, dest.height ); + addXineramaScreenUnique( i, dest.x, dest.y, dest.width, dest.height ); } m_bXinerama = m_aXineramaScreens.size() > 1; if( ! m_aFrames.empty() ) @@ -235,6 +236,35 @@ } } +extern "C" +{ + typedef gint(* screen_get_primary_monitor)(GdkScreen *screen); +} + +int GtkSalDisplay::GetDefaultMonitorNumber() const +{ + fprintf(stderr, "GtkSalDisplay::GetDefaultMonitorNumber\n"); + + GdkScreen* pScreen = gdk_display_get_screen( m_pGdkDisplay, m_nDefaultScreen ); +#if GTK_CHECK_VERSION(2,20,0) + return m_aXineramaScreenIndexMap[gdk_screen_get_primary_monitor(pScreen)]; +#else + static screen_get_primary_monitor sym_gdk_screen_get_primary_monitor = + (screen_get_primary_monitor)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_primary_monitor" ); + if (sym_gdk_screen_get_primary_monitor) + return sym_gdk_screen_get_primary_monitor( pScreen ); + //gdk_screen_get_primary_monitor unavailable, take the first laptop monitor as the default + gint nMonitors = gdk_screen_get_n_monitors(pScreen); + for (gint i = 0; i < nMonitors; ++i) + { + fprintf(stderr, "name is %s\n", gdk_screen_get_monitor_plug_name(pScreen, i)); + if (g_ascii_strncasecmp (gdk_screen_get_monitor_plug_name(pScreen, i), "LVDS", 4) == 0) + return m_aXineramaScreenIndexMap[i]; + } + return 0; +#endif +} + void GtkSalDisplay::initScreen( int nScreen ) const { if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) ) --- vcl.orig/unx/inc/saldisp.hxx 2010-06-14 19:51:39.548798785 +0100 +++ vcl/unx/inc/saldisp.hxx 2010-06-15 10:06:53.031798755 +0100 @@ -389,6 +389,7 @@ bool m_bXinerama; std::vector< Rectangle > m_aXineramaScreens; + std::vector< int > m_aXineramaScreenIndexMap; std::list<SalFrame*> m_aFrames; std::list<SalObject*> m_aSalObjects; @@ -404,7 +405,7 @@ int processRandREvent( XEvent* ); void doDestruct(); - void addXineramaScreenUnique( long i_nX, long i_nY, long i_nWidth, long i_nHeight ); + void addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight ); public: static SalDisplay *GetSalDisplay( Display* display ); static BOOL BestVisual( Display *pDisp, @@ -474,6 +475,7 @@ XLIB_Window GetDrawable( int nScreen ) const { return getDataForScreen( nScreen ).m_aRefWindow; } Display *GetDisplay() const { return pDisp_; } int GetDefaultScreenNumber() const { return m_nDefaultScreen; } + virtual int GetDefaultMonitorNumber() const; const Size& GetScreenSize( int nScreen ) const { return getDataForScreen( nScreen ).m_aSize; } srv_vendor_t GetServerVendor() const { return meServerVendor; } void SetServerVendor() { meServerVendor = sal_GetServerVendor(pDisp_); } --- vcl.orig/unx/source/app/saldisp.cxx 2010-06-14 19:51:39.516798973 +0100 +++ vcl/unx/source/app/saldisp.cxx 2010-06-15 10:12:39.627798619 +0100 @@ -2592,7 +2592,7 @@ sal::static_int_cast< unsigned int >(GetVisual(m_nDefaultScreen).GetVisualId()) ); } -void SalDisplay::addXineramaScreenUnique( long i_nX, long i_nY, long i_nWidth, long i_nHeight ) +void SalDisplay::addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight ) { // see if any frame buffers are at the same coordinates // this can happen with weird configuration e.g. on @@ -2607,10 +2607,12 @@ m_aXineramaScreens[n].GetHeight() < i_nHeight ) { m_aXineramaScreens[n].SetSize( Size( i_nWidth, i_nHeight ) ); + m_aXineramaScreenIndexMap[i] = n; } return; } } + m_aXineramaScreenIndexMap[i] = m_aXineramaScreens.size(); m_aXineramaScreens.push_back( Rectangle( Point( i_nX, i_nY ), Size( i_nWidth, i_nHeight ) ) ); } @@ -2637,8 +2639,9 @@ { m_bXinerama = true; m_aXineramaScreens = std::vector<Rectangle>(); + m_aXineramaScreenIndexMap = std::vector<int>(nFramebuffers); for( int i = 0; i < nFramebuffers; i++ ) - addXineramaScreenUnique( pFramebuffers[i].x, + addXineramaScreenUnique( i, pFramebuffers[i].x, pFramebuffers[i].y, pFramebuffers[i].width, pFramebuffers[i].height ); @@ -2654,9 +2657,10 @@ if( nFramebuffers > 1 ) { m_aXineramaScreens = std::vector<Rectangle>(); + m_aXineramaScreenIndexMap = std::vector<int>(nFramebuffers); for( int i = 0; i < nFramebuffers; i++ ) { - addXineramaScreenUnique( pScreens[i].x_org, + addXineramaScreenUnique( i, pScreens[i].x_org, pScreens[i].y_org, pScreens[i].width, pScreens[i].height ); @@ -2677,6 +2681,11 @@ #endif // USE_XINERAMA } +int SalDisplay::GetDefaultMonitorNumber() const +{ + return 0; +} + void SalDisplay::registerFrame( SalFrame* pFrame ) { m_aFrames.push_front( pFrame ); --- vcl.orig/unx/source/app/salsys.cxx 2010-06-14 19:51:39.515799413 +0100 +++ vcl/unx/source/app/salsys.cxx 2010-06-14 20:28:14.281799292 +0100 @@ -74,7 +74,7 @@ unsigned int X11SalSystem::GetDefaultDisplayNumber() { SalDisplay* pSalDisp = GetX11SalData()->GetDisplay(); - return pSalDisp->GetDefaultScreenNumber(); + return pSalDisp->IsXinerama() ? pSalDisp->GetDefaultMonitorNumber() : pSalDisp->GetDefaultScreenNumber(); } Rectangle X11SalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen ) --- vcl.orig/unx/inc/plugins/gtk/gtkgdi.hxx 2010-06-21 12:34:41.000000000 +0100 +++ vcl/unx/inc/plugins/gtk/gtkgdi.hxx 2010-06-21 13:16:40.000000000 +0100 @@ -49,7 +49,7 @@ virtual ~GtkSalGraphics(); inline GtkWidget* GetGtkWidget() const { return m_pWindow; } - inline GdkWindow* GetGdkWindow() const { return m_pWindow->window; } + inline GdkWindow* GetGdkWindow() const { return widget_get_window(m_pWindow); } inline GtkSalFrame* GetGtkFrame() const { return static_cast<GtkSalFrame*>(m_pFrame); } void SetWindow( GtkWidget* window ) { m_pWindow = window; } @@ -127,7 +127,7 @@ const clipList& rClipList, ControlState nState, const ImplControlValue& aValue, const OUString& rCaption ); - BOOL NWPaintGTKComboBox( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart, + BOOL NWPaintGTKComboBoxEntry( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart, const Rectangle& rControlRectangle, const clipList& rClipList, ControlState nState, const ImplControlValue& aValue, @@ -137,11 +137,13 @@ const clipList& rClipList, ControlState nState, const ImplControlValue& aValue, const OUString& rCaption ); - BOOL NWPaintGTKListBox( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart, - const Rectangle& rControlRectangle, - const clipList& rClipList, - ControlState nState, const ImplControlValue& aValue, - const OUString& rCaption ); + BOOL NWPaintGTKComboBox( GdkDrawable* gdkDrawable, + ControlType nType, ControlPart nPart, + const Rectangle& rControlRectangle, + const clipList& rClipList, + ControlState nState, + const ImplControlValue& aValue, + const OUString& rCaption ); BOOL NWPaintGTKToolbar( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart, const Rectangle& rControlRectangle, --- vcl.orig/unx/gtk/gdi/salnativewidgets-gtk.cxx 2010-06-21 12:34:41.000000000 +0100 +++ vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx 2010-06-21 13:19:37.000000000 +0100 @@ -68,39 +68,45 @@ class NWPixmapCache; struct NWFWidgetData { - GtkWidget * gCacheWindow; - GtkWidget * gDumbContainer; + GtkWidget * gCacheWindow; + GtkWidget * gDumbContainer; - GtkWidget * gBtnWidget; - GtkWidget * gRadioWidget; - GtkWidget * gRadioWidgetSibling; - GtkWidget * gCheckWidget; - GtkWidget * gScrollHorizWidget; - GtkWidget * gScrollVertWidget; - GtkWidget * gArrowWidget; - GtkWidget * gDropdownWidget; - GtkWidget * gEditBoxWidget; - GtkWidget * gSpinButtonWidget; - GtkWidget * gNotebookWidget; - GtkWidget * gOptionMenuWidget; - GtkWidget * gComboWidget; - GtkWidget * gScrolledWindowWidget; - GtkWidget * gToolbarWidget; - GtkWidget * gToolbarButtonWidget; - GtkWidget * gToolbarToggleWidget; - GtkWidget * gHandleBoxWidget; - GtkWidget * gMenubarWidget; - GtkWidget * gMenuItemMenubarWidget; - GtkWidget * gMenuWidget; - GtkWidget * gMenuItemMenuWidget; - GtkWidget * gMenuItemCheckMenuWidget; - GtkWidget * gMenuItemRadioMenuWidget; - GtkWidget * gImageMenuItem; - GtkWidget * gTooltipPopup; - GtkWidget * gProgressBar; - GtkWidget * gTreeView; - GtkWidget * gHScale; - GtkWidget * gVScale; + GtkWidget * gBtnWidget; + GtkWidget * gRadioWidget; + GtkWidget * gRadioWidgetSibling; + GtkWidget * gCheckWidget; + GtkWidget * gScrollHorizWidget; + GtkWidget * gScrollVertWidget; + GtkWidget * gArrowWidget; + GtkWidget * gDropdownWidget; + GtkWidget * gEditBoxWidget; + GtkWidget * gSpinButtonWidget; + GtkWidget * gNotebookWidget; + GtkWidget * gComboBoxEntryWidget; + GtkWidget * gComboBoxEntry_EntryWidget; + GtkWidget * gComboBoxEntry_ButtonWidget; + GtkWidget * gComboBoxEntry_ArrowWidget; + GtkWidget * gComboBoxWidget; + GtkWidget * gComboBox_ButtonWidget; + GtkWidget * gComboBox_SeparatorWidget; + GtkWidget * gComboBox_ArrowWidget; + GtkWidget * gScrolledWindowWidget; + GtkWidget * gToolbarWidget; + GtkWidget * gToolbarButtonWidget; + GtkWidget * gToolbarToggleWidget; + GtkWidget * gHandleBoxWidget; + GtkWidget * gMenubarWidget; + GtkWidget * gMenuItemMenubarWidget; + GtkWidget * gMenuWidget; + GtkWidget * gMenuItemMenuWidget; + GtkWidget * gMenuItemCheckMenuWidget; + GtkWidget * gMenuItemRadioMenuWidget; + GtkWidget * gImageMenuItem; + GtkWidget * gTooltipPopup; + GtkWidget * gProgressBar; + GtkWidget * gTreeView; + GtkWidget * gHScale; + GtkWidget * gVScale; NWPixmapCacheList* gNWPixmapCacheList; NWPixmapCache* gCacheTabItems; @@ -120,8 +126,14 @@ gEditBoxWidget( NULL ), gSpinButtonWidget( NULL ), gNotebookWidget( NULL ), - gOptionMenuWidget( NULL ), - gComboWidget( NULL ), + gComboBoxEntryWidget( NULL ), + gComboBoxEntry_EntryWidget( NULL ), + gComboBoxEntry_ButtonWidget( NULL ), + gComboBoxEntry_ArrowWidget( NULL ), + gComboBoxWidget( NULL ), + gComboBox_ButtonWidget( NULL ), + gComboBox_SeparatorWidget( NULL ), + gComboBox_ArrowWidget( NULL ), gScrolledWindowWidget( NULL ), gToolbarWidget( NULL ), gToolbarButtonWidget( NULL ), @@ -148,29 +160,29 @@ // Keep a hash table of Widgets->default flags so that we can // easily and quickly reset each to a default state before using // them -static std::hash_map<long, guint> gWidgetDefaultFlags; +static std::hash_map<long, guint> gWidgetDefaultFlags; static std::vector<NWFWidgetData> gWidgetData; -static const GtkBorder aDefDefBorder = { 1, 1, 1, 1 }; +static const GtkBorder aDefDefBorder = { 1, 1, 1, 1 }; // Some GTK defaults -#define MIN_ARROW_SIZE 11 -#define BTN_CHILD_SPACING 1 -#define MIN_SPIN_ARROW_WIDTH 6 - - -static void NWEnsureGTKRadio ( int nScreen ); -static void NWEnsureGTKButton ( int nScreen ); -static void NWEnsureGTKCheck ( int nScreen ); -static void NWEnsureGTKScrollbars ( int nScreen ); -static void NWEnsureGTKArrow ( int nScreen ); -static void NWEnsureGTKEditBox ( int nScreen ); -static void NWEnsureGTKSpinButton ( int nScreen ); -static void NWEnsureGTKNotebook ( int nScreen ); -static void NWEnsureGTKOptionMenu ( int nScreen ); -static void NWEnsureGTKCombo ( int nScreen ); -static void NWEnsureGTKScrolledWindow ( int nScreen ); -static void NWEnsureGTKToolbar ( int nScreen ); +#define MIN_ARROW_SIZE 11 +#define BTN_CHILD_SPACING 1 +#define MIN_SPIN_ARROW_WIDTH 6 + + +static void NWEnsureGTKRadio ( int nScreen ); +static void NWEnsureGTKButton ( int nScreen ); +static void NWEnsureGTKCheck ( int nScreen ); +static void NWEnsureGTKScrollbars ( int nScreen ); +static void NWEnsureGTKArrow ( int nScreen ); +static void NWEnsureGTKEditBox ( int nScreen ); +static void NWEnsureGTKSpinButton ( int nScreen ); +static void NWEnsureGTKNotebook ( int nScreen ); +static void NWEnsureGTKComboBoxEntry ( int nScreen ); +static void NWEnsureGTKComboBox ( int nScreen ); +static void NWEnsureGTKScrolledWindow ( int nScreen ); +static void NWEnsureGTKToolbar ( int nScreen ); static void NWEnsureGTKMenubar ( int nScreen ); static void NWEnsureGTKMenu ( int nScreen ); static void NWEnsureGTKTooltip ( int nScreen ); @@ -210,14 +222,10 @@ ControlState nState, const ImplControlValue& aValue, const OUString& rCaption ); //--- -static Rectangle NWGetComboBoxButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState, - const ImplControlValue& aValue, const OUString& rCaption ); - -//--- -static Rectangle NWGetListBoxButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState, - const ImplControlValue& aValue, const OUString& rCaption ); +static Rectangle NWGetComboBoxEntryButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState, + const ImplControlValue& aValue, const OUString& rCaption ); -static Rectangle NWGetListBoxIndicatorRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState, +static Rectangle NWGetComboBoxButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState, const ImplControlValue& aValue, const OUString& rCaption ); static Rectangle NWGetToolbarRect( int nScreen, @@ -229,9 +237,9 @@ const OUString& rCaption ); //--- -static Rectangle NWGetScrollButtonRect( int nScreen, ControlPart nPart, Rectangle aAreaRect ); +static Rectangle NWGetScrollButtonRect( int nScreen, ControlPart nPart, Rectangle aAreaRect ); //--- - + /********************************************************* * PixmapCache *********************************************************/ @@ -298,7 +306,6 @@ g_object_ref( m_pixmap ); } - NWPixmapCache::NWPixmapCache( int nScreen ) { m_idx = 0; @@ -308,25 +315,25 @@ if( gWidgetData[m_screen].gNWPixmapCacheList ) gWidgetData[m_screen].gNWPixmapCacheList->AddCache(this); } + NWPixmapCache::~NWPixmapCache() { if( gWidgetData[m_screen].gNWPixmapCacheList ) gWidgetData[m_screen].gNWPixmapCacheList->RemoveCache(this); delete[] pData; } + void NWPixmapCache::ThemeChanged() { // throw away cached pixmaps - int i; - for(i=0; i<m_size; i++) + for(int i=0; i<m_size; i++) pData[i].SetPixmap( NULL ); } -BOOL NWPixmapCache::Find( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap** pPixmap ) +BOOL NWPixmapCache::Find( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap** pPixmap ) { aState &= ~CTRL_CACHING_ALLOWED; // mask clipping flag - int i; - for(i=0; i<m_size; i++) + for(int i=0; i<m_size; i++) { if( pData[i].m_nType == aType && pData[i].m_nState == aState && @@ -354,11 +361,11 @@ pData[m_idx].SetPixmap( pPixmap ); } - void NWPixmapCacheList::AddCache( NWPixmapCache* pCache ) { mCaches.push_back( pCache ); } + void NWPixmapCacheList::RemoveCache( NWPixmapCache* pCache ) { ::std::vector< NWPixmapCache* >::iterator p; @@ -366,6 +373,7 @@ if( p != mCaches.end() ) mCaches.erase( p ); } + void NWPixmapCacheList::ThemeChanged( ) { ::std::vector< NWPixmapCache* >::iterator p = mCaches.begin(); @@ -382,10 +390,10 @@ *********************************************************/ inline void NW_gtk_border_set_from_border( GtkBorder& aDst, const GtkBorder * pSrc ) { - aDst.left = pSrc->left; - aDst.top = pSrc->top; - aDst.right = pSrc->right; - aDst.bottom = pSrc->bottom; + aDst.left = pSrc->left; + aDst.top = pSrc->top; + aDst.right = pSrc->right; + aDst.bottom = pSrc->bottom; } @@ -535,41 +543,41 @@ */ BOOL GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart ) { - if ( - ((nType==CTRL_PUSHBUTTON) && (nPart==PART_ENTIRE_CONTROL)) || - ((nType==CTRL_RADIOBUTTON) && (nPart==PART_ENTIRE_CONTROL)) || - ((nType==CTRL_CHECKBOX) && (nPart==PART_ENTIRE_CONTROL)) || - ((nType==CTRL_SCROLLBAR) && - ( (nPart==PART_DRAW_BACKGROUND_HORZ) - || (nPart==PART_DRAW_BACKGROUND_VERT) - || (nPart==PART_ENTIRE_CONTROL) - || (nPart==HAS_THREE_BUTTONS) ) ) || - ((nType==CTRL_EDITBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || - ((nType==CTRL_MULTILINE_EDITBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || - ((nType==CTRL_SPINBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==PART_ALL_BUTTONS) - || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || - ((nType==CTRL_SPINBUTTONS) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==PART_ALL_BUTTONS) ) ) || - ((nType==CTRL_COMBOBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || - (((nType==CTRL_TAB_ITEM) || (nType==CTRL_TAB_PANE) || - (nType==CTRL_TAB_BODY) || (nType==CTRL_FIXEDBORDER)) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==PART_TABS_DRAW_RTL) ) ) || - ((nType==CTRL_LISTBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - || (nPart==PART_WINDOW) - || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || + if ( + ((nType==CTRL_PUSHBUTTON) && (nPart==PART_ENTIRE_CONTROL)) || + ((nType==CTRL_RADIOBUTTON) && (nPart==PART_ENTIRE_CONTROL)) || + ((nType==CTRL_CHECKBOX) && (nPart==PART_ENTIRE_CONTROL)) || + ((nType==CTRL_SCROLLBAR) && + ( (nPart==PART_DRAW_BACKGROUND_HORZ) + || (nPart==PART_DRAW_BACKGROUND_VERT) + || (nPart==PART_ENTIRE_CONTROL) + || (nPart==HAS_THREE_BUTTONS) ) ) || + ((nType==CTRL_EDITBOX) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || + ((nType==CTRL_MULTILINE_EDITBOX) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || + ((nType==CTRL_SPINBOX) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==PART_ALL_BUTTONS) + || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || + ((nType==CTRL_SPINBUTTONS) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==PART_ALL_BUTTONS) ) ) || + ((nType==CTRL_COMBOBOX) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || + (((nType==CTRL_TAB_ITEM) || (nType==CTRL_TAB_PANE) || + (nType==CTRL_TAB_BODY) || (nType==CTRL_FIXEDBORDER)) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==PART_TABS_DRAW_RTL) ) ) || + ((nType==CTRL_LISTBOX) && + ( (nPart==PART_ENTIRE_CONTROL) + || (nPart==PART_WINDOW) + || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || ((nType == CTRL_TOOLBAR) && - ( (nPart==PART_ENTIRE_CONTROL) + ( (nPart==PART_ENTIRE_CONTROL) || (nPart==PART_DRAW_BACKGROUND_HORZ) || (nPart==PART_DRAW_BACKGROUND_VERT) || (nPart==PART_THUMB_HORZ) @@ -600,9 +608,9 @@ ) ) ) - return( TRUE ); + return( TRUE ); - return( FALSE ); + return( FALSE ); } @@ -635,10 +643,10 @@ gboolean has_backward; gboolean has_backward2; - gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward, - "has-secondary-forward-stepper", &has_forward2, - "has-backward-stepper", &has_backward, - "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); + gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward, + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); Rectangle aForward; Rectangle aBackward; @@ -705,14 +713,14 @@ } if( IsNativeControlSupported(nType, nPart) ) - { - rIsInside = rControlRegion.IsInside( aPos ); - return( TRUE ); - } - else - { - return( FALSE ); - } + { + rIsInside = rControlRegion.IsInside( aPos ); + return( TRUE ); + } + else + { + return( FALSE ); + } } @@ -738,8 +746,8 @@ return drawNativeMixedStateCheck( nType, nPart, rControlRegion, nState, aValue, rCaption ); } - BOOL returnVal = FALSE; - // get a GC with current clipping region set + BOOL returnVal = FALSE; + // get a GC with current clipping region set SelectFont(); @@ -828,12 +836,9 @@ { returnVal = NWPaintGTKSpinBox( nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption ); } - else if ( (nType == CTRL_COMBOBOX) && - ( (nPart==PART_ENTIRE_CONTROL) - ||(nPart==PART_BUTTON_DOWN) - ) ) + else if ( (nType == CTRL_COMBOBOX) && ((nPart==PART_ENTIRE_CONTROL) || (nPart==PART_BUTTON_DOWN)) ) { - returnVal = NWPaintGTKComboBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption ); + returnVal = NWPaintGTKComboBoxEntry( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption ); } else if ( (nType==CTRL_TAB_ITEM) || (nType==CTRL_TAB_PANE) || (nType==CTRL_TAB_BODY) || (nType==CTRL_FIXEDBORDER) ) { @@ -844,7 +849,7 @@ } else if ( (nType==CTRL_LISTBOX) && ((nPart==PART_ENTIRE_CONTROL) || (nPart==PART_WINDOW)) ) { - returnVal = NWPaintGTKListBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption ); + returnVal = NWPaintGTKComboBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption ); } else if ( (nType== CTRL_TOOLBAR) ) { @@ -961,7 +966,7 @@ const ImplControlValue&, const OUString& ) { - return( FALSE ); + return( FALSE ); } @@ -1001,7 +1006,7 @@ } if ( (nType==CTRL_COMBOBOX) && ((nPart==PART_BUTTON_DOWN) || (nPart==PART_SUB_EDIT)) ) { - rNativeBoundingRegion = NWGetComboBoxButtonRect( m_nScreen, nType, nPart, rControlRegion, nState, + rNativeBoundingRegion = NWGetComboBoxEntryButtonRect( m_nScreen, nType, nPart, rControlRegion, nState, aValue, rCaption ); rNativeContentRegion = rNativeBoundingRegion; @@ -1018,7 +1023,7 @@ } if ( (nType==CTRL_LISTBOX) && ((nPart==PART_BUTTON_DOWN) || (nPart==PART_SUB_EDIT)) ) { - rNativeBoundingRegion = NWGetListBoxButtonRect( m_nScreen, nType, nPart, rControlRegion, nState, + rNativeBoundingRegion = NWGetComboBoxButtonRect( m_nScreen, nType, nPart, rControlRegion, nState, aValue, rCaption ); rNativeContentRegion = rNativeBoundingRegion; @@ -1134,7 +1139,7 @@ returnVal = TRUE; } - return( returnVal ); + return( returnVal ); } @@ -1144,67 +1149,67 @@ BOOL GtkSalGraphics::NWPaintGTKButton( GdkDrawable* gdkDrawable, ControlType, ControlPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList& rClipList, ControlState nState, const ImplControlValue&, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; - gboolean interiorFocus; - gint focusWidth; - gint focusPad; - BOOL bDrawFocus = TRUE; - gint x, y, w, h; - GtkBorder aDefBorder; - GtkBorder* pBorder; - GdkRectangle clipRect; + GtkStateType stateType; + GtkShadowType shadowType; + gboolean interiorFocus; + gint focusWidth; + gint focusPad; + BOOL bDrawFocus = TRUE; + gint x, y, w, h; + GtkBorder aDefBorder; + GtkBorder* pBorder; + GdkRectangle clipRect; - NWEnsureGTKButton( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWEnsureGTKButton( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - x = rControlRectangle.Left(); + x = rControlRectangle.Left(); y = rControlRectangle.Top(); - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); - // Grab some button style attributes - gtk_widget_style_get( gWidgetData[m_nScreen].gBtnWidget, "focus-line-width", &focusWidth, - "focus-padding", &focusPad, - "interior_focus", &interiorFocus, - "default_border", &pBorder, - (char *)NULL ); + // Grab some button style attributes + gtk_widget_style_get( gWidgetData[m_nScreen].gBtnWidget, "focus-line-width", &focusWidth, + "focus-padding", &focusPad, + "interior_focus", &interiorFocus, + "default_border", &pBorder, + (char *)NULL ); - // Make sure the border values exist, otherwise use some defaults - if ( pBorder ) - { - NW_gtk_border_set_from_border( aDefBorder, pBorder ); - gtk_border_free( pBorder ); - } - else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder ); + // Make sure the border values exist, otherwise use some defaults + if ( pBorder ) + { + NW_gtk_border_set_from_border( aDefBorder, pBorder ); + gtk_border_free( pBorder ); + } + else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder ); - // If the button is too small, don't ever draw focus or grab more space - if ( (w < 16) || (h < 16) ) - bDrawFocus = FALSE; + // If the button is too small, don't ever draw focus or grab more space + if ( (w < 16) || (h < 16) ) + bDrawFocus = FALSE; - NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); gint xi = x, yi = y, wi = w, hi = h; - if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus ) - { - xi += aDefBorder.left; - yi += aDefBorder.top; - wi -= aDefBorder.left + aDefBorder.right; - hi -= aDefBorder.top + aDefBorder.bottom; - } + if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus ) + { + xi += aDefBorder.left; + yi += aDefBorder.top; + wi -= aDefBorder.left + aDefBorder.right; + hi -= aDefBorder.top + aDefBorder.bottom; + } - if ( !interiorFocus && bDrawFocus ) - { - xi += focusWidth + focusPad; - yi += focusWidth + focusPad; - wi -= 2 * (focusWidth + focusPad); - hi -= 2 * (focusWidth + focusPad); - } + if ( !interiorFocus && bDrawFocus ) + { + xi += focusWidth + focusPad; + yi += focusWidth + focusPad; + wi -= 2 * (focusWidth + focusPad); + hi -= 2 * (focusWidth + focusPad); + } for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it) { @@ -1225,88 +1230,88 @@ if ( (GTK_BUTTON(gWidgetData[m_nScreen].gBtnWidget)->relief != GTK_RELIEF_NONE) || (nState & CTRL_STATE_PRESSED) - || (nState & CTRL_STATE_ROLLOVER) ) + || (nState & CTRL_STATE_ROLLOVER) ) { gtk_paint_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, stateType, shadowType, &clipRect, gWidgetData[m_nScreen].gBtnWidget, "button", xi, yi, wi, hi ); } } #if 0 // VCL draws focus rects - // Draw focus rect - if ( (nState & CTRL_STATE_FOCUSED) && (nState & CTRL_STATE_ENABLED) && bDrawFocus ) - { - if (interiorFocus) - { - x += gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad; - y += gWidgetData[m_nScreen].gBtnWidget->style->ythickness + focusPad; - w -= 2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad); - h -= 2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad); - } - else - { - x -= focusWidth + focusPad; - y -= focusWidth + focusPad; - w += 2 * (focusWidth + focusPad); - h += 2 * (focusWidth + focusPad); - } - if ( !interiorFocus ) - gtk_paint_focus( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, stateType, &clipRect, + // Draw focus rect + if ( (nState & CTRL_STATE_FOCUSED) && (nState & CTRL_STATE_ENABLED) && bDrawFocus ) + { + if (interiorFocus) + { + x += gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad; + y += gWidgetData[m_nScreen].gBtnWidget->style->ythickness + focusPad; + w -= 2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad); + h -= 2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad); + } + else + { + x -= focusWidth + focusPad; + y -= focusWidth + focusPad; + w += 2 * (focusWidth + focusPad); + h += 2 * (focusWidth + focusPad); + } + if ( !interiorFocus ) + gtk_paint_focus( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, stateType, &clipRect, gWidgetData[m_nScreen].gBtnWidget, "button", x, y, w, h ); - } + } #endif - return( TRUE ); + return( TRUE ); } static Rectangle NWGetButtonArea( int nScreen, ControlType, ControlPart, Rectangle aAreaRect, ControlState nState, const ImplControlValue&, const OUString& ) { - gboolean interiorFocus; - gint focusWidth; - gint focusPad; - GtkBorder aDefBorder; - GtkBorder * pBorder; - BOOL bDrawFocus = TRUE; - Rectangle aRect; - gint x, y, w, h; - - NWEnsureGTKButton( nScreen ); - gtk_widget_style_get( gWidgetData[nScreen].gBtnWidget, - "focus-line-width", &focusWidth, - "focus-padding", &focusPad, - "interior_focus", &interiorFocus, - "default_border", &pBorder, - (char *)NULL ); - - // Make sure the border values exist, otherwise use some defaults - if ( pBorder ) - { - NW_gtk_border_set_from_border( aDefBorder, pBorder ); - gtk_border_free( pBorder ); - } - else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder ); - - x = aAreaRect.Left(); - y = aAreaRect.Top(); - w = aAreaRect.GetWidth(); - h = aAreaRect.GetHeight(); - - // If the button is too small, don't ever draw focus or grab more space - if ( (w < 16) || (h < 16) ) - bDrawFocus = FALSE; - - if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus ) - { - x -= aDefBorder.left; - y -= aDefBorder.top; - w += aDefBorder.left + aDefBorder.right; - h += aDefBorder.top + aDefBorder.bottom; - } + gboolean interiorFocus; + gint focusWidth; + gint focusPad; + GtkBorder aDefBorder; + GtkBorder * pBorder; + BOOL bDrawFocus = TRUE; + Rectangle aRect; + gint x, y, w, h; + + NWEnsureGTKButton( nScreen ); + gtk_widget_style_get( gWidgetData[nScreen].gBtnWidget, + "focus-line-width", &focusWidth, + "focus-padding", &focusPad, + "interior_focus", &interiorFocus, + "default_border", &pBorder, + (char *)NULL ); + + // Make sure the border values exist, otherwise use some defaults + if ( pBorder ) + { + NW_gtk_border_set_from_border( aDefBorder, pBorder ); + gtk_border_free( pBorder ); + } + else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder ); + + x = aAreaRect.Left(); + y = aAreaRect.Top(); + w = aAreaRect.GetWidth(); + h = aAreaRect.GetHeight(); + + // If the button is too small, don't ever draw focus or grab more space + if ( (w < 16) || (h < 16) ) + bDrawFocus = FALSE; + + if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus ) + { + x -= aDefBorder.left; + y -= aDefBorder.top; + w += aDefBorder.left + aDefBorder.right; + h += aDefBorder.top + aDefBorder.bottom; + } aRect = Rectangle( Point( x, y ), Size( w, h ) ); - return( aRect ); + return( aRect ); } //------------------------------------- @@ -1319,15 +1324,15 @@ const ImplControlValue& aValue, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; - BOOL isChecked = (aValue.getTristateVal()==BUTTONVALUE_ON); + GtkStateType stateType; + GtkShadowType shadowType; + BOOL isChecked = (aValue.getTristateVal()==BUTTONVALUE_ON); gint x, y; - GdkRectangle clipRect; + GdkRectangle clipRect; - NWEnsureGTKButton( m_nScreen ); - NWEnsureGTKRadio( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWEnsureGTKButton( m_nScreen ); + NWEnsureGTKRadio( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); gint indicator_size; gtk_widget_style_get( gWidgetData[m_nScreen].gRadioWidget, "indicator_size", &indicator_size, (char *)NULL); @@ -1335,22 +1340,22 @@ x = rControlRectangle.Left() + (rControlRectangle.GetWidth()-indicator_size)/2; y = rControlRectangle.Top() + (rControlRectangle.GetHeight()-indicator_size)/2; - // Set the shadow based on if checked or not so we get a freakin checkmark. - shadowType = isChecked ? GTK_SHADOW_IN : GTK_SHADOW_OUT; - NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidget, nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidgetSibling, nState, stateType ); + // Set the shadow based on if checked or not so we get a freakin checkmark. + shadowType = isChecked ? GTK_SHADOW_IN : GTK_SHADOW_OUT; + NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidgetSibling, nState, stateType ); - // GTK enforces radio groups, so that if we don't have 2 buttons in the group, - // the single button will always be active. So we have to have 2 buttons. + // GTK enforces radio groups, so that if we don't have 2 buttons in the group, + // the single button will always be active. So we have to have 2 buttons. // #i59666# set the members directly where we should use // gtk_toggle_button_set_active. reason: there are animated themes // which are in active state only after a while leading to painting // intermediate states between active/inactive. Let's hope that // GtkToggleButtone stays binary compatible. - if (!isChecked) - GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidgetSibling)->active = TRUE; - GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidget)->active = isChecked; + if (!isChecked) + GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidgetSibling)->active = TRUE; + GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidget)->active = isChecked; for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) { @@ -1364,7 +1369,7 @@ x, y, indicator_size, indicator_size ); } - return( TRUE ); + return( TRUE ); } //------------------------------------- @@ -1377,15 +1382,15 @@ const ImplControlValue& aValue, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; - BOOL isChecked = (aValue.getTristateVal()==BUTTONVALUE_ON) ? TRUE : FALSE; - GdkRectangle clipRect; - gint x,y; + GtkStateType stateType; + GtkShadowType shadowType; + BOOL isChecked = (aValue.getTristateVal()==BUTTONVALUE_ON) ? TRUE : FALSE; + GdkRectangle clipRect; + gint x,y; - NWEnsureGTKButton( m_nScreen ); - NWEnsureGTKCheck( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWEnsureGTKButton( m_nScreen ); + NWEnsureGTKCheck( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); gint indicator_size; gtk_widget_style_get( gWidgetData[m_nScreen].gCheckWidget, "indicator_size", &indicator_size, (char *)NULL); @@ -1393,10 +1398,10 @@ x = rControlRectangle.Left() + (rControlRectangle.GetWidth()-indicator_size)/2; y = rControlRectangle.Top() + (rControlRectangle.GetHeight()-indicator_size)/2; - // Set the shadow based on if checked or not so we get a checkmark. - shadowType = isChecked ? GTK_SHADOW_IN : GTK_SHADOW_OUT; - NWSetWidgetState( gWidgetData[m_nScreen].gCheckWidget, nState, stateType ); - GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gCheckWidget)->active = isChecked; + // Set the shadow based on if checked or not so we get a checkmark. + shadowType = isChecked ? GTK_SHADOW_IN : GTK_SHADOW_OUT; + NWSetWidgetState( gWidgetData[m_nScreen].gCheckWidget, nState, stateType ); + GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gCheckWidget)->active = isChecked; for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) { @@ -1410,17 +1415,17 @@ x, y, indicator_size, indicator_size ); } - return( TRUE ); + return( TRUE ); } //------------------------------------- static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow ) { - // Size the arrow appropriately + // Size the arrow appropriately Size aSize( rButton.GetWidth()/2, rButton.GetHeight()/2 ); rArrow.SetSize( aSize ); - rArrow.SetPos( Point( + rArrow.SetPos( Point( rButton.Left() + ( rButton.GetWidth() - rArrow.GetWidth() ) / 2, rButton.Top() + ( rButton.GetHeight() - rArrow.GetHeight() ) / 2 ) ); @@ -1470,54 +1475,54 @@ button12BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() ); button21BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() ); - NWEnsureGTKButton( m_nScreen ); - NWEnsureGTKScrollbars( m_nScreen ); - NWEnsureGTKArrow( m_nScreen ); + NWEnsureGTKButton( m_nScreen ); + NWEnsureGTKScrollbars( m_nScreen ); + NWEnsureGTKArrow( m_nScreen ); - // Find the overall bounding rect of the control - pixmapRect = rControlRectangle; + // Find the overall bounding rect of the control + pixmapRect = rControlRectangle; pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 1, pixmapRect.GetHeight() + 1 ) ); - scrollbarRect = pixmapRect; + scrollbarRect = pixmapRect; - if ( (scrollbarRect.GetWidth() <= 1) || (scrollbarRect.GetHeight() <= 1) ) - return( TRUE ); + if ( (scrollbarRect.GetWidth() <= 1) || (scrollbarRect.GetHeight() <= 1) ) + return( TRUE ); - // Grab some button style attributes - gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, + // Grab some button style attributes + gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "slider_width", &slider_width, - "stepper_size", &stepper_size, - "trough_border", &trough_border, - "stepper_spacing", &stepper_spacing, - "min_slider_length", &min_slider_length, (char *)NULL ); + "stepper_size", &stepper_size, + "trough_border", &trough_border, + "stepper_spacing", &stepper_spacing, + "min_slider_length", &min_slider_length, (char *)NULL ); gboolean has_forward; gboolean has_forward2; gboolean has_backward; gboolean has_backward2; - gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward, - "has-secondary-forward-stepper", &has_forward2, - "has-backward-stepper", &has_backward, - "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); - gint magic = trough_border ? 1 : 0; + gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward, + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); + gint magic = trough_border ? 1 : 0; gint nFirst = 0; if ( has_backward ) nFirst += 1; if ( has_forward2 ) nFirst += 1; - if ( nPart == PART_DRAW_BACKGROUND_HORZ ) - { - unsigned int sliderHeight = slider_width + (trough_border * 2); - vShim = (pixmapRect.GetHeight() - sliderHeight) / 2; + if ( nPart == PART_DRAW_BACKGROUND_HORZ ) + { + unsigned int sliderHeight = slider_width + (trough_border * 2); + vShim = (pixmapRect.GetHeight() - sliderHeight) / 2; - scrollbarRect.Move( 0, vShim ); - scrollbarRect.SetSize( Size( scrollbarRect.GetWidth(), sliderHeight ) ); + scrollbarRect.Move( 0, vShim ); + scrollbarRect.SetSize( Size( scrollbarRect.GetWidth(), sliderHeight ) ); - scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollHorizWidget ); - scrollbarOrientation = GTK_ORIENTATION_HORIZONTAL; - scrollbarTag = scrollbarTagH; - button1Type = GTK_ARROW_LEFT; - button2Type = GTK_ARROW_RIGHT; + scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollHorizWidget ); + scrollbarOrientation = GTK_ORIENTATION_HORIZONTAL; + scrollbarTag = scrollbarTagH; + button1Type = GTK_ARROW_LEFT; + button2Type = GTK_ARROW_RIGHT; if ( has_backward ) { @@ -1542,33 +1547,33 @@ button21BoundRect.SetSize( Size( stepper_size, slider_width ) ); button22BoundRect.SetSize( Size( stepper_size, slider_width ) ); - thumbRect.Bottom() = thumbRect.Top() + slider_width - 1; - // Make sure the thumb is at least the default width (so we don't get tiny thumbs), - // but if the VCL gives us a size smaller than the theme's default thumb size, - // honor the VCL size + thumbRect.Bottom() = thumbRect.Top() + slider_width - 1; + // Make sure the thumb is at least the default width (so we don't get tiny thumbs), + // but if the VCL gives us a size smaller than the theme's default thumb size, + // honor the VCL size #if 0 - if ( (thumbRect.GetWidth() < min_slider_length) - && ((scrollbarRect.GetWidth()-button1BoundRect.GetWidth()-button2BoundRect.GetWidth()) > min_slider_length) ) - thumbRect.SetSize( Size( min_slider_length, thumbRect.GetHeight() ) ); + if ( (thumbRect.GetWidth() < min_slider_length) + && ((scrollbarRect.GetWidth()-button1BoundRect.GetWidth()-button2BoundRect.GetWidth()) > min_slider_length) ) + thumbRect.SetSize( Size( min_slider_length, thumbRect.GetHeight() ) ); #endif thumbRect.Right() += magic; - // Center vertically in the track - thumbRect.Move( 0, (scrollbarRect.GetHeight() - slider_width) / 2 ); - } - else - { - unsigned int sliderWidth = slider_width + (trough_border * 2); - hShim = (pixmapRect.GetWidth() - sliderWidth) / 2; + // Center vertically in the track + thumbRect.Move( 0, (scrollbarRect.GetHeight() - slider_width) / 2 ); + } + else + { + unsigned int sliderWidth = slider_width + (trough_border * 2); + hShim = (pixmapRect.GetWidth() - sliderWidth) / 2; - scrollbarRect.Move( hShim, 0 ); - scrollbarRect.SetSize( Size( sliderWidth, scrollbarRect.GetHeight() ) ); + scrollbarRect.Move( hShim, 0 ); + scrollbarRect.SetSize( Size( sliderWidth, scrollbarRect.GetHeight() ) ); - scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollVertWidget ); - scrollbarOrientation = GTK_ORIENTATION_VERTICAL; - scrollbarTag = scrollbarTagV; - button1Type = GTK_ARROW_UP; - button2Type = GTK_ARROW_DOWN; + scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollVertWidget ); + scrollbarOrientation = GTK_ORIENTATION_VERTICAL; + scrollbarTag = scrollbarTagV; + button1Type = GTK_ARROW_UP; + button2Type = GTK_ARROW_DOWN; if ( has_backward ) { @@ -1577,7 +1582,7 @@ } button11BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, trough_border ); button11BoundRect.SetSize( Size( slider_width, stepper_size ) ); - button12BoundRect.SetSize( Size( slider_width, stepper_size ) ); + button12BoundRect.SetSize( Size( slider_width, stepper_size ) ); if ( has_backward2 ) { @@ -1592,41 +1597,41 @@ button21BoundRect.SetSize( Size( slider_width, stepper_size ) ); button22BoundRect.SetSize( Size( slider_width, stepper_size ) ); - thumbRect.Right() = thumbRect.Left() + slider_width - 1; + thumbRect.Right() = thumbRect.Left() + slider_width - 1; #if 0 - // Make sure the thumb is at least the default width (so we don't get tiny thumbs), - // but if the VCL gives us a size smaller than the theme's default thumb size, - // honor the VCL size - if ( (thumbRect.GetHeight() < min_slider_length) - && ((scrollbarRect.GetHeight()-button1BoundRect.GetHeight()-button2BoundRect.GetHeight()) > min_slider_length) ) - thumbRect.SetSize( Size( thumbRect.GetWidth(), min_slider_length ) ); + // Make sure the thumb is at least the default width (so we don't get tiny thumbs), + // but if the VCL gives us a size smaller than the theme's default thumb size, + // honor the VCL size + if ( (thumbRect.GetHeight() < min_slider_length) + && ((scrollbarRect.GetHeight()-button1BoundRect.GetHeight()-button2BoundRect.GetHeight()) > min_slider_length) ) + thumbRect.SetSize( Size( thumbRect.GetWidth(), min_slider_length ) ); #endif thumbRect.Bottom() += magic; - // Center horizontally in the track - thumbRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, 0 ); - } + // Center horizontally in the track + thumbRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, 0 ); + } BOOL has_slider = ( thumbRect.GetWidth() > 0 && thumbRect.GetHeight() > 0 ); - scrollbarValues = gtk_range_get_adjustment( GTK_RANGE(scrollbarWidget) ); - if ( scrollbarValues == NULL ) - scrollbarValues = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); - if ( nPart == PART_DRAW_BACKGROUND_HORZ ) - { - scrollbarValues->lower = pScrollbarVal->mnMin; - scrollbarValues->upper = pScrollbarVal->mnMax; - scrollbarValues->value = pScrollbarVal->mnCur; - scrollbarValues->page_size = scrollbarRect.GetWidth() / 2; - } - else - { - scrollbarValues->lower = pScrollbarVal->mnMin; - scrollbarValues->upper = pScrollbarVal->mnMax; - scrollbarValues->value = pScrollbarVal->mnCur; - scrollbarValues->page_size = scrollbarRect.GetHeight() / 2; - } - gtk_adjustment_changed( scrollbarValues ); + scrollbarValues = gtk_range_get_adjustment( GTK_RANGE(scrollbarWidget) ); + if ( scrollbarValues == NULL ) + scrollbarValues = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); + if ( nPart == PART_DRAW_BACKGROUND_HORZ ) + { + scrollbarValues->lower = pScrollbarVal->mnMin; + scrollbarValues->upper = pScrollbarVal->mnMax; + scrollbarValues->value = pScrollbarVal->mnCur; + scrollbarValues->page_size = scrollbarRect.GetWidth() / 2; + } + else + { + scrollbarValues->lower = pScrollbarVal->mnMin; + scrollbarValues->upper = pScrollbarVal->mnMax; + scrollbarValues->value = pScrollbarVal->mnCur; + scrollbarValues->page_size = scrollbarRect.GetHeight() / 2; + } + gtk_adjustment_changed( scrollbarValues ); // as multiple paints are required for the scrollbar // painting them directly to the window flickers @@ -1641,81 +1646,81 @@ GdkDrawable* const &gdkDrawable = GDK_DRAWABLE( pixmap ); GdkRectangle* gdkRect = NULL; - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - NWSetWidgetState( GTK_WIDGET(scrollbarWidget), nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); - style = GTK_WIDGET( scrollbarWidget )->style; + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWSetWidgetState( GTK_WIDGET(scrollbarWidget), nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); + style = GTK_WIDGET( scrollbarWidget )->style; - // ----------------- TROUGH - gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, + // ----------------- TROUGH + gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE, gdkRect, m_pWindow, "base", x, y, w, h ); - gtk_paint_box( style, gdkDrawable, GTK_STATE_ACTIVE, GTK_SHADOW_IN, + gtk_paint_box( style, gdkDrawable, GTK_STATE_ACTIVE, GTK_SHADOW_IN, gdkRect, GTK_WIDGET(scrollbarWidget), "trough", x, y, scrollbarRect.GetWidth(), scrollbarRect.GetHeight() ); - if ( nState & CTRL_STATE_FOCUSED ) - { - gtk_paint_focus( style, gdkDrawable, GTK_STATE_ACTIVE, + if ( nState & CTRL_STATE_FOCUSED ) + { + gtk_paint_focus( style, gdkDrawable, GTK_STATE_ACTIVE, gdkRect, GTK_WIDGET(scrollbarWidget), "trough", x, y, scrollbarRect.GetWidth(), scrollbarRect.GetHeight() ); - } + } - // ----------------- THUMB + // ----------------- THUMB if ( has_slider ) { - NWConvertVCLStateToGTKState( pScrollbarVal->mnThumbState, &stateType, &shadowType ); - if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED ) stateType = GTK_STATE_PRELIGHT; - gtk_paint_slider( style, gdkDrawable, stateType, GTK_SHADOW_OUT, + NWConvertVCLStateToGTKState( pScrollbarVal->mnThumbState, &stateType, &shadowType ); + if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED ) stateType = GTK_STATE_PRELIGHT; + gtk_paint_slider( style, gdkDrawable, stateType, GTK_SHADOW_OUT, gdkRect, GTK_WIDGET(scrollbarWidget), "slider", x+hShim+thumbRect.Left(), y+vShim+thumbRect.Top(), thumbRect.GetWidth(), thumbRect.GetHeight(), scrollbarOrientation ); } - // ----------------- BUTTON 1 // - if ( has_backward ) - { + // ----------------- BUTTON 1 // + if ( has_backward ) + { NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", x+hShim+button11BoundRect.Left(), y+vShim+button11BoundRect.Top(), button11BoundRect.GetWidth(), button11BoundRect.GetHeight() ); // ----------------- ARROW 1 - NWCalcArrowRect( button11BoundRect, arrowRect ); - gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + NWCalcArrowRect( button11BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, TRUE, x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(), arrowRect.GetWidth(), arrowRect.GetHeight() ); } - if ( has_forward2 ) - { + if ( has_forward2 ) + { NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", x+hShim+button12BoundRect.Left(), y+vShim+button12BoundRect.Top(), button12BoundRect.GetWidth(), button12BoundRect.GetHeight() ); // ----------------- ARROW 1 - NWCalcArrowRect( button12BoundRect, arrowRect ); - gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + NWCalcArrowRect( button12BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, TRUE, x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(), arrowRect.GetWidth(), arrowRect.GetHeight() ); } - // ----------------- BUTTON 2 + // ----------------- BUTTON 2 if ( has_backward2 ) { NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", x+hShim+button21BoundRect.Left(), y+vShim+button21BoundRect.Top(), button21BoundRect.GetWidth(), button21BoundRect.GetHeight() ); - // ----------------- ARROW 2 - NWCalcArrowRect( button21BoundRect, arrowRect ); + // ----------------- ARROW 2 + NWCalcArrowRect( button21BoundRect, arrowRect ); gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, TRUE, x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(), @@ -1724,13 +1729,13 @@ if ( has_forward ) { NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", x+hShim+button22BoundRect.Left(), y+vShim+button22BoundRect.Top(), button22BoundRect.GetWidth(), button22BoundRect.GetHeight() ); - // ----------------- ARROW 2 - NWCalcArrowRect( button22BoundRect, arrowRect ); + // ----------------- ARROW 2 + NWCalcArrowRect( button22BoundRect, arrowRect ); gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, TRUE, x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(), @@ -1744,12 +1749,12 @@ } g_object_unref( pixmap ); - return( TRUE ); + return( TRUE ); } //--- -static Rectangle NWGetScrollButtonRect( int nScreen, ControlPart nPart, Rectangle aAreaRect ) +static Rectangle NWGetScrollButtonRect( int nScreen, ControlPart nPart, Rectangle aAreaRect ) { gint slider_width; gint stepper_size; @@ -1758,26 +1763,26 @@ NWEnsureGTKScrollbars( nScreen ); - // Grab some button style attributes - gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget, + // Grab some button style attributes + gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget, "slider-width", &slider_width, - "stepper-size", &stepper_size, - "trough-border", &trough_border, - "stepper-spacing", &stepper_spacing, (char *)NULL ); + "stepper-size", &stepper_size, + "trough-border", &trough_border, + "stepper-spacing", &stepper_spacing, (char *)NULL ); gboolean has_forward; gboolean has_forward2; gboolean has_backward; gboolean has_backward2; - gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget, + gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward, - "has-secondary-forward-stepper", &has_forward2, - "has-backward-stepper", &has_backward, - "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); - gint buttonWidth; - gint buttonHeight; - Rectangle buttonRect; + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, (char *)NULL ); + gint buttonWidth; + gint buttonHeight; + Rectangle buttonRect; gint nFirst = 0; gint nSecond = 0; @@ -1827,7 +1832,7 @@ buttonRect.SetSize( Size( buttonWidth, buttonHeight ) ); - return( buttonRect ); + return( buttonRect ); } //------------------------------------- @@ -1840,7 +1845,7 @@ const ImplControlValue& aValue, const OUString& rCaption ) { - Rectangle pixmapRect; + Rectangle pixmapRect; GdkRectangle clipRect; // Find the overall bounding rect of the buttons's drawing area, @@ -1857,7 +1862,7 @@ NWPaintOneEditBox( m_nScreen, gdkDrawable, &clipRect, nType, nPart, pixmapRect, nState, aValue, rCaption ); } - return( TRUE ); + return( TRUE ); } @@ -1867,31 +1872,31 @@ */ static Rectangle NWGetEditBoxPixmapRect(int nScreen, ControlType, - ControlPart, + ControlPart, Rectangle aAreaRect, ControlState, const ImplControlValue&, const OUString& ) { - Rectangle pixmapRect = aAreaRect; - gboolean interiorFocus; - gint focusWidth; - - NWEnsureGTKEditBox( nScreen ); - - // Grab some entry style attributes - gtk_widget_style_get( gWidgetData[nScreen].gEditBoxWidget, - "focus-line-width", &focusWidth, - "interior-focus", &interiorFocus, (char *)NULL ); + Rectangle pixmapRect = aAreaRect; + gboolean interiorFocus; + gint focusWidth; - if ( !interiorFocus ) - { - pixmapRect.Move( -(focusWidth), -(focusWidth) ); + NWEnsureGTKEditBox( nScreen ); + + // Grab some entry style attributes + gtk_widget_style_get( gWidgetData[nScreen].gEditBoxWidget, + "focus-line-width", &focusWidth, + "interior-focus", &interiorFocus, (char *)NULL ); + + if ( !interiorFocus ) + { + pixmapRect.Move( -(focusWidth), -(focusWidth) ); pixmapRect.SetSize( Size( pixmapRect.GetWidth() + (2*(focusWidth)), pixmapRect.GetHeight() + (2*(focusWidth)) ) ); - } + } - return( pixmapRect ); + return( pixmapRect ); } @@ -1899,67 +1904,66 @@ * All coordinates should be local to the Pixmap, NOT * screen/window coordinates. */ -static void NWPaintOneEditBox( int nScreen, +static void NWPaintOneEditBox( int nScreen, GdkDrawable * gdkDrawable, - GdkRectangle * gdkRect, - ControlType nType, + GdkRectangle * gdkRect, + ControlType nType, ControlPart, - Rectangle aEditBoxRect, - ControlState nState, + Rectangle aEditBoxRect, + ControlState nState, const ImplControlValue&, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; - GtkWidget *widget; - - NWEnsureGTKButton( nScreen ); - NWEnsureGTKEditBox( nScreen ); - NWEnsureGTKSpinButton( nScreen ); - NWEnsureGTKCombo( nScreen ); - NWEnsureGTKScrolledWindow( nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + GtkStateType stateType; + GtkShadowType shadowType; + GtkWidget *widget; + + NWEnsureGTKButton( nScreen ); + NWEnsureGTKEditBox( nScreen ); + NWEnsureGTKSpinButton( nScreen ); + NWEnsureGTKComboBoxEntry( nScreen ); + NWEnsureGTKScrolledWindow( nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); /* border's shadowType for gtk entries is always GTK_SHADOW_IN (see gtkentry.c) shadowType = GTK_SHADOW_IN; */ - switch ( nType ) - { - case CTRL_SPINBOX: - widget = gWidgetData[nScreen].gSpinButtonWidget; - break; - + switch ( nType ) + { + case CTRL_SPINBOX: + widget = gWidgetData[nScreen].gSpinButtonWidget; + break; case CTRL_MULTILINE_EDITBOX: widget = gWidgetData[nScreen].gScrolledWindowWidget; break; - case CTRL_COMBOBOX: - widget = GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry; - break; - - default: - widget = gWidgetData[nScreen].gEditBoxWidget; - break; - } + case CTRL_LISTBOX: + case CTRL_COMBOBOX: + widget = gWidgetData[nScreen].gComboBoxEntry_EntryWidget; + break; + default: + widget = gWidgetData[nScreen].gEditBoxWidget; + break; + } - if ( stateType == GTK_STATE_PRELIGHT ) - stateType = GTK_STATE_NORMAL; + if ( stateType == GTK_STATE_PRELIGHT ) + stateType = GTK_STATE_NORMAL; - // Blueprint needs to paint entry_bg with a Button widget, not an Entry widget to get - // a nice white (or whatever default color) background + // Blueprint needs to paint entry_bg with a Button widget, not an Entry widget to get + // a nice white (or whatever default color) background GtkWidget* pBGWidget = widget; if( GtkSalGraphics::bNeedButtonStyleAsEditBackgroundWorkaround ) { NWSetWidgetState( gWidgetData[nScreen].gBtnWidget, nState, stateType ); pBGWidget = gWidgetData[nScreen].gBtnWidget; } - NWSetWidgetState( widget, nState, stateType ); + NWSetWidgetState( widget, nState, stateType ); - gtk_paint_flat_box( pBGWidget->style, gdkDrawable, stateType, GTK_SHADOW_NONE, + gtk_paint_flat_box( pBGWidget->style, gdkDrawable, stateType, GTK_SHADOW_NONE, gdkRect, pBGWidget, "entry_bg", aEditBoxRect.Left(), aEditBoxRect.Top(), aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() ); - gtk_paint_shadow( widget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_IN, + gtk_paint_shadow( widget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_IN, gdkRect, widget, "entry", aEditBoxRect.Left(), aEditBoxRect.Top(), aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() ); @@ -2068,33 +2072,33 @@ static Rectangle NWGetSpinButtonRect( int nScreen, ControlType, - ControlPart nPart, - Rectangle aAreaRect, + ControlPart nPart, + Rectangle aAreaRect, ControlState, const ImplControlValue&, const OUString& ) { - gint buttonSize; - Rectangle buttonRect; + gint buttonSize; + Rectangle buttonRect; - NWEnsureGTKSpinButton( nScreen ); + NWEnsureGTKSpinButton( nScreen ); - buttonSize = MAX( PANGO_PIXELS( pango_font_description_get_size(GTK_WIDGET(gWidgetData[nScreen].gSpinButtonWidget)->style->font_desc) ), - MIN_SPIN_ARROW_WIDTH ); - buttonSize -= buttonSize % 2 - 1; /* force odd */ - buttonRect.SetSize( Size( buttonSize + 2 * gWidgetData[nScreen].gSpinButtonWidget->style->xthickness, + buttonSize = MAX( PANGO_PIXELS( pango_font_description_get_size(GTK_WIDGET(gWidgetData[nScreen].gSpinButtonWidget)->style->font_desc) ), + MIN_SPIN_ARROW_WIDTH ); + buttonSize -= buttonSize % 2 - 1; /* force odd */ + buttonRect.SetSize( Size( buttonSize + 2 * gWidgetData[nScreen].gSpinButtonWidget->style->xthickness, buttonRect.GetHeight() ) ); - buttonRect.setX( aAreaRect.Left() + (aAreaRect.GetWidth() - buttonRect.GetWidth()) ); - if ( nPart == PART_BUTTON_UP ) - { - buttonRect.setY( aAreaRect.Top() ); - buttonRect.Bottom() = buttonRect.Top() + (aAreaRect.GetHeight() / 2); - } - else if( nPart == PART_BUTTON_DOWN ) - { - buttonRect.setY( aAreaRect.Top() + (aAreaRect.GetHeight() / 2) ); - buttonRect.Bottom() = aAreaRect.Bottom(); // cover area completely - } + buttonRect.setX( aAreaRect.Left() + (aAreaRect.GetWidth() - buttonRect.GetWidth()) ); + if ( nPart == PART_BUTTON_UP ) + { + buttonRect.setY( aAreaRect.Top() ); + buttonRect.Bottom() = buttonRect.Top() + (aAreaRect.GetHeight() / 2); + } + else if( nPart == PART_BUTTON_DOWN ) + { + buttonRect.setY( aAreaRect.Top() + (aAreaRect.GetHeight() / 2) ); + buttonRect.Bottom() = aAreaRect.Bottom(); // cover area completely + } else { buttonRect.Right() = buttonRect.Left()-1; @@ -2103,7 +2107,7 @@ buttonRect.Bottom() = aAreaRect.Bottom(); } - return( buttonRect ); + return( buttonRect ); } //--- @@ -2137,22 +2141,24 @@ arrowSize = (buttonRect.GetWidth() - (2 * gWidgetData[nScreen].gSpinButtonWidget->style->xthickness)) - 4; arrowSize -= arrowSize % 2 - 1; /* force odd */ arrowRect.SetSize( Size( arrowSize, arrowSize ) ); - arrowRect.setX( buttonRect.Left() + (buttonRect.GetWidth() - arrowRect.GetWidth()) / 2 ); - if ( nPart == PART_BUTTON_UP ) - arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 + 1); - else - arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 - 1); + arrowRect.setX( buttonRect.Left() + (buttonRect.GetWidth() - arrowRect.GetWidth()) / 2 ); + if ( nPart == PART_BUTTON_UP ) + arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 + 1); + else + arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 - 1); - gtk_paint_arrow( gWidgetData[nScreen].gSpinButtonWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[nScreen].gSpinButtonWidget, - "spinbutton", (nPart == PART_BUTTON_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN, TRUE, - (arrowRect.Left() - aAreaRect.Left()), (arrowRect.Top() - aAreaRect.Top()), - arrowRect.GetWidth(), arrowRect.GetHeight() ); + gtk_paint_arrow( gWidgetData[nScreen].gSpinButtonWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[nScreen].gSpinButtonWidget, + "spinbutton", (nPart == PART_BUTTON_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN, TRUE, + (arrowRect.Left() - aAreaRect.Left()), (arrowRect.Top() - aAreaRect.Top()), + arrowRect.GetWidth(), arrowRect.GetHeight() ); } //------------------------------------- -BOOL GtkSalGraphics::NWPaintGTKComboBox( GdkDrawable* gdkDrawable, +#define ARROW_EXTENT 0.7 + +BOOL GtkSalGraphics::NWPaintGTKComboBoxEntry( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart, const Rectangle& rControlRectangle, const clipList& rClipList, @@ -2160,40 +2166,37 @@ const ImplControlValue& aValue, const OUString& rCaption ) { - Rectangle pixmapRect; - Rectangle buttonRect; - GtkStateType stateType; - GtkShadowType shadowType; - Rectangle arrowRect; - gint x,y; - GdkRectangle clipRect; - - NWEnsureGTKButton( m_nScreen ); - NWEnsureGTKArrow( m_nScreen ); - NWEnsureGTKCombo( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + Rectangle pixmapRect; + Rectangle buttonRect; + GtkStateType stateType; + GtkShadowType shadowType; + Rectangle arrowRect; + gint x,y; + GdkRectangle clipRect; - // Find the overall bounding rect of the buttons's drawing area, - // plus its actual draw rect excluding adornment - pixmapRect = rControlRectangle; + NWEnsureGTKButton( m_nScreen ); + NWEnsureGTKComboBoxEntry( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + + // Find the overall bounding rect of the buttons's drawing area, + // plus its actual draw rect excluding adornment + pixmapRect = rControlRectangle; x = rControlRectangle.Left(); y = rControlRectangle.Top(); - NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gComboWidget, nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gArrowWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gComboBoxEntryWidget, nState, stateType ); - buttonRect = NWGetComboBoxButtonRect( m_nScreen, nType, PART_BUTTON_DOWN, pixmapRect, nState, aValue, rCaption ); + buttonRect = NWGetComboBoxEntryButtonRect( m_nScreen, nType, PART_BUTTON_DOWN, pixmapRect, nState, aValue, rCaption ); if( nPart == PART_BUTTON_DOWN ) buttonRect.Left() += 1; - Rectangle aEditBoxRect( pixmapRect ); - aEditBoxRect.SetSize( Size( pixmapRect.GetWidth() - buttonRect.GetWidth(), aEditBoxRect.GetHeight() ) ); + Rectangle aEditBoxRect( pixmapRect ); + aEditBoxRect.SetSize( Size( pixmapRect.GetWidth() - buttonRect.GetWidth(), aEditBoxRect.GetHeight() ) ); - #define ARROW_EXTENT 0.7 - arrowRect.SetSize( Size( (gint)(MIN_ARROW_SIZE * ARROW_EXTENT), - (gint)(MIN_ARROW_SIZE * ARROW_EXTENT) ) ); - arrowRect.SetPos( Point( buttonRect.Left() + (gint)((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2), + arrowRect.SetSize( Size( (gint)(MIN_ARROW_SIZE * ARROW_EXTENT), + (gint)(MIN_ARROW_SIZE * ARROW_EXTENT) ) ); + arrowRect.SetPos( Point( buttonRect.Left() + (gint)((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2), buttonRect.Top() + (gint)((buttonRect.GetHeight() - arrowRect.GetHeight()) / 2) ) ); for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) @@ -2213,48 +2216,163 @@ x+(buttonRect.Left() - pixmapRect.Left()), y+(buttonRect.Top() - pixmapRect.Top()), buttonRect.GetWidth(), buttonRect.GetHeight() ); - gtk_paint_box( GTK_COMBO(gWidgetData[m_nScreen].gComboWidget)->button->style, gdkDrawable, stateType, shadowType, - &clipRect, GTK_COMBO(gWidgetData[m_nScreen].gComboWidget)->button, "button", + gtk_paint_box( gWidgetData[m_nScreen].gComboBoxEntry_ButtonWidget->style, gdkDrawable, stateType, shadowType, + &clipRect, gWidgetData[m_nScreen].gComboBoxEntry_ButtonWidget, "button", x+(buttonRect.Left() - pixmapRect.Left()), y+(buttonRect.Top() - pixmapRect.Top()), buttonRect.GetWidth(), buttonRect.GetHeight() ); - gtk_paint_arrow( gWidgetData[m_nScreen].gArrowWidget->style, gdkDrawable, stateType, shadowType, - &clipRect, gWidgetData[m_nScreen].gArrowWidget, "arrow", GTK_ARROW_DOWN, TRUE, + gtk_paint_arrow( gWidgetData[m_nScreen].gComboBoxEntry_ArrowWidget->style, gdkDrawable, stateType, shadowType, + &clipRect, gWidgetData[m_nScreen].gComboBoxEntry_ArrowWidget, "arrow", GTK_ARROW_DOWN, TRUE, x+(arrowRect.Left() - pixmapRect.Left()), y+(arrowRect.Top() - pixmapRect.Top()), arrowRect.GetWidth(), arrowRect.GetHeight() ); } - return( TRUE ); + return( TRUE ); +} + +BOOL GtkSalGraphics::NWPaintGTKComboBox( GdkDrawable* gdkDrawable, + ControlType nType, ControlPart nPart, + const Rectangle& rControlRectangle, + const clipList& rClipList, + ControlState nState, + const ImplControlValue& aValue, + const OUString& rCaption ) +{ + Rectangle pixmapRect; + Rectangle buttonRect; + GtkStateType stateType; + GtkShadowType shadowType; + Rectangle arrowRect; + gint x,y; + GdkRectangle clipRect; + + NWEnsureGTKButton( m_nScreen ); + NWEnsureGTKComboBox( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + + // Find the overall bounding rect of the buttons's drawing area, + // plus its actual draw rect excluding adornment + pixmapRect = rControlRectangle; + if ( nPart == PART_WINDOW ) + { + // Make the widget a _bit_ bigger + pixmapRect.SetPos( Point( pixmapRect.Left() - 1, + pixmapRect.Top() - 1 ) ); + pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 2, + pixmapRect.GetHeight() + 2 ) ); + } + x = pixmapRect.Left(); + y = pixmapRect.Top(); + + NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gComboBoxWidget, nState, stateType ); + + buttonRect = NWGetComboBoxButtonRect( m_nScreen, nType, PART_BUTTON_DOWN, pixmapRect, nState, aValue, rCaption ); + if( nPart == PART_BUTTON_DOWN ) + buttonRect.Left() += 1; + + arrowRect.SetSize( Size( (gint)(MIN_ARROW_SIZE * ARROW_EXTENT), + (gint)(MIN_ARROW_SIZE * ARROW_EXTENT) ) ); + arrowRect.SetPos( Point( buttonRect.Left() + (gint)((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2), + buttonRect.Top() + (gint)((buttonRect.GetHeight() - arrowRect.GetHeight()) / 2) ) ); + + for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) + { + clipRect.x = it->Left(); + clipRect.y = it->Top(); + clipRect.width = it->GetWidth(); + clipRect.height = it->GetHeight(); + + if ( nPart != PART_WINDOW ) + { + // Buttons must paint opaque since some themes have alpha-channel enabled buttons + gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE, + &clipRect, m_pWindow, "base", + x+(pixmapRect.Left() - pixmapRect.Left()), + y+(pixmapRect.Top() - pixmapRect.Top()), + pixmapRect.GetWidth(), pixmapRect.GetHeight() ); + + gtk_paint_box( gWidgetData[m_nScreen].gComboBox_ButtonWidget->style, gdkDrawable, stateType, shadowType, + &clipRect, gWidgetData[m_nScreen].gComboBox_ButtonWidget, "button", + x+(pixmapRect.Left() - pixmapRect.Left()), + y+(pixmapRect.Top() - pixmapRect.Top()), + pixmapRect.GetWidth(), pixmapRect.GetHeight() ); + + gtk_paint_arrow( gWidgetData[m_nScreen].gComboBox_ArrowWidget->style, gdkDrawable, stateType, shadowType, + &clipRect, gWidgetData[m_nScreen].gComboBox_ArrowWidget, "arrow", GTK_ARROW_DOWN, TRUE, + x+(arrowRect.Left() - pixmapRect.Left()), y+(arrowRect.Top() - pixmapRect.Top()), + arrowRect.GetWidth(), arrowRect.GetHeight() ); + + if (gWidgetData[m_nScreen].gComboBox_SeparatorWidget) + { + gint nSeparatorWidth; + gboolean bWideSeparators; + gtk_widget_style_get(gWidgetData[m_nScreen].gComboBox_SeparatorWidget, + "wide-separators", &bWideSeparators, + "separator-width", &nSeparatorWidth, + NULL); + + if (bWideSeparators) + { + gtk_paint_box(gWidgetData[m_nScreen].gComboBox_SeparatorWidget->style, + gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT, + &clipRect, gWidgetData[m_nScreen].gComboBox_SeparatorWidget, + "vseparator", x+(arrowRect.Left() - pixmapRect.Left()-nSeparatorWidth), + y+(arrowRect.Top() - pixmapRect.Top()), nSeparatorWidth, arrowRect.GetHeight()); + } + else + { + gtk_paint_vline(gWidgetData[m_nScreen].gComboBox_SeparatorWidget->style, + gdkDrawable, GTK_STATE_NORMAL, &clipRect, + gWidgetData[m_nScreen].gComboBox_SeparatorWidget, "vseparator", + y+(arrowRect.Top() - pixmapRect.Top()), y+(arrowRect.Top() - pixmapRect.Top()) + arrowRect.GetHeight(), + x+(arrowRect.Left() - pixmapRect.Left())- + gWidgetData[m_nScreen].gComboBox_SeparatorWidget->style->xthickness); + } + } + } + else + { + NWEnsureGTKScrolledWindow(m_nScreen); + + gtk_paint_shadow( gWidgetData[m_nScreen].gScrolledWindowWidget->style, gdkDrawable, + GTK_STATE_NORMAL, GTK_SHADOW_IN, &clipRect, + gWidgetData[m_nScreen].gScrolledWindowWidget, "scrolled_window", + x, y, pixmapRect.GetWidth(), pixmapRect.GetHeight() ); + } + } + + return( TRUE ); } //---- -static Rectangle NWGetComboBoxButtonRect( int nScreen, +static Rectangle NWGetComboBoxEntryButtonRect( int nScreen, ControlType, - ControlPart nPart, - Rectangle aAreaRect, + ControlPart nPart, + Rectangle aAreaRect, ControlState, const ImplControlValue&, const OUString& ) { - Rectangle aButtonRect; - gint nArrowWidth; + Rectangle aButtonRect; + gint nArrowWidth; gint nButtonWidth; - gint nFocusWidth; - gint nFocusPad; + gint nFocusWidth; + gint nFocusPad; - NWEnsureGTKArrow( nScreen ); + NWEnsureGTKComboBoxEntry ( nScreen ); - // Grab some button style attributes - gtk_widget_style_get( gWidgetData[nScreen].gDropdownWidget, - "focus-line-width", &nFocusWidth, - "focus-padding", &nFocusPad, (char *)NULL ); + // Grab some button style attributes + gtk_widget_style_get( gWidgetData[nScreen].gComboBoxEntry_ButtonWidget, + "focus-line-width", &nFocusWidth, + "focus-padding", &nFocusPad, (char *)NULL ); - nArrowWidth = MIN_ARROW_SIZE + (GTK_MISC(gWidgetData[nScreen].gArrowWidget)->xpad * 2); + nArrowWidth = MIN_ARROW_SIZE + (GTK_MISC(gWidgetData[nScreen].gComboBoxEntry_ArrowWidget)->xpad * 2); nButtonWidth = nArrowWidth + - ((BTN_CHILD_SPACING + gWidgetData[nScreen].gDropdownWidget->style->xthickness) * 2) - + (2 * (nFocusWidth+nFocusPad)); + ((BTN_CHILD_SPACING + gWidgetData[nScreen].gComboBoxEntry_ButtonWidget->style->xthickness) * 2) + + (2 * (nFocusWidth+nFocusPad)); if( nPart == PART_BUTTON_DOWN ) { aButtonRect.SetSize( Size( nButtonWidth, aAreaRect.GetHeight() ) ); @@ -2263,13 +2381,11 @@ } else if( nPart == PART_SUB_EDIT ) { - NWEnsureGTKCombo( nScreen ); - - gint adjust_x = GTK_CONTAINER(gWidgetData[nScreen].gComboWidget)->border_width + + gint adjust_x = GTK_CONTAINER(gWidgetData[nScreen].gComboBoxEntryWidget)->border_width + nFocusWidth + nFocusPad; - gint adjust_y = adjust_x + gWidgetData[nScreen].gComboWidget->style->ythickness; - adjust_x += gWidgetData[nScreen].gComboWidget->style->xthickness; + gint adjust_y = adjust_x + gWidgetData[nScreen].gComboBoxEntryWidget->style->ythickness; + adjust_x += gWidgetData[nScreen].gComboBoxEntryWidget->style->xthickness; aButtonRect.SetSize( Size( aAreaRect.GetWidth() - nButtonWidth - 2 * adjust_x, aAreaRect.GetHeight() - 2 * adjust_y ) ); Point aEditPos = aAreaRect.TopLeft(); @@ -2281,22 +2397,86 @@ return( aButtonRect ); } -//------------------------------------- +static Rectangle NWGetComboBoxButtonRect( int nScreen, + ControlType, + ControlPart nPart, + Rectangle aAreaRect, + ControlState, + const ImplControlValue&, + const OUString& ) +{ + Rectangle aButtonRect; + gint nArrowWidth; + gint nButtonWidth; + gint nFocusWidth; + gint nFocusPad; + NWEnsureGTKComboBox ( nScreen ); + // Grab some button style attributes + gtk_widget_style_get( gWidgetData[nScreen].gComboBox_ButtonWidget, + "focus-line-width", &nFocusWidth, + "focus-padding", &nFocusPad, (char *)NULL ); - -BOOL GtkSalGraphics::NWPaintGTKTabItem( ControlType nType, ControlPart, - const Rectangle& rControlRectangle, - const clipList&, - ControlState nState, - const ImplControlValue& aValue, - const OUString& ) -{ - OSL_ASSERT( nType != CTRL_TAB_ITEM || aValue.getType() == CTRL_TAB_ITEM ); - GdkPixmap * pixmap; - Rectangle pixmapRect; - Rectangle tabRect; - GtkStateType stateType; + nArrowWidth = MIN_ARROW_SIZE + (GTK_MISC(gWidgetData[nScreen].gComboBox_ArrowWidget)->xpad * 2); + + gint nSeparatorWidth = 0; + if (gWidgetData[nScreen].gComboBox_SeparatorWidget) + { + gboolean bWideSeparators; + gtk_widget_style_get(gWidgetData[nScreen].gComboBox_SeparatorWidget, + "wide-separators", &bWideSeparators, + "separator-width", &nSeparatorWidth, + NULL); + + if (!bWideSeparators) + nSeparatorWidth = gWidgetData[nScreen].gComboBox_SeparatorWidget->style->xthickness; + } + + nButtonWidth = nArrowWidth + nSeparatorWidth + + + gWidgetData[nScreen].gComboBox_ButtonWidget->style->xthickness + + (nFocusWidth+nFocusPad); + + if( nPart == PART_BUTTON_DOWN ) + { + aButtonRect.SetSize( Size( nButtonWidth, aAreaRect.GetHeight() ) ); + aButtonRect.SetPos( Point( aAreaRect.Left() + aAreaRect.GetWidth() - nButtonWidth, + aAreaRect.Top() ) ); + } + else if( nPart == PART_SUB_EDIT ) + { + gint adjust_x = GTK_CONTAINER(gWidgetData[nScreen].gComboBoxWidget)->border_width + + nFocusWidth + + nFocusPad; + gint adjust_y = adjust_x + gWidgetData[nScreen].gComboBoxWidget->style->ythickness; + adjust_x += gWidgetData[nScreen].gComboBoxWidget->style->xthickness; + aButtonRect.SetSize( Size( aAreaRect.GetWidth() - nButtonWidth - 2 * adjust_x, + aAreaRect.GetHeight() - 2 * adjust_y ) ); + Point aEditPos = aAreaRect.TopLeft(); + aEditPos.X() += adjust_x; + aEditPos.Y() += adjust_y; + aButtonRect.SetPos( aEditPos ); + } + + return( aButtonRect ); +} + + +//------------------------------------- + + + +BOOL GtkSalGraphics::NWPaintGTKTabItem( ControlType nType, ControlPart, + const Rectangle& rControlRectangle, + const clipList&, + ControlState nState, + const ImplControlValue& aValue, + const OUString& ) +{ + OSL_ASSERT( nType != CTRL_TAB_ITEM || aValue.getType() == CTRL_TAB_ITEM ); + GdkPixmap * pixmap; + Rectangle pixmapRect; + Rectangle tabRect; + GtkStateType stateType; GtkShadowType shadowType; if( ! gWidgetData[ m_nScreen ].gCacheTabItems ) { @@ -2366,7 +2546,7 @@ } -// gtk_widget_set_state( gWidgetData[m_nScreen].gNotebookWidget, stateType ); +// gtk_widget_set_state( gWidgetData[m_nScreen].gNotebookWidget, stateType ); pixmap = gdk_pixmap_new( NULL, pixmapRect.GetWidth(), pixmapRect.GetHeight(), GetX11SalData()->GetDisplay()->GetVisual( m_nScreen ).GetDepth() ); @@ -2376,42 +2556,42 @@ paintRect.height = pixmapRect.GetHeight(); gtk_paint_flat_box( m_pWindow->style, pixmap, GTK_STATE_NORMAL, - GTK_SHADOW_NONE, &paintRect, m_pWindow, "base", 0, 0, -1, -1); + GTK_SHADOW_NONE, &paintRect, m_pWindow, "base", 0, 0, -1, -1); - NWSetWidgetState( gWidgetData[m_nScreen].gNotebookWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gNotebookWidget, nState, stateType ); - switch( nType ) - { - case CTRL_TAB_BODY: - break; + switch( nType ) + { + case CTRL_TAB_BODY: + break; - case CTRL_FIXEDBORDER: - case CTRL_TAB_PANE: - gtk_paint_box_gap( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget, - (char *)"notebook", 0, 0, pixmapRect.GetWidth(), pixmapRect.GetHeight(), GTK_POS_TOP, 0, 0 ); - break; - - case CTRL_TAB_ITEM: - stateType = ( nState & CTRL_STATE_SELECTED ) ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE; - - gtk_paint_extension( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget, - (char *)"tab", (tabRect.Left() - pixmapRect.Left()), (tabRect.Top() - pixmapRect.Top()), - tabRect.GetWidth(), tabRect.GetHeight(), GTK_POS_BOTTOM ); - - if ( nState & CTRL_STATE_SELECTED ) - { - gtk_paint_flat_box( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_NONE, NULL, m_pWindow, - (char *)"base", 0, (pixmapRect.GetHeight() - 1), pixmapRect.GetWidth(), 1 ); - } - break; + case CTRL_FIXEDBORDER: + case CTRL_TAB_PANE: + gtk_paint_box_gap( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget, + (char *)"notebook", 0, 0, pixmapRect.GetWidth(), pixmapRect.GetHeight(), GTK_POS_TOP, 0, 0 ); + break; - default: - break; - } + case CTRL_TAB_ITEM: + stateType = ( nState & CTRL_STATE_SELECTED ) ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE; + + gtk_paint_extension( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget, + (char *)"tab", (tabRect.Left() - pixmapRect.Left()), (tabRect.Top() - pixmapRect.Top()), + tabRect.GetWidth(), tabRect.GetHeight(), GTK_POS_BOTTOM ); + + if ( nState & CTRL_STATE_SELECTED ) + { + gtk_paint_flat_box( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_NONE, NULL, m_pWindow, + (char *)"base", 0, (pixmapRect.GetHeight() - 1), pixmapRect.GetWidth(), 1 ); + } + break; + + default: + break; + } - // Crux seems to think it can make the pane without a left edge - if ( nType == CTRL_FIXEDBORDER ) - pixmapRect.Move( 1, 0 ); + // Crux seems to think it can make the pane without a left edge + if ( nType == CTRL_FIXEDBORDER ) + pixmapRect.Move( 1, 0 ); // cache data if( nType == CTRL_TAB_ITEM ) @@ -2419,152 +2599,65 @@ else aCachePage.Fill( nType, nState, pixmapRect, pixmap ); - BOOL bSuccess = NWRenderPixmapToScreen(pixmap, pixmapRect); - g_object_unref( pixmap ); - return bSuccess; + BOOL bSuccess = NWRenderPixmapToScreen(pixmap, pixmapRect); + g_object_unref( pixmap ); + return bSuccess; } -//------------------------------------- - -BOOL GtkSalGraphics::NWPaintGTKListBox( GdkDrawable* gdkDrawable, - ControlType nType, ControlPart nPart, - const Rectangle& rControlRectangle, - const clipList& rClipList, - ControlState nState, - const ImplControlValue& aValue, - const OUString& rCaption ) +static void set_widget_orientation(GtkWidget *widget, GtkOrientation orientation) { - Rectangle pixmapRect; - Rectangle widgetRect; - Rectangle aIndicatorRect; - GtkStateType stateType; - GtkShadowType shadowType; - gint bInteriorFocus; - gint nFocusLineWidth; - gint nFocusPadding; - gint x,y; - GdkRectangle clipRect; - - NWEnsureGTKButton( m_nScreen ); - NWEnsureGTKOptionMenu( m_nScreen ); - NWEnsureGTKScrolledWindow( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - - // Find the overall bounding rect of the buttons's drawing area, - // plus its actual draw rect excluding adornment - pixmapRect = rControlRectangle; - if ( nPart == PART_WINDOW ) - { - // Make the widget a _bit_ bigger - pixmapRect.SetPos( Point( pixmapRect.Left() - 1, - pixmapRect.Top() - 1 ) ); - pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 2, - pixmapRect.GetHeight() + 2 ) ); - } - - widgetRect = pixmapRect; - x = pixmapRect.Left(); - y = pixmapRect.Top(); - - // set up references to correct drawable and cliprect - NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gOptionMenuWidget, nState, stateType ); - NWSetWidgetState( gWidgetData[m_nScreen].gScrolledWindowWidget, nState, stateType ); - - if ( nPart != PART_WINDOW ) - { - gtk_widget_style_get( gWidgetData[m_nScreen].gOptionMenuWidget, - "interior_focus", &bInteriorFocus, - "focus_line_width", &nFocusLineWidth, - "focus_padding", &nFocusPadding, - (char *)NULL); - } - - for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) - { - clipRect.x = it->Left(); - clipRect.y = it->Top(); - clipRect.width = it->GetWidth(); - clipRect.height = it->GetHeight(); - - if ( nPart != PART_WINDOW ) - { - // Listboxes must paint opaque since some themes have alpha-channel enabled bodies - gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE, - &clipRect, m_pWindow, "base", x, y, - pixmapRect.GetWidth(), pixmapRect.GetHeight() ); - gtk_paint_box( gWidgetData[m_nScreen].gOptionMenuWidget->style, gdkDrawable, stateType, shadowType, &clipRect, - gWidgetData[m_nScreen].gOptionMenuWidget, "optionmenu", - x+(widgetRect.Left() - pixmapRect.Left()), - y+(widgetRect.Top() - pixmapRect.Top()), - widgetRect.GetWidth(), widgetRect.GetHeight() ); - aIndicatorRect = NWGetListBoxIndicatorRect( m_nScreen, nType, nPart, widgetRect, nState, - aValue, rCaption ); - gtk_paint_tab( gWidgetData[m_nScreen].gOptionMenuWidget->style, gdkDrawable, stateType, shadowType, &clipRect, - gWidgetData[m_nScreen].gOptionMenuWidget, "optionmenutab", - x+(aIndicatorRect.Left() - pixmapRect.Left()), - y+(aIndicatorRect.Top() - pixmapRect.Top()), - aIndicatorRect.GetWidth(), aIndicatorRect.GetHeight() ); - } - else - { - shadowType = GTK_SHADOW_IN; - - gtk_paint_shadow( gWidgetData[m_nScreen].gScrolledWindowWidget->style, gdkDrawable, GTK_STATE_NORMAL, shadowType, - &clipRect, gWidgetData[m_nScreen].gScrolledWindowWidget, "scrolled_window", - x+(widgetRect.Left() - pixmapRect.Left()), y+(widgetRect.Top() - pixmapRect.Top()), - widgetRect.GetWidth(), widgetRect.GetHeight() ); - } - } - - return( TRUE ); +#if GTK_CHECK_VERSION(2,90,0) + gtk_orientable_set_orientation( GTK_ORIENTABLE(widget), orientation ); +#else + gtk_toolbar_set_orientation( GTK_TOOLBAR(widget), orientation ); +#endif } BOOL GtkSalGraphics::NWPaintGTKToolbar( GdkDrawable* gdkDrawable, ControlType, ControlPart nPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList& rClipList, ControlState nState, const ImplControlValue& aValue, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; - gint x, y, w, h; + GtkStateType stateType; + GtkShadowType shadowType; + gint x, y, w, h; gint g_x=0, g_y=0, g_w=10, g_h=10; bool bPaintButton = true; GtkWidget* pButtonWidget = gWidgetData[m_nScreen].gToolbarButtonWidget; const gchar* pButtonDetail = "button"; - GdkRectangle clipRect; + GdkRectangle clipRect; - NWEnsureGTKToolbar( m_nScreen ); + NWEnsureGTKToolbar( m_nScreen ); if( nPart == PART_BUTTON ) // toolbar buttons cannot focus in gtk nState &= ~CTRL_STATE_FOCUSED; - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - x = rControlRectangle.Left(); + x = rControlRectangle.Left(); y = rControlRectangle.Top(); - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); // handle toolbar if( nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT ) { - NWSetWidgetState( gWidgetData[m_nScreen].gToolbarWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gToolbarWidget, nState, stateType ); GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gToolbarWidget, GTK_SENSITIVE ); if ( nState & CTRL_STATE_ENABLED ) GTK_WIDGET_SET_FLAGS( gWidgetData[m_nScreen].gToolbarWidget, GTK_SENSITIVE ); if( nPart == PART_DRAW_BACKGROUND_HORZ ) - gtk_toolbar_set_orientation( GTK_TOOLBAR(gWidgetData[m_nScreen].gToolbarWidget), GTK_ORIENTATION_HORIZONTAL ); + set_widget_orientation( gWidgetData[m_nScreen].gToolbarWidget, GTK_ORIENTATION_HORIZONTAL ); else - gtk_toolbar_set_orientation( GTK_TOOLBAR(gWidgetData[m_nScreen].gToolbarWidget), GTK_ORIENTATION_VERTICAL ); + set_widget_orientation( gWidgetData[m_nScreen].gToolbarWidget, GTK_ORIENTATION_VERTICAL ); } // handle grip else if( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ) { - NWSetWidgetState( gWidgetData[m_nScreen].gHandleBoxWidget, nState, stateType ); + NWSetWidgetState( gWidgetData[m_nScreen].gHandleBoxWidget, nState, stateType ); GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gHandleBoxWidget, GTK_SENSITIVE ); if ( nState & CTRL_STATE_ENABLED ) @@ -2588,7 +2681,7 @@ bPaintButton = (GTK_BUTTON(pButtonWidget)->relief != GTK_RELIEF_NONE) || (nState & CTRL_STATE_PRESSED) - || (nState & CTRL_STATE_ROLLOVER); + || (nState & CTRL_STATE_ROLLOVER); if( aValue.getTristateVal() == BUTTONVALUE_ON ) { pButtonWidget = gWidgetData[m_nScreen].gToolbarToggleWidget; @@ -2662,7 +2755,7 @@ } } - return( TRUE ); + return( TRUE ); } //---- @@ -2670,24 +2763,24 @@ BOOL GtkSalGraphics::NWPaintGTKMenubar( GdkDrawable* gdkDrawable, ControlType, ControlPart nPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList& rClipList, ControlState nState, const ImplControlValue&, const OUString& ) { - GtkStateType stateType; - GtkShadowType shadowType; + GtkStateType stateType; + GtkShadowType shadowType; GtkShadowType selected_shadow_type = GTK_SHADOW_OUT; - gint x, y, w, h; - GdkRectangle clipRect; + gint x, y, w, h; + GdkRectangle clipRect; - NWEnsureGTKMenubar( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWEnsureGTKMenubar( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - x = rControlRectangle.Left(); + x = rControlRectangle.Left(); y = rControlRectangle.Top(); - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); if( nPart == PART_MENU_ITEM ) { @@ -2749,13 +2842,13 @@ } } - return( TRUE ); + return( TRUE ); } BOOL GtkSalGraphics::NWPaintGTKPopupMenu( GdkDrawable* gdkDrawable, ControlType, ControlPart nPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList& rClipList, ControlState nState, const ImplControlValue&, const OUString& ) @@ -2765,19 +2858,19 @@ if( nPart == PART_MENU_ITEM && ! (nState & CTRL_STATE_ENABLED) ) return FALSE; - GtkStateType stateType; - GtkShadowType shadowType; + GtkStateType stateType; + GtkShadowType shadowType; GtkShadowType selected_shadow_type = GTK_SHADOW_OUT; - gint x, y, w, h; - GdkRectangle clipRect; + gint x, y, w, h; + GdkRectangle clipRect; - NWEnsureGTKMenu( m_nScreen ); - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + NWEnsureGTKMenu( m_nScreen ); + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); - x = rControlRectangle.Left(); + x = rControlRectangle.Left(); y = rControlRectangle.Top(); - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); if( nPart == PART_MENU_ITEM && ( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) ) ) @@ -2879,26 +2972,26 @@ } } - return( TRUE ); + return( TRUE ); } BOOL GtkSalGraphics::NWPaintGTKTooltip( GdkDrawable* gdkDrawable, ControlType, ControlPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList& rClipList, ControlState, const ImplControlValue&, const OUString& ) { NWEnsureGTKTooltip( m_nScreen ); - gint x, y, w, h; - GdkRectangle clipRect; + gint x, y, w, h; + GdkRectangle clipRect; - x = rControlRectangle.Left(); + x = rControlRectangle.Left(); y = rControlRectangle.Top(); - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it ) { @@ -2917,13 +3010,13 @@ x, y, w, h ); } - return( TRUE ); + return( TRUE ); } BOOL GtkSalGraphics::NWPaintGTKListNode( GdkDrawable*, ControlType, ControlPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList&, ControlState nState, const ImplControlValue& rValue, const OUString& ) @@ -2935,13 +3028,13 @@ aRect.Right() += 2; aRect.Top() -= 2; aRect.Bottom() += 2; - gint w, h; - w = aRect.GetWidth(); - h = aRect.GetHeight(); - - GtkStateType stateType; - GtkShadowType shadowType; - NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + gint w, h; + w = aRect.GetWidth(); + h = aRect.GetHeight(); + + GtkStateType stateType; + GtkShadowType shadowType; + NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); ButtonValue aButtonValue = rValue.getTristateVal(); GtkExpanderStyle eStyle = GTK_EXPANDER_EXPANDED; @@ -2968,25 +3061,25 @@ w/2, h/2, eStyle ); - BOOL bRet = NWRenderPixmapToScreen( pixmap, aRect ); + BOOL bRet = NWRenderPixmapToScreen( pixmap, aRect ); g_object_unref( pixmap ); - return bRet; + return bRet; } BOOL GtkSalGraphics::NWPaintGTKProgress( GdkDrawable*, ControlType, ControlPart, - const Rectangle& rControlRectangle, + const Rectangle& rControlRectangle, const clipList&, ControlState, const ImplControlValue& rValue, const OUString& ) { NWEnsureGTKProgressBar( m_nScreen ); - gint w, h; - w = rControlRectangle.GetWidth(); - h = rControlRectangle.GetHeight(); + gint w, h; + w = rControlRectangle.GetWidth(); + h = rControlRectangle.GetHeight(); long nProgressWidth = rValue.getNumericVal(); @@ -3158,120 +3251,10 @@ } #endif - BOOL bRet = NWRenderPixmapToScreen( pixmap, rControlRectangle ); + BOOL bRet = NWRenderPixmapToScreen( pixmap, rControlRectangle ); g_object_unref( pixmap ); - return bRet; -} - -//---- - -static Rectangle NWGetListBoxButtonRect( int nScreen, - ControlType, - ControlPart nPart, - Rectangle aAreaRect, - ControlState, - const ImplControlValue&, - const OUString& ) -{ - Rectangle aPartRect; - GtkRequisition *pIndicatorSize = NULL; - GtkBorder *pIndicatorSpacing = NULL; - gint width = 13; // GTK+ default - gint right = 5; // GTK+ default - gint nButtonAreaWidth = 0; - gint xthickness = 0; - - NWEnsureGTKOptionMenu( nScreen ); - - gtk_widget_style_get( gWidgetData[nScreen].gOptionMenuWidget, - "indicator_size", &pIndicatorSize, - "indicator_spacing",&pIndicatorSpacing, (char *)NULL); - - if ( pIndicatorSize ) - width = pIndicatorSize->width; - - if ( pIndicatorSpacing ) - right = pIndicatorSpacing->right; - - Size aPartSize( 0, aAreaRect.GetHeight() ); - Point aPartPos ( 0, aAreaRect.Top() ); - - xthickness = gWidgetData[nScreen].gOptionMenuWidget->style->xthickness; - nButtonAreaWidth = width + right + (xthickness * 2); - switch( nPart ) - { - case PART_BUTTON_DOWN: - aPartSize.Width() = nButtonAreaWidth; - aPartPos.X() = aAreaRect.Left() + aAreaRect.GetWidth() - aPartSize.Width(); - break; - - case PART_SUB_EDIT: - aPartSize.Width() = aAreaRect.GetWidth() - nButtonAreaWidth - xthickness; - aPartPos.X() = aAreaRect.Left() + xthickness; - break; - - default: - aPartSize.Width() = aAreaRect.GetWidth(); - aPartPos.X() = aAreaRect.Left(); - break; - } - aPartRect = Rectangle( aPartPos, aPartSize ); - - if ( pIndicatorSize ) - gtk_requisition_free( pIndicatorSize ); - if ( pIndicatorSpacing ) - gtk_border_free( pIndicatorSpacing ); - - return( aPartRect ); -} - -//---- - -static Rectangle NWGetListBoxIndicatorRect( int nScreen, - ControlType, - ControlPart, - Rectangle aAreaRect, - ControlState, - const ImplControlValue&, - const OUString& ) -{ - Rectangle aIndicatorRect; - GtkRequisition *pIndicatorSize = NULL; - GtkBorder *pIndicatorSpacing = NULL; - gint width = 13; // GTK+ default - gint height = 13; // GTK+ default - gint right = 5; // GTK+ default - - NWEnsureGTKOptionMenu( nScreen ); - - gtk_widget_style_get( gWidgetData[nScreen].gOptionMenuWidget, - "indicator_size", &pIndicatorSize, - "indicator_spacing",&pIndicatorSpacing, (char *)NULL); - - if ( pIndicatorSize ) - { - width = pIndicatorSize->width; - height = pIndicatorSize->height; - } - - if ( pIndicatorSpacing ) - right = pIndicatorSpacing->right; - - aIndicatorRect.SetSize( Size( width, height ) ); - aIndicatorRect.SetPos( Point( aAreaRect.Left() + aAreaRect.GetWidth() - width - right - gWidgetData[nScreen].gOptionMenuWidget->style->xthickness, - aAreaRect.Top() + ((aAreaRect.GetHeight() - height) / 2) ) ); - - // If height is odd, move the indicator down 1 pixel - if ( aIndicatorRect.GetHeight() % 2 ) - aIndicatorRect.Move( 0, 1 ); - - if ( pIndicatorSize ) - gtk_requisition_free( pIndicatorSize ); - if ( pIndicatorSpacing ) - gtk_border_free( pIndicatorSpacing ); - - return( aIndicatorRect ); + return bRet; } static Rectangle NWGetToolbarRect( int nScreen, @@ -3477,7 +3460,7 @@ // make the "light" color lighter than the menu color and the "shadow" // color darker than it. if ( aStyleSet.GetMenuColor().GetLuminance() >= 32 && - aStyleSet.GetMenuColor().GetLuminance() <= aStyleSet.GetMenuTextColor().GetLuminance() ) + aStyleSet.GetMenuColor().GetLuminance() <= aStyleSet.GetMenuTextColor().GetLuminance() ) { Color temp = aStyleSet.GetMenuColor(); temp.IncreaseLuminance( 8 ); @@ -3495,10 +3478,10 @@ aStyleSet.SetMenuHighlightTextColor( aHighlightTextColor ); // UI font - OString aFamily = pango_font_description_get_family( pStyle->font_desc ); - int nPangoHeight = pango_font_description_get_size( pStyle->font_desc ); - PangoStyle eStyle = pango_font_description_get_style( pStyle->font_desc ); - PangoWeight eWeight = pango_font_description_get_weight( pStyle->font_desc ); + OString aFamily = pango_font_description_get_family( pStyle->font_desc ); + int nPangoHeight = pango_font_description_get_size( pStyle->font_desc ); + PangoStyle eStyle = pango_font_description_get_style( pStyle->font_desc ); + PangoWeight eWeight = pango_font_description_get_weight( pStyle->font_desc ); PangoStretch eStretch = pango_font_description_get_stretch( pStyle->font_desc ); psp::FastPrintFontInfo aInfo; @@ -3507,9 +3490,9 @@ // set italic switch( eStyle ) { - case PANGO_STYLE_NORMAL: aInfo.m_eItalic = psp::italic::Upright;break; - case PANGO_STYLE_ITALIC: aInfo.m_eItalic = psp::italic::Italic;break; - case PANGO_STYLE_OBLIQUE: aInfo.m_eItalic = psp::italic::Oblique;break; + case PANGO_STYLE_NORMAL: aInfo.m_eItalic = psp::italic::Upright;break; + case PANGO_STYLE_ITALIC: aInfo.m_eItalic = psp::italic::Italic;break; + case PANGO_STYLE_OBLIQUE: aInfo.m_eItalic = psp::italic::Oblique;break; } // set weight if( eWeight <= PANGO_WEIGHT_ULTRALIGHT ) @@ -3525,15 +3508,15 @@ // set width switch( eStretch ) { - case PANGO_STRETCH_ULTRA_CONDENSED: aInfo.m_eWidth = psp::width::UltraCondensed;break; - case PANGO_STRETCH_EXTRA_CONDENSED: aInfo.m_eWidth = psp::width::ExtraCondensed;break; - case PANGO_STRETCH_CONDENSED: aInfo.m_eWidth = psp::width::Condensed;break; - case PANGO_STRETCH_SEMI_CONDENSED: aInfo.m_eWidth = psp::width::SemiCondensed;break; - case PANGO_STRETCH_NORMAL: aInfo.m_eWidth = psp::width::Normal;break; - case PANGO_STRETCH_SEMI_EXPANDED: aInfo.m_eWidth = psp::width::SemiExpanded;break; - case PANGO_STRETCH_EXPANDED: aInfo.m_eWidth = psp::width::Expanded;break; - case PANGO_STRETCH_EXTRA_EXPANDED: aInfo.m_eWidth = psp::width::ExtraExpanded;break; - case PANGO_STRETCH_ULTRA_EXPANDED: aInfo.m_eWidth = psp::width::UltraExpanded;break; + case PANGO_STRETCH_ULTRA_CONDENSED: aInfo.m_eWidth = psp::width::UltraCondensed;break; + case PANGO_STRETCH_EXTRA_CONDENSED: aInfo.m_eWidth = psp::width::ExtraCondensed;break; + case PANGO_STRETCH_CONDENSED: aInfo.m_eWidth = psp::width::Condensed;break; + case PANGO_STRETCH_SEMI_CONDENSED: aInfo.m_eWidth = psp::width::SemiCondensed;break; + case PANGO_STRETCH_NORMAL: aInfo.m_eWidth = psp::width::Normal;break; + case PANGO_STRETCH_SEMI_EXPANDED: aInfo.m_eWidth = psp::width::SemiExpanded;break; + case PANGO_STRETCH_EXPANDED: aInfo.m_eWidth = psp::width::Expanded;break; + case PANGO_STRETCH_EXTRA_EXPANDED: aInfo.m_eWidth = psp::width::ExtraExpanded;break; + case PANGO_STRETCH_ULTRA_EXPANDED: aInfo.m_eWidth = psp::width::UltraExpanded;break; } #if OSL_DEBUG_LEVEL > 1 @@ -3627,18 +3610,18 @@ g_free( pIconThemeName ); // FIXME: need some way of fetching toolbar icon size. -// aStyleSet.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_SMALL ); +// aStyleSet.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_SMALL ); const cairo_font_options_t* pNewOptions = NULL; if( GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), m_nScreen ) ) { //#if !GTK_CHECK_VERSION(2,8,1) #if !GTK_CHECK_VERSION(2,9,0) - static cairo_font_options_t* (*gdk_screen_get_font_options)(GdkScreen*) = - (cairo_font_options_t*(*)(GdkScreen*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_font_options" ); + static cairo_font_options_t* (*gdk_screen_get_font_options)(GdkScreen*) = + (cairo_font_options_t*(*)(GdkScreen*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_font_options" ); if( gdk_screen_get_font_options != NULL ) #endif - pNewOptions = gdk_screen_get_font_options( pScreen ); + pNewOptions = gdk_screen_get_font_options( pScreen ); } aStyleSet.SetCairoFontOptions( pNewOptions ); @@ -3698,8 +3681,8 @@ GdkPixmap* GtkSalGraphics::NWGetPixmapFromScreen( Rectangle srcRect ) { // Create a new pixmap to hold the composite of the window background and the control - GdkPixmap * pPixmap = gdk_pixmap_new( GDK_DRAWABLE(GetGdkWindow()), srcRect.GetWidth(), srcRect.GetHeight(), -1 ); - GdkGC * pPixmapGC = gdk_gc_new( pPixmap ); + GdkPixmap * pPixmap = gdk_pixmap_new( GDK_DRAWABLE(GetGdkWindow()), srcRect.GetWidth(), srcRect.GetHeight(), -1 ); + GdkGC * pPixmapGC = gdk_gc_new( pPixmap ); if( !pPixmap || !pPixmapGC ) { @@ -3760,29 +3743,29 @@ * State conversion ************************************************************************/ static void NWConvertVCLStateToGTKState( ControlState nVCLState, - GtkStateType* nGTKState, GtkShadowType* nGTKShadow ) + GtkStateType* nGTKState, GtkShadowType* nGTKShadow ) { - *nGTKShadow = GTK_SHADOW_OUT; - *nGTKState = GTK_STATE_INSENSITIVE; + *nGTKShadow = GTK_SHADOW_OUT; + *nGTKState = GTK_STATE_INSENSITIVE; - if ( nVCLState & CTRL_STATE_ENABLED ) - { - if ( nVCLState & CTRL_STATE_PRESSED ) - { - *nGTKState = GTK_STATE_ACTIVE; - *nGTKShadow = GTK_SHADOW_IN; - } - else if ( nVCLState & CTRL_STATE_ROLLOVER ) - { - *nGTKState = GTK_STATE_PRELIGHT; - *nGTKShadow = GTK_SHADOW_OUT; - } - else - { - *nGTKState = GTK_STATE_NORMAL; - *nGTKShadow = GTK_SHADOW_OUT; - } - } + if ( nVCLState & CTRL_STATE_ENABLED ) + { + if ( nVCLState & CTRL_STATE_PRESSED ) + { + *nGTKState = GTK_STATE_ACTIVE; + *nGTKShadow = GTK_SHADOW_IN; + } + else if ( nVCLState & CTRL_STATE_ROLLOVER ) + { + *nGTKState = GTK_STATE_PRELIGHT; + *nGTKShadow = GTK_SHADOW_OUT; + } + else + { + *nGTKState = GTK_STATE_NORMAL; + *nGTKShadow = GTK_SHADOW_OUT; + } + } } /************************************************************************ @@ -3790,19 +3773,19 @@ ************************************************************************/ static void NWSetWidgetState( GtkWidget* widget, ControlState nState, GtkStateType nGtkState ) { - // Set to default state, then build up from there - GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_DEFAULT ); - GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_FOCUS ); - GTK_WIDGET_UNSET_FLAGS( widget, GTK_SENSITIVE ); - GTK_WIDGET_SET_FLAGS( widget, gWidgetDefaultFlags[(long)widget] ); - - if ( nState & CTRL_STATE_DEFAULT ) - GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_DEFAULT ); - if ( !GTK_IS_TOGGLE_BUTTON(widget) && (nState & CTRL_STATE_FOCUSED) ) - GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_FOCUS ); - if ( nState & CTRL_STATE_ENABLED ) - GTK_WIDGET_SET_FLAGS( widget, GTK_SENSITIVE ); - gtk_widget_set_state( widget, nGtkState ); + // Set to default state, then build up from there + GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_DEFAULT ); + GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_FOCUS ); + GTK_WIDGET_UNSET_FLAGS( widget, GTK_SENSITIVE ); + GTK_WIDGET_SET_FLAGS( widget, gWidgetDefaultFlags[(long)widget] ); + + if ( nState & CTRL_STATE_DEFAULT ) + GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_DEFAULT ); + if ( !GTK_IS_TOGGLE_BUTTON(widget) && (nState & CTRL_STATE_FOCUSED) ) + GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_FOCUS ); + if ( nState & CTRL_STATE_ENABLED ) + GTK_WIDGET_SET_FLAGS( widget, GTK_SENSITIVE ); + gtk_widget_set_state( widget, nGtkState ); } /************************************************************************ @@ -3814,179 +3797,279 @@ static void NWAddWidgetToCacheWindow( GtkWidget* widget, int nScreen ) { NWFWidgetData& rData = gWidgetData[nScreen]; - if ( !rData.gCacheWindow || !rData.gDumbContainer ) - { - if ( !rData.gCacheWindow ) + if ( !rData.gCacheWindow || !rData.gDumbContainer ) + { + if ( !rData.gCacheWindow ) { - rData.gCacheWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + rData.gCacheWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL ); GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), nScreen ); if( pScreen ) gtk_window_set_screen( GTK_WINDOW(rData.gCacheWindow), pScreen ); } - if ( !rData.gDumbContainer ) - rData.gDumbContainer = gtk_fixed_new(); - gtk_container_add( GTK_CONTAINER(rData.gCacheWindow), rData.gDumbContainer ); - gtk_widget_realize( rData.gDumbContainer ); - gtk_widget_realize( rData.gCacheWindow ); - } + if ( !rData.gDumbContainer ) + rData.gDumbContainer = gtk_fixed_new(); + gtk_container_add( GTK_CONTAINER(rData.gCacheWindow), rData.gDumbContainer ); + gtk_widget_realize( rData.gDumbContainer ); + gtk_widget_realize( rData.gCacheWindow ); + } - gtk_container_add( GTK_CONTAINER(rData.gDumbContainer), widget ); - gtk_widget_realize( widget ); - gtk_widget_ensure_style( widget ); + gtk_container_add( GTK_CONTAINER(rData.gDumbContainer), widget ); + gtk_widget_realize( widget ); + gtk_widget_ensure_style( widget ); - // Store widget's default flags - gWidgetDefaultFlags[ (long)widget ] = GTK_WIDGET_FLAGS( widget ); + // Store widget's default flags + gWidgetDefaultFlags[ (long)widget ] = GTK_WIDGET_FLAGS( widget ); } //------------------------------------- static void NWEnsureGTKButton( int nScreen ) { - if ( !gWidgetData[nScreen].gBtnWidget ) - { - gWidgetData[nScreen].gBtnWidget = gtk_button_new_with_label( "" ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gBtnWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gBtnWidget ) + { + gWidgetData[nScreen].gBtnWidget = gtk_button_new_with_label( "" ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gBtnWidget, nScreen ); + } } //------------------------------------- static void NWEnsureGTKRadio( int nScreen ) { - if ( !gWidgetData[nScreen].gRadioWidget || !gWidgetData[nScreen].gRadioWidgetSibling ) - { - gWidgetData[nScreen].gRadioWidget = gtk_radio_button_new( NULL ); - gWidgetData[nScreen].gRadioWidgetSibling = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON(gWidgetData[nScreen].gRadioWidget) ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidget, nScreen ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidgetSibling, nScreen ); - } + if ( !gWidgetData[nScreen].gRadioWidget || !gWidgetData[nScreen].gRadioWidgetSibling ) + { + gWidgetData[nScreen].gRadioWidget = gtk_radio_button_new( NULL ); + gWidgetData[nScreen].gRadioWidgetSibling = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON(gWidgetData[nScreen].gRadioWidget) ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidget, nScreen ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidgetSibling, nScreen ); + } } //------------------------------------- static void NWEnsureGTKCheck( int nScreen ) { - if ( !gWidgetData[nScreen].gCheckWidget ) - { - gWidgetData[nScreen].gCheckWidget = gtk_check_button_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gCheckWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gCheckWidget ) + { + gWidgetData[nScreen].gCheckWidget = gtk_check_button_new(); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gCheckWidget, nScreen ); + } } //------------------------------------- static void NWEnsureGTKScrollbars( int nScreen ) { - if ( !gWidgetData[nScreen].gScrollHorizWidget ) - { - gWidgetData[nScreen].gScrollHorizWidget = gtk_hscrollbar_new( NULL ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollHorizWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gScrollHorizWidget ) + { + gWidgetData[nScreen].gScrollHorizWidget = gtk_hscrollbar_new( NULL ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollHorizWidget, nScreen ); + } - if ( !gWidgetData[nScreen].gScrollVertWidget ) - { - gWidgetData[nScreen].gScrollVertWidget = gtk_vscrollbar_new( NULL ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollVertWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gScrollVertWidget ) + { + gWidgetData[nScreen].gScrollVertWidget = gtk_vscrollbar_new( NULL ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollVertWidget, nScreen ); + } } //------------------------------------- static void NWEnsureGTKArrow( int nScreen ) { - if ( !gWidgetData[nScreen].gArrowWidget || !gWidgetData[nScreen].gDropdownWidget ) - { - gWidgetData[nScreen].gDropdownWidget = gtk_toggle_button_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gDropdownWidget, nScreen ); - gWidgetData[nScreen].gArrowWidget = gtk_arrow_new( GTK_ARROW_DOWN, GTK_SHADOW_OUT ); - gtk_container_add( GTK_CONTAINER(gWidgetData[nScreen].gDropdownWidget), gWidgetData[nScreen].gArrowWidget ); - gtk_widget_set_rc_style( gWidgetData[nScreen].gArrowWidget ); - gtk_widget_realize( gWidgetData[nScreen].gArrowWidget ); - } + if ( !gWidgetData[nScreen].gArrowWidget || !gWidgetData[nScreen].gDropdownWidget ) + { + gWidgetData[nScreen].gDropdownWidget = gtk_toggle_button_new(); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gDropdownWidget, nScreen ); + gWidgetData[nScreen].gArrowWidget = gtk_arrow_new( GTK_ARROW_DOWN, GTK_SHADOW_OUT ); + gtk_container_add( GTK_CONTAINER(gWidgetData[nScreen].gDropdownWidget), gWidgetData[nScreen].gArrowWidget ); + gtk_widget_set_style( gWidgetData[nScreen].gArrowWidget, NULL ); + gtk_widget_realize( gWidgetData[nScreen].gArrowWidget ); + } } //------------------------------------- static void NWEnsureGTKEditBox( int nScreen ) { - if ( !gWidgetData[nScreen].gEditBoxWidget ) - { - gWidgetData[nScreen].gEditBoxWidget = gtk_entry_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gEditBoxWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gEditBoxWidget ) + { + gWidgetData[nScreen].gEditBoxWidget = gtk_entry_new(); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gEditBoxWidget, nScreen ); + } } //------------------------------------- static void NWEnsureGTKSpinButton( int nScreen ) { - if ( !gWidgetData[nScreen].gSpinButtonWidget ) - { - GtkAdjustment *adj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 1, 1, 1, 0) ); - gWidgetData[nScreen].gSpinButtonWidget = gtk_spin_button_new( adj, 1, 2 ); + if ( !gWidgetData[nScreen].gSpinButtonWidget ) + { + GtkAdjustment *adj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 1, 1, 1, 0) ); + gWidgetData[nScreen].gSpinButtonWidget = gtk_spin_button_new( adj, 1, 2 ); - //Setting non-editable means it doesn't blink, so there's no timeouts - //running around to nobble us - gtk_editable_set_editable(GTK_EDITABLE(gWidgetData[nScreen].gSpinButtonWidget), false); + //Setting non-editable means it doesn't blink, so there's no timeouts + //running around to nobble us + gtk_editable_set_editable(GTK_EDITABLE(gWidgetData[nScreen].gSpinButtonWidget), false); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gSpinButtonWidget, nScreen ); - } + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gSpinButtonWidget, nScreen ); + } } //------------------------------------- static void NWEnsureGTKNotebook( int nScreen ) { - if ( !gWidgetData[nScreen].gNotebookWidget ) - { - gWidgetData[nScreen].gNotebookWidget = gtk_notebook_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gNotebookWidget, nScreen ); - } + if ( !gWidgetData[nScreen].gNotebookWidget ) + { + gWidgetData[nScreen].gNotebookWidget = gtk_notebook_new(); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gNotebookWidget, nScreen ); + } } //------------------------------------- -static void NWEnsureGTKOptionMenu( int nScreen ) +G_BEGIN_DECLS +static void get_combo_box_entry_inner_widgets(GtkWidget *widget, gpointer client_data); +static void get_combo_box_entry_arrow(GtkWidget *widget, gpointer client_data); +static void get_combo_box_inner_widgets(GtkWidget *widget, gpointer client_data); +G_END_DECLS + +static void get_combo_box_entry_inner_widgets(GtkWidget *widget, gpointer client_data) +{ + int nScreen = GPOINTER_TO_INT(client_data); + if (GTK_IS_TOGGLE_BUTTON(widget)) + gWidgetData[nScreen].gComboBoxEntry_ButtonWidget = widget; + else if (GTK_IS_ENTRY(widget)) + { + // #i59129# Setting non-editable means it doesn't blink, so + // there are no timeouts running around to nobble us + gtk_editable_set_editable(GTK_EDITABLE(widget), false); + gWidgetData[nScreen].gComboBoxEntry_EntryWidget = widget; + } + else + return; + gtk_widget_realize(widget); +} + +static void get_combo_box_entry_arrow(GtkWidget *widget, gpointer client_data) { - if ( !gWidgetData[nScreen].gOptionMenuWidget ) - { - gWidgetData[nScreen].gOptionMenuWidget = gtk_option_menu_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gOptionMenuWidget, nScreen ); - } + if (GTK_IS_ARROW(widget)) + { + int nScreen = GPOINTER_TO_INT(client_data); + gWidgetData[nScreen].gComboBoxEntry_ArrowWidget = widget; + gtk_widget_realize(widget); + } } -//------------------------------------- +static void NWEnsureGTKComboBoxEntry( int nScreen ) +{ + if ( !gWidgetData[nScreen].gComboBoxEntryWidget ) + { + gWidgetData[nScreen].gComboBoxEntryWidget = gtk_combo_box_entry_new(); + + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gComboBoxEntryWidget, nScreen ); + + gtk_container_forall(GTK_CONTAINER(gWidgetData[nScreen].gComboBoxEntryWidget), + get_combo_box_entry_inner_widgets, GINT_TO_POINTER(nScreen) ); + + //If for some reason or other we couldn't find the expected children, + //alias them to some we know will definitely exist + if (!gWidgetData[nScreen].gComboBoxEntry_EntryWidget) + { + NWEnsureGTKEditBox( nScreen ); + gWidgetData[nScreen].gComboBoxEntry_EntryWidget = gWidgetData[nScreen].gEditBoxWidget; + } + if (gWidgetData[nScreen].gComboBoxEntry_ButtonWidget) + { + //Dig around for the arrow + GtkWidget *child = GTK_BIN(gWidgetData[nScreen].gComboBoxEntry_ButtonWidget)->child; + if (GTK_IS_HBOX(child)) + { + gtk_container_forall(GTK_CONTAINER(child), get_combo_box_entry_arrow, + GINT_TO_POINTER(nScreen) ); + } + else + get_combo_box_entry_arrow(child, GINT_TO_POINTER(nScreen)); + } + else + { + NWEnsureGTKArrow( nScreen ); + gWidgetData[nScreen].gComboBoxEntry_ButtonWidget = gWidgetData[nScreen].gDropdownWidget; + } + if (!gWidgetData[nScreen].gComboBoxEntry_ArrowWidget) + { + NWEnsureGTKArrow( nScreen ); + gWidgetData[nScreen].gComboBoxEntry_ArrowWidget = gWidgetData[nScreen].gArrowWidget; + } + } +} -static void NWEnsureGTKCombo( int nScreen ) +static void get_combo_box_inner_widgets(GtkWidget *widget, gpointer client_data) { - if ( !gWidgetData[nScreen].gComboWidget ) - { - gWidgetData[nScreen].gComboWidget = gtk_combo_new(); + int nScreen = GPOINTER_TO_INT(client_data); + if (GTK_IS_TOGGLE_BUTTON(widget)) + gWidgetData[nScreen].gComboBox_ButtonWidget = widget; + else if (GTK_IS_SEPARATOR(widget)) + gWidgetData[nScreen].gComboBox_SeparatorWidget = widget; + else if (GTK_IS_ARROW(widget)) + gWidgetData[nScreen].gComboBox_ArrowWidget = widget; + else + return; + gtk_widget_realize(widget); +} - // #i59129# Setting non-editable means it doesn't blink, so - // there are no timeouts running around to nobble us - gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry), false); +static void NWEnsureGTKComboBox( int nScreen ) +{ + if ( !gWidgetData[nScreen].gComboBoxWidget ) + { + gWidgetData[nScreen].gComboBoxWidget = gtk_combo_box_new(); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gComboWidget, nScreen ); - // Must realize the ComboBox's children, since GTK - // does not do this for us in GtkCombo::gtk_widget_realize() - gtk_widget_realize( GTK_COMBO(gWidgetData[nScreen].gComboWidget)->button ); - gtk_widget_realize( GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry ); - } + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gComboBoxWidget, nScreen ); + + gtk_container_forall(GTK_CONTAINER(gWidgetData[nScreen].gComboBoxWidget), + get_combo_box_inner_widgets, GINT_TO_POINTER(nScreen) ); + + //If for some reason or other we couldn't find the expected children, + //alias them to some we know will definitely exist + if (gWidgetData[nScreen].gComboBox_ButtonWidget) + { + //Dig around for the arrow + GtkWidget *child = GTK_BIN(gWidgetData[nScreen].gComboBox_ButtonWidget)->child; + if (GTK_IS_HBOX(child)) + { + gtk_container_forall(GTK_CONTAINER(child), get_combo_box_inner_widgets, + GINT_TO_POINTER(nScreen) ); + } + else + get_combo_box_inner_widgets(child, GINT_TO_POINTER(nScreen)); + } + else + { + NWEnsureGTKArrow( nScreen ); + gWidgetData[nScreen].gComboBox_ButtonWidget = gWidgetData[nScreen].gDropdownWidget; + } + + if (!gWidgetData[nScreen].gComboBox_ArrowWidget) + { + NWEnsureGTKArrow( nScreen ); + gWidgetData[nScreen].gComboBox_ArrowWidget = gWidgetData[nScreen].gArrowWidget; + } + } } //------------------------------------- static void NWEnsureGTKScrolledWindow( int nScreen ) { - if ( !gWidgetData[nScreen].gScrolledWindowWidget ) - { - GtkAdjustment *hadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); - GtkAdjustment *vadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); + if ( !gWidgetData[nScreen].gScrolledWindowWidget ) + { + GtkAdjustment *hadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); + GtkAdjustment *vadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); - gWidgetData[nScreen].gScrolledWindowWidget = gtk_scrolled_window_new( hadj, vadj ); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrolledWindowWidget, nScreen ); - } + gWidgetData[nScreen].gScrolledWindowWidget = gtk_scrolled_window_new( hadj, vadj ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrolledWindowWidget, nScreen ); + } } //------------------------------------- @@ -4003,7 +4086,7 @@ GtkReliefStyle aRelief = GTK_RELIEF_NORMAL; gtk_widget_ensure_style( gWidgetData[nScreen].gToolbarWidget ); gtk_widget_style_get( gWidgetData[nScreen].gToolbarWidget, - "button_relief", &aRelief, + "button_relief", &aRelief, (char *)NULL); gtk_button_set_relief( GTK_BUTTON(gWidgetData[nScreen].gToolbarButtonWidget), aRelief ); @@ -4102,7 +4185,7 @@ if( !gWidgetData[nScreen].gProgressBar ) { gWidgetData[nScreen].gProgressBar = gtk_progress_bar_new (); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gProgressBar, nScreen ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gProgressBar, nScreen ); } } @@ -4111,7 +4194,7 @@ if( !gWidgetData[nScreen].gTreeView ) { gWidgetData[nScreen].gTreeView = gtk_tree_view_new (); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gTreeView, nScreen ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gTreeView, nScreen ); } } @@ -4120,11 +4203,13 @@ if( !gWidgetData[nScreen].gHScale ) { gWidgetData[nScreen].gHScale = gtk_hscale_new_with_range(0, 10, 1); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gHScale, nScreen ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gHScale, nScreen ); } if( !gWidgetData[nScreen].gVScale ) { gWidgetData[nScreen].gVScale = gtk_vscale_new_with_range(0, 10, 1); - NWAddWidgetToCacheWindow( gWidgetData[nScreen].gVScale, nScreen ); + NWAddWidgetToCacheWindow( gWidgetData[nScreen].gVScale, nScreen ); } } + +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ --- vcl.orig/unx/gtk/window/gtkobject.cxx 2010-05-26 17:30:44.000000000 +0100 +++ vcl/unx/gtk/window/gtkobject.cxx 2010-07-01 10:45:41.000000000 +0100 @@ -32,6 +32,7 @@ #include <plugins/gtk/gtkframe.hxx> #include <plugins/gtk/gtkdata.hxx> #include <plugins/gtk/gtkinst.hxx> +#include <plugins/gtk/gtkgdi.hxx> GtkSalObject::GtkSalObject( GtkSalFrame* pParent, BOOL bShow ) : m_pSocket( NULL ), @@ -58,7 +59,7 @@ SalDisplay* pDisp = GetX11SalData()->GetDisplay(); m_aSystemData.nSize = sizeof( SystemChildData ); m_aSystemData.pDisplay = pDisp->GetDisplay(); - m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(m_pSocket->window); + m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(widget_get_window(m_pSocket)); m_aSystemData.pSalFrame = NULL; m_aSystemData.pWidget = m_pSocket; m_aSystemData.pVisual = pDisp->GetVisual(pParent->getScreenNumber()).GetVisual(); @@ -66,7 +67,7 @@ m_aSystemData.nDepth = pDisp->GetVisual(pParent->getScreenNumber()).GetDepth(); m_aSystemData.aColormap = pDisp->GetColormap(pParent->getScreenNumber()).GetXColormap(); m_aSystemData.pAppContext = NULL; - m_aSystemData.aShellWindow = GDK_WINDOW_XWINDOW(GTK_WIDGET(pParent->getWindow())->window); + m_aSystemData.aShellWindow = GDK_WINDOW_XWINDOW(widget_get_window(GTK_WIDGET(pParent->getWindow()))); m_aSystemData.pShellWidget = GTK_WIDGET(pParent->getWindow()); g_signal_connect( G_OBJECT(m_pSocket), "button-press-event", G_CALLBACK(signalButton), this ); --- fpicker.orig/source/unx/gnome/SalGtkPicker.cxx 2010-05-26 17:30:44.000000000 +0100 +++ fpicker/source/unx/gnome/SalGtkPicker.cxx 2010-07-01 12:51:05.000000000 +0100 @@ -155,7 +157,11 @@ if (pParent) { gtk_widget_realize(mpDialog); +#if GTK_CHECK_VERSION(2,90,0) + gdk_window_set_transient_for(gtk_widget_get_window(mpDialog), pParent); +#else gdk_window_set_transient_for(mpDialog->window, pParent); +#endif } } --- extensions.orig/source/plugin/unx/npnapi.cxx 2010-07-01 13:42:35.000000000 +0100 +++ extensions/source/plugin/unx/npnapi.cxx 2010-07-01 13:44:46.000000000 +0100 @@ -701,8 +701,11 @@ pInst->window.window = (void *)gtk_socket_get_id( GTK_SOCKET(pInst->pGtkWidget ) ); XSync( pAppDisplay, False ); - +#if GTK_CHECK_VERSION(2,90,0) + XMapWindow( pAppDisplay, GDK_WINDOW_XWINDOW(gtk_widget_get_window(pInst->pGtkWindow)) ); +#else XMapWindow( pAppDisplay, GDK_WINDOW_XWINDOW(pInst->pGtkWindow->window) ); +#endif XSync( pAppDisplay, False ); } --- vcl.orig/unx/inc/plugins/gtk/gtkdata.hxx 2010-07-07 10:20:34.000000000 +0100 +++ vcl/unx/inc/plugins/gtk/gtkdata.hxx 2010-07-07 11:15:19.000000000 +0100 @@ -40,6 +40,39 @@ #include <list> +inline GdkWindow * widget_get_window(GtkWidget *widget) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_get_window(widget); +#else + return widget->window; +#endif +} + +inline void widget_set_can_focus(GtkWidget *widget, gboolean can_focus) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_set_can_focus(widget, can_focus); +#else + if (can_focus) + GTK_WIDGET_SET_FLAGS( widget, GTK_CAN_FOCUS ); + else + GTK_WIDGET_UNSET_FLAGS( widget, GTK_CAN_FOCUS ); +#endif +} + +inline void widget_set_can_default(GtkWidget *widget, gboolean can_default) +{ +#if GTK_CHECK_VERSION(2,90,0) + return gtk_widget_set_can_default(widget, can_default); +#else + if (can_default) + GTK_WIDGET_SET_FLAGS( widget, GTK_CAN_DEFAULT ); + else + GTK_WIDGET_UNSET_FLAGS( widget, GTK_CAN_DEFAULT ); +#endif +} + class GtkData : public X11SalData { public: @@ -73,6 +106,8 @@ virtual long Dispatch( XEvent *pEvent ); virtual void initScreen( int nScreen ) const; + virtual int GetDefaultMonitorNumber() const; + static GdkFilterReturn filterGdkEvent( GdkXEvent* sys_event, GdkEvent* event, gpointer data );