Hello community,

here is the log from the commit of package oxygen-gtk3 for openSUSE:Factory 
checked in at 2012-05-15 17:42:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/oxygen-gtk3 (Old)
 and      /work/SRC/openSUSE:Factory/.oxygen-gtk3.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "oxygen-gtk3", Maintainer is ""

Changes:
--------
--- /work/SRC/openSUSE:Factory/oxygen-gtk3/oxygen-gtk3.changes  2012-04-17 
22:00:36.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.oxygen-gtk3.new/oxygen-gtk3.changes     
2012-05-15 17:42:33.000000000 +0200
@@ -1,0 +2,6 @@
+Tue May 15 03:01:37 UTC 2012 - m...@suse.com
+
+- Update to version 1.0.4
+  * Bugfix release
+
+-------------------------------------------------------------------

Old:
----
  oxygen-gtk3-1.0.3.tar.bz2

New:
----
  oxygen-gtk3-1.0.4.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ oxygen-gtk3.spec ++++++
--- /var/tmp/diff_new_pack.QBFWeg/_old  2012-05-15 17:42:33.000000000 +0200
+++ /var/tmp/diff_new_pack.QBFWeg/_new  2012-05-15 17:42:33.000000000 +0200
@@ -17,13 +17,13 @@
 
 
 Name:           oxygen-gtk3
-Version:        1.0.3
+Version:        1.0.4
 Release:        0
 Summary:        A Port of the default KDE Widget Theme (Oxygen), to GTK 3.x
 License:        LGPL-2.1+
 Group:          System/GUI/KDE
 Url:            
https://projects.kde.org/projects/playground/artwork/oxygen-gtk/
-Source0:        
ftp://ftp.kde.org/pub/kde/stable/oxygen-gtk3/1.0.3/src/%{name}-1.0.3.tar.bz2
+Source0:        
ftp://ftp.kde.org/pub/kde/stable/oxygen-gtk3/%{version}/src/%{name}-%{version}.tar.bz2
 Source100:      baselibs.conf
 BuildRequires:  cmake
 BuildRequires:  gcc-c++
@@ -87,7 +87,7 @@
 This package contains the Oxygen gtk 3.x theme.
 
 %prep
-%setup -q -n %{name}-1.0.3
+%setup -q
 
 %build
 mkdir -p build

++++++ oxygen-gtk3-1.0.3.tar.bz2 -> oxygen-gtk3-1.0.4.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/CMakeLists.txt 
new/oxygen-gtk3-1.0.4/CMakeLists.txt
--- old/oxygen-gtk3-1.0.3/CMakeLists.txt        2012-04-13 15:02:08.000000000 
+0200
+++ new/oxygen-gtk3-1.0.4/CMakeLists.txt        2012-05-14 08:38:34.000000000 
+0200
@@ -13,7 +13,7 @@
 set( CPACK_PACKAGE_VENDOR "h...@oxygen-icons.org" )
 set( CPACK_PACKAGE_VERSION_MAJOR "1" )
 set( CPACK_PACKAGE_VERSION_MINOR "0" )
-set( CPACK_PACKAGE_VERSION_PATCH "3" )
+set( CPACK_PACKAGE_VERSION_PATCH "4" )
 set( CPACK_SOURCE_IGNORE_FILES "build" "^${PROJECT_SOURCE_DIR}.*/.git/" )
 
 ##################################
@@ -46,6 +46,11 @@
     set( OXYGEN_DEBUG_INNERSHADOWS 0 )
 endif( NOT DEFINED OXYGEN_DEBUG_INNERSHADOWS )
 
+# Set to 1 to build windeco test app (normal users rarely need this)
+if( NOT DEFINED BUILD_DECO_TEST )
+    set( BUILD_DECO_TEST 0 )
+endif( NOT DEFINED BUILD_DECO_TEST )
+
 # Set to 1 to replace gtk stock icons
 # with oxygen-icons
 if( NOT DEFINED OXYGEN_ICON_HACK )
@@ -145,6 +150,7 @@
 #########
 message( "Flags: " )
 message( "  OXYGEN_DEBUG ${OXYGEN_DEBUG}" )
