mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #202 from duncanspumpkin/master
Fixed small window bug and changed to using global window list var
This commit is contained in:
commit
777390c4b0
|
@ -235,7 +235,7 @@ void game_handle_input()
|
|||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009ABDF2, uint8) != 0) {
|
||||
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006EA73F);
|
||||
|
@ -269,7 +269,7 @@ void game_handle_input()
|
|||
}
|
||||
}
|
||||
|
||||
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_08], 0, 0, 0, 0,(int) w, 0, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -1386,7 +1386,7 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom)
|
|||
windowDPI->height = bottom - top;
|
||||
windowDPI->pitch = screenDPI->width + screenDPI->pitch + left - right;
|
||||
|
||||
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) {
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) {
|
||||
if (w->flags & WF_TRANSPARENT)
|
||||
continue;
|
||||
if (right <= w->x || bottom <= w->y)
|
||||
|
|
|
@ -312,7 +312,7 @@ void scenario_end()
|
|||
rct_window* w;
|
||||
window_close_by_id(WC_DROPDOWN, 0);
|
||||
|
||||
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){
|
||||
for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){
|
||||
if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)))
|
||||
window_close(w);
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ void viewport_init_all()
|
|||
}
|
||||
|
||||
// Setting up windows
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window);
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) = g_window_list;
|
||||
RCT2_GLOBAL(0x01423604, sint32) = 0;
|
||||
|
||||
// Setting up viewports
|
||||
|
|
66
src/window.c
66
src/window.c
|
@ -32,6 +32,10 @@
|
|||
#define RCT2_LAST_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) - 1)
|
||||
#define RCT2_NEW_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*))
|
||||
|
||||
#define MAX_NUMBER_WINDOWS 11
|
||||
|
||||
rct_window* g_window_list = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window);
|
||||
|
||||
static void window_all_wheel_input();
|
||||
static int window_draw_split(rct_window *w, int left, int top, int right, int bottom);
|
||||
|
||||
|
@ -131,7 +135,7 @@ void window_dispatch_update_all()
|
|||
|
||||
RCT2_GLOBAL(0x01423604, sint32)++;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_NOT_SHOWN_TICKS, sint16)++;
|
||||
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--)
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--)
|
||||
RCT2_CALLPROC_WE_UPDATE(w->event_handlers[WE_UPDATE], w);
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x006EE411); // handle_text_input
|
||||
|
@ -154,7 +158,7 @@ void window_update_all()
|
|||
|
||||
gfx_draw_all_dirty_blocks();
|
||||
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->viewport != NULL)
|
||||
viewport_update_position(w);
|
||||
|
||||
|
@ -162,12 +166,12 @@ void window_update_all()
|
|||
RCT2_GLOBAL(0x009DEB7C, sint16) += RCT2_GLOBAL(0x009DE588, sint16);
|
||||
if (RCT2_GLOBAL(0x009DEB7C, sint16) >= 1000) {
|
||||
RCT2_GLOBAL(0x009DEB7C, sint16) = 0;
|
||||
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--)
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--)
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, (int) w, 0, 0);
|
||||
}
|
||||
|
||||
// Border flash invalidation
|
||||
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--) {
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--) {
|
||||
if (w->flags & WF_WHITE_BORDER_MASK) {
|
||||
w->flags -= WF_WHITE_BORDER_ONE;
|
||||
if (!(w->flags & WF_WHITE_BORDER_MASK))
|
||||
|
@ -316,7 +320,7 @@ static void window_all_wheel_input()
|
|||
}
|
||||
|
||||
// Check windows, front to back
|
||||
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--)
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--)
|
||||
if (window_wheel_input(w, wheel))
|
||||
return;
|
||||
}
|
||||
|
@ -337,9 +341,9 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
|
|||
{
|
||||
rct_window *w;
|
||||
// Check if there are any window slots left
|
||||
if (RCT2_NEW_WINDOW >= &(RCT2_FIRST_WINDOW[11])) {
|
||||
if (RCT2_NEW_WINDOW >= &(g_window_list[MAX_NUMBER_WINDOWS])) {
|
||||
// Close least recently used window
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT | WF_9)))
|
||||
break;
|
||||
|
||||
|
@ -350,14 +354,14 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
|
|||
|
||||
// Flags
|
||||
if (flags & WF_STICK_TO_BACK) {
|
||||
for (; w >= RCT2_FIRST_WINDOW + 1; w--) {
|
||||
for (; w >= g_window_list + 1; w--) {
|
||||
if ((w - 1)->flags & WF_STICK_TO_FRONT)
|
||||
continue;
|
||||
if ((w - 1)->flags & WF_STICK_TO_BACK)
|
||||
break;
|
||||
}
|
||||
} else if (!(flags & WF_STICK_TO_FRONT)) {
|
||||
for (; w >= RCT2_FIRST_WINDOW + 1; w--) {
|
||||
for (; w >= g_window_list + 1; w--) {
|
||||
if (!((w - 1)->flags & WF_STICK_TO_FRONT))
|
||||
break;
|
||||
}
|
||||
|
@ -464,7 +468,9 @@ void window_close(rct_window* window)
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Closes window with defined windowclass and windownumber.
|
||||
* If the windowclass has the highest bit set (bit 15) then it only looks
|
||||
* at the windowclass and not the windownumber
|
||||
* rct2: 0x006ECCF4
|
||||
* @param cls (cl)
|
||||
* @param number (dx)
|
||||
|
@ -474,24 +480,28 @@ void window_close_by_id(rct_windowclass cls, rct_windownumber number)
|
|||
rct_window* w;
|
||||
|
||||
if (cls & 0x80) {
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) {
|
||||
cls &= ~0x80;
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) {
|
||||
if (w->classification == cls) {
|
||||
window_close(w);
|
||||
w = RCT2_FIRST_WINDOW - 1;
|
||||
w = g_window_list - 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) {
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) {
|
||||
if (w->classification == cls && w->number == number) {
|
||||
window_close(w);
|
||||
w = RCT2_FIRST_WINDOW - 1;
|
||||
w = g_window_list - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Returns the first window with defined windowclass and windownumber.
|
||||
* If the windowclass has the highest bit set (bit 15) then it only looks
|
||||
* at the windowclass and not the windownumber.
|
||||
* Returns NULL on failure to find window.
|
||||
* rct2: 0x006EA8A0
|
||||
* @param cls (cl)
|
||||
* @param number (dx)
|
||||
|
@ -502,11 +512,11 @@ rct_window *window_find_by_id(rct_windowclass cls, rct_windownumber number)
|
|||
|
||||
if (cls & 0x80) {
|
||||
cls &= ~0x80;
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->classification == cls)
|
||||
return w;
|
||||
} else {
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->classification == cls && w->number == number)
|
||||
return w;
|
||||
}
|
||||
|
@ -529,7 +539,7 @@ void window_close_top()
|
|||
if (RCT2_GLOBAL(0x0141F570, uint8) != 1)
|
||||
return;
|
||||
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_LAST_WINDOW; w++) {
|
||||
for (w = g_window_list; w < RCT2_LAST_WINDOW; w++) {
|
||||
if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) {
|
||||
window_close(w);
|
||||
return;
|
||||
|
@ -547,10 +557,10 @@ void window_close_all() {
|
|||
|
||||
window_close_by_id(WC_DROPDOWN, 0);
|
||||
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_LAST_WINDOW; w++){
|
||||
for (w = g_window_list; w < RCT2_LAST_WINDOW; w++){
|
||||
if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) {
|
||||
window_close(w);
|
||||
w = RCT2_FIRST_WINDOW;
|
||||
w = g_window_list;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -565,7 +575,7 @@ rct_window *window_find_from_point(int x, int y)
|
|||
rct_widget *widget;
|
||||
int widget_index;
|
||||
|
||||
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--) {
|
||||
for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--) {
|
||||
if (x < w->x || x >= w->x + w->width || y < w->y || y >= w->y + w->height)
|
||||
continue;
|
||||
|
||||
|
@ -656,7 +666,7 @@ void window_invalidate_by_id(uint16 cls, rct_windownumber number)
|
|||
if (cls & 0x80) {
|
||||
widgetIndex = cls >> 8;
|
||||
cls &= 0x7F;
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) {
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) {
|
||||
if (w->classification == cls && w->number == number) {
|
||||
widget = &w->widgets[widgetIndex];
|
||||
if (widget->left != -2) {
|
||||
|
@ -667,11 +677,11 @@ void window_invalidate_by_id(uint16 cls, rct_windownumber number)
|
|||
}
|
||||
} else if (cls & 0x40) {
|
||||
cls &= 0xBF;
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->classification == cls)
|
||||
window_invalidate(w);
|
||||
} else {
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->classification == cls && w->number == number)
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
@ -789,11 +799,11 @@ rct_window *window_bring_to_front(rct_window *w)
|
|||
if (w->flags & 0x03)
|
||||
return w;
|
||||
|
||||
for (v = RCT2_LAST_WINDOW; v >= RCT2_FIRST_WINDOW; v--)
|
||||
for (v = RCT2_LAST_WINDOW; v >= g_window_list; v--)
|
||||
if (!(v->flags & 2))
|
||||
break;
|
||||
|
||||
if (v >= RCT2_FIRST_WINDOW && w != v) {
|
||||
if (v >= g_window_list && w != v) {
|
||||
do {
|
||||
t = *w;
|
||||
*w = *(w + 1);
|
||||
|
@ -825,7 +835,7 @@ void window_push_others_below(rct_window *w1)
|
|||
rct_window* w2;
|
||||
|
||||
// Enumerate through all other windows
|
||||
for (w2 = RCT2_FIRST_WINDOW; w2 < RCT2_NEW_WINDOW; w2++) {
|
||||
for (w2 = g_window_list; w2 < RCT2_NEW_WINDOW; w2++) {
|
||||
if (w1 == w2)
|
||||
continue;
|
||||
|
||||
|
@ -866,7 +876,7 @@ rct_window *window_get_main()
|
|||
{
|
||||
rct_window* w;
|
||||
|
||||
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
|
||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||
if (w->classification == WC_MAIN_WINDOW)
|
||||
return w;
|
||||
|
||||
|
|
|
@ -293,6 +293,9 @@ enum PROMPT_MODE {
|
|||
PM_QUIT
|
||||
};
|
||||
|
||||
// rct2: 0x01420078
|
||||
extern rct_window* g_window_list;
|
||||
|
||||
void window_dispatch_update_all();
|
||||
void window_update_all();
|
||||
rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags);
|
||||
|
|
Loading…
Reference in New Issue