File indexing completed on 2024-05-12 17:05:48
0001 /* 0002 this file is part of the oxygen gtk engine 0003 SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr> 0004 0005 the hover data code is largely inspired from the gtk redmond engine 0006 0007 SPDX-License-Identifier: LGPL-2.0-or-later 0008 */ 0009 0010 #include "oxygenhoverdata.h" 0011 #include "../oxygengtkutils.h" 0012 #include "../config.h" 0013 0014 #include <gtk/gtk.h> 0015 #include <iostream> 0016 0017 namespace Oxygen 0018 { 0019 0020 //________________________________________________________________________________ 0021 void HoverData::connect( GtkWidget* widget ) 0022 { 0023 0024 #if OXYGEN_DEBUG 0025 std::cerr << "Oxygen::HoverData::connect - " << widget << " (" << (widget ? G_OBJECT_TYPE_NAME( widget ):"null") << ")" << std::endl; 0026 #endif 0027 0028 const bool enabled( gtk_widget_get_state( widget ) != GTK_STATE_INSENSITIVE ); 0029 0030 // on connection, needs to check whether mouse pointer is in widget or not 0031 // to have the proper initial value of the hover flag 0032 if( enabled ) 0033 { 0034 0035 gint xPointer,yPointer; 0036 gdk_window_get_pointer( gtk_widget_get_window( widget ), &xPointer, &yPointer, 0L); 0037 const GtkAllocation allocation( Gtk::gtk_widget_get_allocation( widget ) ); 0038 const GdkRectangle rect( Gtk::gdk_rectangle( 0, 0, allocation.width, allocation.height ) ); 0039 setHovered( widget, Gtk::gdk_rectangle_contains( &rect, xPointer, yPointer ) ); 0040 0041 } else { 0042 0043 setHovered( widget, false ); 0044 0045 } 0046 0047 // register callbacks 0048 _enterId.connect( G_OBJECT(widget), "enter-notify-event", G_CALLBACK( enterNotifyEvent ), this ); 0049 _leaveId.connect( G_OBJECT(widget), "leave-notify-event", G_CALLBACK( leaveNotifyEvent ), this ); 0050 } 0051 0052 //________________________________________________________________________________ 0053 void HoverData::disconnect( GtkWidget* widget ) 0054 { 0055 #if OXYGEN_DEBUG 0056 std::cerr << "Oxygen::HoverData::disconnect - " << widget << " (" << (widget ? G_OBJECT_TYPE_NAME( widget ):"null") << ")" << std::endl; 0057 #endif 0058 0059 _enterId.disconnect(); 0060 _leaveId.disconnect(); 0061 } 0062 0063 //________________________________________________________________________________ 0064 gboolean HoverData::enterNotifyEvent(GtkWidget* widget, GdkEventCrossing*, gpointer data ) 0065 { 0066 #if OXYGEN_DEBUG 0067 std::cerr << "HoverData::enterNotifyEvent - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl; 0068 #endif 0069 0070 static_cast<HoverData*>( data )->setHovered( widget, true ); 0071 return FALSE; 0072 } 0073 0074 //________________________________________________________________________________ 0075 gboolean HoverData::leaveNotifyEvent( GtkWidget* widget, GdkEventCrossing*, gpointer data ) 0076 { 0077 #if OXYGEN_DEBUG 0078 std::cerr << "Oxygen::HoverData::leaveNotifyEvent - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl; 0079 #endif 0080 0081 static_cast<HoverData*>( data )->setHovered( widget, false ); 0082 return FALSE; 0083 } 0084 0085 }