+message( "  BUILD_DECO_TEST ${BUILD_DECO_TEST}" )
 message( "  OXYGEN_DEBUG_INNERSHADOWS ${OXYGEN_DEBUG_INNERSHADOWS}" )
 message( "  OXYGEN_ICON_HACK ${OXYGEN_ICON_HACK}" )
 message( "  OXYGEN_FORCE_KDE_ICONS_AND_FONTS 
${OXYGEN_FORCE_KDE_ICONS_AND_FONTS}" )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/rc/gtk.css 
new/oxygen-gtk3-1.0.4/rc/gtk.css
--- old/oxygen-gtk3-1.0.3/rc/gtk.css    2012-04-13 15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/rc/gtk.css    2012-05-14 08:38:34.000000000 +0200
@@ -127,10 +127,16 @@
 GtkFrame { padding: 4px; }
 GtkViewport { padding: 0px; }
 GtkProgressBar { padding: 0px; }
+GtkAssistant .sidebar { padding: 4px; }
 
 /* switchs */
 GtkSwitch { padding: 0px; }
 
+/* spinners */
+.spinner:active {
+    transition: 750ms linear loop;
+}
+
 /* combo boxes */
 GtkComboBox { padding: 0px 0px; }
 GtkComboBox>GtkFrame { padding: 0px 0px 0px 4px; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/rc/icons4 
new/oxygen-gtk3-1.0.4/rc/icons4
--- old/oxygen-gtk3-1.0.3/rc/icons4     2012-04-13 15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/rc/icons4     2012-05-14 08:38:34.000000000 +0200
@@ -101,19 +101,22 @@
 gtk-zoom-out actions/zoom-out.png
 stock_edit-bookmark actions/bookmarks-organize.png
 
+gimp-info status/dialog-information.png
+gimp-warning status/dialog-warning.png
+gimp-reset actions/view-refresh.png
+gimp-images mimetypes/image-x-generic.png
+gimp-tool-options actions/configure.png
+
+gimp-edit NONE
 gimp-anchor NONE
 gimp-duplicate NONE
-gimp-edit actions/edit.png
-gimp-info actions/dialog-information.png
 gimp-linked NONE
 gimp-paste-as-new NONE
 gimp-paste-into NONE
-gimp-reset actions/reload.png
 gimp-selection-stroke NONE
 gimp-to-path NONE
 gimp-to-selection NONE
 gimp-visible NONE
-gimp-warning actions/dialog-warning.png
 gimp-selection-replace NONE
 gimp-selection-add NONE
 gimp-selection-subtract NONE
@@ -134,10 +137,8 @@
 gimp-resize NONE
 gimp-scale NONE
 gimp-selection-to-channel NONE
-gimp-tool-options actions/tool.png
 gimp-device-status NONE
 gimp-layer-to-imagesize NONE
-gimp-images mimetypes/image.png
 gimp-layers NONE
 gimp-channes NONE
 gimp-paths NONE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/CMakeLists.txt 
new/oxygen-gtk3-1.0.4/src/CMakeLists.txt
--- old/oxygen-gtk3-1.0.3/src/CMakeLists.txt    2012-04-13 15:02:08.000000000 
+0200
+++ new/oxygen-gtk3-1.0.4/src/CMakeLists.txt    2012-05-14 08:38:34.000000000 
+0200
@@ -18,6 +18,7 @@
     animations/oxygenmainwindowdata.cpp
     animations/oxygenmenubarstatedata.cpp
     animations/oxygenmenustatedata.cpp
+    animations/oxygenmenuitemengine.cpp
     animations/oxygenmenuitemdata.cpp
     animations/oxygenpaneddata.cpp
     animations/oxygensignal.cpp
@@ -52,6 +53,7 @@
     oxygenoptionmap.cpp
     oxygenpalette.cpp
     oxygenpathlist.cpp
+    oxygenpropertynames.cpp
     oxygenqtsettings.cpp
     oxygenrgba.cpp
     oxygenshadowconfiguration.cpp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oxygen-gtk3-1.0.3/src/animations/oxygenanimations.cpp 
new/oxygen-gtk3-1.0.4/src/animations/oxygenanimations.cpp
--- old/oxygen-gtk3-1.0.3/src/animations/oxygenanimations.cpp   2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/animations/oxygenanimations.cpp   2012-05-14 
08:38:34.000000000 +0200
@@ -216,6 +216,21 @@
         // check type
         if( !GTK_IS_WIDGET( widget ) ) return FALSE;
 
+        // comboboxes
+        /*
+        need to force the wrap-width property to 0,
+        otherwise the "appears-as-list" flag is not respected, which 
additionally breaks the widget rendering.
+        This has to be done soon enoug to avoid crash with latest gtk3 versions
+        */
+        if(
+            GTK_IS_COMBO_BOX( widget ) &&
+            Gtk::gtk_combobox_appears_as_list( widget ) &&
+            !gtk_combo_box_get_has_entry( GTK_COMBO_BOX( widget ) ) )
+        {
+            gtk_combo_box_set_wrap_width( GTK_COMBO_BOX( widget ), 0 );
+            return TRUE;
+        }
+
         // groupbox labels
         #if ENABLE_GROUPBOX_HACK
         if( static_cast<Animations*>( data )->groupBoxLabelEngine().contains( 
widget ) )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oxygen-gtk3-1.0.3/src/animations/oxygencomboboxdata.cpp 
new/oxygen-gtk3-1.0.4/src/animations/oxygencomboboxdata.cpp
--- old/oxygen-gtk3-1.0.3/src/animations/oxygencomboboxdata.cpp 2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/animations/oxygencomboboxdata.cpp 2012-05-14 
08:38:34.000000000 +0200
@@ -47,12 +47,6 @@
         // initialize cell view
         initializeCellView( widget );
 
-        /*
-        need to force the wrap-width property to 0,
-        otherwise the "appears-as-list" flag is not respected, which 
additionally breaks the widget rendering.
-        */
-        gtk_combo_box_set_wrap_width( GTK_COMBO_BOX( widget ), 0 );
-
     }
 
     
//________________________________________________________________________________
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oxygen-gtk3-1.0.3/src/animations/oxygenmenuitemengine.cpp 
new/oxygen-gtk3-1.0.4/src/animations/oxygenmenuitemengine.cpp
--- old/oxygen-gtk3-1.0.3/src/animations/oxygenmenuitemengine.cpp       
1970-01-01 01:00:00.000000000 +0100
+++ new/oxygen-gtk3-1.0.4/src/animations/oxygenmenuitemengine.cpp       
2012-05-14 08:38:34.000000000 +0200
@@ -0,0 +1,53 @@
+/*
+* this file is part of the oxygen gtk engine
+* Copyright (c) 2010 Hugo Pereira Da Costa <h...@oxygen-icons.org>
+*
+* This  library is free  software; you can  redistribute it and/or
+* modify it  under  the terms  of the  GNU Lesser  General  Public
+* License  as published  by the Free  Software  Foundation; either
+* version 2 of the License, or(at your option ) any later version.
+*
+* This library is distributed  in the hope that it will be useful,
+* but  WITHOUT ANY WARRANTY; without even  the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License  along  with  this library;  if not,  write to  the Free
+* Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
+* MA 02110-1301, USA.
+*/
+
+#include "oxygenmenuitemengine.h"
+#include <iostream>
+
+namespace Oxygen
+{
+
+    //_______________________________________________________________
+    bool MenuItemEngine::registerMenu( GtkWidget* parent )
+    {
+
+        // check widget
+        if( !GTK_IS_MENU( parent ) ) return false;
+
+        // keep track of added children
+        bool found( false );
+
+        // get children
+        GList* children( gtk_container_get_children( GTK_CONTAINER( parent ) ) 
);
+        for( GList *child = g_list_first( children ); child; child = 
g_list_next( child ) )
+        {
+            if( !GTK_IS_MENU_ITEM( child->data ) ) continue;
+            GtkWidget* widget( gtk_bin_get_child( GTK_BIN( child->data ) ) );
+            if( registerWidget( widget ) ) found = true;
+        }
+
+        // free list of children
+        if( children ) g_list_free( children );
+
+        return found;
+
+    }
+
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oxygen-gtk3-1.0.3/src/animations/oxygenmenuitemengine.h 
new/oxygen-gtk3-1.0.4/src/animations/oxygenmenuitemengine.h
--- old/oxygen-gtk3-1.0.3/src/animations/oxygenmenuitemengine.h 2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/animations/oxygenmenuitemengine.h 2012-05-14 
08:38:34.000000000 +0200
@@ -51,6 +51,9 @@
         virtual ~MenuItemEngine( void )
         {}
 
+        //! register all menuItems children of a menu
+        virtual bool registerMenu( GtkWidget* );
+
     };
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oxygen-gtk3-1.0.3/src/animations/oxygenscrolledwindowdata.cpp 
new/oxygen-gtk3-1.0.4/src/animations/oxygenscrolledwindowdata.cpp
--- old/oxygen-gtk3-1.0.3/src/animations/oxygenscrolledwindowdata.cpp   
2012-04-13 15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/animations/oxygenscrolledwindowdata.cpp   
2012-05-14 08:38:34.000000000 +0200
@@ -72,7 +72,6 @@
             static const char* widgetTypes[] = {
                 "ExoIconView",
                 "FMIconContainer",
-                "MessageList",
                 "EMailDisplay",
                 0L };
             for( unsigned int i = 0; widgetTypes[i]; i++ )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenanimationdata.h 
new/oxygen-gtk3-1.0.4/src/oxygenanimationdata.h
--- old/oxygen-gtk3-1.0.3/src/oxygenanimationdata.h     2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenanimationdata.h     2012-05-14 
08:38:34.000000000 +0200
@@ -1,31 +1,31 @@
 #ifndef oxygenanimationdata_h
 #define oxygenanimationdata_h
 
-//////////////////////////////////////////////////////////////////////////////
-// oxygenanimationdata.h
-// animation modes
-// -------------------
-//
-// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pere...@free.fr>
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-//////////////////////////////////////////////////////////////////////////////
+/*
+* oxygenanimationdata.h
+* animation modes
+* -------------------
+*
+* Copyright (c) 2012 Hugo Pereira Da Costa <h...@oxygen-icons.org>
+*
+* Largely inspired from Qtcurve style
+* Copyright (C) Craig Drummond, 2003 - 2010 craig.p.drumm...@gmail.com
+*
+* This  library is free  software; you can  redistribute it and/or
+* modify it  under  the terms  of the  GNU Lesser  General  Public
+* License  as published  by the Free  Software  Foundation; either
+* version 2 of the License, or( at your option ) any later version.
+*
+* This library is distributed  in the hope that it will be useful,
+* but  WITHOUT ANY WARRANTY; without even  the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License  along  with  this library;  if not,  write to  the Free
+* Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
+* MA 02110-1301, USA.
+*/
 
 #include "oxygenanimationmodes.h"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenanimationmodes.h 
new/oxygen-gtk3-1.0.4/src/oxygenanimationmodes.h
--- old/oxygen-gtk3-1.0.3/src/oxygenanimationmodes.h    2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenanimationmodes.h    2012-05-14 
08:38:34.000000000 +0200
@@ -1,31 +1,32 @@
 #ifndef oxygenanimationmodes_h
 #define oxygenanimationmodes_h
 
-//////////////////////////////////////////////////////////////////////////////
-// oxygenanimationmodes.h
-// animation modes
-// -------------------
-//
-// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pere...@free.fr>
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-//////////////////////////////////////////////////////////////////////////////
+/*
+* oxygenanimationmodes.h
+* animation modes
+* -------------------
+*
+* Copyright (c) 2012 Hugo Pereira Da Costa <h...@oxygen-icons.org>
+*
+* Largely inspired from Qtcurve style
+* Copyright (C) Craig Drummond, 2003 - 2010 craig.p.drumm...@gmail.com
+*
+* This  library is free  software; you can  redistribute it and/or
+* modify it  under  the terms  of the  GNU Lesser  General  Public
+* License  as published  by the Free  Software  Foundation; either
+* version 2 of the License, or( at your option ) any later version.
+*
+* This library is distributed  in the hope that it will be useful,
+* but  WITHOUT ANY WARRANTY; without even  the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License  along  with  this library;  if not,  write to  the Free
+* Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
+* MA 02110-1301, USA.
+*/
+
 #include "oxygenflags.h"
 
 namespace Oxygen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygengtkutils.cpp 
new/oxygen-gtk3-1.0.4/src/oxygengtkutils.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygengtkutils.cpp        2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygengtkutils.cpp        2012-05-14 
08:38:34.000000000 +0200
@@ -34,7 +34,6 @@
 
 namespace Oxygen
 {
-    GQuark Gtk::Quarks::_rcStyle = 0L;
 
     
//_____________________________________________________________________________
     std::ostream& operator << ( std::ostream& out, const GtkWidgetPath* path )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygengtkutils.h 
new/oxygen-gtk3-1.0.4/src/oxygengtkutils.h
--- old/oxygen-gtk3-1.0.3/src/oxygengtkutils.h  2012-04-13 15:02:08.000000000 
+0200
+++ new/oxygen-gtk3-1.0.4/src/oxygengtkutils.h  2012-05-14 08:38:34.000000000 
+0200
@@ -422,43 +422,6 @@
         //! returns a widget which has response_id as response id for dialog
         GtkWidget* gtk_dialog_find_button( GtkDialog*, gint );
 
-        //! store quarks
-        class Quarks
-        {
-            public:
-
-            //! parent class
-            inline static GQuark rcStyle( void )
-            {
-
-                // try initialize
-                if( !_rcStyle )
-                { _rcStyle = g_quark_try_string( "gtk-rc-style" ); }
-
-                return _rcStyle;
-
-            }
-
-
-            private:
-
-            //! RC style quark
-            /*!
-            used to check whether an RCStyle was installed on a given widget 
or not.
-            See gtkwidet::gtk_widget_get_modifier_style()
-            */
-            static GQuark _rcStyle;
-
-        };
-
-        //! returns true if widget style color is modified
-        inline bool gtk_widget_style_is_modified( GtkWidget* widget, 
GtkStateType state, GtkRcFlags flag )
-        {
-            const bool hasRCStyle( g_object_get_qdata (G_OBJECT (widget), 
Quarks::rcStyle() ) );
-            return ( hasRCStyle && 
gtk_widget_get_modifier_style(widget)->color_flags[state]&flag );
-        }
-
-
     }
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenoption.h 
new/oxygen-gtk3-1.0.4/src/oxygenoption.h
--- old/oxygen-gtk3-1.0.3/src/oxygenoption.h    2012-04-13 15:02:08.000000000 
+0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenoption.h    2012-05-14 08:38:34.000000000 
+0200
@@ -82,12 +82,6 @@
 
         template< typename T>  T toVariant( T = T() ) const;
 
-        #if OXYGEN_DEBUG
-        protected:
-        const std::string& file( void ) const
-        { return _file; }
-        #endif
-
         class Set: public std::set<Option>
         {
             public:
@@ -101,6 +95,12 @@
 
         };
 
+        #if OXYGEN_DEBUG
+        protected:
+        const std::string& file( void ) const
+        { return _file; }
+        #endif
+
         private:
 
         //! tag
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenpropertynames.cpp 
new/oxygen-gtk3-1.0.4/src/oxygenpropertynames.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygenpropertynames.cpp   1970-01-01 
01:00:00.000000000 +0100
+++ new/oxygen-gtk3-1.0.4/src/oxygenpropertynames.cpp   2012-05-14 
08:38:34.000000000 +0200
@@ -0,0 +1,34 @@
+/*
+* oxygenpropertynames.cpp
+* hard-coded property names to disable some of oxygen features
+* -------------------
+*
+* Copyright (c) 2012 Hugo Pereira Da Costa <h...@oxygen-icons.org>
+*
+* Largely inspired from Qtcurve style
+* Copyright (C) Craig Drummond, 2003 - 2010 craig.p.drumm...@gmail.com
+*
+* This  library is free  software; you can  redistribute it and/or
+* modify it  under  the terms  of the  GNU Lesser  General  Public
+* License  as published  by the Free  Software  Foundation; either
+* version 2 of the License, or( at your option ) any later version.
+*
+* This library is distributed  in the hope that it will be useful,
+* but  WITHOUT ANY WARRANTY; without even  the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License  along  with  this library;  if not,  write to  the Free
+* Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
+* MA 02110-1301, USA.
+*/
+#include "oxygenpropertynames.h"
+
+namespace Oxygen
+{
+
+    const char* const PropertyNames::noAnimations = "_kde_no_animations";
+    const char* const PropertyNames::noWindowGrab = "_kde_no_window_grab";
+
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenpropertynames.h 
new/oxygen-gtk3-1.0.4/src/oxygenpropertynames.h
--- old/oxygen-gtk3-1.0.3/src/oxygenpropertynames.h     1970-01-01 
01:00:00.000000000 +0100
+++ new/oxygen-gtk3-1.0.4/src/oxygenpropertynames.h     2012-05-14 
08:38:34.000000000 +0200
@@ -0,0 +1,43 @@
+#ifndef oxygenpropertynames_h
+#define oxygenpropertynames_h
+
+/*
+* oxygenpropertynames.h
+* hard-coded property names to disable some of oxygen features
+* -------------------
+*
+* Copyright (c) 2012 Hugo Pereira Da Costa <h...@oxygen-icons.org>
+*
+* Largely inspired from Qtcurve style
+* Copyright (C) Craig Drummond, 2003 - 2010 craig.p.drumm...@gmail.com
+*
+* This  library is free  software; you can  redistribute it and/or
+* modify it  under  the terms  of the  GNU Lesser  General  Public
+* License  as published  by the Free  Software  Foundation; either
+* version 2 of the License, or( at your option ) any later version.
+*
+* This library is distributed  in the hope that it will be useful,
+* but  WITHOUT ANY WARRANTY; without even  the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License  along  with  this library;  if not,  write to  the Free
+* Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
+* MA 02110-1301, USA.
+*/
+
+namespace Oxygen
+{
+
+    struct PropertyNames
+    {
+
+        static const char* const noAnimations;
+        static const char* const noWindowGrab;
+
+    };
+
+}
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenqtsettings.cpp 
new/oxygen-gtk3-1.0.4/src/oxygenqtsettings.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygenqtsettings.cpp      2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenqtsettings.cpp      2012-05-14 
08:38:34.000000000 +0200
@@ -511,7 +511,7 @@
         GtkSettings* settings( gtk_settings_get_default() );
 
         gtk_settings_set_string_property( settings, "gtk-icon-theme-name", 
_kdeIconTheme.c_str(), "oxygen-gtk" );
-        gtk_settings_set_string_property( settings, 
"gtk-fallback-icon-theme-name", _kdeFallbackIconTheme.c_str(), "oxygen-gtk" );
+        gtk_settings_set_string_property( settings, "gtk-fallback-icon-theme", 
_kdeFallbackIconTheme.c_str(), "oxygen-gtk" );
 
         // load icon sizes from kde
         // const int desktopIconSize( _kdeGlobals.getOption( "[DesktopIcons]", 
"Size" ).toInt( 48 ) );
@@ -693,6 +693,11 @@
         _css.addToCurrentSection( Gtk::CSSOption<std::string>( 
GTK_STYLE_PROPERTY_BACKGROUND_COLOR, _palette.color( Palette::Selected ) ) );
         _css.addToCurrentSection( Gtk::CSSOption<std::string>( 
GTK_STYLE_PROPERTY_COLOR, _palette.color( Palette::SelectedText ) ) );
 
