File indexing completed on 2024-04-28 05:32:09

0001 /*
0002     this file is part of the oxygen gtk engine
0003     SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0004     SPDX-FileCopyrightText: 2010 Ruslan Kabatsayev <b7.10110111@gmail.com>
0005 
0006     Hook-setup code provided by Ruslan
0007 
0008     SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 
0011 #include "oxygenargbhelper.h"
0012 #include "oxygengtktypenames.h"
0013 #include "config.h"
0014 
0015 #include <gtk/gtk.h>
0016 
0017 #include <cassert>
0018 #include <iostream>
0019 
0020 namespace Oxygen
0021 {
0022 
0023     //__________________________________________________________________
0024     ArgbHelper::ArgbHelper( void ):
0025         _hooksInitialized( false )
0026     {
0027         #if OXYGEN_DEBUG
0028         std::cerr << "Oxygen::ArgbHelper::ArgbHelper" << std::endl;
0029         #endif
0030     }
0031 
0032 
0033     //_____________________________________________________
0034     ArgbHelper::~ArgbHelper( void )
0035     {
0036 
0037         #if OXYGEN_DEBUG
0038         std::cerr << "Oxygen::ArgbHelper::~ArgbHelper" << std::endl;
0039         #endif
0040 
0041         // disconnect hooks
0042         _styleSetHook.disconnect();
0043 
0044     }
0045 
0046     //_____________________________________________________
0047     void ArgbHelper::initializeHooks( void )
0048     {
0049 
0050         if( _hooksInitialized ) return;
0051 
0052         // colormap hooks
0053         if( _styleSetHook.connect( "style-set", (GSignalEmissionHook)styleSetHook, 0L ) )
0054         { _hooksInitialized = true; }
0055 
0056         return;
0057 
0058     }
0059 
0060     //_____________________________________________________
0061     gboolean ArgbHelper::styleSetHook( GSignalInvocationHint*, guint, const GValue* params, gpointer )
0062     {
0063 
0064         // get widget from params
0065         GtkWidget* widget( GTK_WIDGET( g_value_get_object( params ) ) );
0066 
0067         // check type
0068         if( !GTK_IS_WIDGET( widget ) ) return FALSE;
0069         if( !GTK_IS_WINDOW( widget ) ) return TRUE;
0070 
0071         // make sure widget has not been realized already
0072         #if GTK_CHECK_VERSION(2, 20, 0)
0073         if( gtk_widget_get_realized( widget ) ) return TRUE;
0074         #else
0075         if( GTK_WIDGET_REALIZED( widget ) ) return TRUE;
0076         #endif
0077 
0078         // screen
0079         GdkScreen* screen = gdk_screen_get_default();
0080         if( !screen ) return TRUE;
0081 
0082         // colormap
0083         GdkColormap* colormap(gdk_screen_get_rgba_colormap( screen ) );
0084         if( !colormap ) return TRUE;
0085 
0086         // hint
0087         GtkWindow* window( GTK_WINDOW( widget ) );
0088         GdkWindowTypeHint hint = gtk_window_get_type_hint( window );
0089         if(
0090             hint == GDK_WINDOW_TYPE_HINT_MENU ||
0091             hint == GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU ||
0092             hint == GDK_WINDOW_TYPE_HINT_POPUP_MENU ||
0093             hint == GDK_WINDOW_TYPE_HINT_TOOLTIP ||
0094             hint == GDK_WINDOW_TYPE_HINT_COMBO
0095             )
0096         {
0097 
0098             #if OXYGEN_DEBUG
0099             std::cerr << "Oxygen::ArgbHelper::styleSetHook - "
0100                 << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")"
0101                 << " hint: " << Gtk::TypeNames::windowTypeHint( hint )
0102                 << std::endl;
0103             #endif
0104 
0105             // assign argb colormap to widget
0106             gtk_widget_set_colormap( widget, colormap );
0107 
0108         }
0109 
0110         return TRUE;
0111 
0112     }
0113 
0114 }