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 }