+        // sidebars
+        _css.addSection( "GtkAssistant .sidebar" );
+        _css.addToCurrentSection( Gtk::CSSOption<std::string>( 
GTK_STYLE_PROPERTY_BACKGROUND_COLOR, _palette.color( Palette::Disabled, 
Palette::Base ) ) );
+        _css.addToCurrentSection( Gtk::CSSOption<std::string>( 
GTK_STYLE_PROPERTY_COLOR, _palette.color( Palette::Disabled, Palette::Text ) ) 
);
+
          // buttons and comboboxes
         _css.addSection( "GtkButton" );
         _css.addToCurrentSection( Gtk::CSSOption<std::string>( 
GTK_STYLE_PROPERTY_BACKGROUND_COLOR, _palette.color( Palette::Button ) ) );
@@ -837,6 +842,10 @@
         // don't check for section and tag presence - use default font if not 
present
         _WMFont=FontInfo::fromKdeOption( _kdeGlobals.getValue( "[WM]", 
"activeFont", "Sans Serif,8,-1,5,50,0,0,0,0,0" ) );
 
+
+        _css.addSection( "GtkAssistant .sidebar .highlight" );
+        _css.addToCurrentSection( Gtk::CSSOption<std::string>( "font-weight", 
"bold" ) );
+
     }
 
     //_________________________________________________________
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenthemingengine.cpp 
new/oxygen-gtk3-1.0.4/src/oxygenthemingengine.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygenthemingengine.cpp   2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenthemingengine.cpp   2012-05-14 
08:38:34.000000000 +0200
@@ -211,6 +211,10 @@
         const GtkWidgetPath* path( gtk_theming_engine_get_path( engine ) );
         GtkWidget* widget( Style::instance().widgetLookup().find( context, 
path ) );
 
