GLK: Window rearrangement methods

This commit is contained in:
Paul Gilbert 2018-10-24 22:00:05 -07:00 committed by Paul Gilbert
parent 3d8626081c
commit 49b8281ce3
6 changed files with 118 additions and 13 deletions

View File

@ -25,6 +25,7 @@
#include "gargoyle/streams.h"
#include "gargoyle/string.h"
#include "gargoyle/windows.h"
#include "gargoyle/window_pair.h"
namespace Gargoyle {
@ -86,14 +87,21 @@ void Glk::glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr)
// TODO
}
void Glk::glk_window_set_arrangement(winid_t win, glui32 method,
glui32 size, winid_t keywin) {
// TODO
void Glk::glk_window_set_arrangement(winid_t win, glui32 method, glui32 size, winid_t keywin) {
if (!win) {
warning("window_set_arrangement: invalid ref");
} else {
win->setArrangement(method, size, keywin);
}
}
void Glk::glk_window_get_arrangement(winid_t win, glui32 *methodptr,
glui32 *sizeptr, winid_t *keywinptr) {
// TODO
void Glk::glk_window_get_arrangement(winid_t win, glui32 *method,
glui32 *size, winid_t *keyWin) {
if (!win) {
warning("window_get_arrangement: invalid ref");
} else {
win->getArrangement(method, size, keyWin);
}
}
winid_t Glk::glk_window_iterate(winid_t win, glui32 *rockptr) {

View File

@ -75,8 +75,8 @@ public:
glui32 *heightptr);
void glk_window_set_arrangement(winid_t win, glui32 method,
glui32 size, winid_t keywin);
void glk_window_get_arrangement(winid_t win, glui32 *methodptr,
glui32 *sizeptr, winid_t *keywinptr);
void glk_window_get_arrangement(winid_t win, glui32 *method,
glui32 *size, winid_t *keywin);
winid_t glk_window_iterate(winid_t win, glui32 *rockptr);
glui32 glk_window_get_rock(winid_t win);
glui32 glk_window_get_type(winid_t win);

View File

@ -124,4 +124,85 @@ void PairWindow::redraw() {
// TODO
}
void PairWindow::getArrangement(glui32 *method, glui32 *size, Window **keyWin) {
glui32 val = _dir | _division;
if (!_wBorder)
val |= winmethod_NoBorder;
if (size)
*size = _size;
if (keyWin) {
if (_key)
*keyWin = _key;
else
*keyWin = nullptr;
}
if (method)
*method = val;
}
void PairWindow::setArrangement(glui32 method, glui32 size, Window *keyWin) {
glui32 newDir;
bool newVertical, newBackward;
if (_key) {
Window *wx;
PairWindow *pairWin = dynamic_cast<PairWindow *>(_key);
if (pairWin) {
warning("setArrangement: keywin cannot be a Pair");
return;
}
for (wx = _key; wx; wx = wx->_parent) {
if (wx == this)
break;
}
if (wx == nullptr) {
warning("setArrangement: keywin must be a descendant");
return;
}
}
newDir = method & winmethod_DirMask;
newVertical = (newDir == winmethod_Left || newDir == winmethod_Right);
newBackward = (newDir == winmethod_Left || newDir == winmethod_Above);
if (!keyWin)
keyWin = _key;
if ((newVertical && !_vertical) || (!newVertical && _vertical)) {
if (!_vertical)
warning("setArrangement: split must stay horizontal");
else
warning("setArrangement: split must stay vertical");
return;
}
if (keyWin && dynamic_cast<BlankWindow *>(keyWin)
&& (method & winmethod_DivisionMask) == winmethod_Fixed) {
warning("setArrangement: a Blank window cannot have a fixed size");
return;
}
if ((newBackward && !_backward) || (!newBackward && _backward)) {
// switch the children
Window *tmpWin = _child1;
_child1 = _child2;
_child2 = tmpWin;
}
// set up everything else
_dir = newDir;
_division = method & winmethod_DivisionMask;
_key = keyWin;
_size = size;
_wBorder = ((method & winmethod_BorderMask) == winmethod_Border);
_vertical = (_dir == winmethod_Left || _dir == winmethod_Right);
_backward = (_dir == winmethod_Left || _dir == winmethod_Above);
_windows->rearrange();
}
} // End of namespace Gargoyle

View File

@ -57,6 +57,10 @@ public:
* Redraw the window
*/
virtual void redraw() override;
virtual void getArrangement(glui32 *method, glui32 *size, Window **keyWin) override;
virtual void setArrangement(glui32 method, glui32 size, Window *keyWin) override;
};
} // End of namespace Gargoyle

View File

@ -471,6 +471,14 @@ void Window::acceptReadChar(glui32 arg) {
warning("acceptReadChar:: window does not support keyboard input");
}
void Window::getArrangement(glui32 *method, glui32 *size, Window **keyWin) {
warning("getArrangement: not a Pair window");
}
void Window::setArrangement(glui32 method, glui32 size, Window *keyWin) {
warning("setArrangement: not a Pair window");
}
bool Window::checkTerminator(glui32 ch) {
if (ch == keycode_Escape)
return true;

View File

@ -98,11 +98,6 @@ private:
*/
PairWindow *newPairWindow(glui32 method, Window *key, glui32 size);
/**
* Rearrange windows
*/
void rearrange();
void refocus(Window *win);
Window *iterateTreeOrder(Window *win);
@ -158,6 +153,11 @@ public:
void clearClaimSelect() { _claimSelect = false; }
/**
* Rearrange windows
*/
void rearrange();
void redraw();
void redrawRect(const Common::Rect &r);
@ -366,6 +366,10 @@ public:
virtual void acceptReadChar(glui32 arg);
virtual void getArrangement(glui32 *method, glui32 *size, Window **keyWin);
virtual void setArrangement(glui32 method, glui32 size, Window *keyWin);
int acceptScroll(glui32 arg);
};
typedef Window *winid_t;