|
|
@ -170,7 +170,7 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, bool double_click)
|
|
|
|
|
|
|
|
|
|
|
|
if (w->desc_flags & WDF_STD_BTN) {
|
|
|
|
if (w->desc_flags & WDF_STD_BTN) {
|
|
|
|
if (e.we.click.widget == 0) { /* 'X' */
|
|
|
|
if (e.we.click.widget == 0) { /* 'X' */
|
|
|
|
DeleteWindow(w);
|
|
|
|
delete w;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -364,6 +364,16 @@ void CallWindowEventNP(Window *w, int event)
|
|
|
|
w->HandleWindowEvent(&e);
|
|
|
|
w->HandleWindowEvent(&e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Mark entire window as dirty (in need of re-paint)
|
|
|
|
|
|
|
|
* @param w Window to redraw
|
|
|
|
|
|
|
|
* @ingroup dirty
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
void Window::SetDirty() const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
SetDirtyBlocks(this->left, this->top, this->left + this->width, this->top + this->height);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Mark entire window as dirty (in need of re-paint)
|
|
|
|
* Mark entire window as dirty (in need of re-paint)
|
|
|
|
* @param w Window to redraw
|
|
|
|
* @param w Window to redraw
|
|
|
@ -371,8 +381,7 @@ void CallWindowEventNP(Window *w, int event)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void SetWindowDirty(const Window *w)
|
|
|
|
void SetWindowDirty(const Window *w)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (w == NULL) return;
|
|
|
|
if (w != NULL) w->SetDirty();
|
|
|
|
SetDirtyBlocks(w->left, w->top, w->left + w->width, w->top + w->height);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Find the Window whose parent pointer points to this window
|
|
|
|
/** Find the Window whose parent pointer points to this window
|
|
|
@ -410,44 +419,35 @@ Window **FindWindowZPosition(const Window *w)
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Remove window and all its child windows from the window stack.
|
|
|
|
* Remove window and all its child windows from the window stack.
|
|
|
|
* @param w Window to delete
|
|
|
|
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void DeleteWindow(Window *w)
|
|
|
|
Window::~Window()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (w == NULL) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (_thd.place_mode != VHM_NONE &&
|
|
|
|
if (_thd.place_mode != VHM_NONE &&
|
|
|
|
_thd.window_class == w->window_class &&
|
|
|
|
_thd.window_class == this->window_class &&
|
|
|
|
_thd.window_number == w->window_number) {
|
|
|
|
_thd.window_number == this->window_number) {
|
|
|
|
ResetObjectToPlace();
|
|
|
|
ResetObjectToPlace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */
|
|
|
|
/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */
|
|
|
|
if (_mouseover_last_w == w) _mouseover_last_w = NULL;
|
|
|
|
if (_mouseover_last_w == this) _mouseover_last_w = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
/* Find the window in the z-array, and effectively remove it
|
|
|
|
/* Find the window in the z-array, and effectively remove it
|
|
|
|
* by moving all windows after it one to the left. This must be
|
|
|
|
* by moving all windows after it one to the left. This must be
|
|
|
|
* done before removing the child so we cannot cause recursion
|
|
|
|
* done before removing the child so we cannot cause recursion
|
|
|
|
* between the deletion of the parent and the child. */
|
|
|
|
* between the deletion of the parent and the child. */
|
|
|
|
Window **wz = FindWindowZPosition(w);
|
|
|
|
Window **wz = FindWindowZPosition(this);
|
|
|
|
if (wz == NULL) return;
|
|
|
|
if (wz == NULL) return;
|
|
|
|
memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz);
|
|
|
|
memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz);
|
|
|
|
_last_z_window--;
|
|
|
|
_last_z_window--;
|
|
|
|
|
|
|
|
|
|
|
|
/* Delete any children a window might have in a head-recursive manner */
|
|
|
|
/* Delete any children a window might have in a head-recursive manner */
|
|
|
|
Window *v = FindChildWindow(w);
|
|
|
|
delete FindChildWindow(this);
|
|
|
|
if (v != NULL) DeleteWindow(v);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CallWindowEventNP(w, WE_DESTROY);
|
|
|
|
|
|
|
|
if (w->viewport != NULL) DeleteWindowViewport(w);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
CallWindowEventNP(this, WE_DESTROY);
|
|
|
|
free(w->widget);
|
|
|
|
if (this->viewport != NULL) DeleteWindowViewport(this);
|
|
|
|
w->widget = NULL;
|
|
|
|
|
|
|
|
w->widget_count = 0;
|
|
|
|
|
|
|
|
w->parent = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delete w;
|
|
|
|
this->SetDirty();
|
|
|
|
|
|
|
|
free(this->widget);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -475,7 +475,7 @@ Window *FindWindowById(WindowClass cls, WindowNumber number)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void DeleteWindowById(WindowClass cls, WindowNumber number)
|
|
|
|
void DeleteWindowById(WindowClass cls, WindowNumber number)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DeleteWindow(FindWindowById(cls, number));
|
|
|
|
delete FindWindowById(cls, number);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -493,7 +493,7 @@ restart_search:
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
Window *w = *wz;
|
|
|
|
Window *w = *wz;
|
|
|
|
if (w->window_class == cls) {
|
|
|
|
if (w->window_class == cls) {
|
|
|
|
DeleteWindow(w);
|
|
|
|
delete w;
|
|
|
|
goto restart_search;
|
|
|
|
goto restart_search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -514,7 +514,7 @@ restart_search:
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
Window *w = *wz;
|
|
|
|
Window *w = *wz;
|
|
|
|
if (w->caption_color == id) {
|
|
|
|
if (w->caption_color == id) {
|
|
|
|
DeleteWindow(w);
|
|
|
|
delete w;
|
|
|
|
goto restart_search;
|
|
|
|
goto restart_search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -696,7 +696,7 @@ static Window *LocalAllocateWindow(int x, int y, int min_width, int min_height,
|
|
|
|
if (_last_z_window == endof(_z_windows)) {
|
|
|
|
if (_last_z_window == endof(_z_windows)) {
|
|
|
|
w = FindDeletableWindow();
|
|
|
|
w = FindDeletableWindow();
|
|
|
|
if (w == NULL) w = ForceFindDeletableWindow();
|
|
|
|
if (w == NULL) w = ForceFindDeletableWindow();
|
|
|
|
DeleteWindow(w);
|
|
|
|
delete w;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
w = new Window(proc);
|
|
|
|
w = new Window(proc);
|
|
|
@ -1087,7 +1087,7 @@ restart_search:
|
|
|
|
* anywhere in the z-array. We call DeleteWindow() so that it can properly
|
|
|
|
* anywhere in the z-array. We call DeleteWindow() so that it can properly
|
|
|
|
* release own alloc'd memory, which otherwise could result in memleaks */
|
|
|
|
* release own alloc'd memory, which otherwise could result in memleaks */
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
DeleteWindow(*wz);
|
|
|
|
delete *wz;
|
|
|
|
goto restart_search;
|
|
|
|
goto restart_search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2212,7 +2212,7 @@ restart_search:
|
|
|
|
w->window_class != WC_TOOLTIPS &&
|
|
|
|
w->window_class != WC_TOOLTIPS &&
|
|
|
|
(w->flags4 & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
|
|
|
|
(w->flags4 & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
|
|
|
|
|
|
|
|
|
|
|
|
DeleteWindow(w);
|
|
|
|
delete w;
|
|
|
|
goto restart_search;
|
|
|
|
goto restart_search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -2236,7 +2236,7 @@ restart_search:
|
|
|
|
* anywhere in the z-array */
|
|
|
|
* anywhere in the z-array */
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
FOR_ALL_WINDOWS(wz) {
|
|
|
|
if ((*wz)->flags4 & WF_STICKY) {
|
|
|
|
if ((*wz)->flags4 & WF_STICKY) {
|
|
|
|
DeleteWindow(*wz);
|
|
|
|
delete *wz;
|
|
|
|
goto restart_search;
|
|
|
|
goto restart_search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|