+        GtkWidget* toplevel=gtk_widget_get_toplevel(widget);
+        if(GTK_IS_DIALOG(toplevel))
+        { 
Style::instance().animations().dialogEngine().registerWidget(toplevel); }
+
         if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_TOOLTIP ) )
         {
 
@@ -240,7 +244,8 @@
         } else if( widget && (
             gtk_widget_path_is_type( path, GTK_TYPE_PANED ) ||
             gtk_widget_path_is_type( path, GTK_TYPE_WINDOW ) ||
-            gtk_widget_path_is_type( path, GTK_TYPE_VIEWPORT )
+            gtk_widget_path_is_type( path, GTK_TYPE_VIEWPORT ) ||
+            gtk_widget_path_is_type( path, GTK_TYPE_EVENT_BOX )
             ) )
         {
 
@@ -254,6 +259,9 @@
             if( pattern.isValid() )
             {
                 // if valid background image is found, fallback to parent style
+                #if OXYGEN_DEBUG
+                std::cerr << "Calling parentClass()->render_background()\n";
+                #endif
                 ThemingEngine::parentClass()->render_background( engine, 
context, x, y, w, h );
                 return;
             }
@@ -308,15 +316,6 @@
 
             // no need to render anything for notebook gradient
 
-        } else if(
-            gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_SIDEBAR ) &&
-            Gtk::gtk_widget_path_has_type( path, GTK_TYPE_ASSISTANT ) &&
-            gtk_widget_path_is_type( path, GTK_TYPE_FRAME ) ) {
-
-            // no background for assistant sidebar frame
-            Style::instance().fill( context, x, y, w, h, 
Style::instance().settings().palette().color( Palette::Base ) );
-            return;
-
         } else if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_CELL 
) ) {
 
             GtkStateFlags state( gtk_theming_engine_get_state( engine ) );
@@ -468,8 +467,17 @@
         {
 
             return;
+
         } else if( gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_TOOLBAR ) ) {
 
+            // render background
+            if( !Gtk::gtk_widget_is_applet( widget ) )
+            { Style::instance().renderWindowBackground( context, 0L, widget, 
x, y, w, h ); }
+
+            // possible groupbox background
+            if( Gtk::gtk_widget_path_has_type( path, GTK_TYPE_FRAME ) )
+            { Style::instance().renderGroupBoxBackground( context, widget, x, 
y, w, h, Blend ); }
+
             render_animated_button( context, widget );
             return;
 
@@ -504,6 +512,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_background()\n";
+            #endif
             ThemingEngine::parentClass()->render_background( engine, context, 
x, y, w, h );
 
         }
