Move all icon-support data to the platform-specific Fl_XXX_Window_Driver class

because these data are platform-specific.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11399 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2016-03-22 13:27:22 +00:00
parent b8e6c430e8
commit 6302b3da00
8 changed files with 75 additions and 88 deletions

View File

@ -22,11 +22,6 @@
#ifndef Fl_Window_H
#define Fl_Window_H
#ifdef WIN32
//#include <windows.h>
typedef struct HICON__* HICON;
#endif
#include "Fl_Group.H"
#include "Fl_Bitmap.H"
#include <stdlib.h>
@ -37,7 +32,6 @@ typedef struct HICON__* HICON;
class Fl_X;
class Fl_Window_Driver;
class Fl_RGB_Image;
class Fl_Shared_Image;
class Fl_Double_Window;
/**
@ -77,7 +71,6 @@ class FL_EXPORT Fl_Window : public Fl_Group {
const char* iconlabel_;
char* xclass_;
struct icon_data *icon_;
// size_range stuff:
int minw, minh, maxw, maxh;
int dw, dh, aspect;
@ -403,6 +396,9 @@ public:
void icons(const Fl_RGB_Image*[], int);
#ifdef WIN32
typedef struct HICON__* HICON;
// These 2 member functions break the driver model but are kept for back compatibility.
// They are implemented in Fl_WinAPI_Window_Driver.cxx
static void default_icons(HICON big_icon, HICON small_icon);
void icons(HICON big_icon, HICON small_icon);
#endif

View File

@ -44,8 +44,6 @@ class FL_EXPORT Fl_Window_Driver
protected:
Fl_Window *pWindow;
struct icon_data;
icon_data *icon_;
struct shape_data_type;
shape_data_type *shape_data_; ///< non-null means the window has a non-rectangular shape

View File

@ -1765,7 +1765,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
wcw.lpfnWndProc = (WNDPROC)WndProc;
wcw.cbClsExtra = wcw.cbWndExtra = 0;
wcw.hInstance = fl_display;
if (!w->icon() && !w->pWindowDriver->icon_->count)
if (!w->icon() && !((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->count)
w->icon((void *)LoadIcon(NULL, IDI_APPLICATION));
wcw.hIcon = wcw.hIconSm = (HICON)w->icon();
wcw.hCursor = LoadCursor(NULL, IDC_ARROW);
@ -2159,24 +2159,24 @@ void Fl_X::set_icons() {
big_icon = NULL;
small_icon = NULL;
if (w->pWindowDriver->icon_->count) {
if (((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->count) {
const Fl_RGB_Image *best_big, *best_small;
best_big = find_best_icon(GetSystemMetrics(SM_CXICON),
(const Fl_RGB_Image **)w->pWindowDriver->icon_->icons,
w->pWindowDriver->icon_->count);
(const Fl_RGB_Image **)((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->icons,
((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->count);
best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON),
(const Fl_RGB_Image **)w->pWindowDriver->icon_->icons,
w->pWindowDriver->icon_->count);
(const Fl_RGB_Image **)((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->icons,
((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->count);
if (best_big != NULL)
big_icon = image_to_icon(best_big, true, 0, 0);
if (best_small != NULL)
small_icon = image_to_icon(best_small, true, 0, 0);
} else {
if ((w->pWindowDriver->icon_->big_icon != NULL) || (w->pWindowDriver->icon_->small_icon != NULL)) {
big_icon = w->pWindowDriver->icon_->big_icon;
small_icon = w->pWindowDriver->icon_->small_icon;
if ((((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->big_icon != NULL) || (((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->small_icon != NULL)) {
big_icon = ((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->big_icon;
small_icon = ((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->small_icon;
} else {
big_icon = default_big_icon;
small_icon = default_small_icon;
@ -2187,49 +2187,6 @@ void Fl_X::set_icons() {
SendMessage(xid, WM_SETICON, ICON_SMALL, (LPARAM)small_icon);
}
/** Sets the default window icons.
Convenience function to set the default icons using Windows'
native HICON icon handles.
The given icons are copied. You can free the icons immediately after
this call.
\param[in] big_icon default large icon for all windows
subsequently created
\param[in] small_icon default small icon for all windows
subsequently created
\see Fl_Window::default_icon(const Fl_RGB_Image *)
\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icon(const Fl_RGB_Image *)
\see Fl_Window::icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icons(HICON, HICON)
*/
void Fl_Window::default_icons(HICON big_icon, HICON small_icon) {
Fl_X::set_default_icons(big_icon, small_icon);
}
/** Sets the window icons.
Convenience function to set this window's icons using Windows'
native HICON icon handles.
The given icons are copied. You can free the icons immediately after
this call.
\param[in] big_icon large icon for this window
\param[in] small_icon small icon for this windows
\see Fl_Window::default_icon(const Fl_RGB_Image *)
\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)
\see Fl_Window::default_icons(HICON, HICON)
\see Fl_Window::icon(const Fl_RGB_Image *)
\see Fl_Window::icons(const Fl_RGB_Image *[], int)
*/
void Fl_Window::icons(HICON big_icon, HICON small_icon) {
((Fl_WinAPI_Window_Driver*)pWindowDriver)->icons(big_icon, small_icon);
}
////////////////////////////////////////////////////////////////

View File

