Re: [fltk.general] Smooth blinking

2013-03-19 Thread MacArthur, Ian (Selex ES, UK)
  You have to realize a blinking message, or an object which
 periodically swaps two images :
  think of an alarm icon.
  The alarm is sounding, and the icon keeps alternating red/yellow horn
 images until the user pushes the ack button.
 
  Use a timer to blink... but things are not always smooth blinking.
  Not a big problem, anyway... just would like to know if there is a
 clever way to assure a smooth blinking
  (usually we are speaking of small objects).

Not really sure this is what was being asked, but here's a simple demo of 
blinking widgets.

Maybe this is what was wanted?

--

//
// Flashing Boxes
//

#include FL/Fl.H
#include FL/Fl_Double_Window.H
#include FL/Fl_Button.H
#include FL/Fl_Box.H

static Fl_Double_Window *main_win = 0;
static Fl_Button *quit_bt = 0;

static Fl_Box *box1 = 0;
static Fl_Box *box2 = 0;

static void cb_quit(Fl_Widget *, void *) {
  main_win-hide();
} // cb_quit

void update_box1(void *) {
  static int state = 0;
  if(state) {
state = 0;
box1-color(FL_GREEN);
  }
  else {
state = -1;
box1-color(FL_RED);
  }

  Fl::repeat_timeout(0.7, update_box1);
  box1-redraw();
} // update_box1

void update_box2(void *) {
  static int state = 0;
  static int step = 1;
  const int thd = 15;
  state += step;
  if(state = thd) {
step = -1;
  }
  else if (state = 0) {
step = 1;
  }
  float alpha = (float)state / (float)thd;

  Fl_Color col = fl_color_average(FL_RED, FL_BACKGROUND_COLOR, alpha);
  box2-color(col);

  Fl::repeat_timeout(0.05, update_box2);
  box2-redraw();
} // update_box2

int main(int argc, char ** argv) {
  main_win = new Fl_Double_Window(370, 230, Flashing Widgets);
  main_win-begin();

  box1 = new Fl_Box(10, 10, 60, 30, ALERT!);
  box1-box(FL_FLAT_BOX);
  box1-color(FL_GREEN);

  box2 = new Fl_Box(80, 10, 60, 30, ALERT!);
  box2-box(FL_FLAT_BOX);
  box2-color(FL_BACKGROUND_COLOR);

  quit_bt = new Fl_Button(300, 190, 60, 30, Quit);
  quit_bt-box(FL_THIN_UP_BOX);
  quit_bt-callback(cb_quit);

  main_win-end();
  main_win-show(argc,argv);

  Fl::add_timeout(0.3, update_box1);
  Fl::add_timeout(0.05, update_box2);

  return Fl::run();
} // main

// end of file //





Selex ES Ltd
Registered Office: Sigma House, Christopher Martin Road, Basildon, Essex SS14 
3EL
A company registered in England  Wales.  Company no. 02426132

This email and any attachments are confidential to the intended
recipient and may also be privileged. If you are not the intended
recipient please delete it from your system and notify the sender.
You should not copy it or use it for any purpose nor disclose or
distribute its contents to any other person.


___
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk


Re: [fltk.general] Smooth blinking

2013-03-18 Thread Greg Ercolano
On 03/18/13 08:00, memoryl...@tin.it wrote:
 Hi all,
 forgive me but here is another question, not-so-evident for me.
 
 You have to realize a blinking message, or an object which periodically swaps 
 two images :
 think of an alarm icon.
 The alarm is sounding, and the icon keeps alternating red/yellow horn images 
 until the user pushes the ack button.
 
 Use a timer to blink... but things are not always smooth blinking.
 Not a big problem, anyway... just would like to know if there is a clever way 
 to assure a smooth blinking
 (usually we are speaking of small objects).

Make sure the window is an Fl_Double_Window, so that it uses 
double-buffering.

Beyond that, just have the timer callback:

1) Change the the thing being blinked to on or off 
(hide()/show() can work)

2) Call redraw() on the widget that handles the background of 
the widget in question.

   If the widget draws its own background, then tell /it/ to 
redraw. If the widget
   is 'see through' (eg. text label with FL_NO_BOX), then tell 
the closest parent
   that handles the background to redraw()
   or call redraw() on the parent that draws the background 
under the widget

3) Call Fl::repeat_timeout() to reset the timer for the next 
trigger

___
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk