diff --git a/eiconman/NotifyBox.cpp b/eiconman/NotifyBox.cpp index 45fb6eb..1a59670 100644 --- a/eiconman/NotifyBox.cpp +++ b/eiconman/NotifyBox.cpp @@ -23,20 +23,21 @@ #define TIMEOUT (1.0f/60.0f) #define TIME_SHOWN 3.0f -#define STATE_SHOWING 1 -#define STATE_HIDING 2 -#define STATE_DONE 3 - -NotifyBox::NotifyBox(int aw, int ah) : Fl_Box(0, 0, 0, 0) { +NotifyBox::NotifyBox(int aw, int ah) : Fl_Window(0, 0, 10, 10) { area_w = aw; area_h = ah; lwidth = lheight = 0; is_shown = false; - state = 0; - box(FL_BORDER_BOX); - color(FL_WHITE); - align(FL_ALIGN_WRAP); + clear_border(); + set_non_modal(); + + begin(); + txt_box = new Fl_Box(0, 0, w(), h()); + txt_box->box(FL_BORDER_BOX); + txt_box->color(FL_WHITE); + txt_box->align(FL_ALIGN_WRAP); + end(); } NotifyBox::~NotifyBox() { @@ -47,89 +48,67 @@ void NotifyBox::update_label_size(void) { lwidth = MAX_LABEL_WIDTH; lheight= 0; - fl_font(labelfont(), labelsize()); - fl_measure(label(), lwidth, lheight, align()); + fl_font(txt_box->labelfont(), txt_box->labelsize()); + fl_measure(txt_box->label(), lwidth, lheight, txt_box->align()); lwidth += 10; lheight += 10; } +void NotifyBox::resize_all(void) { + update_label_size(); + + // center box + int x_pos = (area_w/2) - (lwidth/2); + resize(x_pos, 0, lwidth, lheight); + txt_box->resize(0, 0, w(), h()); +} + void NotifyBox::show(void) { if(shown()) return; - if(state == STATE_HIDING) - return; + EDEBUG(ESTRLOC ": %i %i\n", x(), y()); + resize_all(); - update_label_size(); - - // center box - int x_pos = (area_w/2) - (lwidth/2); - resize(x_pos, y() - lheight, lwidth, lheight); - - Fl_Box::show(); - - state = STATE_SHOWING; - Fl::add_timeout(TIMEOUT, animate_cb, this); + Fl_Window::show(); + is_shown = true; + Fl::add_timeout(TIME_SHOWN, visible_timeout_cb, this); } void NotifyBox::hide(void) { if(!shown()) return; - // explicitely remove timer when hide() is called - Fl::remove_timeout(animate_cb); - - Fl_Box::hide(); + Fl_Window::hide(); is_shown = false; - state = 0; + Fl::remove_timeout(visible_timeout_cb); + Fl::remove_timeout(animate_cb); } void NotifyBox::label(const char* l) { - Fl_Box::label(l); + txt_box->label(l); + resize_all(); } void NotifyBox::copy_label(const char* l) { - Fl_Box::copy_label(l); + txt_box->copy_label(l); + resize_all(); } const char* NotifyBox::label(void) { - return Fl_Box::label(); + return txt_box->label(); } void NotifyBox::animate(void) { - if(state == STATE_SHOWING) { - if(y() < 0) { - position(x(), y() + 1); - redraw(); - //EDEBUG("SHOWING...\n"); - Fl::repeat_timeout(TIMEOUT, animate_cb, this); - state = STATE_SHOWING; - } else { - state = STATE_DONE; - is_shown = true; - - // now set visible timeout, which will procede to hiding() - visible_timeout(); - } - } else if(state == STATE_HIDING) { - if(y() > -lheight) { - position(x(), y() - 1); - //redraw(); - //EDEBUG("%i %i\n", x(), y()); - // this will prevent redrawing whole screen - Desktop::instance()->damage(FL_DAMAGE_ALL, x(), 0, w(), h()); - - //EDEBUG("HIDING...\n"); - Fl::repeat_timeout(TIMEOUT, animate_cb, this); - } else { - state = STATE_DONE; - is_shown = false; - } - } + if(y() > -lheight) { + position(x(), y() - 1); + Fl::repeat_timeout(TIMEOUT, animate_cb, this); + } else + hide(); } void NotifyBox::visible_timeout(void) { - state = STATE_HIDING; - Fl::repeat_timeout(TIME_SHOWN, animate_cb, this); + Fl::remove_timeout(visible_timeout_cb); + Fl::add_timeout(TIMEOUT, animate_cb, this); } diff --git a/eiconman/NotifyBox.h b/eiconman/NotifyBox.h index f521f01..2ad3639 100644 --- a/eiconman/NotifyBox.h +++ b/eiconman/NotifyBox.h @@ -14,14 +14,16 @@ #define __NOTIFYBOX_H__ #include +#include -class NotifyBox : public Fl_Box { +class NotifyBox : public Fl_Window { private: bool is_shown; - int state; int lwidth, lheight; int area_w, area_h; + Fl_Box* txt_box; void update_label_size(void); + void resize_all(void); public: NotifyBox(int aw, int ah); diff --git a/eiconman/eiconman.cpp b/eiconman/eiconman.cpp index 7360920..9e86c09 100644 --- a/eiconman/eiconman.cpp +++ b/eiconman/eiconman.cpp @@ -47,7 +47,7 @@ * Which widgets Fl::belowmouse() should skip. This should be updated * when new non-icon child is added to Desktop window. */ -#define NOT_SELECTABLE(widget) ((widget == this) || (widget == wallpaper) || (widget == notify)) +#define NOT_SELECTABLE(widget) ((widget == this) || (widget == wallpaper)) Desktop* Desktop::pinstance = NULL; bool running = false; @@ -134,10 +134,10 @@ Desktop::Desktop() : DESKTOP_WINDOW(0, 0, 100, 100, "") { //wallpaper->hide(); wallpaper->set("/home/sanelz/walls/nin/1024x768-04.jpg"); //wallpaper->set("/home/sanelz/walls/nin/1024x768-02.jpg"); - notify = new NotifyBox(w(), h()); - notify->hide(); end(); + notify = new NotifyBox(w(), h()); + read_config(); set_bg_color(dsett->color, false); @@ -149,6 +149,7 @@ Desktop::~Desktop() { delete dsett; delete selbox; + delete notify; } void Desktop::init(void) { @@ -414,7 +415,6 @@ void Desktop::add_icon(DesktopIcon* ic) { EASSERT(ic != NULL); icons.push_back(ic); - // FIXME: validate this add((Fl_Widget*)ic); } @@ -587,7 +587,8 @@ void Desktop::notify_box(const char* msg, bool copy) { else notify->label(msg); - notify->show(); + if(!notify->shown()) + notify->show(); } void Desktop::notify_box_color(Fl_Color col) {