@ -2533,8 +2533,8 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
fl_show_iconic = 0;
showit = 0;
}
if (win->pWindowDriver->icon_->legacy_icon) {
hints->icon_pixmap = (Pixmap)win->pWindowDriver->icon_->legacy_icon;
if (((Fl_X11_Window_Driver*)win->pWindowDriver)->icon_->legacy_icon) {
hints->icon_pixmap = (Pixmap)((Fl_X11_Window_Driver*)win->pWindowDriver)->icon_->legacy_icon;
hints->flags |= IconPixmapHint;
}
XSetWMHints(fl_display, xp->xid, hints);
@ -2730,8 +2730,8 @@ void Fl_X::set_icons() {
unsigned long *net_wm_icons;
size_t net_wm_icons_size;
if (w->pWindowDriver->icon_->count) {
icons_to_property((const Fl_RGB_Image **)w->pWindowDriver->icon_->icons, w->pWindowDriver->icon_->count,
if (((Fl_X11_Window_Driver*)w->pWindowDriver)->icon_->count) {
icons_to_property((const Fl_RGB_Image **)((Fl_X11_Window_Driver*)w->pWindowDriver)->icon_->icons, ((Fl_X11_Window_Driver*)w->pWindowDriver)->icon_->count,
&net_wm_icons, &net_wm_icons_size);
} else {
net_wm_icons = default_net_wm_icons;
@ -2741,7 +2741,7 @@ void Fl_X::set_icons() {
XChangeProperty (fl_display, xid, fl_NET_WM_ICON, XA_CARDINAL, 32,
PropModeReplace, (unsigned char*) net_wm_icons, net_wm_icons_size);
if (w->pWindowDriver->icon_->count) {
if (((Fl_X11_Window_Driver*)w->pWindowDriver)->icon_->count) {
delete [] net_wm_icons;
net_wm_icons = 0L;
net_wm_icons_size = 0;

View File

@ -43,13 +43,6 @@
? 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
@ -60,6 +53,14 @@ struct Fl_Window_Driver::shape_data_type {
class FL_EXPORT Fl_WinAPI_Window_Driver : public Fl_Window_Driver
{
friend class Fl_Window;
struct icon_data {
const void *legacy_icon;
Fl_RGB_Image **icons;
int count;
HICON big_icon;
HICON small_icon;
};
private:
RECT border_width_title_bar_height(int &bx, int &by, int &bt);
void shape_bitmap_(Fl_Image* b);
@ -68,6 +69,7 @@ public:
Fl_WinAPI_Window_Driver(Fl_Window*);
~Fl_WinAPI_Window_Driver();
struct icon_data *icon_;
// --- window data
virtual int decorated_w();
virtual int decorated_h();
@ -84,7 +86,6 @@ public:
virtual const void *icon() const;
virtual void icon(const void * ic);
virtual void free_icons();
void icons(HICON big_icon, HICON small_icon);
// this one is implemented in Fl_win32.cxx
virtual void capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Image*& left, Fl_Shared_Image*& bottom, Fl_Shared_Image*& right);
virtual void wait_for_expose();

View File

@ -43,8 +43,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));
icon_ = new icon_data;
memset(icon_, 0, sizeof(icon_data));
}
@ -54,6 +54,7 @@ Fl_WinAPI_Window_Driver::~Fl_WinAPI_Window_Driver()
delete shape_data_->todelete_;
delete shape_data_;
}
delete icon_;
}
@ -358,19 +359,53 @@ void Fl_WinAPI_Window_Driver::free_icons() {
icon_->small_icon = NULL;
}
void Fl_WinAPI_Window_Driver::icons(HICON big_icon, HICON small_icon)
/** Sets the window icons using Windows' native HICON icon handles.
The given icons are copied. You can free the icons immediately after
this call.
\param[in] big_icon large window icon
\param[in] small_icon small window icon
*/
void Fl_Window::icons(HICON big_icon, HICON small_icon)
{
free_icons();
if (big_icon != NULL)
icon_->big_icon = CopyIcon(big_icon);
((Fl_WinAPI_Window_Driver*)pWindowDriver)->icon_->big_icon = CopyIcon(big_icon);
if (small_icon != NULL)
icon_->small_icon = CopyIcon(small_icon);
((Fl_WinAPI_Window_Driver*)pWindowDriver)->icon_->small_icon = CopyIcon(small_icon);
if (Fl_X::i(pWindow))
Fl_X::i(pWindow)->set_icons();
if (Fl_X::i(this))
Fl_X::i(this)->set_icons();
}
/** Sets the default window icons.
Convenience function to set the default icons using Windows'
native HICON icon handles.
The given icons are copied. You can free the icons immediately after
this call.
\param[in] big_icon default large icon for all windows
subsequently created
\param[in] small_icon default small icon for all windows
subsequently created
\see Fl_Window::default_icon(const Fl_RGB_Image *)
\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icon(const Fl_RGB_Image *)
\see Fl_Window::icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icons(HICON, HICON)
*/
void Fl_Window::default_icons(HICON big_icon, HICON small_icon) {
Fl_X::set_default_icons(big_icon, small_icon);
}
void Fl_WinAPI_Window_Driver::wait_for_expose() {
if (!pWindow->shown()) return;
Fl_X *i = Fl_X::i(pWindow);

View File

@ -44,11 +44,6 @@ class Fl_Bitmap;
? 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 {
@ -63,6 +58,11 @@ class FL_EXPORT Fl_X11_Window_Driver : public Fl_Window_Driver
friend class Fl_X;
private:
struct icon_data {
const void *legacy_icon;
Fl_RGB_Image **icons;
int count;
} *icon_;
void decorated_win_size(int &w, int &h);
void combine_mask();
void shape_bitmap_(Fl_Image* b);

View File

@ -116,8 +116,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));
icon_ = new icon_data;
memset(icon_, 0, sizeof(icon_data));
}