File indexing completed on 2024-05-12 05:34:34
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 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "oxygenmainwindowdata.h" 0010 #include "../oxygengtkutils.h" 0011 0012 #include <gtk/gtk.h> 0013 0014 namespace Oxygen 0015 { 0016 0017 //________________________________________________________________________________ 0018 void MainWindowData::connect( GtkWidget* widget ) 0019 { 0020 _target = widget; 0021 _locked = false; 0022 _configureId.connect( G_OBJECT(widget), "configure-event", G_CALLBACK( configureNotifyEvent ), this); 0023 } 0024 0025 //________________________________________________________________________________ 0026 void MainWindowData::disconnect( GtkWidget* widget ) 0027 { 0028 _target = 0L; 0029 0030 // reset timeout and locked flag 0031 _timer.stop(); 0032 _locked = false; 0033 0034 _configureId.disconnect(); 0035 } 0036 0037 //________________________________________________________________________________ 0038 void MainWindowData::updateSize( int width, int height ) 0039 { 0040 0041 if( width == _width && height == _height ) return; 0042 _width = width; 0043 _height = height; 0044 0045 // schedule delayed timeOut 0046 if( !_timer.isRunning() ) 0047 { 0048 0049 _timer.start( 50, (GSourceFunc)delayedUpdate, this ); 0050 _locked = false; 0051 0052 } else _locked = true; 0053 0054 } 0055 0056 //________________________________________________________________________________ 0057 gboolean MainWindowData::configureNotifyEvent(GtkWidget* widget, GdkEventConfigure* event, gpointer data ) 0058 { 0059 static_cast<MainWindowData*>(data)->updateSize( event->width, event->height ); 0060 return FALSE; 0061 } 0062 0063 //________________________________________________________________________________ 0064 gboolean MainWindowData::delayedUpdate( gpointer pointer ) 0065 { 0066 0067 MainWindowData& data( *static_cast<MainWindowData*>(pointer) ); 0068 if( !data._target ) 0069 { 0070 0071 // if target is invalid, reset timeout and return 0072 data._locked = false; 0073 return FALSE; 0074 0075 } else if( data._locked ) { 0076 0077 // if locked, reset the flag and re-run timer 0078 data._locked = false; 0079 return TRUE; 0080 0081 } else { 0082 0083 // otherwise, trigger update 0084 gtk_widget_queue_draw( data._target ); 0085 return FALSE; 0086 0087 } 0088 0089 } 0090 0091 }