@@ -692,10 +703,11 @@
 
         } else if( gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_BUTTON ) ) {
 
-            // no frame for scrollbar buttons and spin buttons
+            // no frame for scrollbar buttons, spin buttons, and menu buttons
             if(
                 gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_SCROLLBAR ) ||
-                gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_SPINBUTTON ) )
+                gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_SPINBUTTON ) ||
+                gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_MENU ) )
             { return; }
 
             // pathbar buttons
@@ -1033,6 +1045,9 @@
                 // add mask if needed
                 if( GTK_IS_MENU(widget) )
                 {
+
+                    
Style::instance().animations().menuItemEngine().registerMenu( widget );
+
                     GdkWindow* window( gtk_widget_get_parent_window(widget) );
                     if( !(options&Alpha) )
                     {
@@ -1530,6 +1545,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_frame_gap()\n";
+            #endif
             ThemingEngine::parentClass()->render_frame_gap( engine, context, 
x, y, w, h, position, xy0_gap, xy1_gap );
 
         }
@@ -1743,6 +1761,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_check()\n";
+            #endif
             ThemingEngine::parentClass()->render_check( engine, context, x, y, 
w, h );
 
         }
@@ -1827,6 +1848,9 @@
         } else {
 
             // parent
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_option()\n";
+            #endif
             ThemingEngine::parentClass()->render_option( engine, context, x, 
y, w, h );
 
         }
