|
fltk 1.3.0rc3
About: FLTK (Fast Light Tool Kit) is a cross-platform C++ GUI toolkit for UNIX/Linux (X11), Microsoft Windows, and MacOS X. Release candidate.
SfR Fresh Dox: fltk-1.3.0rc3-source.tar.gz ("inofficial" and yet experimental doxygen-generated source code documentation) ![]() |
00001 // 00002 // "$Id: Fl_add_idle.cxx 7903 2010-11-28 21:06:39Z matt $" 00003 // 00004 // Idle routine support for the Fast Light Tool Kit (FLTK). 00005 // 00006 // Copyright 1998-2010 by Bill Spitzak and others. 00007 // 00008 // This library is free software; you can redistribute it and/or 00009 // modify it under the terms of the GNU Library General Public 00010 // License as published by the Free Software Foundation; either 00011 // version 2 of the License, or (at your option) any later version. 00012 // 00013 // This library is distributed in the hope that it will be useful, 00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 // Library General Public License for more details. 00017 // 00018 // You should have received a copy of the GNU Library General Public 00019 // License along with this library; if not, write to the Free Software 00020 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00021 // USA. 00022 // 00023 // Please report all bugs and problems on the following page: 00024 // 00025 // http://www.fltk.org/str.php 00026 // 00027 00028 // Allows you to manage an arbitrary set of idle() callbacks. 00029 // Replaces the older set_idle() call (which is used to implement this) 00030 00031 #include <FL/Fl.H> 00032 00033 struct idle_cb { 00034 void (*cb)(void*); 00035 void* data; 00036 idle_cb *next; 00037 }; 00038 00039 // the callbacks are stored linked in a ring. last points at the one 00040 // just called, first at the next to call. last->next == first. 00041 00042 static idle_cb* first; 00043 static idle_cb* last; 00044 static idle_cb* freelist; 00045 00046 static void call_idle() { 00047 idle_cb* p = first; 00048 last = p; first = p->next; 00049 p->cb(p->data); // this may call add_idle() or remove_idle()! 00050 } 00051 00069 void Fl::add_idle(Fl_Idle_Handler cb, void* data) { 00070 idle_cb* p = freelist; 00071 if (p) freelist = p->next; 00072 else p = new idle_cb; 00073 p->cb = cb; 00074 p->data = data; 00075 if (first) { 00076 last->next = p; 00077 last = p; 00078 p->next = first; 00079 } else { 00080 first = last = p; 00081 p->next = p; 00082 set_idle(call_idle); 00083 } 00084 } 00085 00089 int Fl::has_idle(Fl_Idle_Handler cb, void* data) { 00090 idle_cb* p = first; 00091 if (!p) return 0; 00092 for (;; p = p->next) { 00093 if (p->cb == cb && p->data == data) return 1; 00094 if (p==last) return 0; 00095 } 00096 } 00097 00101 void Fl::remove_idle(Fl_Idle_Handler cb, void* data) { 00102 idle_cb* p = first; 00103 if (!p) return; 00104 idle_cb* l = last; 00105 for (;; p = p->next) { 00106 if (p->cb == cb && p->data == data) break; 00107 if (p==last) return; // not found 00108 l = p; 00109 } 00110 if (l == p) { // only one 00111 first = last = 0; 00112 set_idle(0); 00113 } else { 00114 last = l; 00115 first = l->next = p->next; 00116 } 00117 p->next = freelist; 00118 freelist = p; 00119 } 00120 00121 // 00122 // End of "$Id: Fl_add_idle.cxx 7903 2010-11-28 21:06:39Z matt $". 00123 //