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 }