diff options
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 41 |
1 files changed, 25 insertions, 16 deletions
@@ -197,7 +197,6 @@ static void DispatchMouseWheelEvent(Window *w, int widget, int wheel) } } - static void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom); void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) @@ -348,12 +347,16 @@ void DeleteWindowByClass(WindowClass cls) } } -void DeletePlayerWindows(PlayerID pi) +/** Delete all windows of a player. We identify windows of a player + * by looking at the caption colour. If it is equal to the player ID + * then we say the window belongs to the player and should be deleted + * @param id PlayerID player identifier */ +void DeletePlayerWindows(PlayerID id) { Window *w; for (w = _windows; w != _last_window;) { - if (w->caption_color == pi) { + if (w->caption_color == id) { DeleteWindow(w); w = _windows; } else { @@ -361,11 +364,15 @@ void DeletePlayerWindows(PlayerID pi) } } - /* Also delete the player specific windows, that haven't got the caption set */ - DeleteWindowById(WC_BUY_COMPANY, pi); + /* Also delete the player specific windows, that don't have a player-colour */ + DeleteWindowById(WC_BUY_COMPANY, id); } -/* Change the owner of all the windows one player can take over from another player (like vehicle view windows) */ +/** Change the owner of all the windows one player can take over from another + * player in the case of a company merger. Do not change ownership of windows + * that need to be deleted once takeover is complete + * @param old_player PlayerID of original owner of the window + * @param new_player PlayerID of the new owner of the window */ void ChangeWindowOwner(PlayerID old_player, PlayerID new_player) { Window *w; @@ -381,6 +388,7 @@ void ChangeWindowOwner(PlayerID old_player, PlayerID new_player) if (w->window_class == WC_AIRCRAFT_LIST) continue; if (w->window_class == WC_BUY_COMPANY) continue; if (w->window_class == WC_COMPANY) continue; + w->caption_color = new_player; } } @@ -411,7 +419,9 @@ static inline bool IsVitalWindow(const Window *w) * there are certain windows that always need to be on-top; these include * - Toolbar, Statusbar (always on) * - New window, Chatbar (only if open) + * The window is marked dirty for a repaint if the window is actually moved * @param w window that is put into the foreground + * @return pointer to the window, can be different! */ static Window *BringWindowToFront(Window *w) { @@ -548,7 +558,7 @@ static Window *LocalAllocateWindow( } // Set up window properties - memset(w, 0, sizeof(Window)); + memset(w, 0, sizeof(*w)); w->window_class = cls; w->flags4 = WF_WHITE_BORDER_MASK; // just opened windows have a white border w->caption_color = 0xFF; @@ -639,10 +649,8 @@ static bool IsGoodAutoPlace2(int left, int top) width = _awap_r.width; height = _awap_r.height; - if (left < -(width>>2) || left > _screen.width - (width>>1)) - return false; - if (top < 22 || top > _screen.height - (height>>2)) - return false; + if (left < -(width>>2) || left > _screen.width - (width>>1)) return false; + if (top < 22 || top > _screen.height - (height>>2)) return false; // Make sure it is not obscured by any window. for (w = _windows; w != _last_window; w++) { @@ -799,14 +807,16 @@ Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number) return w; } +/** Do a search for a window at specific coordinates. For this we start + * at the topmost window, obviously and work our way down to the bottom + * @return a pointer to the found window if any, NULL otherwise */ Window *FindWindowFromPt(int x, int y) { Window *w; for (w = _last_window; w != _windows;) { --w; - if (IS_INSIDE_1D(x, w->left, w->width) && - IS_INSIDE_1D(y, w->top, w->height)) { + if (IS_INSIDE_1D(x, w->left, w->width) && IS_INSIDE_1D(y, w->top, w->height)) { return w; } } @@ -1641,9 +1651,8 @@ void UpdateWindows(void) w--; if (w->flags4 & WF_WHITE_BORDER_MASK) { w->flags4 -= WF_WHITE_BORDER_ONE; - if (!(w->flags4 & WF_WHITE_BORDER_MASK)) { - SetWindowDirty(w); - } + + if (!(w->flags4 & WF_WHITE_BORDER_MASK)) SetWindowDirty(w); } } |