@@ -2153,6 +2177,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_layout()\n";
+            #endif
             ThemingEngine::parentClass()->render_layout( engine, context, x, 
y, layout );
 
         }
@@ -2206,19 +2233,6 @@
                 cairo_restore( context );
                 return;
 
-            } else if(
-                gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_HIGHLIGHT ) &&
-                Gtk::gtk_widget_path_has_type( path, GTK_TYPE_ASSISTANT ) )
-            {
-
-                // identify highlighted assistant labels and change font to 
bold
-                PangoAttrList* attributes( pango_layout_get_attributes( layout 
) );
-                if( !attributes ) attributes = pango_attr_list_new();
-                pango_attr_list_insert( attributes, pango_attr_weight_new( 
PANGO_WEIGHT_BOLD ) );
-                pango_layout_set_attributes( layout, attributes );
-                render_layout_internal( engine, context, x, y, layout );
-                return;
-
             }
 
         }
@@ -2282,6 +2296,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_slider()\n";
+            #endif
             ThemingEngine::parentClass()->render_slider( engine, context, x, 
y, w, h, orientation );
 
         }
@@ -2294,12 +2311,13 @@
     void render_handle( GtkThemingEngine* engine, cairo_t* context, gdouble x, 
gdouble y, gdouble w, gdouble h )
     {
 
+        const GtkWidgetPath* path(gtk_theming_engine_get_path(engine));
         #if OXYGEN_DEBUG
         std::cerr
             << "Oxygen::render_handle -"
             << " context: " << context
             << " rect: " << Gtk::gdk_rectangle( x, y, w, h )
-            << " path: " << gtk_theming_engine_get_path(engine)
+            << " path: " << path
             << std::endl;
         #endif
 
@@ -2326,14 +2344,22 @@
                 options, AnimationHover ) );
             Style::instance().renderSplitter( context, x, y, w, h, options, 
data );
 
-        } else if( gtk_theming_engine_has_class( engine, 
GTK_STYLE_CLASS_TOOLBAR) ) {
+        } else if( gtk_widget_path_is_type(path,GTK_TYPE_HANDLE_BOX) ) {
+
+            // render background
+            if( !Gtk::gtk_widget_is_applet( widget ) )
+            { Style::instance().renderWindowBackground( context, 0L, widget, 
x, y, w, h ); }
 
+            // handles
             StyleOptions options( widget, state );
-            if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_VERTICAL 
) ) options |= Vertical;
+            if(h>w) options|=Vertical;
             Style::instance().renderToolBarHandle( context, x, y, w, h, 
options );
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_handle()\n";
+            #endif
             ThemingEngine::parentClass()->render_handle( engine, context, x, 
y, w, h );
 
         }
@@ -2396,6 +2422,9 @@
 
         } else {
 
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_activity()\n";
+            #endif
             ThemingEngine::parentClass()->render_activity( engine, context, x, 
y, w, h );
 
         }
@@ -2404,12 +2433,51 @@
 
     }
 
+    //___________________________________________________________
+    static GdkPixbuf* render_stated_pixbuf( GdkPixbuf* source, GtkStateFlags 
state, bool useEffect )
+    {
+
+        #if OXYGEN_DEBUG
+        std::cerr
+            << "Oxygen::render_stated_pixbuf -"
+            << " state: " << state
+            << " useEffect: " << useEffect
+            << std::endl;
+        #endif
+
+        // first make a copy
+        GdkPixbuf* stated( source );
+        if( state & GTK_STATE_FLAG_INSENSITIVE )
+        {
+
+            stated = Gtk::gdk_pixbuf_set_alpha( source, 0.3 );
+            gdk_pixbuf_saturate_and_pixelate( stated, stated, 0.1, false );
+
+        } else if( useEffect && (state&GTK_STATE_FLAG_PRELIGHT) ) {
+
+            stated = gdk_pixbuf_copy( source );
+            if(!Gtk::gdk_pixbuf_to_gamma( stated, 0.7 ) )
+            {
+                // FIXME: correct the value to match KDE
+                /*
+                in fact KDE allows one to set many different effects on icon
+                not sure we want to copy this code all over the place, 
especially since nobody changes the default settings,
+                as far as I know */
+                gdk_pixbuf_saturate_and_pixelate( source, stated, 1.2, false );
+            }
+
+        }
+
+        return stated;
+    }
+
     
