diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H | 15 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 57 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.H | 11 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.cxx | 40 |
4 files changed, 122 insertions, 1 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H index 2517130bb..605a0547c 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H @@ -26,6 +26,7 @@ #define FL_WINAPI_WINDOW_DRIVER_H #include <FL/Fl_Window_Driver.H> +#include <windows.h> /* Move everything here that manages the native window interface. @@ -42,6 +43,14 @@ ? where do we handle the interface between OpenGL/DirectX and Cocoa/WIN32/Glx? */ +struct Fl_Window_Driver::icon_data { + const void *legacy_icon; + Fl_RGB_Image **icons; + int count; + HICON big_icon; + HICON small_icon; +}; + struct Fl_Window_Driver::shape_data_type { int lw_; ///< width of shape image int lh_; ///< height of shape image @@ -59,10 +68,14 @@ public: ~Fl_WinAPI_Window_Driver(); virtual void shape(const Fl_Image* img); virtual void draw(); + virtual void icons(const Fl_RGB_Image *icons[], int count); + virtual const void *icon() const; + virtual void icon(const void * ic); + virtual void free_icons(); + void icons(HICON big_icon, HICON small_icon); }; - #endif // FL_WINAPI_WINDOW_DRIVER_H // diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx index e61fa4799..796f60c36 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx @@ -30,6 +30,8 @@ Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w) Fl_WinAPI_Window_Driver::Fl_WinAPI_Window_Driver(Fl_Window *win) : Fl_Window_Driver(win) { + icon_ = new Fl_Window_Driver::icon_data; + memset(icon_, 0, sizeof(Fl_Window_Driver::icon_data)); } Fl_WinAPI_Window_Driver::~Fl_WinAPI_Window_Driver() @@ -190,6 +192,61 @@ void Fl_WinAPI_Window_Driver::draw() { } Fl_Window_Driver::draw(); } +void Fl_WinAPI_Window_Driver::icons(const Fl_RGB_Image *icons[], int count) { + free_icons(); + + if (count > 0) { + icon_->icons = new Fl_RGB_Image*[count]; + icon_->count = count; + // FIXME: Fl_RGB_Image lacks const modifiers on methods + for (int i = 0;i < count;i++) + icon_->icons[i] = (Fl_RGB_Image*)((Fl_RGB_Image*)icons[i])->copy(); + } + + if (Fl_X::i(pWindow)) + Fl_X::i(pWindow)->set_icons(); +} + +const void *Fl_WinAPI_Window_Driver::icon() const { + return icon_->legacy_icon; +} + +void Fl_WinAPI_Window_Driver::icon(const void * ic) { + free_icons(); + icon_->legacy_icon = ic; +} + +void Fl_WinAPI_Window_Driver::free_icons() { + int i; + icon_->legacy_icon = 0L; + if (icon_->icons) { + for (i = 0;i < icon_->count;i++) + delete icon_->icons[i]; + delete [] icon_->icons; + icon_->icons = 0L; + } + icon_->count = 0; + if (icon_->big_icon) + DestroyIcon(icon_->big_icon); + if (icon_->small_icon) + DestroyIcon(icon_->small_icon); + icon_->big_icon = NULL; + icon_->small_icon = NULL; +} + +void Fl_WinAPI_Window_Driver::icons(HICON big_icon, HICON small_icon) +{ + free_icons(); + + if (big_icon != NULL) + icon_->big_icon = CopyIcon(big_icon); + if (small_icon != NULL) + icon_->small_icon = CopyIcon(small_icon); + + if (Fl_X::i(pWindow)) + Fl_X::i(pWindow)->set_icons(); +} + // // End of "$Id$". // diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H index c7ea3d382..e4f8862bd 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.H +++ b/src/drivers/X11/Fl_X11_Window_Driver.H @@ -42,6 +42,13 @@ ? where do we handle the interface between OpenGL/DirectX and Cocoa/WIN32/Glx? */ +struct Fl_Window_Driver::icon_data { + const void *legacy_icon; + Fl_RGB_Image **icons; + int count; +}; + + struct Fl_Window_Driver::shape_data_type { int lw_; ///< width of shape image int lh_; ///< height of shape image @@ -62,6 +69,10 @@ public: virtual void take_focus(); virtual void shape(const Fl_Image* img); virtual void draw(); + virtual void icons(const Fl_RGB_Image *icons[], int count); + virtual const void *icon() const; + virtual void icon(const void * ic); + virtual void free_icons(); }; diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index 833891ae4..d1f377793 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -56,6 +56,8 @@ Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w) Fl_X11_Window_Driver::Fl_X11_Window_Driver(Fl_Window *win) : Fl_Window_Driver(win) { + icon_ = new Fl_Window_Driver::icon_data; + memset(icon_, 0, sizeof(Fl_Window_Driver::icon_data)); } @@ -65,6 +67,7 @@ Fl_X11_Window_Driver::~Fl_X11_Window_Driver() delete shape_data_->todelete_; delete shape_data_; } + delete icon_; } void Fl_X11_Window_Driver::take_focus() @@ -235,6 +238,43 @@ void Fl_X11_Window_Driver::draw() { Fl_Window_Driver::draw(); } +void Fl_X11_Window_Driver::icons(const Fl_RGB_Image *icons[], int count) { + free_icons(); + + if (count > 0) { + icon_->icons = new Fl_RGB_Image*[count]; + icon_->count = count; + // FIXME: Fl_RGB_Image lacks const modifiers on methods + for (int i = 0;i < count;i++) + icon_->icons[i] = (Fl_RGB_Image*)((Fl_RGB_Image*)icons[i])->copy(); + } + + if (Fl_X::i(pWindow)) + Fl_X::i(pWindow)->set_icons(); +} + +const void *Fl_X11_Window_Driver::icon() const { + return icon_->legacy_icon; +} + +void Fl_X11_Window_Driver::icon(const void * ic) { + free_icons(); + icon_->legacy_icon = ic; +} + +void Fl_X11_Window_Driver::free_icons() { + int i; + icon_->legacy_icon = 0L; + if (icon_->icons) { + for (i = 0;i < icon_->count;i++) + delete icon_->icons[i]; + delete [] icon_->icons; + icon_->icons = 0L; + } + icon_->count = 0; +} + + // // End of "$Id$". // |
