File indexing completed on 2024-05-12 05:34:35

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     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "oxygenscrollbardata.h"
0009 #include "../oxygengtkutils.h"
0010 
0011 #include <gtk/gtk.h>
0012 
0013 namespace Oxygen
0014 {
0015 
0016     //________________________________________________________________________________
0017     void ScrollBarData::connect( GtkWidget* widget )
0018     {
0019         _target = widget;
0020         _locked = false;
0021         _valueChangedId.connect( G_OBJECT(widget), "value-changed", G_CALLBACK( valueChanged ), this );
0022     }
0023 
0024     //________________________________________________________________________________
0025     void ScrollBarData::disconnect( GtkWidget* )
0026     {
0027         _target = 0L;
0028 
0029         // reset timeout and locked flag
0030         _timer.stop();
0031         _locked = false;
0032 
0033         _valueChangedId.disconnect();
0034     }
0035 
0036     //________________________________________________________________________________
0037     void ScrollBarData::valueChanged( GtkRange* widget, gpointer pointer )
0038     {
0039 
0040         ScrollBarData& data( *static_cast<ScrollBarData*>( pointer ) );
0041         if( data._updatesDelayed )
0042         {
0043 
0044             // schedule delayed timeOut
0045             if( !data._timer.isRunning() )
0046             {
0047 
0048                 data._timer.start( data._delay, (GSourceFunc)delayedUpdate, &data );
0049                 data._locked = false;
0050 
0051             } else data._locked = true;
0052 
0053 
0054         } else if( GtkWidget* parent = Gtk::gtk_parent_scrolled_window( GTK_WIDGET( widget ) ) ) {
0055 
0056             gtk_widget_queue_draw( parent );
0057 
0058         }
0059 
0060         return;
0061     }
0062 
0063     //________________________________________________________________________________
0064     gboolean ScrollBarData::delayedUpdate( gpointer pointer )
0065     {
0066 
0067         ScrollBarData& data( *static_cast<ScrollBarData*>(pointer) );
0068 
0069         if( !data._target )
0070         {
0071 
0072             // if target is invalid, reset timeout and return
0073             data._locked = false;
0074             return FALSE;
0075 
0076         } else if( data._locked ) {
0077 
0078             // if locked, reset the flag and re-run timer
0079             data._locked = false;
0080             return TRUE;
0081 
0082         } else if( GtkWidget* parent = Gtk::gtk_parent_scrolled_window( GTK_WIDGET( data._target ) ) ) {
0083 
0084             // otherwise, trigger update
0085             gtk_widget_queue_draw( parent );
0086             return FALSE;
0087 
0088         }
0089 
0090         // if everything fails, unlock and do nothing
0091         data._locked = false;
0092         return FALSE;
0093 
0094     }
0095 
0096 }