File indexing completed on 2024-05-12 17:05:49
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 }