//________________________________________________________________________________________________
     GdkPixbuf* render_icon_pixbuf( GtkThemingEngine *engine, const 
GtkIconSource *source, GtkIconSize size)
     {
+
         #if OXYGEN_DEBUG
         std::cerr
-            << "Oxygen::render_icon_pixbuf-"
+            << "Oxygen::render_icon_pixbuf -"
             << " source: " << source
             << " size: " << size
             << " path: " << gtk_theming_engine_get_path(engine)
@@ -2451,42 +2519,77 @@
         GtkStateFlags state(gtk_theming_engine_get_state( engine ) );
         const GtkWidgetPath* path( gtk_theming_engine_get_path( engine ) );
 
-        // non-flat pushbuttons don't have any icon effect
-        /* since we can't access the button directly, we enable effect only 
for toolbutton widgets */
-        const bool useEffect(
-            Style::instance().settings().useIconEffect() &&
-            Gtk::gtk_widget_path_has_type( path, GTK_TYPE_TOOL_BUTTON ) );
-
         /* If the state was wildcarded, then generate a state. */
-        GdkPixbuf *stated( scaled );
-        if( gtk_icon_source_get_state_wildcarded( source ) )
+        if( !gtk_icon_source_get_state_wildcarded( source ) ) return scaled;
+        else {
+
+            // non-flat pushbuttons don't have any icon effect
+            /* since we can't access the button directly, we enable effect 
only for toolbutton widgets */
+            const bool useEffect(
+                Style::instance().settings().useIconEffect() &&
+                Gtk::gtk_widget_path_has_type( path, GTK_TYPE_TOOL_BUTTON ) );
+
+            /* If the state was wildcarded, then generate a state. */
+            GdkPixbuf *stated( render_stated_pixbuf( scaled, state, useEffect 
) );
+
+            // clean-up
+            if( stated != scaled )
+            { g_object_unref( scaled ); }
+
+            // return
+            return stated;
+        }
+
+    }
+
+    
//_______________________________________________________________________________________________________________
+    void render_icon( GtkThemingEngine* engine, cairo_t *context, GdkPixbuf* 
pixbuf, gdouble x, gdouble y )
+    {
+
+        #if OXYGEN_DEBUG
+        std::cerr
+            << "Oxygen::render_icon -"
+            << " context: " << context
+            << " pixbuf: " << pixbuf
+            << " position: (" << x << "," << y << ")"
+            << " path: " << gtk_theming_engine_get_path(engine)
+            << std::endl;
+        #endif
+
+        // get state and path
+        GtkStateFlags state( gtk_theming_engine_get_state( engine ) );
+        const GtkWidgetPath* path( gtk_theming_engine_get_path( engine ) );
+        if( gtk_widget_path_is_type( path, GTK_TYPE_SPIN_BUTTON ) )
         {
 
-            if( state&GTK_STATE_FLAG_INSENSITIVE )
-            {
+            // need to apply state effect on pixbuf because it is not done by 
Gtk
+            // nor is render_icon_pixbuf called
+            // TODO: see if one can implement some sort of cache.
 
-                stated = Gtk::gdk_pixbuf_set_alpha( scaled, 0.3 );
-                gdk_pixbuf_saturate_and_pixelate( stated, stated, 0.1, false );
-                g_object_unref (scaled);
+            /* since we can't access the button directly, we enable effect 
only for toolbutton widgets */
+            const bool useEffect( Style::instance().settings().useIconEffect() 
);
+            GdkPixbuf* stated( render_stated_pixbuf( pixbuf, state, useEffect 
) );
 
-            } else if( useEffect && (state&GTK_STATE_FLAG_PRELIGHT) ) {
+            // call parent method with stated pixbuf
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_icon()\n";
+            #endif
+            ThemingEngine::parentClass()->render_icon( engine, context, 
stated, x, y );
 
-                stated = gdk_pixbuf_copy( scaled );
-                if(!Gtk::gdk_pixbuf_to_gamma( stated, 0.7 ) )
-                {
-                    // FIXME: correct the value to match KDE
-                    /*
-                    in fact KDE allows one to set many different effects on 
icon
-                    not sure we want to copy this code all over the place, 
especially since nobody changes the default settings,
-                    as far as I know */
-                    gdk_pixbuf_saturate_and_pixelate( scaled, stated, 1.2, 
false );
-                }
-                g_object_unref( scaled );
+            // and cleanup
+            if( stated != pixbuf ) g_object_unref( stated );
+            return;
 
-            }
-        }
+        } else {
 
-        return stated;
+            // call parent method
+            #if OXYGEN_DEBUG
+            std::cerr << "Calling parentClass()->render_icon()\n";
+            #endif
+            ThemingEngine::parentClass()->render_icon( engine, context, 
pixbuf, x, y );
+            return;
+
+        }
 
     }
 
@@ -2536,6 +2639,7 @@
         theming_engine_class->render_handle = render_handle;
         theming_engine_class->render_activity = render_activity;
         theming_engine_class->render_icon_pixbuf = render_icon_pixbuf;
+        theming_engine_class->render_icon = render_icon;
         return;
 
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenwindecobutton.cpp 
new/oxygen-gtk3-1.0.4/src/oxygenwindecobutton.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygenwindecobutton.cpp   2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenwindecobutton.cpp   2012-05-14 
08:38:34.000000000 +0200
@@ -114,6 +114,7 @@
             cairo_stroke(context);
 
             cairo_arc_qt( context, 9,8,4, 135*M_PI/180, M_PI/4 );
+            cairo_stroke( context );
             cairo_move_to( context, 9,12 );
             cairo_close_path( context );
             cairo_stroke( context );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenwindowmanager.cpp 
new/oxygen-gtk3-1.0.4/src/oxygenwindowmanager.cpp
--- old/oxygen-gtk3-1.0.3/src/oxygenwindowmanager.cpp   2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenwindowmanager.cpp   2012-05-14 
08:38:34.000000000 +0200
@@ -26,6 +26,7 @@
 */
 
 #include "oxygenwindowmanager.h"
+#include "oxygenpropertynames.h"
 #include "oxygenstyle.h"
 #include "config.h"
 
