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 }