summaryrefslogtreecommitdiff
path: root/src/drivers/WinAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/WinAPI')
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H15
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx57
2 files changed, 71 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$".
//