@@ -87,10 +88,28 @@
     bool WindowManager::registerWidget( GtkWidget* widget )
     {
 
-        if( _map.contains( widget ) || widgetIsBlackListed( widget ) ) return 
false;
+        if( _map.contains( widget ) ) return false;
+
+        // check against black listed typenames
+        if( widgetIsBlackListed( widget ) )
+        {
+            registerBlackListWidget( widget );
+            return false;
+        }
+
+        // check blocking property
+        if( g_object_get_data( G_OBJECT( widget ), PropertyNames::noWindowGrab 
) )
+        {
+            registerBlackListWidget( widget );
+            return false;
+        }
 
         // Window with no decorations (set by app), let window manage it self
-        if( GTK_IS_WINDOW( widget ) && !gtk_window_get_decorated( GTK_WINDOW( 
widget ) ) ) return false;
+        if( GTK_IS_WINDOW( widget ) && !gtk_window_get_decorated( GTK_WINDOW( 
widget ) ) )
+        {
+            registerBlackListWidget( widget );
+            return false;
+        }
 
         // widgets used in tabs also must be ignored (happens, unfortunately)
         GtkWidget* parent( gtk_widget_get_parent( widget ) );
@@ -107,6 +126,13 @@
             std::string( G_OBJECT_TYPE_NAME( widget ) ) == "GtkWindow" &&
             (gtk_widget_get_events ( widget ) &
             (GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK) ) )
+        {
+            registerBlackListWidget( widget );
+            return false;
+        }
+
+        // check for blacklisted parent
+        if( widgetHasBlackListedParent( widget ) )
         { return false; }
 
         #if OXYGEN_DEBUG
@@ -156,6 +182,41 @@
     }
 
     //_________________________________________________
+    bool WindowManager::registerBlackListWidget( GtkWidget* widget )
+    {
+
+        // make sure that widget is not already connected
+        if( _blackListWidgets.find( widget ) != _blackListWidgets.end() ) 
return false;
+
+        #if OXYGEN_DEBUG
+        std::cerr << "Oxygen::WindowManager::registerBlackListWidget - " << 
widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
+        #endif
+
+      // connect destroy signal and insert in map
+        Signal destroyId;
+        destroyId.connect( G_OBJECT( widget ), "destroy", G_CALLBACK( 
wmBlackListDestroy ), this );
+        _blackListWidgets.insert( std::make_pair( widget, destroyId ) );
+        return true;
+
+    }
+
+    //_________________________________________________
+    void WindowManager::unregisterBlackListWidget( GtkWidget* widget )
+    {
+
+        WidgetMap::iterator iter( _blackListWidgets.find( widget ) );
+        if( iter == _blackListWidgets.end() ) return;
+
+        #if OXYGEN_DEBUG
+        std::cerr << "Oxygen::WindowManager::unregisterBlackListWidget - " << 
widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
+        #endif
+
+        iter->second.disconnect();
+        _blackListWidgets.erase( widget );
+
+    }
+
+    //_________________________________________________
     void WindowManager::setMode( WindowManager::Mode mode )
     {
         if( mode == _mode ) return;
@@ -182,6 +243,13 @@
     }
 
     //_________________________________________________
+    gboolean WindowManager::wmBlackListDestroy( GtkWidget* widget, gpointer 
data )
+    {
+        static_cast<WindowManager*>(data)->unregisterBlackListWidget( widget );
+        return false;
+    }
+
+    //_________________________________________________
     gboolean WindowManager::wmButtonPress(GtkWidget *widget, GdkEventButton* 
event, gpointer data )
     {
 
@@ -597,6 +665,21 @@
     }
 
     //_________________________________________________
+    bool WindowManager::widgetHasBlackListedParent( GtkWidget* widget ) const
+    {
+
+        #if OXYGEN_DEBUG
+        std::cerr << "Oxygen::WindowManager::widgetHasBlackListedParent - " << 
widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
+        #endif
+
+        // loop over widget parent
+        for( GtkWidget* parent = gtk_widget_get_parent( widget ); parent; 
parent = gtk_widget_get_parent( parent ) )
+        { if( _blackListWidgets.find( parent ) != _blackListWidgets.end() ) 
return true; }
+
+        return false;
+    }
+
+    //_________________________________________________
     void WindowManager::initializeBlackList( void )
     {
         // clear list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oxygen-gtk3-1.0.3/src/oxygenwindowmanager.h 
new/oxygen-gtk3-1.0.4/src/oxygenwindowmanager.h
--- old/oxygen-gtk3-1.0.3/src/oxygenwindowmanager.h     2012-04-13 
15:02:08.000000000 +0200
+++ new/oxygen-gtk3-1.0.4/src/oxygenwindowmanager.h     2012-05-14 
08:38:34.000000000 +0200
@@ -93,6 +93,9 @@
         //! on window destroy
         static gboolean wmDestroy( GtkWidget*, gpointer );
 
+        //! on window destroy
+        static gboolean wmBlackListDestroy(  GtkWidget*, gpointer );
+
         //! delayed drag
         static gboolean startDelayedDrag( gpointer );
 
@@ -106,10 +109,16 @@
 
         //! register widget
         /*! returns true if widget is effictively registered */
-        virtual bool registerWidget( GtkWidget* );
+        bool registerWidget( GtkWidget* );
 
         //! unregister widget
-        virtual void unregisterWidget( GtkWidget* );
+        void unregisterWidget( GtkWidget* );
+
+        //! register blacklist widget
+        bool registerBlackListWidget( GtkWidget* );
+
+        //! unregister blacklist widget
+        void unregisterBlackListWidget( GtkWidget* );
 
         //! start dragging widget
         bool startDrag( GtkWidget*, GdkEventMotion* );
@@ -166,6 +175,9 @@
         bool widgetIsBlackListed( GtkWidget* widget ) const
         { return std::find_if( _blackList.begin(), _blackList.end(), 
BlackListFTor( G_OBJECT( widget ) ) ) != _blackList.end(); }
 
+        //! return true if widget has a black listed parent
+        bool widgetHasBlackListedParent( GtkWidget* widget ) const;
+
         //! stores connections
         class Data
         {
@@ -240,9 +252,14 @@
         int _x;
         int _y;
 
-        //! widget black list
+        //! widget typenames black-list
         std::vector<std::string> _blackList;
 
+        //! widget black-list
+        typedef std::map< GtkWidget*, Signal > WidgetMap;
+        WidgetMap _blackListWidgets;
+
+
         //! map widgets to data structure
         DataMap<Data> _map;
 

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to