Transform Fl_X::make(Fl_Window*) for WIN32 platform into virtual Fl_X* Fl_Window_Driver::makeWindow().

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11659 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2016-04-19 15:33:58 +00:00
parent 6600993adc
commit 1e060f6408
4 changed files with 37 additions and 38 deletions

View File

@ -58,12 +58,7 @@ public:
// static variables, static functions and member functions
static Fl_X* first;
static Fl_X* i(const Fl_Window* w) {return (Fl_X*)w->i;}
static int fake_X_wm(const Fl_Window* w,int &X, int &Y,
int &bt,int &bx,int &by);
void make_fullscreen(int X, int Y, int W, int H);
void set_minmax(LPMINMAXINFO minmax);
void mapraise();
static Fl_X* make(Fl_Window*);
};
extern FL_EXPORT UINT fl_wake_msg;
extern FL_EXPORT char fl_override_redirect; // hack into Fl_Window::make_xid()

View File

@ -1356,7 +1356,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
}
case WM_GETMINMAXINFO:
Fl_X::i(window)->set_minmax((LPMINMAXINFO)lParam);
((Fl_WinAPI_Window_Driver*)window->driver())->set_minmax((LPMINMAXINFO)lParam);
break;
case WM_SIZE:
@ -1559,8 +1559,8 @@ static int fake_X_wm_style(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, in
return ret;
}
int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) {
return fake_X_wm_style(w, X, Y, bt, bx, by, 0, 0, w->maxw, w->minw, w->maxh, w->minh, w->size_range_set);
int Fl_WinAPI_Window_Driver::fake_X_wm(int &X,int &Y, int &bt,int &bx, int &by) {
return fake_X_wm_style(pWindow, X, Y, bt, bx, by, 0, 0, maxw(), minw(), maxh(), minh(), size_range_set());
}
////////////////////////////////////////////////////////////////
@ -1597,7 +1597,7 @@ void Fl_WinAPI_Window_Driver::resize(int X,int Y,int W,int H) {
int dummy_x, dummy_y, bt, bx, by;
//Ignore window managing when resizing, so that windows (and more
//specifically menus) can be moved offscreen.
if (Fl_X::fake_X_wm(pWindow, dummy_x, dummy_y, bt, bx, by)) {
if (fake_X_wm(dummy_x, dummy_y, bt, bx, by)) {
X -= bx;
Y -= by+bt;
W += 2*bx;
@ -1652,7 +1652,7 @@ void fl_fix_focus(); // in Fl.cxx
UINT fl_wake_msg = 0;
int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
Fl_X* Fl_X::make(Fl_Window* w) {
Fl_X* Fl_WinAPI_Window_Driver::makeWindow() {
Fl_Group::current(0); // get rid of very common user bug: forgot end()
fl_open_display();
@ -1660,6 +1660,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
// if the window is a subwindow and our parent is not mapped yet, we
// mark this window visible, so that mapping the parent at a later
// point in time will call this function again to finally map the subwindow.
Fl_Window* w = pWindow;
if (w->parent() && !Fl_X::i(w->window())) {
w->set_visible();
return 0L;
@ -1696,7 +1697,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() && !((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->icon_->count)
if (!w->icon() && !icon_->count)
w->icon((void *)LoadIcon(NULL, IDI_APPLICATION));
wcw.hIcon = wcw.hIconSm = (HICON)w->icon();
wcw.hCursor = LoadCursor(NULL, IDC_ARROW);
@ -1728,7 +1729,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
styleEx |= WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT;
parent = fl_xid(w->window());
} else {
if (!w->size_range_set) {
if (!size_range_set()) {
if (w->resizable()) {
Fl_Widget *o = w->resizable();
int minw = o->w(); if (minw > 100) minw = 100;
@ -1742,7 +1743,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
int wintype = 0;
if (w->border() && !w->parent()) {
if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh)) wintype = 2;
if (size_range_set() && (maxw() != minw() || maxh() != minh())) wintype = 2;
else wintype = 1;
}
@ -1769,17 +1770,17 @@ Fl_X* Fl_X::make(Fl_Window* w) {
}
int xwm = xp , ywm = yp , bt, bx, by;
fake_X_wm_style(w, xwm, ywm, bt, bx, by, style, styleEx, w->maxw, w->minw, w->maxh, w->minh, w->size_range_set);
fake_X_wm_style(w, xwm, ywm, bt, bx, by, style, styleEx, maxw(), minw(), maxh(), minh(), size_range_set());
if (by+bt) {
wp += 2*bx;
hp += 2*by+bt;
}
if (!w->force_position()) {
if (!force_position()) {
xp = yp = CW_USEDEFAULT;
} else {
if (!Fl::grab()) {
xp = xwm; yp = ywm;
w->x(xp);w->y(yp);
x(xp); y(yp);
}
xp -= bx;
yp -= by+bt;
@ -1796,13 +1797,13 @@ Fl_X* Fl_X::make(Fl_Window* w) {
}
Fl_X *x = new Fl_X;
w->driver()->other_xid = 0;
x->w = w; w->i = x;
other_xid = 0;
x->w = w;
i(x);
x->region = 0;
x->private_dc = 0;
Fl_WinAPI_Window_Driver *driver = (Fl_WinAPI_Window_Driver*)w->driver();
driver->cursor = LoadCursor(NULL, IDC_ARROW);
driver->custom_cursor = 0;
cursor = LoadCursor(NULL, IDC_ARROW);
custom_cursor = 0;
if (!fl_codepage) fl_get_codepage();
WCHAR *lab = NULL;
@ -1831,7 +1832,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
x->next = Fl_X::first;
Fl_X::first = x;
((Fl_WinAPI_Window_Driver*)w->pWindowDriver)->set_icons();
set_icons();
if (w->fullscreen_active()) {
/* We need to make sure that the fullscreen is created on the
@ -1850,8 +1851,8 @@ Fl_X* Fl_X::make(Fl_Window* w) {
if (!fl_clipboard_notify_empty() && clipboard_wnd == NULL)
fl_clipboard_notify_target(x->xid);
w->driver()->wait_for_expose_value = 1;
if (Fl_Window::show_iconic_) {showit = 0; Fl_Window::show_iconic_ = 0;}
wait_for_expose_value = 1;
if (show_iconic()) {showit = 0; show_iconic(0);}
if (showit) {
w->set_visible();
int old_event = Fl::e_number;
@ -1883,24 +1884,24 @@ Fl_X* Fl_X::make(Fl_Window* w) {
HINSTANCE fl_display = GetModuleHandle(NULL);
void Fl_X::set_minmax(LPMINMAXINFO minmax)
void Fl_WinAPI_Window_Driver::set_minmax(LPMINMAXINFO minmax)
{
int td, wd, hd, dummy_x, dummy_y;
fake_X_wm(w, dummy_x, dummy_y, td, wd, hd);
fake_X_wm(dummy_x, dummy_y, td, wd, hd);
wd *= 2;
hd *= 2;
hd += td;
minmax->ptMinTrackSize.x = w->minw + wd;
minmax->ptMinTrackSize.y = w->minh + hd;
if (w->maxw) {
minmax->ptMaxTrackSize.x = w->maxw + wd;
minmax->ptMaxSize.x = w->maxw + wd;
minmax->ptMinTrackSize.x = minw() + wd;
minmax->ptMinTrackSize.y = minh() + hd;
if (maxw()) {
minmax->ptMaxTrackSize.x = maxw() + wd;
minmax->ptMaxSize.x = maxw() + wd;
}
if (w->maxh) {
minmax->ptMaxTrackSize.y = w->maxh + hd;
minmax->ptMaxSize.y = w->maxh + hd;
if (maxh()) {
minmax->ptMaxTrackSize.y = maxh() + hd;
minmax->ptMaxSize.y = maxh() + hd;
}
}
@ -2247,7 +2248,7 @@ int Fl_WinAPI_Window_Driver::set_cursor(const Fl_RGB_Image *image, int hotx, int
void Fl_WinAPI_Window_Driver::show() {
if (!shown()) {
// if (can_boxcheat(box())) fl_background_pixel = fl_xpixel(color());
Fl_X::make(pWindow);
makeWindow();
} else {
// Once again, we would lose the capture if we activated the window.
Fl_X *i = Fl_X::i(pWindow);

View File

@ -72,11 +72,14 @@ public:
struct icon_data *icon_;
HCURSOR cursor;
int custom_cursor;
void set_minmax(LPMINMAXINFO minmax);
int fake_X_wm(int &X, int &Y, int &bt,int &bx,int &by);
// --- window data
virtual int decorated_w();
virtual int decorated_h();
// --- window management
virtual Fl_X *makeWindow();
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();

View File

@ -524,12 +524,12 @@ void Fl_WinAPI_Window_Driver::fullscreen_on() {
void Fl_WinAPI_Window_Driver::fullscreen_off(int X, int Y, int W, int H) {
pWindow->_clear_fullscreen();
DWORD style = GetWindowLong(fl_xid(pWindow), GWL_STYLE);
// Remove the xid temporarily so that Fl_X::fake_X_wm() behaves like it
// does in Fl_X::make().
// Remove the xid temporarily so that Fl_WinAPI_Window_Driver::fake_X_wm() behaves like it
// does in Fl_WinAPI_Window_Driver::makeWindow().
HWND xid = fl_xid(pWindow);
Fl_X::i(pWindow)->xid = NULL;
int wx, wy, bt, bx, by;
switch (Fl_X::fake_X_wm(pWindow, wx, wy, bt, bx, by)) {
switch (fake_X_wm(wx, wy, bt, bx, by)) {
case 0:
break;
case 1: