author | peter1138 |
Sun, 03 Aug 2008 17:35:08 +0000 | |
changeset 9834 | 7474149531c1 |
parent 9508 | e5ab9738298a |
child 9898 | 75347c78b276 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
9111
48ce04029fe4
(svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents:
9083
diff
changeset
|
3 |
/** @file window.cpp Windowing system, widgets and events */ |
6117
6507b2a7e71d
(svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents:
5907
diff
changeset
|
4 |
|
0 | 5 |
#include "stdafx.h" |
4755
9ebcb0db6c06
(svn r6669) -Add: vararg functions to set hidden/disabled/lowered state of multiple widgets in one call
glx
parents:
4749
diff
changeset
|
6 |
#include <stdarg.h> |
1891
862800791170
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1867
diff
changeset
|
7 |
#include "openttd.h" |
1299
39c06aba09aa
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1112
diff
changeset
|
8 |
#include "debug.h" |
8254
1496654ca5e7
(svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents:
8224
diff
changeset
|
9 |
#include "player_func.h" |
8224
c5a64d87cc54
(svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents:
8177
diff
changeset
|
10 |
#include "gfx_func.h" |
9336 | 11 |
#include "console_func.h" |
12 |
#include "console_gui.h" |
|
8224
c5a64d87cc54
(svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents:
8177
diff
changeset
|
13 |
#include "viewport_func.h" |
2159
f6284cf5fab0
(svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents:
2154
diff
changeset
|
14 |
#include "variables.h" |
4300
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
15 |
#include "genworld.h" |
6937
40c760fcf1f6
(svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
6878
diff
changeset
|
16 |
#include "blitter/factory.hpp" |
8106
e6790dd9e750
(svn r11667) -Codechange: split window.h into a header that defines some 'global' window related types, on that defined 'global' window functions and one that defines functions and types only used by *_gui.cpps.
rubidium
parents:
8068
diff
changeset
|
17 |
#include "window_gui.h" |
8123
ce31d2843a95
(svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents:
8121
diff
changeset
|
18 |
#include "zoom_func.h" |
8130
d2eb7d04f6e1
(svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents:
8123
diff
changeset
|
19 |
#include "core/alloc_func.hpp" |
8139
4e91c448c409
(svn r11701) -Codechange: removal unnecessary inclusions of map.h (and split map.h).
rubidium
parents:
8131
diff
changeset
|
20 |
#include "map_func.h" |
8144
65cec0877b78
(svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents:
8139
diff
changeset
|
21 |
#include "vehicle_base.h" |
8270
e7c342f6b14c
(svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents:
8268
diff
changeset
|
22 |
#include "settings_type.h" |
8965
29a591456a2f
(svn r12757) -Codechange: move all cheat related stuff from all over the place to a single location.
rubidium
parents:
8957
diff
changeset
|
23 |
#include "cheat_func.h" |
9117
87f472043e9e
(svn r12977) -Codechange: remove quite some redundant (duplicate) function declarations.
rubidium
parents:
9116
diff
changeset
|
24 |
#include "window_func.h" |
9127
14f21c5954ee
(svn r12987) -Codechange: split viewport and tile selection.
rubidium
parents:
9124
diff
changeset
|
25 |
#include "tilehighlight_func.h" |
0 | 26 |
|
8264
b1e85998c7d3
(svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents:
8254
diff
changeset
|
27 |
#include "table/sprites.h" |
b1e85998c7d3
(svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents:
8254
diff
changeset
|
28 |
|
8924
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
29 |
static Point _drag_delta; ///< delta between mouse cursor and upper left corner of dragged window |
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
30 |
static Window *_mouseover_last_w = NULL; ///< Window of the last MOUSEOVER event |
350 | 31 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
32 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
33 |
* List of windows opened at the screen. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
34 |
* Uppermost window is at _z_windows[_last_z_window - 1], |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
35 |
* bottom window is at _z_windows[0] |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
36 |
*/ |
8925
e0d37ce1eba8
(svn r12695) -Codechange: only allocate window structs when needed. Based on a patch by Alberth.
rubidium
parents:
8924
diff
changeset
|
37 |
Window *_z_windows[MAX_NUMBER_OF_WINDOWS]; |
5126
9084bb06e52e
(svn r7207) -Codechange: Pass the (unchanged) windowpointer to the console window and do it only once.
Darkvater
parents:
5124
diff
changeset
|
38 |
Window **_last_z_window; ///< always points to the next free space in the z-array |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
39 |
|
9411
f54d5b3b3bf8
(svn r13322) -Codechange: _no_scroll belongs more with the window code.
rubidium
parents:
9410
diff
changeset
|
40 |
byte _no_scroll; |
8268
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
41 |
Point _cursorpos_drag_start; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
42 |
|
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
43 |
int _scrollbar_start_pos; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
44 |
int _scrollbar_size; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
45 |
byte _scroller_click_timeout; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
46 |
|
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
47 |
bool _scrolling_scrollbar; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
48 |
bool _scrolling_viewport; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
49 |
|
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
50 |
byte _special_mouse_mode; |
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
51 |
|
5027ad5e70a0
(svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents:
8264
diff
changeset
|
52 |
|
7993
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
53 |
void CDECL Window::SetWidgetsDisabledState(bool disab_stat, int widgets, ...) |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
54 |
{ |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
55 |
va_list wdg_list; |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
56 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
57 |
va_start(wdg_list, widgets); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
58 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
59 |
while (widgets != WIDGET_LIST_END) { |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
60 |
SetWidgetDisabledState(widgets, disab_stat); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
61 |
widgets = va_arg(wdg_list, int); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
62 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
63 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
64 |
va_end(wdg_list); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
65 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
66 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
67 |
void CDECL Window::SetWidgetsHiddenState(bool hidden_stat, int widgets, ...) |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
68 |
{ |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
69 |
va_list wdg_list; |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
70 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
71 |
va_start(wdg_list, widgets); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
72 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
73 |
while (widgets != WIDGET_LIST_END) { |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
74 |
SetWidgetHiddenState(widgets, hidden_stat); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
75 |
widgets = va_arg(wdg_list, int); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
76 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
77 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
78 |
va_end(wdg_list); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
79 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
80 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
81 |
void CDECL Window::SetWidgetsLoweredState(bool lowered_stat, int widgets, ...) |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
82 |
{ |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
83 |
va_list wdg_list; |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
84 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
85 |
va_start(wdg_list, widgets); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
86 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
87 |
while (widgets != WIDGET_LIST_END) { |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
88 |
SetWidgetLoweredState(widgets, lowered_stat); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
89 |
widgets = va_arg(wdg_list, int); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
90 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
91 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
92 |
va_end(wdg_list); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
93 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
94 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
95 |
void Window::RaiseButtons() |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
96 |
{ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
97 |
for (uint i = 0; i < this->widget_count; i++) { |
8032
f35fba9bacb0
(svn r11592) -Codechange: Use the Window member RaiseButtons and remove the now useless RaiseWindowButtons function
belugas
parents:
8031
diff
changeset
|
98 |
if (this->IsWidgetLowered(i)) { |
f35fba9bacb0
(svn r11592) -Codechange: Use the Window member RaiseButtons and remove the now useless RaiseWindowButtons function
belugas
parents:
8031
diff
changeset
|
99 |
this->RaiseWidget(i); |
f35fba9bacb0
(svn r11592) -Codechange: Use the Window member RaiseButtons and remove the now useless RaiseWindowButtons function
belugas
parents:
8031
diff
changeset
|
100 |
this->InvalidateWidget(i); |
7993
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
101 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
102 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
103 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
104 |
|
8026
a188ea8201ce
(svn r11586) -Fix: make another widget 'accessor' function const when it should be const.
glx
parents:
8023
diff
changeset
|
105 |
void Window::InvalidateWidget(byte widget_index) const |
7993
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
106 |
{ |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
107 |
const Widget *wi = &this->widget[widget_index]; |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
108 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
109 |
/* Don't redraw the window if the widget is invisible or of no-type */ |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
110 |
if (wi->type == WWT_EMPTY || IsWidgetHidden(widget_index)) return; |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
111 |
|
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
112 |
SetDirtyBlocks(this->left + wi->left, this->top + wi->top, this->left + wi->right + 1, this->top + wi->bottom + 1); |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
113 |
} |
8776e72bf3da
(svn r11551) -Codechange: Introduction of widget control members on struct Window. These "new" members have the exact same functionalities as their pure functions "genitors"
belugas
parents:
7954
diff
changeset
|
114 |
|
8035
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
115 |
void Window::HandleButtonClick(byte widget) |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
116 |
{ |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
117 |
this->LowerWidget(widget); |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
118 |
this->flags4 |= 5 << WF_TIMEOUT_SHL; |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
119 |
this->InvalidateWidget(widget); |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
120 |
} |
8c76ea0d84ab
(svn r11595) -Codechange: add a new member to Window struct, based on its function counterpart HandleButtonClick.
belugas
parents:
8033
diff
changeset
|
121 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
122 |
static void StartWindowDrag(Window *w); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
123 |
static void StartWindowSizing(Window *w); |
2817 | 124 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
125 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
126 |
* Dispatch left mouse-button (possibly double) click in window. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
127 |
* @param w Window to dispatch event in |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
128 |
* @param x X coordinate of the click |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
129 |
* @param y Y coordinate of the click |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
130 |
* @param double_click Was it a double click? |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
131 |
*/ |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
132 |
static void DispatchLeftClickEvent(Window *w, int x, int y, bool double_click) |
2596 | 133 |
{ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
134 |
int widget = 0; |
0 | 135 |
if (w->desc_flags & WDF_DEF_WIDGET) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
136 |
widget = GetWidgetFromPos(w, x, y); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
137 |
if (widget < 0) return; // exit if clicked outside of widgets |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
138 |
|
5236
4c1289d5e45a
(svn r7356) -Codechange: replace 'for (i = 0, wi = w->widget; wi->type != WWT_LAST; i++, wi++)' type for loops with 'for (i = 0; i < w->window_count; i++) { wi = &w->widget[i];'-type for loops for better readability.
rubidium
parents:
5235
diff
changeset
|
139 |
/* don't allow any interaction if the button has been disabled */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
140 |
if (w->IsWidgetDisabled(widget)) return; |
222
b88456001397
(svn r223) -Fix: Const correctness and miscellaneous fixes. Thank you Tron for your diligent fixing of warnings (and some possibly bugs) (Tron)
darkvater
parents:
211
diff
changeset
|
141 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
142 |
const Widget *wi = &w->widget[widget]; |
0 | 143 |
|
4938
0447845fd1b3
(svn r6925) -Codechange: Be more strict with widget distinctions. WWT_PANEL is only plain panel,
Darkvater
parents:
4766
diff
changeset
|
144 |
if (wi->type & WWB_MASK) { |
211 | 145 |
/* special widget handling for buttons*/ |
2952 | 146 |
switch (wi->type) { |
4938
0447845fd1b3
(svn r6925) -Codechange: Be more strict with widget distinctions. WWT_PANEL is only plain panel,
Darkvater
parents:
4766
diff
changeset
|
147 |
case WWT_PANEL | WWB_PUSHBUTTON: /* WWT_PUSHBTN */ |
0447845fd1b3
(svn r6925) -Codechange: Be more strict with widget distinctions. WWT_PANEL is only plain panel,
Darkvater
parents:
4766
diff
changeset
|
148 |
case WWT_IMGBTN | WWB_PUSHBUTTON: /* WWT_PUSHIMGBTN */ |
0447845fd1b3
(svn r6925) -Codechange: Be more strict with widget distinctions. WWT_PANEL is only plain panel,
Darkvater
parents:
4766
diff
changeset
|
149 |
case WWT_TEXTBTN | WWB_PUSHBUTTON: /* WWT_PUSHTXTBTN */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
150 |
w->HandleButtonClick(widget); |
4938
0447845fd1b3
(svn r6925) -Codechange: Be more strict with widget distinctions. WWT_PANEL is only plain panel,
Darkvater
parents:
4766
diff
changeset
|
151 |
break; |
0 | 152 |
} |
842 | 153 |
} else if (wi->type == WWT_SCROLLBAR || wi->type == WWT_SCROLL2BAR || wi->type == WWT_HSCROLLBAR) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
154 |
ScrollbarClickHandler(w, wi, x, y); |
0 | 155 |
} |
156 |
||
157 |
if (w->desc_flags & WDF_STD_BTN) { |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
158 |
if (widget == 0) { /* 'X' */ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
159 |
delete w; |
984
2ff5fb62658a
(svn r1481) -Fix: [ 1099891 ] Added a return in DispatchLeftClickEvent which prevents reading of free'd memory (tamlin)
celestar
parents:
983
diff
changeset
|
160 |
return; |
1109
ecb98f43ba2c
(svn r1610) Remove trailing whitespace (last time ever, i hope)
tron
parents:
1101
diff
changeset
|
161 |
} |
ecb98f43ba2c
(svn r1610) Remove trailing whitespace (last time ever, i hope)
tron
parents:
1101
diff
changeset
|
162 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
163 |
if (widget == 1) { /* 'Title bar' */ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
164 |
StartWindowDrag(w); |
1112
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
165 |
return; |
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
166 |
} |
0 | 167 |
} |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
168 |
|
1112
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
169 |
if (w->desc_flags & WDF_RESIZABLE && wi->type == WWT_RESIZEBOX) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
170 |
StartWindowSizing(w); |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
171 |
w->InvalidateWidget(widget); |
1112
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
172 |
return; |
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
173 |
} |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
174 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
175 |
if (w->desc_flags & WDF_STICKY_BUTTON && wi->type == WWT_STICKYBOX) { |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
176 |
w->flags4 ^= WF_STICKY; |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
177 |
w->InvalidateWidget(widget); |
1112
d8503ef77898
(svn r1613) -Fix: WE_CLICK event is not called on default actions. If special action is needed, use the other events like WE_RESIZE or WE_DESTROY, etc.
darkvater
parents:
1109
diff
changeset
|
178 |
return; |
682
74c70f645d95
(svn r1121) -Feature: Added sticky windows feature. A small pin allows the user to set the window as undeletable and can only be closed by hand. As an example the viewport window has been stickied (thanks to Neko-San)
darkvater
parents:
679
diff
changeset
|
179 |
} |
0 | 180 |
} |
1038
fb62bb1c424f
(svn r1539) -Fix: [1103271] free'd memory used. Moved w->wndproc(w, &e) to end of function. Thanks for finding this tamlin.
darkvater
parents:
1033
diff
changeset
|
181 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
182 |
Point pt = { x, y }; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
183 |
|
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
184 |
if (double_click) { |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
185 |
w->OnDoubleClick(pt, widget); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
186 |
} else { |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
187 |
w->OnClick(pt, widget); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
188 |
} |
0 | 189 |
} |
190 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
191 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
192 |
* Dispatch right mouse-button click in window. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
193 |
* @param w Window to dispatch event in |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
194 |
* @param x X coordinate of the click |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
195 |
* @param y Y coordinate of the click |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
196 |
*/ |
4171 | 197 |
static void DispatchRightClickEvent(Window *w, int x, int y) |
2596 | 198 |
{ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
199 |
int widget = 0; |
0 | 200 |
|
201 |
/* default tooltips handler? */ |
|
202 |
if (w->desc_flags & WDF_STD_TOOLTIPS) { |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
203 |
widget = GetWidgetFromPos(w, x, y); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
204 |
if (widget < 0) return; // exit if clicked outside of widgets |
0 | 205 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
206 |
if (w->widget[widget].tooltips != 0) { |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
207 |
GuiShowTooltips(w->widget[widget].tooltips); |
0 | 208 |
return; |
209 |
} |
|
210 |
} |
|
211 |
||
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
212 |
Point pt = { x, y }; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
213 |
w->OnRightClick(pt, widget); |
0 | 214 |
} |
215 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
216 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
217 |
* Dispatch the mousewheel-action to the window. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
218 |
* The window will scroll any compatible scrollbars if the mouse is pointed over the bar or its contents |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
219 |
* @param w Window |
2021
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
220 |
* @param widget the widget where the scrollwheel was used |
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
221 |
* @param wheel scroll up or down |
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
222 |
*/ |
4171 | 223 |
static void DispatchMouseWheelEvent(Window *w, int widget, int wheel) |
0 | 224 |
{ |
2021
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
225 |
if (widget < 0) return; |
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
226 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
227 |
const Widget *wi1 = &w->widget[widget]; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
228 |
const Widget *wi2 = &w->widget[widget + 1]; |
2021
3a8c59ea3fbe
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
Darkvater
parents:
1980
diff
changeset
|
229 |
|
982
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
230 |
/* The listbox can only scroll if scrolling was done on the scrollbar itself, |
1019
6bae6c11e865
(svn r1520) Trim 134 (!) lines with trailing whitespace ):
tron
parents:
999
diff
changeset
|
231 |
* or on the listbox (and the next item is (must be) the scrollbar) |
982
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
232 |
* XXX - should be rewritten as a widget-dependent scroller but that's |
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
233 |
* not happening until someone rewrites the whole widget-code */ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
234 |
Scrollbar *sb; |
1019
6bae6c11e865
(svn r1520) Trim 134 (!) lines with trailing whitespace ):
tron
parents:
999
diff
changeset
|
235 |
if ((sb = &w->vscroll, wi1->type == WWT_SCROLLBAR) || (sb = &w->vscroll2, wi1->type == WWT_SCROLL2BAR) || |
982
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
236 |
(sb = &w->vscroll2, wi2->type == WWT_SCROLL2BAR) || (sb = &w->vscroll, wi2->type == WWT_SCROLLBAR) ) { |
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
237 |
|
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
238 |
if (sb->count > sb->cap) { |
7922
a7e266f966d9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
7918
diff
changeset
|
239 |
int pos = Clamp(sb->pos + wheel, 0, sb->count - sb->cap); |
982
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
240 |
if (pos != sb->pos) { |
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
241 |
sb->pos = pos; |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
242 |
w->SetDirty(); |
982
d3ce4d6a65f8
(svn r1478) -Fix: [1099195] mouse-wheel in train replace window. Scrollbar1 and Scrollbar2 now work independently. You can only scroll on list and scrollbar itself; scrollbar must be next widget of the list.
darkvater
parents:
959
diff
changeset
|
243 |
} |
0 | 244 |
} |
245 |
} |
|
246 |
} |
|
247 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
248 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
249 |
* Generate repaint events for the visible part of window *wz within the rectangle. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
250 |
* |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
251 |
* The function goes recursively upwards in the window stack, and splits the rectangle |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
252 |
* into multiple pieces at the window edges, so obscured parts are not redrawn. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
253 |
* |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
254 |
* @param wz Pointer into window stack, pointing at the window that needs to be repainted |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
255 |
* @param left Left edge of the rectangle that should be repainted |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
256 |
* @param top Top edge of the rectangle that should be repainted |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
257 |
* @param right Right edge of the rectangle that should be repainted |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
258 |
* @param bottom Bottom edge of the rectangle that should be repainted |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
259 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
260 |
static void DrawOverlappedWindow(Window* const *wz, int left, int top, int right, int bottom) |
0 | 261 |
{ |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
262 |
Window* const *vz = wz; |
0 | 263 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
264 |
while (++vz != _last_z_window) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
265 |
const Window *v = *vz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
266 |
|
0 | 267 |
if (right > v->left && |
2026 | 268 |
bottom > v->top && |
0 | 269 |
left < v->left + v->width && |
270 |
top < v->top + v->height) { |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
271 |
/* v and rectangle intersect with eeach other */ |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
272 |
int x; |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
273 |
|
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6481
diff
changeset
|
274 |
if (left < (x = v->left)) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
275 |
DrawOverlappedWindow(wz, left, top, x, bottom); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
276 |
DrawOverlappedWindow(wz, x, top, right, bottom); |
0 | 277 |
return; |
278 |
} |
|
279 |
||
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6481
diff
changeset
|
280 |
if (right > (x = v->left + v->width)) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
281 |
DrawOverlappedWindow(wz, left, top, x, bottom); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
282 |
DrawOverlappedWindow(wz, x, top, right, bottom); |
0 | 283 |
return; |
284 |
} |
|
285 |
||
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6481
diff
changeset
|
286 |
if (top < (x = v->top)) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
287 |
DrawOverlappedWindow(wz, left, top, right, x); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
288 |
DrawOverlappedWindow(wz, left, x, right, bottom); |
0 | 289 |
return; |
290 |
} |
|
291 |
||
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6481
diff
changeset
|
292 |
if (bottom > (x = v->top + v->height)) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
293 |
DrawOverlappedWindow(wz, left, top, right, x); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
294 |
DrawOverlappedWindow(wz, left, x, right, bottom); |
0 | 295 |
return; |
296 |
} |
|
297 |
||
298 |
return; |
|
299 |
} |
|
300 |
} |
|
301 |
||
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
302 |
/* Setup blitter, and dispatch a repaint event to window *wz */ |
8922
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
303 |
DrawPixelInfo *dp = _cur_dpi; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
304 |
dp->width = right - left; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
305 |
dp->height = bottom - top; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
306 |
dp->left = left - (*wz)->left; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
307 |
dp->top = top - (*wz)->top; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
308 |
dp->pitch = _screen.pitch; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
309 |
dp->dst_ptr = BlitterFactoryBase::GetCurrentBlitter()->MoveTo(_screen.dst_ptr, left, top); |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
310 |
dp->zoom = ZOOM_LVL_NORMAL; |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
311 |
(*wz)->OnPaint(); |
8922
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
312 |
} |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
313 |
|
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
314 |
/** |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
315 |
* From a rectangle that needs redrawing, find the windows that intersect with the rectangle. |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
316 |
* These windows should be re-painted. |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
317 |
* @param left Left edge of the rectangle that should be repainted |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
318 |
* @param top Top edge of the rectangle that should be repainted |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
319 |
* @param right Right edge of the rectangle that should be repainted |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
320 |
* @param bottom Bottom edge of the rectangle that should be repainted |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
321 |
*/ |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
322 |
void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
323 |
{ |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
324 |
Window* const *wz; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
325 |
DrawPixelInfo bk; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
326 |
_cur_dpi = &bk; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
327 |
|
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
328 |
FOR_ALL_WINDOWS(wz) { |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
329 |
const Window *w = *wz; |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
330 |
if (right > w->left && |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
331 |
bottom > w->top && |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
332 |
left < w->left + w->width && |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
333 |
top < w->top + w->height) { |
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
334 |
/* Window w intersects with the rectangle => needs repaint */ |
8922
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
335 |
DrawOverlappedWindow(wz, left, top, right, bottom); |
2a945724618d
(svn r12692) -Codechange: swap to functions to remove a function declaration.
rubidium
parents:
8857
diff
changeset
|
336 |
} |
0 | 337 |
} |
338 |
} |
|
339 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
340 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
341 |
* Mark entire window as dirty (in need of re-paint) |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
342 |
* @param w Window to redraw |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
343 |
* @ingroup dirty |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
344 |
*/ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
345 |
void Window::SetDirty() const |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
346 |
{ |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
347 |
SetDirtyBlocks(this->left, this->top, this->left + this->width, this->top + this->height); |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
348 |
} |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
349 |
|
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
350 |
/** |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
351 |
* Mark entire window as dirty (in need of re-paint) |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
352 |
* @param w Window to redraw |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
353 |
* @ingroup dirty |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
354 |
*/ |
4171 | 355 |
void SetWindowDirty(const Window *w) |
0 | 356 |
{ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
357 |
if (w != NULL) w->SetDirty(); |
0 | 358 |
} |
359 |
||
5415
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
360 |
/** Find the Window whose parent pointer points to this window |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
361 |
* @param w parent Window to find child of |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
362 |
* @return a Window pointer that is the child of w, or NULL otherwise */ |
5415
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
363 |
static Window *FindChildWindow(const Window *w) |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
364 |
{ |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
365 |
Window* const *wz; |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
366 |
|
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
367 |
FOR_ALL_WINDOWS(wz) { |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
368 |
Window *v = *wz; |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
369 |
if (v->parent == w) return v; |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
370 |
} |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
371 |
|
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
372 |
return NULL; |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
373 |
} |
60e096e4818d
(svn r7618) -Feature: Add support for a parent<>child relationship in Window terms. A child
Darkvater
parents:
5413
diff
changeset
|
374 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
375 |
/** Find the z-value of a window. A window must already be open |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
376 |
* or the behaviour is undefined but function should never fail |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
377 |
* @param w window to query Z Position |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
378 |
* @return Pointer into the window-list at the position of \a w |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
379 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
380 |
Window **FindWindowZPosition(const Window *w) |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
381 |
{ |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
382 |
Window **wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
383 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
384 |
FOR_ALL_WINDOWS(wz) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
385 |
if (*wz == w) return wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
386 |
} |
5429
a664da42d64e
(svn r7635) -Fix (r7618, r7621): Guard against recursive deletion. It is possible that when a
Darkvater
parents:
5416
diff
changeset
|
387 |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
388 |
DEBUG(misc, 3, "Window (cls %d, number %d) is not open, probably removed by recursive calls", |
5429
a664da42d64e
(svn r7635) -Fix (r7618, r7621): Guard against recursive deletion. It is possible that when a
Darkvater
parents:
5416
diff
changeset
|
389 |
w->window_class, w->window_number); |
a664da42d64e
(svn r7635) -Fix (r7618, r7621): Guard against recursive deletion. It is possible that when a
Darkvater
parents:
5416
diff
changeset
|
390 |
return NULL; |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
391 |
} |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
392 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
393 |
/** |
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
394 |
* Remove window and all its child windows from the window stack. |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
395 |
*/ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
396 |
Window::~Window() |
0 | 397 |
{ |
4077
d4d440dd8925
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4000
diff
changeset
|
398 |
if (_thd.place_mode != VHM_NONE && |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
399 |
_thd.window_class == this->window_class && |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
400 |
_thd.window_number == this->window_number) { |
0 | 401 |
ResetObjectToPlace(); |
402 |
} |
|
403 |
||
9083
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
404 |
/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
405 |
if (_mouseover_last_w == this) _mouseover_last_w = NULL; |
9083
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
406 |
|
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
407 |
/* Find the window in the z-array, and effectively remove it |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
408 |
* by moving all windows after it one to the left. This must be |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
409 |
* done before removing the child so we cannot cause recursion |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
410 |
* between the deletion of the parent and the child. */ |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
411 |
Window **wz = FindWindowZPosition(this); |
9083
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
412 |
if (wz == NULL) return; |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
413 |
memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz); |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
414 |
_last_z_window--; |
e18c37b3a45e
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
rubidium
parents:
9082
diff
changeset
|
415 |
|
9233
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
416 |
/* Delete all children a window might have in a head-recursive manner */ |
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
417 |
Window *child = FindChildWindow(this); |
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
418 |
while (child != NULL) { |
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
419 |
delete child; |
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
420 |
child = FindChildWindow(this); |
b29c7a028999
(svn r13099) -Fix [FS#2014]: when a window had children only one of them would be closed (on a parent closure) instead of all children.
rubidium
parents:
9203
diff
changeset
|
421 |
} |
0 | 422 |
|
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
423 |
if (this->viewport != NULL) DeleteWindowViewport(this); |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
424 |
|
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
425 |
this->SetDirty(); |
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
426 |
free(this->widget); |
0 | 427 |
} |
428 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
429 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
430 |
* Find a window by its class and window number |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
431 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
432 |
* @param number Number of the window within the window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
433 |
* @return Pointer to the found window, or \c NULL if not available |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
434 |
*/ |
0 | 435 |
Window *FindWindowById(WindowClass cls, WindowNumber number) |
436 |
{ |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
437 |
Window* const *wz; |
0 | 438 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
439 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
440 |
Window *w = *wz; |
2639 | 441 |
if (w->window_class == cls && w->window_number == number) return w; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
442 |
} |
0 | 443 |
|
444 |
return NULL; |
|
445 |
} |
|
446 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
447 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
448 |
* Delete a window by its class and window number (if it is open). |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
449 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
450 |
* @param number Number of the window within the window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
451 |
*/ |
0 | 452 |
void DeleteWindowById(WindowClass cls, WindowNumber number) |
453 |
{ |
|
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
454 |
delete FindWindowById(cls, number); |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
455 |
} |
0 | 456 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
457 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
458 |
* Delete all windows of a given class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
459 |
* @param cls Window class of windows to delete |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
460 |
*/ |
999
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
461 |
void DeleteWindowByClass(WindowClass cls) |
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
462 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
463 |
Window* const *wz; |
2639 | 464 |
|
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
465 |
restart_search: |
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
466 |
/* When we find the window to delete, we need to restart the search |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
467 |
* as deleting this window could cascade in deleting (many) others |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
468 |
* anywhere in the z-array */ |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
469 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
470 |
Window *w = *wz; |
999
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
471 |
if (w->window_class == cls) { |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
472 |
delete w; |
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
473 |
goto restart_search; |
2639 | 474 |
} |
999
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
475 |
} |
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
476 |
} |
647f65adeb9e
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
darkvater
parents:
984
diff
changeset
|
477 |
|
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
478 |
/** Delete all windows of a player. We identify windows of a player |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
479 |
* by looking at the caption colour. If it is equal to the player ID |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
480 |
* then we say the window belongs to the player and should be deleted |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
481 |
* @param id PlayerID player identifier */ |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
482 |
void DeletePlayerWindows(PlayerID id) |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
483 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
484 |
Window* const *wz; |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
485 |
|
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
486 |
restart_search: |
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
487 |
/* When we find the window to delete, we need to restart the search |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
488 |
* as deleting this window could cascade in deleting (many) others |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
489 |
* anywhere in the z-array */ |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
490 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
491 |
Window *w = *wz; |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
492 |
if (w->caption_color == id) { |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
493 |
delete w; |
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
494 |
goto restart_search; |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
495 |
} |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
496 |
} |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
497 |
|
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
498 |
/* Also delete the player specific windows, that don't have a player-colour */ |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
499 |
DeleteWindowById(WC_BUY_COMPANY, id); |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
500 |
} |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
501 |
|
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
502 |
/** Change the owner of all the windows one player can take over from another |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
503 |
* player in the case of a company merger. Do not change ownership of windows |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
504 |
* that need to be deleted once takeover is complete |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
505 |
* @param old_player PlayerID of original owner of the window |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
506 |
* @param new_player PlayerID of the new owner of the window */ |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
507 |
void ChangeWindowOwner(PlayerID old_player, PlayerID new_player) |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
508 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
509 |
Window* const *wz; |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
510 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
511 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
512 |
Window *w = *wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
513 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
514 |
if (w->caption_color != old_player) continue; |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
515 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
516 |
switch (w->window_class) { |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
517 |
case WC_PLAYER_COLOR: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
518 |
case WC_FINANCES: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
519 |
case WC_STATION_LIST: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
520 |
case WC_TRAINS_LIST: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
521 |
case WC_ROADVEH_LIST: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
522 |
case WC_SHIPS_LIST: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
523 |
case WC_AIRCRAFT_LIST: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
524 |
case WC_BUY_COMPANY: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
525 |
case WC_COMPANY: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
526 |
continue; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
527 |
|
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
528 |
default: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
529 |
w->caption_color = new_player; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
530 |
break; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
531 |
} |
5077
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
532 |
} |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
533 |
} |
5a601eb01735
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
bjarni
parents:
5072
diff
changeset
|
534 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
535 |
static void BringWindowToFront(const Window *w); |
2817 | 536 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
537 |
/** Find a window and make it the top-window on the screen. The window |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
538 |
* gets a white border for a brief period of time to visualize its "activation" |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
539 |
* @param cls WindowClass of the window to activate |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
540 |
* @param number WindowNumber of the window to activate |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
541 |
* @return a pointer to the window thus activated */ |
0 | 542 |
Window *BringWindowToFrontById(WindowClass cls, WindowNumber number) |
543 |
{ |
|
544 |
Window *w = FindWindowById(cls, number); |
|
545 |
||
546 |
if (w != NULL) { |
|
547 |
w->flags4 |= WF_WHITE_BORDER_MASK; |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
548 |
BringWindowToFront(w); |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
549 |
w->SetDirty(); |
0 | 550 |
} |
551 |
||
552 |
return w; |
|
553 |
} |
|
554 |
||
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
555 |
static inline bool IsVitalWindow(const Window *w) |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
556 |
{ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
557 |
switch (w->window_class) { |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
558 |
case WC_MAIN_TOOLBAR: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
559 |
case WC_STATUS_BAR: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
560 |
case WC_NEWS_WINDOW: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
561 |
case WC_SEND_NETWORK_MSG: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
562 |
return true; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
563 |
|
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
564 |
default: |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
565 |
return false; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
566 |
} |
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
567 |
} |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
568 |
|
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
569 |
/** On clicking on a window, make it the frontmost window of all. However |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
570 |
* there are certain windows that always need to be on-top; these include |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
571 |
* - Toolbar, Statusbar (always on) |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
572 |
* - New window, Chatbar (only if open) |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
573 |
* The window is marked dirty for a repaint if the window is actually moved |
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
574 |
* @param w window that is put into the foreground |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
575 |
* @return pointer to the window, the same as the input pointer |
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
576 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
577 |
static void BringWindowToFront(const Window *w) |
0 | 578 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
579 |
Window **wz = FindWindowZPosition(w); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
580 |
Window **vz = _last_z_window; |
0 | 581 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
582 |
/* Bring the window just below the vital windows */ |
0 | 583 |
do { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
584 |
if (--vz < _z_windows) return; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
585 |
} while (IsVitalWindow(*vz)); |
0 | 586 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
587 |
if (wz == vz) return; // window is already in the right position |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
588 |
assert(wz < vz); |
0 | 589 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
590 |
Window *tempz = *wz; |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
591 |
memmove(wz, wz + 1, (byte*)vz - (byte*)wz); |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
592 |
*vz = tempz; |
0 | 593 |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
594 |
w->SetDirty(); |
0 | 595 |
} |
596 |
||
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
597 |
/** We have run out of windows, so find a suitable candidate for replacement. |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
598 |
* Keep all important windows intact. These are |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
599 |
* - Main window (gamefield), Toolbar, Statusbar (always on) |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
600 |
* - News window, Chatbar (when on) |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
601 |
* - Any sticked windows since we wanted to keep these |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
602 |
* @return w pointer to the window that is going to be deleted |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
603 |
*/ |
6247 | 604 |
static Window *FindDeletableWindow() |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
605 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
606 |
Window* const *wz; |
2639 | 607 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
608 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
609 |
Window *w = *wz; |
2639 | 610 |
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w) && !(w->flags4 & WF_STICKY)) { |
611 |
return w; |
|
612 |
} |
|
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
613 |
} |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
614 |
return NULL; |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
615 |
} |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
616 |
|
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
617 |
/** A window must be freed, and all are marked as important windows. Ease the |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
618 |
* restriction a bit by allowing to delete sticky windows. Keep important/vital |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
619 |
* windows intact (Main window, Toolbar, Statusbar, News Window, Chatbar) |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
620 |
* Start finding an appropiate candidate from the lowest z-values (bottom) |
1648
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
621 |
* @see FindDeletableWindow() |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
622 |
* @return w Pointer to the window that is being deleted |
41c3d5de9994
(svn r2152) - Fix: Chatbar in MP games is now on-top of the news window.
darkvater
parents:
1645
diff
changeset
|
623 |
*/ |
6247 | 624 |
static Window *ForceFindDeletableWindow() |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
625 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
626 |
Window* const *wz; |
2639 | 627 |
|
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
628 |
FOR_ALL_WINDOWS(wz) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
629 |
Window *w = *wz; |
2639 | 630 |
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w)) return w; |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
631 |
} |
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
632 |
NOT_REACHED(); |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
633 |
} |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
634 |
|
9167
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
635 |
/** |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
636 |
* Assign widgets to a new window by initialising its widget pointers, and by |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
637 |
* copying the widget array \a widget to \c w->widget to allow for resizable |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
638 |
* windows. |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
639 |
* @param w Window on which to attach the widget array |
9167
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
640 |
* @param widget pointer of widget array to fill the window with |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
641 |
* |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
642 |
* @post \c w->widget points to allocated memory and contains the copied widget array except for the terminating widget, |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
643 |
* \c w->widget_count contains number of widgets in the allocated memory. |
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
644 |
*/ |
9168
888730a77af3
(svn r13031) -Codechange: make AssignWidgetToWindow a static function instead of a global one as it should only be used from window.cpp.
rubidium
parents:
9167
diff
changeset
|
645 |
static void AssignWidgetToWindow(Window *w, const Widget *widget) |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
646 |
{ |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
647 |
if (widget != NULL) { |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
648 |
uint index = 1; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
649 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
650 |
for (const Widget *wi = widget; wi->type != WWT_LAST; wi++) index++; |
2639 | 651 |
|
9167
f99163cc2832
(svn r13030) -Codechange: do use MallocT instead of ReallocT when 100% sure that the pointer you are allocating to is NULL. Patch by Alberth.
rubidium
parents:
9166
diff
changeset
|
652 |
w->widget = MallocT<Widget>(index); |
2639 | 653 |
memcpy(w->widget, widget, sizeof(*w->widget) * index); |
5232
d099cc0d7961
(svn r7352) -Codechange: add widget_count parameter to the window.
rubidium
parents:
5198
diff
changeset
|
654 |
w->widget_count = index - 1; |
2639 | 655 |
} else { |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
656 |
w->widget = NULL; |
5232
d099cc0d7961
(svn r7352) -Codechange: add widget_count parameter to the window.
rubidium
parents:
5198
diff
changeset
|
657 |
w->widget_count = 0; |
2639 | 658 |
} |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
659 |
} |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
660 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
661 |
/** |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
662 |
* Initializes a new Window. |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
663 |
* This function is called the constructors. |
4520
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
664 |
* See descriptions for those functions for usage |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
665 |
* Only addition here is window_number, which is the window_number being assigned to the new window |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
666 |
* @param x offset in pixels from the left of the screen |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
667 |
* @param y offset in pixels from the top of the screen |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
668 |
* @param min_width minimum width in pixels of the window |
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
669 |
* @param min_height minimum height in pixels of the window |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
670 |
* @param cls see WindowClass class of the window, used for identification and grouping |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
671 |
* @param *widget see Widget pointer to the window layout and various elements |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
672 |
* @param window_number number being assigned to the new window |
9203
082fbf0500c4
(svn r13069) -Codechange: it is no longer needed to pass a void *data pointer with the WE_CREATE message because nothing uses it anymore.
rubidium
parents:
9184
diff
changeset
|
673 |
* @return Window pointer of the newly created window |
082fbf0500c4
(svn r13069) -Codechange: it is no longer needed to pass a void *data pointer with the WE_CREATE message because nothing uses it anymore.
rubidium
parents:
9184
diff
changeset
|
674 |
*/ |
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
675 |
void Window::Initialize(int x, int y, int min_width, int min_height, |
9317
f14eb8815829
(svn r13185) -Codechange: remove everything related to the WindowProc callbacks.
rubidium
parents:
9301
diff
changeset
|
676 |
WindowClass cls, const Widget *widget, int window_number) |
0 | 677 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
678 |
/* We have run out of windows, close one and use that as the place for our new one */ |
8925
e0d37ce1eba8
(svn r12695) -Codechange: only allocate window structs when needed. Based on a patch by Alberth.
rubidium
parents:
8924
diff
changeset
|
679 |
if (_last_z_window == endof(_z_windows)) { |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
680 |
Window *w = FindDeletableWindow(); |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
681 |
if (w == NULL) w = ForceFindDeletableWindow(); |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
682 |
delete w; |
0 | 683 |
} |
684 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
685 |
/* Set up window properties */ |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
686 |
this->window_class = cls; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
687 |
this->flags4 = WF_WHITE_BORDER_MASK; // just opened windows have a white border |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
688 |
this->caption_color = 0xFF; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
689 |
this->left = x; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
690 |
this->top = y; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
691 |
this->width = min_width; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
692 |
this->height = min_height; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
693 |
AssignWidgetToWindow(this, widget); |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
694 |
this->resize.width = min_width; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
695 |
this->resize.height = min_height; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
696 |
this->resize.step_width = 1; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
697 |
this->resize.step_height = 1; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
698 |
this->window_number = window_number; |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
699 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
700 |
/* Hacky way of specifying always-on-top windows. These windows are |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
701 |
* always above other windows because they are moved below them. |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
702 |
* status-bar is above news-window because it has been created earlier. |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
703 |
* Also, as the chat-window is excluded from this, it will always be |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
704 |
* the last window, thus always on top. |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
705 |
* XXX - Yes, ugly, probably needs something like w->always_on_top flag |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
706 |
* to implement correctly, but even then you need some kind of distinction |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
707 |
* between on-top of chat/news and status windows, because these conflict */ |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
708 |
Window **wz = _last_z_window; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
709 |
if (wz != _z_windows && this->window_class != WC_SEND_NETWORK_MSG && this->window_class != WC_HIGHSCORE && this->window_class != WC_ENDSCREEN) { |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
710 |
if (FindWindowById(WC_MAIN_TOOLBAR, 0) != NULL) wz--; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
711 |
if (FindWindowById(WC_STATUS_BAR, 0) != NULL) wz--; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
712 |
if (FindWindowById(WC_NEWS_WINDOW, 0) != NULL) wz--; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
713 |
if (FindWindowById(WC_SEND_NETWORK_MSG, 0) != NULL) wz--; |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
714 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
715 |
assert(wz >= _z_windows); |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
716 |
if (wz != _last_z_window) memmove(wz + 1, wz, (byte*)_last_z_window - (byte*)wz); |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
717 |
} |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
718 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
719 |
*wz = this; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
720 |
_last_z_window++; |
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
721 |
} |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
722 |
|
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
723 |
/** |
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
724 |
* Resize window towards the default size. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
725 |
* Prior to construction, a position for the new window (for its default size) |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
726 |
* has been found with LocalGetWindowPlacement(). Initially, the window is |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
727 |
* constructed with minimal size. Resizing the window to its default size is |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
728 |
* done here. |
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
729 |
* @param def_width default width in pixels of the window |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
730 |
* @param def_height default height in pixels of the window |
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
731 |
* @see Window::Window(), Window::Initialize() |
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
732 |
*/ |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
733 |
void Window::FindWindowPlacementAndResize(int def_width, int def_height) |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
734 |
{ |
7353
5d8ba9486e96
(svn r10716) -Codechange: not all windows' minimum size is actually their minimum size, so take the size of the window after WE_CREATE has been called as bare minimum size.
rubidium
parents:
7344
diff
changeset
|
735 |
/* Try to make windows smaller when our window is too small. |
5d8ba9486e96
(svn r10716) -Codechange: not all windows' minimum size is actually their minimum size, so take the size of the window after WE_CREATE has been called as bare minimum size.
rubidium
parents:
7344
diff
changeset
|
736 |
* w->(width|height) is normally the same as min_(width|height), |
5d8ba9486e96
(svn r10716) -Codechange: not all windows' minimum size is actually their minimum size, so take the size of the window after WE_CREATE has been called as bare minimum size.
rubidium
parents:
7344
diff
changeset
|
737 |
* but this way the GUIs can be made a little more dynamic; |
5d8ba9486e96
(svn r10716) -Codechange: not all windows' minimum size is actually their minimum size, so take the size of the window after WE_CREATE has been called as bare minimum size.
rubidium
parents:
7344
diff
changeset
|
738 |
* one can use the same spec for multiple windows and those |
5d8ba9486e96
(svn r10716) -Codechange: not all windows' minimum size is actually their minimum size, so take the size of the window after WE_CREATE has been called as bare minimum size.
rubidium
parents:
7344
diff
changeset
|
739 |
* can then determine the real minimum size of the window. */ |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
740 |
if (this->width != def_width || this->height != def_height) { |
7344
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
741 |
/* Think about the overlapping toolbars when determining the minimum window size */ |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
742 |
int free_height = _screen.height; |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
743 |
const Window *wt = FindWindowById(WC_STATUS_BAR, 0); |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
744 |
if (wt != NULL) free_height -= wt->height; |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
745 |
wt = FindWindowById(WC_MAIN_TOOLBAR, 0); |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
746 |
if (wt != NULL) free_height -= wt->height; |
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
747 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
748 |
int enlarge_x = max(min(def_width - this->width, _screen.width - this->width), 0); |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
749 |
int enlarge_y = max(min(def_height - this->height, free_height - this->height), 0); |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
750 |
|
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
751 |
/* X and Y has to go by step.. calculate it. |
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
752 |
* The cast to int is necessary else x/y are implicitly casted to |
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
753 |
* unsigned int, which won't work. */ |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
754 |
if (this->resize.step_width > 1) enlarge_x -= enlarge_x % (int)this->resize.step_width; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
755 |
if (this->resize.step_height > 1) enlarge_y -= enlarge_y % (int)this->resize.step_height; |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
756 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
757 |
ResizeWindow(this, enlarge_x, enlarge_y); |
7342
c42f92fe1a60
(svn r10705) -Fix (r10704): some windows were not correctly initialized as they resized the window themselves and that should be interfered by making sure the window is resized in the right "step" size.
rubidium
parents:
7341
diff
changeset
|
758 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
759 |
Point size; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
760 |
Point diff; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
761 |
size.x = this->width; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
762 |
size.y = this->height; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
763 |
diff.x = enlarge_x; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
764 |
diff.y = enlarge_y; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
765 |
this->OnResize(size, diff); |
7344
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
766 |
} |
7342
c42f92fe1a60
(svn r10705) -Fix (r10704): some windows were not correctly initialized as they resized the window themselves and that should be interfered by making sure the window is resized in the right "step" size.
rubidium
parents:
7341
diff
changeset
|
767 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
768 |
int nx = this->left; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
769 |
int ny = this->top; |
7464
be4757750389
(svn r10967) -Fix: in case of moving the window on create (because it doesn't fit in the screen), make sure to move the viewport too if we are an extra viewport (spotted by Maedhros)
truelight
parents:
7454
diff
changeset
|
770 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
771 |
if (nx + this->width > _screen.width) nx -= (nx + this->width - _screen.width); |
7364
b9333195343a
(svn r10727) -Codechange: when a window would fall outside of the screen (on the right) when opening it, move it to the left so it stays inside the screen.
rubidium
parents:
7363
diff
changeset
|
772 |
|
7344
1d44a3182218
(svn r10707) -Codechange: account for the main toolbar and status bar when determining the maximum height for a window.
rubidium
parents:
7342
diff
changeset
|
773 |
const Window *wt = FindWindowById(WC_MAIN_TOOLBAR, 0); |
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
774 |
ny = max(ny, (wt == NULL || this == wt || this->top == 0) ? 0 : wt->height); |
7464
be4757750389
(svn r10967) -Fix: in case of moving the window on create (because it doesn't fit in the screen), make sure to move the viewport too if we are an extra viewport (spotted by Maedhros)
truelight
parents:
7454
diff
changeset
|
775 |
nx = max(nx, 0); |
be4757750389
(svn r10967) -Fix: in case of moving the window on create (because it doesn't fit in the screen), make sure to move the viewport too if we are an extra viewport (spotted by Maedhros)
truelight
parents:
7454
diff
changeset
|
776 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
777 |
if (this->viewport != NULL) { |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
778 |
this->viewport->left += nx - this->left; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
779 |
this->viewport->top += ny - this->top; |
7464
be4757750389
(svn r10967) -Fix: in case of moving the window on create (because it doesn't fit in the screen), make sure to move the viewport too if we are an extra viewport (spotted by Maedhros)
truelight
parents:
7454
diff
changeset
|
780 |
} |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
781 |
this->left = nx; |
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
782 |
this->top = ny; |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
783 |
|
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
784 |
this->SetDirty(); |
0 | 785 |
} |
786 |
||
9178
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
787 |
void Window::FindWindowPlacementAndResize(const WindowDesc *desc) |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
788 |
{ |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
789 |
this->FindWindowPlacementAndResize(desc->default_width, desc->default_height); |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
790 |
} |
3235f895bf12
(svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents:
9168
diff
changeset
|
791 |
|
4520
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
792 |
/** |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
793 |
* Open a new window. If there is no space for a new window, close an open |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
794 |
* window. Try to avoid stickied windows, but if there is no else, close one of |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
795 |
* those as well. Then make sure all created windows are below some always-on-top |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
796 |
* ones. Finally set all variables and call the WE_CREATE event |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
797 |
* @param x offset in pixels from the left of the screen |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
798 |
* @param y offset in pixels from the top of the screen |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
799 |
* @param width width in pixels of the window |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
800 |
* @param height height in pixels of the window |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
801 |
* @param cls see WindowClass class of the window, used for identification and grouping |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
802 |
* @param *widget see Widget pointer to the window layout and various elements |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
803 |
* @return Window pointer of the newly created window |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
804 |
*/ |
9301
3b20dfb6c4e8
(svn r13169) -Codechange: remove a (now) unneeded parameter of one of the Window constructors.
rubidium
parents:
9293
diff
changeset
|
805 |
Window::Window(int x, int y, int width, int height, WindowClass cls, const Widget *widget) |
4520
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
806 |
{ |
9317
f14eb8815829
(svn r13185) -Codechange: remove everything related to the WindowProc callbacks.
rubidium
parents:
9301
diff
changeset
|
807 |
this->Initialize(x, y, width, height, cls, widget, 0); |
4520
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
808 |
} |
0 | 809 |
|
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
810 |
/** |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
811 |
* Decide whether a given rectangle is a good place to open a completely visible new window. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
812 |
* The new window should be within screen borders, and not overlap with another already |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
813 |
* existing window (except for the main window in the background). |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
814 |
* @param left Left edge of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
815 |
* @param top Top edge of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
816 |
* @param width Width of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
817 |
* @param height Height of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
818 |
* @param pos If rectangle is good, use this parameter to return the top-left corner of the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
819 |
* @return Boolean indication that the rectangle is a good place for the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
820 |
*/ |
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
821 |
static bool IsGoodAutoPlace1(int left, int top, int width, int height, Point &pos) |
0 | 822 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
823 |
Window* const *wz; |
0 | 824 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
825 |
int right = width + left; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
826 |
int bottom = height + top; |
0 | 827 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
828 |
if (left < 0 || top < 22 || right > _screen.width || bottom > _screen.height) return false; |
0 | 829 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
830 |
/* Make sure it is not obscured by any window. */ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
831 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
832 |
const Window *w = *wz; |
2639 | 833 |
if (w->window_class == WC_MAIN_WINDOW) continue; |
0 | 834 |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
835 |
if (right > w->left && |
2639 | 836 |
w->left + w->width > left && |
0 | 837 |
bottom > w->top && |
2639 | 838 |
w->top + w->height > top) { |
839 |
return false; |
|
840 |
} |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
841 |
} |
0 | 842 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
843 |
pos.x = left; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
844 |
pos.y = top; |
0 | 845 |
return true; |
846 |
} |
|
847 |
||
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
848 |
/** |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
849 |
* Decide whether a given rectangle is a good place to open a mostly visible new window. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
850 |
* The new window should be mostly within screen borders, and not overlap with another already |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
851 |
* existing window (except for the main window in the background). |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
852 |
* @param left Left edge of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
853 |
* @param top Top edge of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
854 |
* @param width Width of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
855 |
* @param height Height of the rectangle |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
856 |
* @param pos If rectangle is good, use this parameter to return the top-left corner of the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
857 |
* @return Boolean indication that the rectangle is a good place for the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
858 |
*/ |
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
859 |
static bool IsGoodAutoPlace2(int left, int top, int width, int height, Point &pos) |
0 | 860 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
861 |
Window* const *wz; |
0 | 862 |
|
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
863 |
/* Left part of the rectangle may be at most 1/4 off-screen, |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
864 |
* right part of the rectangle may be at most 1/2 off-screen |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
865 |
*/ |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
866 |
if (left < -(width>>2) || left > _screen.width - (width>>1)) return false; |
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
867 |
/* Bottom part of the rectangle may be at most 1/4 off-screen */ |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
868 |
if (top < 22 || top > _screen.height - (height>>2)) return false; |
0 | 869 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
870 |
/* Make sure it is not obscured by any window. */ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
871 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
872 |
const Window *w = *wz; |
2639 | 873 |
if (w->window_class == WC_MAIN_WINDOW) continue; |
0 | 874 |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
875 |
if (left + width > w->left && |
2639 | 876 |
w->left + w->width > left && |
0 | 877 |
top + height > w->top && |
2639 | 878 |
w->top + w->height > top) { |
879 |
return false; |
|
880 |
} |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
881 |
} |
0 | 882 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
883 |
pos.x = left; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
884 |
pos.y = top; |
0 | 885 |
return true; |
886 |
} |
|
887 |
||
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
888 |
/** |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
889 |
* Find a good place for opening a new window of a given width and height. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
890 |
* @param width Width of the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
891 |
* @param height Height of the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
892 |
* @return Top-left coordinate of the new window |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
893 |
*/ |
1095 | 894 |
static Point GetAutoPlacePosition(int width, int height) |
895 |
{ |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
896 |
Window* const *wz; |
0 | 897 |
Point pt; |
898 |
||
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
899 |
/* First attempt, try top-left of the screen */ |
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
900 |
if (IsGoodAutoPlace1(0, 24, width, height, pt)) return pt; |
0 | 901 |
|
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
902 |
/* Second attempt, try around all existing windows with a distance of 2 pixels. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
903 |
* The new window must be entirely on-screen, and not overlap with an existing window. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
904 |
* Eight starting points are tried, two at each corner. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
905 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
906 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
907 |
const Window *w = *wz; |
2639 | 908 |
if (w->window_class == WC_MAIN_WINDOW) continue; |
0 | 909 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
910 |
if (IsGoodAutoPlace1(w->left + w->width + 2, w->top, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
911 |
if (IsGoodAutoPlace1(w->left - width - 2, w->top, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
912 |
if (IsGoodAutoPlace1(w->left, w->top + w->height + 2, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
913 |
if (IsGoodAutoPlace1(w->left, w->top - height - 2, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
914 |
if (IsGoodAutoPlace1(w->left + w->width + 2, w->top + w->height - height, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
915 |
if (IsGoodAutoPlace1(w->left - width - 2, w->top + w->height - height, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
916 |
if (IsGoodAutoPlace1(w->left + w->width - width, w->top + w->height + 2, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
917 |
if (IsGoodAutoPlace1(w->left + w->width - width, w->top - height - 2, width, height, pt)) return pt; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
918 |
} |
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
919 |
|
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
920 |
/* Third attempt, try around all existing windows with a distance of 2 pixels. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
921 |
* The new window may be partly off-screen, and must not overlap with an existing window. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
922 |
* Only four starting points are tried. |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
923 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
924 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
925 |
const Window *w = *wz; |
2639 | 926 |
if (w->window_class == WC_MAIN_WINDOW) continue; |
0 | 927 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
928 |
if (IsGoodAutoPlace2(w->left + w->width + 2, w->top, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
929 |
if (IsGoodAutoPlace2(w->left - width - 2, w->top, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
930 |
if (IsGoodAutoPlace2(w->left, w->top + w->height + 2, width, height, pt)) return pt; |
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
931 |
if (IsGoodAutoPlace2(w->left, w->top - height - 2, width, height, pt)) return pt; |
0 | 932 |
} |
933 |
||
9424
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
934 |
/* Fourth and final attempt, put window at diagonal starting from (0, 24), try multiples |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
935 |
* of (+5, +5) |
0e77ca5edffb
(svn r13338) -Doc: add documentation about the window placement. Patch by Alberth.
rubidium
parents:
9413
diff
changeset
|
936 |
*/ |
0 | 937 |
{ |
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
938 |
int left = 0, top = 24; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
939 |
|
6532
034c5077ab16
(svn r9720) -Codechange: Remove global var and gotos from window autoplacement
peter1138
parents:
6492
diff
changeset
|
940 |
restart: |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
941 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
942 |
const Window *w = *wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
943 |
|
0 | 944 |
if (w->left == left && w->top == top) { |
945 |
left += 5; |
|
946 |
top += 5; |
|
947 |
goto restart; |
|
948 |
} |
|
949 |
} |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
950 |
|
0 | 951 |
pt.x = left; |
952 |
pt.y = top; |
|
953 |
return pt; |
|
954 |
} |
|
955 |
} |
|
956 |
||
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
957 |
/** |
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
958 |
* Compute the position of the top-left corner of a new window that is opened. |
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
959 |
* |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
960 |
* By default position a child window at an offset of 10/10 of its parent. |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
961 |
* With the exception of WC_BUILD_TOOLBAR (build railway/roads/ship docks/airports) |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
962 |
* and WC_SCEN_LAND_GEN (landscaping). Whose child window has an offset of 0/36 of |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
963 |
* its parent. So it's exactly under the parent toolbar and no buttons will be covered. |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
964 |
* However if it falls too extremely outside window positions, reposition |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
965 |
* it to an automatic place. |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
966 |
* |
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
967 |
* @param *desc The pointer to the WindowDesc to be created |
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
968 |
* @param window_number the window number of the new window |
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
969 |
* |
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
970 |
* @return Coordinate of the top-left corner of the new window |
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
971 |
*/ |
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
972 |
static Point LocalGetWindowPlacement(const WindowDesc *desc, int window_number) |
0 | 973 |
{ |
974 |
Point pt; |
|
975 |
Window *w; |
|
976 |
||
5071
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
977 |
if (desc->parent_cls != 0 /* WC_MAIN_WINDOW */ && |
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
978 |
(w = FindWindowById(desc->parent_cls, window_number)) != NULL && |
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
979 |
w->left < _screen.width - 20 && w->left > -60 && w->top < _screen.height - 20) { |
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
980 |
|
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
981 |
pt.x = w->left + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? 0 : 10); |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
982 |
if (pt.x > _screen.width + 10 - desc->default_width) { |
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
983 |
pt.x = (_screen.width + 10 - desc->default_width) - 20; |
5071
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
984 |
} |
7721
8aaea36c01df
(svn r11256) -Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it.
belugas
parents:
7464
diff
changeset
|
985 |
pt.y = w->top + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? 36 : 10); |
0 | 986 |
} else { |
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
987 |
switch (desc->left) { |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
988 |
case WDP_ALIGN_TBR: // Align the right side with the top toolbar |
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
989 |
w = FindWindowById(WC_MAIN_TOOLBAR, 0); |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
990 |
pt.x = (w->left + w->width) - desc->default_width; |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
991 |
break; |
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
992 |
|
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
993 |
case WDP_ALIGN_TBL: // Align the left side with the top toolbar |
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
994 |
pt.x = FindWindowById(WC_MAIN_TOOLBAR, 0)->left; |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
995 |
break; |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
996 |
|
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
997 |
case WDP_AUTO: // Find a good automatic position for the window |
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
998 |
return GetAutoPlacePosition(desc->default_width, desc->default_height); |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
999 |
|
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
1000 |
case WDP_CENTER: // Centre the window horizontally |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
1001 |
pt.x = (_screen.width - desc->default_width) / 2; |
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1002 |
break; |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
1003 |
|
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1004 |
default: |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1005 |
pt.x = desc->left; |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1006 |
if (pt.x < 0) pt.x += _screen.width; // negative is from right of the screen |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1007 |
} |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1008 |
|
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1009 |
switch (desc->top) { |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
1010 |
case WDP_CENTER: // Centre the window vertically |
7341
02515d0d4ced
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents:
7301
diff
changeset
|
1011 |
pt.y = (_screen.height - desc->default_height) / 2; |
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1012 |
break; |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
1013 |
|
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1014 |
/* WDP_AUTO sets the position at once and is controlled by desc->left. |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1015 |
* Both left and top must be set to WDP_AUTO */ |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1016 |
case WDP_AUTO: |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1017 |
NOT_REACHED(); |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1018 |
assert(desc->left == WDP_AUTO && desc->top != WDP_AUTO); |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1019 |
/* fallthrough */ |
9079
1b3d1fb740d8
(svn r12938) -Codechange: coding style fixes. Patch by Alberth.
rubidium
parents:
9078
diff
changeset
|
1020 |
|
5072
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1021 |
default: |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1022 |
pt.y = desc->top; |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1023 |
if (pt.y < 0) pt.y += _screen.height; // negative is from bottom of the screen |
69195f96a23a
(svn r7130) -Codechange: Handle the positioning of windows through the desc->left/top settings with
Darkvater
parents:
5071
diff
changeset
|
1024 |
break; |
0 | 1025 |
} |
1026 |
} |
|
1027 |
||
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1028 |
return pt; |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1029 |
} |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1030 |
|
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1031 |
/** |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1032 |
* Set the positions of a new window from a WindowDesc and open it. |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1033 |
* |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1034 |
* @param *desc The pointer to the WindowDesc to be created |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1035 |
* @param window_number the window number of the new window |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1036 |
* |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1037 |
* @return Window pointer of the newly created window |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1038 |
*/ |
9203
082fbf0500c4
(svn r13069) -Codechange: it is no longer needed to pass a void *data pointer with the WE_CREATE message because nothing uses it anymore.
rubidium
parents:
9184
diff
changeset
|
1039 |
Window::Window(const WindowDesc *desc, WindowNumber window_number) |
9078
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1040 |
{ |
09266c44bd2f
(svn r12937) -Codechange: split allocating and finding the spot to place a window. Patch by Alberth.
rubidium
parents:
8995
diff
changeset
|
1041 |
Point pt = LocalGetWindowPlacement(desc, window_number); |
9317
f14eb8815829
(svn r13185) -Codechange: remove everything related to the WindowProc callbacks.
rubidium
parents:
9301
diff
changeset
|
1042 |
this->Initialize(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->cls, desc->widgets, window_number); |
9142
858a058aa730
(svn r13004) -Codechange: replace AllocateWindow and AllocateWindowDesc with a Window constructor.
rubidium
parents:
9138
diff
changeset
|
1043 |
this->desc_flags = desc->flags; |
4520
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
1044 |
} |
98f1b167d0ca
(svn r6345) -Codechange: AllocateWindowDescFront() now ensures that window_number is set before calling the WE_CREATE event
bjarni
parents:
4337
diff
changeset
|
1045 |
|
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
1046 |
/** Do a search for a window at specific coordinates. For this we start |
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
1047 |
* at the topmost window, obviously and work our way down to the bottom |
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
1048 |
* @param x position x to query |
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
1049 |
* @param y position y to query |
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
1050 |
* @return a pointer to the found window if any, NULL otherwise */ |
0 | 1051 |
Window *FindWindowFromPt(int x, int y) |
1052 |
{ |
|
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1053 |
for (Window * const *wz = _last_z_window; wz != _z_windows;) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1054 |
Window *w = *--wz; |
7954
57b51c69c072
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
7928
diff
changeset
|
1055 |
if (IsInsideBS(x, w->left, w->width) && IsInsideBS(y, w->top, w->height)) { |
2639 | 1056 |
return w; |
1057 |
} |
|
0 | 1058 |
} |
1059 |
||
1060 |
return NULL; |
|
1061 |
} |
|
1062 |
||
8923
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1063 |
/** |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1064 |
* (re)initialize the windowing system |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1065 |
*/ |
6247 | 1066 |
void InitWindowSystem() |
152
c3964b43943e
(svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents:
136
diff
changeset
|
1067 |
{ |
136
78ac8de2b2b8
(svn r137) Fix: console sometime didn't open (sign_de)
dominik
parents:
126
diff
changeset
|
1068 |
IConsoleClose(); |
1474
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1069 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1070 |
_last_z_window = _z_windows; |
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1071 |
_mouseover_last_w = NULL; |
1397
fa8539dcab46
(svn r1901) - Fix: unwanted behaviour of the savegame dialog, as well as a bug with a sloppy termination of a string. When any editbox is open, scrolling is disabled. If any new types of editboxes come up, please use SET/CLRBIT of _no_scroll with its unique identifier (ttd.h)
Darkvater
parents:
1299
diff
changeset
|
1072 |
_no_scroll = 0; |
9410
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1073 |
_scrolling_viewport = 0; |
0 | 1074 |
} |
1075 |
||
8923
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1076 |
/** |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1077 |
* Close down the windowing system |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1078 |
*/ |
6247 | 1079 |
void UnInitWindowSystem() |
1474
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1080 |
{ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1081 |
while (_last_z_window != _z_windows) delete _z_windows[0]; |
1474
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1082 |
} |
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1083 |
|
8923
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1084 |
/** |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1085 |
* Reset the windowing system, by means of shutting it down followed by re-initialization |
145035178dcb
(svn r12693) -Documentation: add some documentation to some window related stuff. Based on a patch by Albert.
rubidium
parents:
8922
diff
changeset
|
1086 |
*/ |
6247 | 1087 |
void ResetWindowSystem() |
1474
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1088 |
{ |
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1089 |
UnInitWindowSystem(); |
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1090 |
InitWindowSystem(); |
1744
c999671a5740
(svn r2248) - Fix (regression): fix crashing of game when joining a dedicated server (only reset _thd.pos, not the whole structure; as done in revision 2241 to fix another crash)
Darkvater
parents:
1737
diff
changeset
|
1091 |
_thd.pos.x = 0; |
c999671a5740
(svn r2248) - Fix (regression): fix crashing of game when joining a dedicated server (only reset _thd.pos, not the whole structure; as done in revision 2241 to fix another crash)
Darkvater
parents:
1737
diff
changeset
|
1092 |
_thd.pos.y = 0; |
2877
3058c128f10e
(svn r3425) - Fix: Followup to r3421. Correctly reset the TileHighLightData structure to prevent crashes in all the other cases where it is not guarded against sufficiently
Darkvater
parents:
2817
diff
changeset
|
1093 |
_thd.new_pos.x = 0; |
3058c128f10e
(svn r3425) - Fix: Followup to r3421. Correctly reset the TileHighLightData structure to prevent crashes in all the other cases where it is not guarded against sufficiently
Darkvater
parents:
2817
diff
changeset
|
1094 |
_thd.new_pos.y = 0; |
1474
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1095 |
} |
a26a21fa10ef
(svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents:
1397
diff
changeset
|
1096 |
|
6247 | 1097 |
static void DecreaseWindowCounters() |
0 | 1098 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1099 |
Window* const *wz; |
0 | 1100 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1101 |
for (wz = _last_z_window; wz != _z_windows;) { |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1102 |
Window *w = *--wz; |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1103 |
/* Unclick scrollbar buttons if they are pressed. */ |
0 | 1104 |
if (w->flags4 & (WF_SCROLL_DOWN | WF_SCROLL_UP)) { |
1105 |
w->flags4 &= ~(WF_SCROLL_DOWN | WF_SCROLL_UP); |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1106 |
w->SetDirty(); |
0 | 1107 |
} |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1108 |
w->OnMouseLoop(); |
0 | 1109 |
} |
1110 |
||
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1111 |
for (wz = _last_z_window; wz != _z_windows;) { |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1112 |
Window *w = *--wz; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1113 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1114 |
if (w->flags4 & WF_TIMEOUT_MASK && !(--w->flags4 & WF_TIMEOUT_MASK)) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1115 |
w->OnTimeout(); |
8032
f35fba9bacb0
(svn r11592) -Codechange: Use the Window member RaiseButtons and remove the now useless RaiseWindowButtons function
belugas
parents:
8031
diff
changeset
|
1116 |
if (w->desc_flags & WDF_UNCLICK_BUTTONS) w->RaiseButtons(); |
0 | 1117 |
} |
1118 |
} |
|
1119 |
} |
|
1120 |
||
6247 | 1121 |
Window *GetCallbackWnd() |
0 | 1122 |
{ |
1123 |
return FindWindowById(_thd.window_class, _thd.window_number); |
|
1124 |
} |
|
1125 |
||
6247 | 1126 |
static void HandlePlacePresize() |
0 | 1127 |
{ |
2639 | 1128 |
if (_special_mouse_mode != WSM_PRESIZE) return; |
0 | 1129 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1130 |
Window *w = GetCallbackWnd(); |
2639 | 1131 |
if (w == NULL) return; |
0 | 1132 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1133 |
Point pt = GetTileBelowCursor(); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1134 |
if (pt.x == -1) { |
0 | 1135 |
_thd.selend.x = -1; |
1136 |
return; |
|
1137 |
} |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1138 |
|
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1139 |
w->OnPlacePresize(pt, TileVirtXY(pt.x, pt.y)); |
0 | 1140 |
} |
1141 |
||
6247 | 1142 |
static bool HandleDragDrop() |
0 | 1143 |
{ |
2639 | 1144 |
if (_special_mouse_mode != WSM_DRAGDROP) return true; |
1145 |
if (_left_button_down) return false; |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1146 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1147 |
Window *w = GetCallbackWnd(); |
0 | 1148 |
|
2639 | 1149 |
if (w != NULL) { |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1150 |
/* send an event in client coordinates. */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1151 |
Point pt; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1152 |
pt.x = _cursor.pos.x - w->left; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1153 |
pt.y = _cursor.pos.y - w->top; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1154 |
w->OnDragDrop(pt, GetWidgetFromPos(w, pt.x, pt.y)); |
0 | 1155 |
} |
8585
61ac905ff5f7
(svn r12166) -Fix [FS#337]: when drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated (original patch by GrimRC)
smatz
parents:
8270
diff
changeset
|
1156 |
|
61ac905ff5f7
(svn r12166) -Fix [FS#337]: when drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated (original patch by GrimRC)
smatz
parents:
8270
diff
changeset
|
1157 |
ResetObjectToPlace(); |
61ac905ff5f7
(svn r12166) -Fix [FS#337]: when drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated (original patch by GrimRC)
smatz
parents:
8270
diff
changeset
|
1158 |
|
0 | 1159 |
return false; |
1160 |
} |
|
1161 |
||
6247 | 1162 |
static bool HandleMouseOver() |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1163 |
{ |
8924
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1164 |
Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1165 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1166 |
/* We changed window, put a MOUSEOVER event to the last window */ |
8924
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1167 |
if (_mouseover_last_w != NULL && _mouseover_last_w != w) { |
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1168 |
/* Reset mouse-over coordinates of previous window */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1169 |
Point pt = { -1, -1 }; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1170 |
_mouseover_last_w->OnMouseOver(pt, 0); |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1171 |
} |
8924
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1172 |
|
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1173 |
/* _mouseover_last_w will get reset when the window is deleted, see DeleteWindow() */ |
7063881d180a
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
rubidium
parents:
8923
diff
changeset
|
1174 |
_mouseover_last_w = w; |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1175 |
|
2639 | 1176 |
if (w != NULL) { |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1177 |
/* send an event in client coordinates. */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1178 |
Point pt = { _cursor.pos.x - w->left, _cursor.pos.y - w->top }; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1179 |
int widget = 0; |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1180 |
if (w->widget != NULL) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1181 |
widget = GetWidgetFromPos(w, pt.x, pt.y); |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1182 |
} |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1183 |
w->OnMouseOver(pt, widget); |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1184 |
} |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1185 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1186 |
/* Mouseover never stops execution */ |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1187 |
return true; |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1188 |
} |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1189 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1190 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1191 |
* Resize the window. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1192 |
* Update all the widgets of a window based on their resize flags |
5268
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1193 |
* Both the areas of the old window and the new sized window are set dirty |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1194 |
* ensuring proper redrawal. |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1195 |
* @param w Window to resize |
6481
85ad87daf4b0
(svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents:
6443
diff
changeset
|
1196 |
* @param x delta x-size of changed window (positive if larger, etc.) |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1197 |
* @param y delta y-size of changed window |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1198 |
*/ |
5268
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1199 |
void ResizeWindow(Window *w, int x, int y) |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1200 |
{ |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1201 |
bool resize_height = false; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1202 |
bool resize_width = false; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1203 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1204 |
if (x == 0 && y == 0) return; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1205 |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1206 |
w->SetDirty(); |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1207 |
for (Widget *wi = w->widget; wi->type != WWT_LAST; wi++) { |
5268
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1208 |
/* Isolate the resizing flags */ |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1209 |
byte rsizeflag = GB(wi->display_flags, 0, 4); |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1210 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1211 |
if (rsizeflag == RESIZE_NONE) continue; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1212 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1213 |
/* Resize the widget based on its resize-flag */ |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1214 |
if (rsizeflag & RESIZE_LEFT) { |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1215 |
wi->left += x; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1216 |
resize_width = true; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1217 |
} |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1218 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1219 |
if (rsizeflag & RESIZE_RIGHT) { |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1220 |
wi->right += x; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1221 |
resize_width = true; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1222 |
} |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1223 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1224 |
if (rsizeflag & RESIZE_TOP) { |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1225 |
wi->top += y; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1226 |
resize_height = true; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1227 |
} |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1228 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1229 |
if (rsizeflag & RESIZE_BOTTOM) { |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1230 |
wi->bottom += y; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1231 |
resize_height = true; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1232 |
} |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1233 |
} |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1234 |
|
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1235 |
/* We resized at least 1 widget, so let's resize the window totally */ |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1236 |
if (resize_width) w->width += x; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1237 |
if (resize_height) w->height += y; |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1238 |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1239 |
w->SetDirty(); |
5268
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1240 |
} |
2596 | 1241 |
|
1242 |
static bool _dragging_window; |
|
1243 |
||
6247 | 1244 |
static bool HandleWindowDragging() |
0 | 1245 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1246 |
Window* const *wz; |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1247 |
/* Get out immediately if no window is being dragged at all. */ |
2639 | 1248 |
if (!_dragging_window) return true; |
0 | 1249 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1250 |
/* Otherwise find the window... */ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1251 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1252 |
Window *w = *wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1253 |
|
350 | 1254 |
if (w->flags4 & WF_DRAGGING) { |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1255 |
const Widget *t = &w->widget[1]; // the title bar ... ugh |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1256 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1257 |
/* Stop the dragging if the left mouse button was released */ |
0 | 1258 |
if (!_left_button_down) { |
350 | 1259 |
w->flags4 &= ~WF_DRAGGING; |
0 | 1260 |
break; |
1261 |
} |
|
1262 |
||
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1263 |
w->SetDirty(); |
0 | 1264 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1265 |
int x = _cursor.pos.x + _drag_delta.x; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1266 |
int y = _cursor.pos.y + _drag_delta.y; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1267 |
int nx = x; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1268 |
int ny = y; |
350 | 1269 |
|
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1270 |
if (_settings_client.gui.window_snap_radius != 0) { |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
1271 |
Window* const *vz; |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1272 |
|
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1273 |
int hsnap = _settings_client.gui.window_snap_radius; |
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1274 |
int vsnap = _settings_client.gui.window_snap_radius; |
353 | 1275 |
int delta; |
350 | 1276 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1277 |
FOR_ALL_WINDOWS(vz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1278 |
const Window *v = *vz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1279 |
|
350 | 1280 |
if (v == w) continue; // Don't snap at yourself |
1281 |
||
1282 |
if (y + w->height > v->top && y < v->top + v->height) { |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1283 |
/* Your left border <-> other right border */ |
350 | 1284 |
delta = abs(v->left + v->width - x); |
1285 |
if (delta <= hsnap) { |
|
1286 |
nx = v->left + v->width; |
|
1287 |
hsnap = delta; |
|
1288 |
} |
|
1289 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1290 |
/* Your right border <-> other left border */ |
350 | 1291 |
delta = abs(v->left - x - w->width); |
1292 |
if (delta <= hsnap) { |
|
1293 |
nx = v->left - w->width; |
|
1294 |
hsnap = delta; |
|
1295 |
} |
|
1296 |
} |
|
1297 |
||
353 | 1298 |
if (w->top + w->height >= v->top && w->top <= v->top + v->height) { |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1299 |
/* Your left border <-> other left border */ |
353 | 1300 |
delta = abs(v->left - x); |
1301 |
if (delta <= hsnap) { |
|
1302 |
nx = v->left; |
|
1303 |
hsnap = delta; |
|
1304 |
} |
|
1305 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1306 |
/* Your right border <-> other right border */ |
353 | 1307 |
delta = abs(v->left + v->width - x - w->width); |
1308 |
if (delta <= hsnap) { |
|
1309 |
nx = v->left + v->width - w->width; |
|
1310 |
hsnap = delta; |
|
1311 |
} |
|
1312 |
} |
|
1313 |
||
350 | 1314 |
if (x + w->width > v->left && x < v->left + v->width) { |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1315 |
/* Your top border <-> other bottom border */ |
350 | 1316 |
delta = abs(v->top + v->height - y); |
1317 |
if (delta <= vsnap) { |
|
1318 |
ny = v->top + v->height; |
|
1319 |
vsnap = delta; |
|
1320 |
} |
|
1321 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1322 |
/* Your bottom border <-> other top border */ |
350 | 1323 |
delta = abs(v->top - y - w->height); |
1324 |
if (delta <= vsnap) { |
|
1325 |
ny = v->top - w->height; |
|
1326 |
vsnap = delta; |
|
1327 |
} |
|
1328 |
} |
|
353 | 1329 |
|
1330 |
if (w->left + w->width >= v->left && w->left <= v->left + v->width) { |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1331 |
/* Your top border <-> other top border */ |
353 | 1332 |
delta = abs(v->top - y); |
1333 |
if (delta <= vsnap) { |
|
1334 |
ny = v->top; |
|
1335 |
vsnap = delta; |
|
1336 |
} |
|
1337 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1338 |
/* Your bottom border <-> other bottom border */ |
353 | 1339 |
delta = abs(v->top + v->height - y - w->height); |
1340 |
if (delta <= vsnap) { |
|
1341 |
ny = v->top + v->height - w->height; |
|
1342 |
vsnap = delta; |
|
1343 |
} |
|
1344 |
} |
|
0 | 1345 |
} |
1346 |
} |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1347 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1348 |
/* Make sure the window doesn't leave the screen |
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1349 |
* 13 is the height of the title bar */ |
7922
a7e266f966d9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
7918
diff
changeset
|
1350 |
nx = Clamp(nx, 13 - t->right, _screen.width - 13 - t->left); |
a7e266f966d9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
7918
diff
changeset
|
1351 |
ny = Clamp(ny, 0, _screen.height - 13); |
350 | 1352 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1353 |
/* Make sure the title bar isn't hidden by behind the main tool bar */ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1354 |
Window *v = FindWindowById(WC_MAIN_TOOLBAR, 0); |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1355 |
if (v != NULL) { |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1356 |
int v_bottom = v->top + v->height; |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1357 |
int v_right = v->left + v->width; |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1358 |
if (ny + t->top >= v->top && ny + t->top < v_bottom) { |
371 | 1359 |
if ((v->left < 13 && nx + t->left < v->left) || |
1360 |
(v_right > _screen.width - 13 && nx + t->right > v_right)) { |
|
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1361 |
ny = v_bottom; |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1362 |
} else { |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1363 |
if (nx + t->left > v->left - 13 && |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1364 |
nx + t->right < v_right + 13) { |
2639 | 1365 |
if (w->top >= v_bottom) { |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1366 |
ny = v_bottom; |
2639 | 1367 |
} else if (w->left < nx) { |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1368 |
nx = v->left - 13 - t->left; |
2639 | 1369 |
} else { |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1370 |
nx = v_right + 13 - t->right; |
2639 | 1371 |
} |
370
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1372 |
} |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1373 |
} |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1374 |
} |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1375 |
} |
dc2452392ce4
(svn r558) -Fix: [ 1065247 ] Windows can be placed behind toolbar
tron
parents:
353
diff
changeset
|
1376 |
|
350 | 1377 |
if (w->viewport != NULL) { |
1378 |
w->viewport->left += nx - w->left; |
|
1379 |
w->viewport->top += ny - w->top; |
|
1380 |
} |
|
1381 |
w->left = nx; |
|
1382 |
w->top = ny; |
|
1383 |
||
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1384 |
w->SetDirty(); |
0 | 1385 |
return false; |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1386 |
} else if (w->flags4 & WF_SIZING) { |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1387 |
int x, y; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1388 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1389 |
/* Stop the sizing if the left mouse button was released */ |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1390 |
if (!_left_button_down) { |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1391 |
w->flags4 &= ~WF_SIZING; |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1392 |
w->SetDirty(); |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1393 |
break; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1394 |
} |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1395 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1396 |
x = _cursor.pos.x - _drag_delta.x; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1397 |
y = _cursor.pos.y - _drag_delta.y; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1398 |
|
2675
010fe459fc1d
(svn r3217) Fix issue with resizing stepped windows introduced in revision 3181.
peter1138
parents:
2643
diff
changeset
|
1399 |
/* X and Y has to go by step.. calculate it. |
010fe459fc1d
(svn r3217) Fix issue with resizing stepped windows introduced in revision 3181.
peter1138
parents:
2643
diff
changeset
|
1400 |
* The cast to int is necessary else x/y are implicitly casted to |
010fe459fc1d
(svn r3217) Fix issue with resizing stepped windows introduced in revision 3181.
peter1138
parents:
2643
diff
changeset
|
1401 |
* unsigned int, which won't work. */ |
010fe459fc1d
(svn r3217) Fix issue with resizing stepped windows introduced in revision 3181.
peter1138
parents:
2643
diff
changeset
|
1402 |
if (w->resize.step_width > 1) x -= x % (int)w->resize.step_width; |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1403 |
|
2675
010fe459fc1d
(svn r3217) Fix issue with resizing stepped windows introduced in revision 3181.
peter1138
parents:
2643
diff
changeset
|
1404 |
if (w->resize.step_height > 1) y -= y % (int)w->resize.step_height; |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1405 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1406 |
/* Check if we don't go below the minimum set size */ |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1407 |
if ((int)w->width + x < (int)w->resize.width) |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1408 |
x = w->resize.width - w->width; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1409 |
if ((int)w->height + y < (int)w->resize.height) |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1410 |
y = w->resize.height - w->height; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1411 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1412 |
/* Window already on size */ |
2639 | 1413 |
if (x == 0 && y == 0) return false; |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1414 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1415 |
/* Now find the new cursor pos.. this is NOT _cursor, because |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1416 |
we move in steps. */ |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1417 |
_drag_delta.x += x; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1418 |
_drag_delta.y += y; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1419 |
|
5268
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1420 |
/* ResizeWindow sets both pre- and after-size to dirty for redrawal */ |
e2625c661000
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
Darkvater
parents:
5236
diff
changeset
|
1421 |
ResizeWindow(w, x, y); |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1422 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1423 |
Point size; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1424 |
Point diff; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1425 |
size.x = x + w->width; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1426 |
size.y = y + w->height; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1427 |
diff.x = x; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1428 |
diff.y = y; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1429 |
w->OnResize(size, diff); |
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1430 |
return false; |
0 | 1431 |
} |
1432 |
} |
|
1433 |
||
1434 |
_dragging_window = false; |
|
1435 |
return false; |
|
1436 |
} |
|
1437 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1438 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1439 |
* Start window dragging |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1440 |
* @param w Window to start dragging |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1441 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1442 |
static void StartWindowDrag(Window *w) |
0 | 1443 |
{ |
1444 |
w->flags4 |= WF_DRAGGING; |
|
1445 |
_dragging_window = true; |
|
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1446 |
|
350 | 1447 |
_drag_delta.x = w->left - _cursor.pos.x; |
1448 |
_drag_delta.y = w->top - _cursor.pos.y; |
|
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1449 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1450 |
BringWindowToFront(w); |
0 | 1451 |
DeleteWindowById(WC_DROPDOWN_MENU, 0); |
1452 |
} |
|
1453 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1454 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1455 |
* Start resizing a window |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1456 |
* @param w Window to start resizing |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1457 |
*/ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1458 |
static void StartWindowSizing(Window *w) |
0 | 1459 |
{ |
1460 |
w->flags4 |= WF_SIZING; |
|
1461 |
_dragging_window = true; |
|
867
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1462 |
|
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1463 |
_drag_delta.x = _cursor.pos.x; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1464 |
_drag_delta.y = _cursor.pos.y; |
dffd33233237
(svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents:
857
diff
changeset
|
1465 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1466 |
BringWindowToFront(w); |
0 | 1467 |
DeleteWindowById(WC_DROPDOWN_MENU, 0); |
1468 |
} |
|
1469 |
||
1470 |
||
6247 | 1471 |
static bool HandleScrollbarScrolling() |
0 | 1472 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1473 |
Window* const *wz; |
0 | 1474 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1475 |
/* Get out quickly if no item is being scrolled */ |
2639 | 1476 |
if (!_scrolling_scrollbar) return true; |
0 | 1477 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1478 |
/* Find the scrolling window */ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1479 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1480 |
Window *w = *wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1481 |
|
0 | 1482 |
if (w->flags4 & WF_SCROLL_MIDDLE) { |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1483 |
/* Abort if no button is clicked any more. */ |
0 | 1484 |
if (!_left_button_down) { |
1485 |
w->flags4 &= ~WF_SCROLL_MIDDLE; |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1486 |
w->SetDirty(); |
0 | 1487 |
break; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1488 |
} |
0 | 1489 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1490 |
int i; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1491 |
Scrollbar *sb; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1492 |
|
0 | 1493 |
if (w->flags4 & WF_HSCROLL) { |
1494 |
sb = &w->hscroll; |
|
1495 |
i = _cursor.pos.x - _cursorpos_drag_start.x; |
|
842 | 1496 |
} else if (w->flags4 & WF_SCROLL2){ |
1497 |
sb = &w->vscroll2; |
|
1498 |
i = _cursor.pos.y - _cursorpos_drag_start.y; |
|
0 | 1499 |
} else { |
1500 |
sb = &w->vscroll; |
|
1501 |
i = _cursor.pos.y - _cursorpos_drag_start.y; |
|
1502 |
} |
|
1503 |
||
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1504 |
/* Find the item we want to move to and make sure it's inside bounds. */ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1505 |
int pos = min(max(0, i + _scrollbar_start_pos) * sb->count / _scrollbar_size, max(0, sb->count - sb->cap)); |
0 | 1506 |
if (pos != sb->pos) { |
1507 |
sb->pos = pos; |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1508 |
w->SetDirty(); |
0 | 1509 |
} |
1510 |
return false; |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1511 |
} |
0 | 1512 |
} |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1513 |
|
0 | 1514 |
_scrolling_scrollbar = false; |
1515 |
return false; |
|
1516 |
} |
|
1517 |
||
6247 | 1518 |
static bool HandleViewportScroll() |
0 | 1519 |
{ |
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1520 |
bool scrollwheel_scrolling = _settings_client.gui.scrollwheel_scrolling == 1 && (_cursor.v_wheel != 0 || _cursor.h_wheel != 0); |
6289
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1521 |
|
2639 | 1522 |
if (!_scrolling_viewport) return true; |
0 | 1523 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1524 |
Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); |
4335
02934874f33d
(svn r6036) -Codechange: do not handle SCROLL in a central function, but let windows handle them theirself. Added WE_SCROLL for this.
truelight
parents:
4300
diff
changeset
|
1525 |
|
7855
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1526 |
if (!(_right_button_down || scrollwheel_scrolling) || w == NULL) { |
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1527 |
_cursor.fix_at = false; |
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1528 |
_scrolling_viewport = false; |
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1529 |
return true; |
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1530 |
} |
e82c1fca64ee
(svn r11405) -Fix: in rare cases OpenTTD could segfault when resizing and scroll the main window (Rafal Rzepecki)
truelight
parents:
7759
diff
changeset
|
1531 |
|
9184 | 1532 |
if (w == FindWindowById(WC_MAIN_WINDOW, 0) && w->viewport->follow_vehicle != INVALID_VEHICLE) { |
7759
eb8f1b5b2883
(svn r11304) -Feature: Control-Clicking the Center Main View button on the vehicle window allows the main viewport to follow the chosen vehicle.(stevenh)
belugas
parents:
7721
diff
changeset
|
1533 |
/* If the main window is following a vehicle, then first let go of it! */ |
9184 | 1534 |
const Vehicle *veh = GetVehicle(w->viewport->follow_vehicle); |
7759
eb8f1b5b2883
(svn r11304) -Feature: Control-Clicking the Center Main View button on the vehicle window allows the main viewport to follow the chosen vehicle.(stevenh)
belugas
parents:
7721
diff
changeset
|
1535 |
ScrollMainWindowTo(veh->x_pos, veh->y_pos, true); /* This also resets follow_vehicle */ |
eb8f1b5b2883
(svn r11304) -Feature: Control-Clicking the Center Main View button on the vehicle window allows the main viewport to follow the chosen vehicle.(stevenh)
belugas
parents:
7721
diff
changeset
|
1536 |
return true; |
eb8f1b5b2883
(svn r11304) -Feature: Control-Clicking the Center Main View button on the vehicle window allows the main viewport to follow the chosen vehicle.(stevenh)
belugas
parents:
7721
diff
changeset
|
1537 |
} |
eb8f1b5b2883
(svn r11304) -Feature: Control-Clicking the Center Main View button on the vehicle window allows the main viewport to follow the chosen vehicle.(stevenh)
belugas
parents:
7721
diff
changeset
|
1538 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1539 |
Point delta; |
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1540 |
if (_settings_client.gui.reverse_scroll) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1541 |
delta.x = -_cursor.delta.x; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1542 |
delta.y = -_cursor.delta.y; |
2680
7fd99282368c
(svn r3222) -Feature: Right-Click-Scrolling optionally moves in the opposite direction (Requested by manx)
tron
parents:
2675
diff
changeset
|
1543 |
} else { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1544 |
delta.x = _cursor.delta.x; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1545 |
delta.y = _cursor.delta.y; |
2680
7fd99282368c
(svn r3222) -Feature: Right-Click-Scrolling optionally moves in the opposite direction (Requested by manx)
tron
parents:
2675
diff
changeset
|
1546 |
} |
7fd99282368c
(svn r3222) -Feature: Right-Click-Scrolling optionally moves in the opposite direction (Requested by manx)
tron
parents:
2675
diff
changeset
|
1547 |
|
6289
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1548 |
if (scrollwheel_scrolling) { |
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1549 |
/* We are using scrollwheels for scrolling */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1550 |
delta.x = _cursor.h_wheel; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1551 |
delta.y = _cursor.v_wheel; |
6289
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1552 |
_cursor.v_wheel = 0; |
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1553 |
_cursor.h_wheel = 0; |
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1554 |
} |
9f468eccc674
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
bjarni
parents:
6248
diff
changeset
|
1555 |
|
4335
02934874f33d
(svn r6036) -Codechange: do not handle SCROLL in a central function, but let windows handle them theirself. Added WE_SCROLL for this.
truelight
parents:
4300
diff
changeset
|
1556 |
/* Create a scroll-event and send it to the window */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1557 |
w->OnScroll(delta); |
0 | 1558 |
|
2989 | 1559 |
_cursor.delta.x = 0; |
1560 |
_cursor.delta.y = 0; |
|
1561 |
return false; |
|
0 | 1562 |
} |
1563 |
||
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1564 |
/** Check if a window can be made top-most window, and if so do |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1565 |
* it. If a window does not obscure any other windows, it will not |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1566 |
* be brought to the foreground. Also if the only obscuring windows |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1567 |
* are so-called system-windows, the window will not be moved. |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1568 |
* The function will return false when a child window of this window is a |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1569 |
* modal-popup; function returns a false and child window gets a white border |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1570 |
* @param w Window to bring on-top |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1571 |
* @return false if the window has an active modal child, true otherwise */ |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1572 |
static bool MaybeBringWindowToFront(const Window *w) |
0 | 1573 |
{ |
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1574 |
bool bring_to_front = false; |
0 | 1575 |
|
2639 | 1576 |
if (w->window_class == WC_MAIN_WINDOW || |
1577 |
IsVitalWindow(w) || |
|
1578 |
w->window_class == WC_TOOLTIPS || |
|
1579 |
w->window_class == WC_DROPDOWN_MENU) { |
|
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1580 |
return true; |
2639 | 1581 |
} |
0 | 1582 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1583 |
Window * const *wz = FindWindowZPosition(w); |
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1584 |
for (Window * const *uz = wz; ++uz != _last_z_window;) { |
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1585 |
Window *u = *uz; |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1586 |
|
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1587 |
/* A modal child will prevent the activation of the parent window */ |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1588 |
if (u->parent == w && (u->desc_flags & WDF_MODAL)) { |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1589 |
u->flags4 |= WF_WHITE_BORDER_MASK; |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1590 |
u->SetDirty(); |
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1591 |
return false; |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1592 |
} |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1593 |
|
2639 | 1594 |
if (u->window_class == WC_MAIN_WINDOW || |
1595 |
IsVitalWindow(u) || |
|
1596 |
u->window_class == WC_TOOLTIPS || |
|
1597 |
u->window_class == WC_DROPDOWN_MENU) { |
|
1598 |
continue; |
|
1599 |
} |
|
0 | 1600 |
|
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1601 |
/* Window sizes don't interfere, leave z-order alone */ |
0 | 1602 |
if (w->left + w->width <= u->left || |
1603 |
u->left + u->width <= w->left || |
|
1604 |
w->top + w->height <= u->top || |
|
2639 | 1605 |
u->top + u->height <= w->top) { |
1606 |
continue; |
|
1607 |
} |
|
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1608 |
|
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1609 |
bring_to_front = true; |
0 | 1610 |
} |
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1611 |
|
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1612 |
if (bring_to_front) BringWindowToFront(w); |
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1613 |
return true; |
0 | 1614 |
} |
1615 |
||
5086
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1616 |
/** Handle keyboard input. |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1617 |
* @param raw_key Lower 8 bits contain the ASCII character, the higher 16 bits the keycode |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1618 |
*/ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1619 |
void HandleKeypress(uint32 raw_key) |
0 | 1620 |
{ |
8019
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1621 |
/* Stores if a window with a textfield for typing is open |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1622 |
* If this is the case, keypress events are only passed to windows with text fields and |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1623 |
* to thein this main toolbar. */ |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1624 |
bool query_open = false; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1625 |
|
5086
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1626 |
/* |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1627 |
* During the generation of the world, there might be |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1628 |
* another thread that is currently building for example |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1629 |
* a road. To not interfere with those tasks, we should |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1630 |
* NOT change the _current_player here. |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1631 |
* |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1632 |
* This is not necessary either, as the only events that |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1633 |
* can be handled are the 'close application' events |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1634 |
*/ |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1635 |
if (!IsGeneratingWorld()) _current_player = _local_player; |
386ba9fe0621
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
Darkvater
parents:
5077
diff
changeset
|
1636 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1637 |
/* Setup event */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1638 |
uint16 key = GB(raw_key, 0, 16); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1639 |
uint16 keycode = GB(raw_key, 16, 16); |
0 | 1640 |
|
8177
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1641 |
/* |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1642 |
* The Unicode standard defines an area called the private use area. Code points in this |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1643 |
* area are reserved for private use and thus not portable between systems. For instance, |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1644 |
* Apple defines code points for the arrow keys in this area, but these are only printable |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1645 |
* on a system running OS X. We don't want these keys to show up in text fields and such, |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1646 |
* and thus we have to clear the unicode character when we encounter such a key. |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1647 |
*/ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1648 |
if (key >= 0xE000 && key <= 0xF8FF) key = 0; |
8177
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1649 |
|
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1650 |
/* |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1651 |
* If both key and keycode is zero, we don't bother to process the event. |
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1652 |
*/ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1653 |
if (key == 0 && keycode == 0) return; |
8177
d3b340b0bdfe
(svn r11740) -Fix [FS#1610]: Modify and possibly discard key events for code points in the unicode private use area.
egladil
parents:
8144
diff
changeset
|
1654 |
|
8019
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1655 |
/* check if we have a query string window open before allowing hotkeys */ |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1656 |
if (FindWindowById(WC_QUERY_STRING, 0) != NULL || |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1657 |
FindWindowById(WC_SEND_NETWORK_MSG, 0) != NULL || |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1658 |
FindWindowById(WC_GENERATE_LANDSCAPE, 0) != NULL || |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1659 |
FindWindowById(WC_CONSOLE, 0) != NULL || |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1660 |
FindWindowById(WC_SAVELOAD, 0) != NULL || |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1661 |
FindWindowById(WC_COMPANY_PASSWORD_WINDOW, 0) != NULL) { |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1662 |
query_open = true; |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1663 |
} |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1664 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1665 |
/* Call the event, start with the uppermost window. */ |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1666 |
for (Window* const *wz = _last_z_window; wz != _z_windows;) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1667 |
Window *w = *--wz; |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1668 |
|
8019
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1669 |
/* if a query window is open, only call the event for certain window types */ |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1670 |
if (query_open && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1671 |
w->window_class != WC_QUERY_STRING && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1672 |
w->window_class != WC_SEND_NETWORK_MSG && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1673 |
w->window_class != WC_GENERATE_LANDSCAPE && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1674 |
w->window_class != WC_CONSOLE && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1675 |
w->window_class != WC_SAVELOAD && |
fc0e94dee165
(svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents:
8018
diff
changeset
|
1676 |
w->window_class != WC_COMPANY_PASSWORD_WINDOW) { |
651
48b94e823465
(svn r1084) Generalized hotkey catching when textfield windows are open. Now only hotkeys attached to the main toolbar are working if you have a textfield open.
dominik
parents:
649
diff
changeset
|
1677 |
continue; |
2639 | 1678 |
} |
9285
235e5e2d7f55
(svn r13151) -Codechange: use an enum instead of bool as return type of OnKeyPress/OnCTRLStateChange to make it obvious what the return values mean.
rubidium
parents:
9275
diff
changeset
|
1679 |
if (w->OnKeyPress(key, keycode) == Window::ES_HANDLED) return; |
0 | 1680 |
} |
1637
ee2049729147
(svn r2141) - Fix: Keys now hopefully only activate the right windows. If console/querybox/chatbox is open, all input goes there, if closed to game itself.
Darkvater
parents:
1570
diff
changeset
|
1681 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1682 |
Window *w = FindWindowById(WC_MAIN_TOOLBAR, 0); |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1683 |
/* When there is no toolbar w is null, check for that */ |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1684 |
if (w != NULL) w->OnKeyPress(key, keycode); |
0 | 1685 |
} |
1686 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1687 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1688 |
* State of CONTROL key has changed |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1689 |
*/ |
8586
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1690 |
void HandleCtrlChanged() |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1691 |
{ |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1692 |
/* Call the event, start with the uppermost window. */ |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1693 |
for (Window* const *wz = _last_z_window; wz != _z_windows;) { |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1694 |
Window *w = *--wz; |
9285
235e5e2d7f55
(svn r13151) -Codechange: use an enum instead of bool as return type of OnKeyPress/OnCTRLStateChange to make it obvious what the return values mean.
rubidium
parents:
9275
diff
changeset
|
1695 |
if (w->OnCTRLStateChange() == Window::ES_HANDLED) return; |
8586
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1696 |
} |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1697 |
} |
cb0e7e00f1d2
(svn r12167) -Feature(tte): change colour of autorail and autoroad selection when Ctrl is pressed
smatz
parents:
8585
diff
changeset
|
1698 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1699 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1700 |
* Local counter that is incremented each time an mouse input event is detected. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1701 |
* The counter is used to stop auto-scrolling. |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1702 |
* @see HandleAutoscroll() |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1703 |
* @see HandleMouseEvents() |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1704 |
*/ |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1705 |
static int _input_events_this_tick = 0; |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1706 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1707 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1708 |
* If needed and switched on, perform auto scrolling (automatically |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1709 |
* moving window contents when mouse is near edge of the window). |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1710 |
*/ |
6247 | 1711 |
static void HandleAutoscroll() |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1712 |
{ |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1713 |
if (_input_events_this_tick != 0) { |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1714 |
/* HandleAutoscroll is called only once per GameLoop() - so we can clear the counter here */ |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1715 |
_input_events_this_tick = 0; |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1716 |
/* there were some inputs this tick, don't scroll ??? */ |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1717 |
return; |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1718 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1719 |
|
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1720 |
if (_settings_client.gui.autoscroll && _game_mode != GM_MENU && !IsGeneratingWorld()) { |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1721 |
int x = _cursor.pos.x; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1722 |
int y = _cursor.pos.y; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1723 |
Window *w = FindWindowFromPt(x, y); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1724 |
if (w == NULL || w->flags4 & WF_DISABLE_VP_SCROLL) return; |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1725 |
ViewPort *vp = IsPtInWindowViewport(w, x, y); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1726 |
if (vp != NULL) { |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1727 |
x -= vp->left; |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1728 |
y -= vp->top; |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1729 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1730 |
/* here allows scrolling in both x and y axis */ |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1731 |
#define scrollspeed 3 |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1732 |
if (x - 15 < 0) { |
9184 | 1733 |
w->viewport->dest_scrollpos_x += ScaleByZoom((x - 15) * scrollspeed, vp->zoom); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1734 |
} else if (15 - (vp->width - x) > 0) { |
9184 | 1735 |
w->viewport->dest_scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * scrollspeed, vp->zoom); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1736 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1737 |
if (y - 15 < 0) { |
9184 | 1738 |
w->viewport->dest_scrollpos_y += ScaleByZoom((y - 15) * scrollspeed, vp->zoom); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1739 |
} else if (15 - (vp->height - y) > 0) { |
9184 | 1740 |
w->viewport->dest_scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * scrollspeed, vp->zoom); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1741 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1742 |
#undef scrollspeed |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1743 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1744 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1745 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1746 |
|
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1747 |
enum MouseClick { |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1748 |
MC_NONE = 0, |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1749 |
MC_LEFT, |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1750 |
MC_RIGHT, |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1751 |
MC_DOUBLE_LEFT, |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1752 |
|
7018
71e174292e42
(svn r10276) -Codechange: made a counter based on milliseconds and independent of the game-state to base double-click and TGP Generation Process on
truelight
parents:
7009
diff
changeset
|
1753 |
MAX_OFFSET_DOUBLE_CLICK = 5, ///< How much the mouse is allowed to move to call it a double click |
71e174292e42
(svn r10276) -Codechange: made a counter based on milliseconds and independent of the game-state to base double-click and TGP Generation Process on
truelight
parents:
7009
diff
changeset
|
1754 |
TIME_BETWEEN_DOUBLE_CLICK = 500, ///< Time between 2 left clicks before it becoming a double click, in ms |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1755 |
}; |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1756 |
|
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1757 |
extern void UpdateTileSelection(); |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1758 |
extern bool VpHandlePlaceSizingDrag(); |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
1759 |
|
9410
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1760 |
static void ScrollMainViewport(int x, int y) |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1761 |
{ |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1762 |
if (_game_mode != GM_MENU) { |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1763 |
Window *w = FindWindowById(WC_MAIN_WINDOW, 0); |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1764 |
assert(w); |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1765 |
|
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1766 |
w->viewport->dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom); |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1767 |
w->viewport->dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom); |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1768 |
} |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1769 |
} |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1770 |
|
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1771 |
/** |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1772 |
* Describes all the different arrow key combinations the game allows |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1773 |
* when it is in scrolling mode. |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1774 |
* The real arrow keys are bitwise numbered as |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1775 |
* 1 = left |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1776 |
* 2 = up |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1777 |
* 4 = right |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1778 |
* 8 = down |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1779 |
*/ |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1780 |
static const int8 scrollamt[16][2] = { |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1781 |
{ 0, 0}, ///< no key specified |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1782 |
{-2, 0}, ///< 1 : left |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1783 |
{ 0, -2}, ///< 2 : up |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1784 |
{-2, -1}, ///< 3 : left + up |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1785 |
{ 2, 0}, ///< 4 : right |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1786 |
{ 0, 0}, ///< 5 : left + right = nothing |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1787 |
{ 2, -1}, ///< 6 : right + up |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1788 |
{ 0, -2}, ///< 7 : right + left + up = up |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1789 |
{ 0 ,2}, ///< 8 : down |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1790 |
{-2 ,1}, ///< 9 : down + left |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1791 |
{ 0, 0}, ///< 10 : down + up = nothing |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1792 |
{-2, 0}, ///< 11 : left + up + down = left |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1793 |
{ 2, 1}, ///< 12 : down + right |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1794 |
{ 0, 2}, ///< 13 : left + right + down = down |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1795 |
{ 2, 0}, ///< 14 : right + up + down = right |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1796 |
{ 0, 0}, ///< 15 : left + up + right + down = nothing |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1797 |
}; |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1798 |
|
9431
ce662bc7151b
(svn r13346) -Fix (r13322): scrolling the main viewport with keyboard when having a build tool selected failed.
rubidium
parents:
9424
diff
changeset
|
1799 |
static void HandleKeyScrolling() |
9410
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1800 |
{ |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1801 |
if (_dirkeys && !_no_scroll) { |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1802 |
int factor = _shift_pressed ? 50 : 10; |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1803 |
ScrollMainViewport(scrollamt[_dirkeys][0] * factor, scrollamt[_dirkeys][1] * factor); |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1804 |
} |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1805 |
} |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
1806 |
|
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1807 |
void MouseLoop(MouseClick click, int mousewheel) |
0 | 1808 |
{ |
1809 |
DecreaseWindowCounters(); |
|
1810 |
HandlePlacePresize(); |
|
1811 |
UpdateTileSelection(); |
|
9431
ce662bc7151b
(svn r13346) -Fix (r13322): scrolling the main viewport with keyboard when having a build tool selected failed.
rubidium
parents:
9424
diff
changeset
|
1812 |
|
2639 | 1813 |
if (!VpHandlePlaceSizingDrag()) return; |
1814 |
if (!HandleDragDrop()) return; |
|
1815 |
if (!HandleWindowDragging()) return; |
|
1816 |
if (!HandleScrollbarScrolling()) return; |
|
1817 |
if (!HandleViewportScroll()) return; |
|
1818 |
if (!HandleMouseOver()) return; |
|
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
410
diff
changeset
|
1819 |
|
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1820 |
bool scrollwheel_scrolling = _settings_client.gui.scrollwheel_scrolling == 1 && (_cursor.v_wheel != 0 || _cursor.h_wheel != 0); |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1821 |
if (click == MC_NONE && mousewheel == 0 && !scrollwheel_scrolling) return; |
0 | 1822 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1823 |
int x = _cursor.pos.x; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1824 |
int y = _cursor.pos.y; |
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1825 |
Window *w = FindWindowFromPt(x, y); |
2639 | 1826 |
if (w == NULL) return; |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1827 |
|
5416
b9a3326da943
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
Darkvater
parents:
5415
diff
changeset
|
1828 |
if (!MaybeBringWindowToFront(w)) return; |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1829 |
ViewPort *vp = IsPtInWindowViewport(w, x, y); |
0 | 1830 |
|
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1831 |
/* Don't allow any action in a viewport if either in menu of in generating world */ |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1832 |
if (vp != NULL && (_game_mode == GM_MENU || IsGeneratingWorld())) return; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1833 |
|
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1834 |
if (mousewheel != 0) { |
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
1835 |
if (_settings_client.gui.scrollwheel_scrolling == 0) { |
9264
9380b4a14c92
(svn r13130) -Codechange: remove some of the (old) WindowEvent wrapper functions/enums/variables as they are not used anymore.
rubidium
parents:
9233
diff
changeset
|
1836 |
/* Send mousewheel event to window */ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1837 |
w->OnMouseWheel(mousewheel); |
6296
a6bed59002c6
(svn r9126) -Feature: "Function of scrollwheel" can now be set to off as well
bjarni
parents:
6290
diff
changeset
|
1838 |
} |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1839 |
|
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1840 |
/* Dispatch a MouseWheelEvent for widgets if it is not a viewport */ |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1841 |
if (vp == NULL) DispatchMouseWheelEvent(w, GetWidgetFromPos(w, x - w->left, y - w->top), mousewheel); |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1842 |
} |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1843 |
|
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1844 |
if (vp != NULL) { |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1845 |
if (scrollwheel_scrolling) click = MC_RIGHT; // we are using the scrollwheel in a viewport, so we emulate right mouse button |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1846 |
switch (click) { |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1847 |
case MC_DOUBLE_LEFT: |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1848 |
case MC_LEFT: |
5380
8ea58542b6e0
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5272
diff
changeset
|
1849 |
DEBUG(misc, 2, "Cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite); |
7918
970e7c5005e5
(svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents:
7855
diff
changeset
|
1850 |
if (_thd.place_mode != VHM_NONE && |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1851 |
/* query button and place sign button work in pause mode */ |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1852 |
_cursor.sprite != SPR_CURSOR_QUERY && |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1853 |
_cursor.sprite != SPR_CURSOR_SIGN && |
6231
ff7454d35935
(svn r9034) -Codechange: renamed _pause to _pause_game, as some targets already have
truelight
parents:
6117
diff
changeset
|
1854 |
_pause_game != 0 && |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1855 |
!_cheats.build_in_pause.value) { |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1856 |
return; |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1857 |
} |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1858 |
|
7918
970e7c5005e5
(svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents:
7855
diff
changeset
|
1859 |
if (_thd.place_mode == VHM_NONE) { |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1860 |
HandleViewportClicked(vp, x, y); |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1861 |
} else { |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1862 |
PlaceObject(); |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1863 |
} |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1864 |
break; |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1865 |
|
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1866 |
case MC_RIGHT: |
4337
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1867 |
if (!(w->flags4 & WF_DISABLE_VP_SCROLL)) { |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1868 |
_scrolling_viewport = true; |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1869 |
_cursor.fix_at = true; |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1870 |
} |
e705eef174bf
(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that
truelight
parents:
4335
diff
changeset
|
1871 |
break; |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1872 |
|
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1873 |
default: |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1874 |
break; |
0 | 1875 |
} |
1876 |
} else { |
|
2631
2ed0eb408229
(svn r3173) Use the trinary operator and switch to improve readability
tron
parents:
2630
diff
changeset
|
1877 |
switch (click) { |
9138
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1878 |
case MC_DOUBLE_LEFT: |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1879 |
DispatchLeftClickEvent(w, x - w->left, y - w->top, true); |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1880 |
if (_mouseover_last_w == NULL) break; // The window got removed. |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1881 |
/* fallthough, and also give a single-click for backwards compatibility */ |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1882 |
case MC_LEFT: |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1883 |
DispatchLeftClickEvent(w, x - w->left, y - w->top, false); |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1884 |
break; |
b9fe83746a62
(svn r12999) -Fix [FS#1995]: when a Window got deleted on a double click event, we should not send a click event to the now non-existant Window as that causes segfaults.
rubidium
parents:
9127
diff
changeset
|
1885 |
|
6290
a3ca06710eeb
(svn r9112) -Feature r9111: scrollwheel scrolling can now also scroll the smallmap
bjarni
parents:
6289
diff
changeset
|
1886 |
default: |
a3ca06710eeb
(svn r9112) -Feature r9111: scrollwheel scrolling can now also scroll the smallmap
bjarni
parents:
6289
diff
changeset
|
1887 |
if (!scrollwheel_scrolling || w == NULL || w->window_class != WC_SMALLMAP) break; |
a3ca06710eeb
(svn r9112) -Feature r9111: scrollwheel scrolling can now also scroll the smallmap
bjarni
parents:
6289
diff
changeset
|
1888 |
/* We try to use the scrollwheel to scroll since we didn't touch any of the buttons. |
a3ca06710eeb
(svn r9112) -Feature r9111: scrollwheel scrolling can now also scroll the smallmap
bjarni
parents:
6289
diff
changeset
|
1889 |
* Simulate a right button click so we can get started. */ |
a3ca06710eeb
(svn r9112) -Feature r9111: scrollwheel scrolling can now also scroll the smallmap
bjarni
parents:
6289
diff
changeset
|
1890 |
/* fallthough */ |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1891 |
case MC_RIGHT: DispatchRightClickEvent(w, x - w->left, y - w->top); break; |
2631
2ed0eb408229
(svn r3173) Use the trinary operator and switch to improve readability
tron
parents:
2630
diff
changeset
|
1892 |
} |
0 | 1893 |
} |
1894 |
} |
|
1895 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1896 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1897 |
* Handle a mouse event from the video driver |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1898 |
*/ |
6247 | 1899 |
void HandleMouseEvents() |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1900 |
{ |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1901 |
static int double_click_time = 0; |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1902 |
static int double_click_x = 0; |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1903 |
static int double_click_y = 0; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1904 |
|
4300
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1905 |
/* |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1906 |
* During the generation of the world, there might be |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1907 |
* another thread that is currently building for example |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1908 |
* a road. To not interfere with those tasks, we should |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1909 |
* NOT change the _current_player here. |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1910 |
* |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1911 |
* This is not necessary either, as the only events that |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1912 |
* can be handled are the 'close application' events |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1913 |
*/ |
c7e43c47a2b9
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents:
4171
diff
changeset
|
1914 |
if (!IsGeneratingWorld()) _current_player = _local_player; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1915 |
|
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1916 |
/* Mouse event? */ |
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1917 |
MouseClick click = MC_NONE; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1918 |
if (_left_button_down && !_left_button_clicked) { |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1919 |
click = MC_LEFT; |
7018
71e174292e42
(svn r10276) -Codechange: made a counter based on milliseconds and independent of the game-state to base double-click and TGP Generation Process on
truelight
parents:
7009
diff
changeset
|
1920 |
if (double_click_time != 0 && _realtime_tick - double_click_time < TIME_BETWEEN_DOUBLE_CLICK && |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1921 |
double_click_x != 0 && abs(_cursor.pos.x - double_click_x) < MAX_OFFSET_DOUBLE_CLICK && |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1922 |
double_click_y != 0 && abs(_cursor.pos.y - double_click_y) < MAX_OFFSET_DOUBLE_CLICK) { |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1923 |
click = MC_DOUBLE_LEFT; |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1924 |
} |
7018
71e174292e42
(svn r10276) -Codechange: made a counter based on milliseconds and independent of the game-state to base double-click and TGP Generation Process on
truelight
parents:
7009
diff
changeset
|
1925 |
double_click_time = _realtime_tick; |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1926 |
double_click_x = _cursor.pos.x; |
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1927 |
double_click_y = _cursor.pos.y; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1928 |
_left_button_clicked = true; |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1929 |
_input_events_this_tick++; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1930 |
} else if (_right_button_clicked) { |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1931 |
_right_button_clicked = false; |
7009
9992ccf17e58
(svn r10265) -Feature: allow double-clicking on certain places: build-vehicle and town-action
truelight
parents:
6937
diff
changeset
|
1932 |
click = MC_RIGHT; |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1933 |
_input_events_this_tick++; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1934 |
} |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1935 |
|
9124
e50e61b8bb42
(svn r12984) -Codechange: some coding style in window.cpp.
rubidium
parents:
9117
diff
changeset
|
1936 |
int mousewheel = 0; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1937 |
if (_cursor.wheel) { |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1938 |
mousewheel = _cursor.wheel; |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1939 |
_cursor.wheel = 0; |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1940 |
_input_events_this_tick++; |
1570
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1941 |
} |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1942 |
|
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1943 |
MouseLoop(click, mousewheel); |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1944 |
} |
c9b6cf44ce53
(svn r2074) MouseLoop -> InputLoop(), factor out a real mouse-specific MouseLoop from the new InitLoop() (more in the spirit of HandleKeypress()).
pasky
parents:
1474
diff
changeset
|
1945 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1946 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1947 |
* Regular call from the global game loop |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1948 |
*/ |
6247 | 1949 |
void InputLoop() |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1950 |
{ |
9508
e5ab9738298a
(svn r13495) -Fix: scrolling the main map with the keys speed was influenced by movement of the mouse.
rubidium
parents:
9431
diff
changeset
|
1951 |
HandleKeyScrolling(); |
5090
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1952 |
HandleMouseEvents(); |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1953 |
HandleAutoscroll(); |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1954 |
} |
67446a4104f7
(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle
Darkvater
parents:
5089
diff
changeset
|
1955 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1956 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1957 |
* Update the continuously changing contents of the windows, such as the viewports |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1958 |
*/ |
6247 | 1959 |
void UpdateWindows() |
0 | 1960 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1961 |
Window* const *wz; |
5089
67c761427921
(svn r7156) -Codechange: Remove obsolete variable, localize global variable, use GB and change logic
Darkvater
parents:
5086
diff
changeset
|
1962 |
static int we4_timer = 0; |
67c761427921
(svn r7156) -Codechange: Remove obsolete variable, localize global variable, use GB and change logic
Darkvater
parents:
5086
diff
changeset
|
1963 |
int t = we4_timer + 1; |
0 | 1964 |
|
2639 | 1965 |
if (t >= 100) { |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1966 |
for (wz = _last_z_window; wz != _z_windows;) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
1967 |
(*--wz)->OnHundredthTick(); |
0 | 1968 |
} |
1969 |
t = 0; |
|
1970 |
} |
|
5089
67c761427921
(svn r7156) -Codechange: Remove obsolete variable, localize global variable, use GB and change logic
Darkvater
parents:
5086
diff
changeset
|
1971 |
we4_timer = t; |
0 | 1972 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1973 |
for (wz = _last_z_window; wz != _z_windows;) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1974 |
Window *w = *--wz; |
0 | 1975 |
if (w->flags4 & WF_WHITE_BORDER_MASK) { |
1976 |
w->flags4 -= WF_WHITE_BORDER_ONE; |
|
5120
1ff65e874ce3
(svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents:
5108
diff
changeset
|
1977 |
|
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
1978 |
if (!(w->flags4 & WF_WHITE_BORDER_MASK)) w->SetDirty(); |
0 | 1979 |
} |
1980 |
} |
|
1981 |
||
1982 |
DrawDirtyBlocks(); |
|
1983 |
||
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1984 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
1985 |
if ((*wz)->viewport != NULL) UpdateViewportPosition(*wz); |
0 | 1986 |
} |
7454
e55eea8c05c7
(svn r10932) -Codechange: replace "text" with "chat" for the chat related function and variables.
rubidium
parents:
7367
diff
changeset
|
1987 |
DrawChatMessage(); |
6432
226650eb2ef3
(svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents:
6296
diff
changeset
|
1988 |
/* Redraw mouse cursor in case it was hidden */ |
0 | 1989 |
DrawMouseCursor(); |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
1990 |
} |
0 | 1991 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1992 |
/** |
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
1993 |
* Mark window as dirty (in need of repainting) |
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
1994 |
* @param cls Window class |
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
1995 |
* @param number Window number in that class |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
1996 |
*/ |
2788
0187c588107e
(svn r3336) byte -> WindowClass, uint16 -> WindowNumber
tron
parents:
2703
diff
changeset
|
1997 |
void InvalidateWindow(WindowClass cls, WindowNumber number) |
0 | 1998 |
{ |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
1999 |
Window* const *wz; |
0 | 2000 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2001 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2002 |
const Window *w = *wz; |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
2003 |
if (w->window_class == cls && w->window_number == number) w->SetDirty(); |
0 | 2004 |
} |
2005 |
} |
|
2006 |
||
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
2007 |
/** |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2008 |
* Mark a particular widget in a particular window as dirty (in need of repainting) |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2009 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2010 |
* @param number Window number in that class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2011 |
* @param widget_index Index number of the widget that needs repainting |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2012 |
*/ |
2788
0187c588107e
(svn r3336) byte -> WindowClass, uint16 -> WindowNumber
tron
parents:
2703
diff
changeset
|
2013 |
void InvalidateWindowWidget(WindowClass cls, WindowNumber number, byte widget_index) |
0 | 2014 |
{ |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
2015 |
Window* const *wz; |
0 | 2016 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2017 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2018 |
const Window *w = *wz; |
2639 | 2019 |
if (w->window_class == cls && w->window_number == number) { |
8028
e578ea22f371
(svn r11588) -Codechange: use the new member introduced in r11551
glx
parents:
8026
diff
changeset
|
2020 |
w->InvalidateWidget(widget_index); |
0 | 2021 |
} |
2022 |
} |
|
2023 |
} |
|
2024 |
||
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
2025 |
/** |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2026 |
* Mark all windows of a particular class as dirty (in need of repainting) |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2027 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2028 |
*/ |
2788
0187c588107e
(svn r3336) byte -> WindowClass, uint16 -> WindowNumber
tron
parents:
2703
diff
changeset
|
2029 |
void InvalidateWindowClasses(WindowClass cls) |
0 | 2030 |
{ |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
2031 |
Window* const *wz; |
2639 | 2032 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2033 |
FOR_ALL_WINDOWS(wz) { |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
2034 |
if ((*wz)->window_class == cls) (*wz)->SetDirty(); |
0 | 2035 |
} |
2036 |
} |
|
2037 |
||
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2038 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2039 |
* Mark window data as invalid (in need of re-computing) |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2040 |
* @param w Window with invalid data |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2041 |
*/ |
9165
6f26cc347e7a
(svn r13028) -Codechange: WE_MESSAGE and WE_INVALIDATE_DATA were doing the same thing.
rubidium
parents:
9162
diff
changeset
|
2042 |
void InvalidateThisWindowData(Window *w, int data) |
4766
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2043 |
{ |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2044 |
w->OnInvalidateData(data); |
9116
f2491d3c321b
(svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents:
9115
diff
changeset
|
2045 |
w->SetDirty(); |
4766
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2046 |
} |
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2047 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2048 |
/** |
8992
0b2fb43cc875
(svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents:
8965
diff
changeset
|
2049 |
* Mark window data of the window of a given class and specific window number as invalid (in need of re-computing) |
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2050 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2051 |
* @param number Window number within the class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2052 |
*/ |
9165
6f26cc347e7a
(svn r13028) -Codechange: WE_MESSAGE and WE_INVALIDATE_DATA were doing the same thing.
rubidium
parents:
9162
diff
changeset
|
2053 |
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data) |
4739
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4719
diff
changeset
|
2054 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2055 |
Window* const *wz; |
4739
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4719
diff
changeset
|
2056 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2057 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2058 |
Window *w = *wz; |
9165
6f26cc347e7a
(svn r13028) -Codechange: WE_MESSAGE and WE_INVALIDATE_DATA were doing the same thing.
rubidium
parents:
9162
diff
changeset
|
2059 |
if (w->window_class == cls && w->window_number == number) InvalidateThisWindowData(w, data); |
4766
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2060 |
} |
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2061 |
} |
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2062 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2063 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2064 |
* Mark window data of all windows of a given class as invalid (in need of re-computing) |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2065 |
* @param cls Window class |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2066 |
*/ |
9165
6f26cc347e7a
(svn r13028) -Codechange: WE_MESSAGE and WE_INVALIDATE_DATA were doing the same thing.
rubidium
parents:
9162
diff
changeset
|
2067 |
void InvalidateWindowClassesData(WindowClass cls, int data) |
4766
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2068 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2069 |
Window* const *wz; |
4766
aa276d0ec2eb
(svn r6680) -Codechange r6679: [train build window] only generate the list when the window data is invalidated or the window is generated, not on each redraw
bjarni
parents:
4757
diff
changeset
|
2070 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2071 |
FOR_ALL_WINDOWS(wz) { |
9165
6f26cc347e7a
(svn r13028) -Codechange: WE_MESSAGE and WE_INVALIDATE_DATA were doing the same thing.
rubidium
parents:
9162
diff
changeset
|
2072 |
if ((*wz)->window_class == cls) InvalidateThisWindowData(*wz, data); |
4739
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4719
diff
changeset
|
2073 |
} |
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4719
diff
changeset
|
2074 |
} |
0 | 2075 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2076 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2077 |
* Dispatch WE_TICK event over all windows |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2078 |
*/ |
6247 | 2079 |
void CallWindowTickEvent() |
0 | 2080 |
{ |
9410
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2081 |
if (_scroller_click_timeout > 3) { |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2082 |
_scroller_click_timeout -= 3; |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2083 |
} else { |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2084 |
_scroller_click_timeout = 0; |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2085 |
} |
b8cbfacc9057
(svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents:
9407
diff
changeset
|
2086 |
|
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2087 |
for (Window * const *wz = _last_z_window; wz != _z_windows;) { |
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2088 |
(*--wz)->OnTick(); |
0 | 2089 |
} |
2090 |
} |
|
2091 |
||
8995
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2092 |
/** |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2093 |
* Try to delete a non-vital window. |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2094 |
* Non-vital windows are windows other than the game selection, main toolbar, |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2095 |
* status bar, toolbar menu, and tooltip windows. Stickied windows are also |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2096 |
* considered vital. |
f6b859375e10
(svn r12790) -Codechange: code style fixes. Patch by Alberth.
rubidium
parents:
8992
diff
changeset
|
2097 |
*/ |
6247 | 2098 |
void DeleteNonVitalWindows() |
0 | 2099 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2100 |
Window* const *wz; |
2639 | 2101 |
|
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2102 |
restart_search: |
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2103 |
/* When we find the window to delete, we need to restart the search |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2104 |
* as deleting this window could cascade in deleting (many) others |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2105 |
* anywhere in the z-array */ |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2106 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2107 |
Window *w = *wz; |
0 | 2108 |
if (w->window_class != WC_MAIN_WINDOW && |
2109 |
w->window_class != WC_SELECT_GAME && |
|
2110 |
w->window_class != WC_MAIN_TOOLBAR && |
|
2111 |
w->window_class != WC_STATUS_BAR && |
|
2112 |
w->window_class != WC_TOOLBAR_MENU && |
|
682
74c70f645d95
(svn r1121) -Feature: Added sticky windows feature. A small pin allows the user to set the window as undeletable and can only be closed by hand. As an example the viewport window has been stickied (thanks to Neko-San)
darkvater
parents:
679
diff
changeset
|
2113 |
w->window_class != WC_TOOLTIPS && |
74c70f645d95
(svn r1121) -Feature: Added sticky windows feature. A small pin allows the user to set the window as undeletable and can only be closed by hand. As an example the viewport window has been stickied (thanks to Neko-San)
darkvater
parents:
679
diff
changeset
|
2114 |
(w->flags4 & WF_STICKY) == 0) { // do not delete windows which are 'pinned' |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2115 |
|
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
2116 |
delete w; |
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2117 |
goto restart_search; |
0 | 2118 |
} |
2119 |
} |
|
2120 |
} |
|
2121 |
||
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
2122 |
/** It is possible that a stickied window gets to a position where the |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2123 |
* 'close' button is outside the gaming area. You cannot close it then; except |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2124 |
* with this function. It closes all windows calling the standard function, |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2125 |
* then, does a little hacked loop of closing all stickied windows. Note |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2126 |
* that standard windows (status bar, etc.) are not stickied, so these aren't affected */ |
6247 | 2127 |
void DeleteAllNonVitalWindows() |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2128 |
{ |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2129 |
Window* const *wz; |
2639 | 2130 |
|
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2131 |
/* Delete every window except for stickied ones, then sticky ones as well */ |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2132 |
DeleteNonVitalWindows(); |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2133 |
|
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2134 |
restart_search: |
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2135 |
/* When we find the window to delete, we need to restart the search |
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2136 |
* as deleting this window could cascade in deleting (many) others |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2137 |
* anywhere in the z-array */ |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2138 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2139 |
if ((*wz)->flags4 & WF_STICKY) { |
9115
47ae980bace3
(svn r12975) -Codechange: replace DeleteWindow(w) with delete w.
rubidium
parents:
9111
diff
changeset
|
2140 |
delete *wz; |
5121
e45de1152730
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
Darkvater
parents:
5120
diff
changeset
|
2141 |
goto restart_search; |
4077
d4d440dd8925
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4000
diff
changeset
|
2142 |
} |
763
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2143 |
} |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2144 |
} |
ced9fcae239d
(svn r1225) -Feature: SHIFT+DEL now deletes all non-vital windows (only status bar and main bar remain)
darkvater
parents:
682
diff
changeset
|
2145 |
|
6443
63fbe9f76801
(svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents:
6432
diff
changeset
|
2146 |
/** Delete all always on-top windows to get an empty screen */ |
6247 | 2147 |
void HideVitalWindows() |
983
4765bf636f6b
(svn r1479) -Added highscore chart (accessible from the difficulty window) with top5 companies for a given difficulty (select the difficulty in the menu)
darkvater
parents:
982
diff
changeset
|
2148 |
{ |
5907
31c78a89f10c
(svn r8533) -Fix: segmentation fault when the toolbar gets removed and you have selected one of the items in a submenu of the toolbar.
rubidium
parents:
5642
diff
changeset
|
2149 |
DeleteWindowById(WC_TOOLBAR_MENU, 0); |
983
4765bf636f6b
(svn r1479) -Added highscore chart (accessible from the difficulty window) with top5 companies for a given difficulty (select the difficulty in the menu)
darkvater
parents:
982
diff
changeset
|
2150 |
DeleteWindowById(WC_MAIN_TOOLBAR, 0); |
4765bf636f6b
(svn r1479) -Added highscore chart (accessible from the difficulty window) with top5 companies for a given difficulty (select the difficulty in the menu)
darkvater
parents:
982
diff
changeset
|
2151 |
DeleteWindowById(WC_STATUS_BAR, 0); |
4765bf636f6b
(svn r1479) -Added highscore chart (accessible from the difficulty window) with top5 companies for a given difficulty (select the difficulty in the menu)
darkvater
parents:
982
diff
changeset
|
2152 |
} |
4765bf636f6b
(svn r1479) -Added highscore chart (accessible from the difficulty window) with top5 companies for a given difficulty (select the difficulty in the menu)
darkvater
parents:
982
diff
changeset
|
2153 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2154 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2155 |
* (Re)position main toolbar window at the screen |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2156 |
* @param w Window structure of the main toolbar window, may also be \c NULL |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2157 |
* @return X coordinate of left edge of the repositioned toolbar window |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2158 |
*/ |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
2159 |
int PositionMainToolbar(Window *w) |
68
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2160 |
{ |
5380
8ea58542b6e0
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5272
diff
changeset
|
2161 |
DEBUG(misc, 5, "Repositioning Main Toolbar..."); |
68
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2162 |
|
4077
d4d440dd8925
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4000
diff
changeset
|
2163 |
if (w == NULL || w->window_class != WC_MAIN_TOOLBAR) { |
68
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2164 |
w = FindWindowById(WC_MAIN_TOOLBAR, 0); |
4077
d4d440dd8925
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4000
diff
changeset
|
2165 |
} |
68
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2166 |
|
9413
7042a8ec3fa8
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
9411
diff
changeset
|
2167 |
switch (_settings_client.gui.toolbar_pos) { |
5071
e28106dfcb6f
(svn r7129) -Codechange: Get rid of a global variable that only sets a window's number.
Darkvater
parents:
5043
diff
changeset
|
2168 |
case 1: w->left = (_screen.width - w->width) / 2; break; |
2026 | 2169 |
case 2: w->left = _screen.width - w->width; break; |
2170 |
default: w->left = 0; |
|
68
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2171 |
} |
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2172 |
SetDirtyBlocks(0, 0, _screen.width, w->height); // invalidate the whole top part |
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2173 |
return w->left; |
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2174 |
} |
4051f3c8efa2
(svn r69) -Feature: align toolbar left/center/right patch (TrueLight)
darkvater
parents:
67
diff
changeset
|
2175 |
|
9407
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2176 |
void SetVScrollCount(Window *w, int num) |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2177 |
{ |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2178 |
w->vscroll.count = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2179 |
num -= w->vscroll.cap; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2180 |
if (num < 0) num = 0; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2181 |
if (num < w->vscroll.pos) w->vscroll.pos = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2182 |
} |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2183 |
|
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2184 |
void SetVScroll2Count(Window *w, int num) |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2185 |
{ |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2186 |
w->vscroll2.count = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2187 |
num -= w->vscroll2.cap; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2188 |
if (num < 0) num = 0; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2189 |
if (num < w->vscroll2.pos) w->vscroll2.pos = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2190 |
} |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2191 |
|
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2192 |
void SetHScrollCount(Window *w, int num) |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2193 |
{ |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2194 |
w->hscroll.count = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2195 |
num -= w->hscroll.cap; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2196 |
if (num < 0) num = 0; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2197 |
if (num < w->hscroll.pos) w->hscroll.pos = num; |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2198 |
} |
079a6bf07bae
(svn r13318) -Codechange: move some functions from gui.h/misc_gui.cpp to window_gui.h/window.cpp because they belong there.
rubidium
parents:
9354
diff
changeset
|
2199 |
|
8857
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2200 |
/** |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2201 |
* Relocate all windows to fit the new size of the game application screen |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2202 |
* @param neww New width of the game application screen |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2203 |
* @param newh New height of the game appliction screen |
7593af4962e6
(svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium
parents:
8698
diff
changeset
|
2204 |
*/ |
0 | 2205 |
void RelocateAllWindows(int neww, int newh) |
2206 |
{ |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2207 |
Window* const *wz; |
0 | 2208 |
|
5124
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2209 |
FOR_ALL_WINDOWS(wz) { |
2ca62776430e
(svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents:
5122
diff
changeset
|
2210 |
Window *w = *wz; |
0 | 2211 |
int left, top; |
158
b1a821f84250
(svn r159) -Fix: w->custom[] was too small for 64bit pointers
truelight
parents:
152
diff
changeset
|
2212 |
|
0 | 2213 |
if (w->window_class == WC_MAIN_WINDOW) { |
2214 |
ViewPort *vp = w->viewport; |
|
2215 |
vp->width = w->width = neww; |
|
2216 |
vp->height = w->height = newh; |
|
6626
207875b9069a
(svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents:
6624
diff
changeset
|
2217 |
vp->virtual_width = ScaleByZoom(neww, vp->zoom); |
207875b9069a
(svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents:
6624
diff
changeset
|
2218 |
vp->virtual_height = ScaleByZoom(newh, vp->zoom); |
0 | 2219 |
continue; // don't modify top,left |
152
c3964b43943e
(svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents:
136
diff
changeset
|
2220 |
} |
c3964b43943e
(svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents:
136
diff
changeset
|
2221 |
|
5126
9084bb06e52e
(svn r7207) -Codechange: Pass the (unchanged) windowpointer to the console window and do it only once.
Darkvater
parents:
5124
diff
changeset
|
2222 |
/* XXX - this probably needs something more sane. For example specying |
9084bb06e52e
(svn r7207) -Codechange: Pass the (unchanged) windowpointer to the console window and do it only once.
Darkvater
parents:
5124
diff
changeset
|
2223 |
* in a 'backup'-desc that the window should always be centred. */ |
2989 | 2224 |
switch (w->window_class) { |
2225 |
case WC_MAIN_TOOLBAR: |
|
7362
959896e9b55b
(svn r10725) -Codechange: move some window related code out of gfx.cpp to windows.cpp
rubidium
parents:
7354
diff
changeset
|
2226 |
if (neww - w->width != 0) { |
959896e9b55b
(svn r10725) -Codechange: move some window related code out of gfx.cpp to windows.cpp
rubidium
parents:
7354
diff
changeset
|
2227 |
ResizeWindow(w, min(neww, 640) - w->width, 0); |
959896e9b55b
(svn r10725) -Codechange: move some window related code out of gfx.cpp to windows.cpp
rubidium
parents:
7354
diff
changeset
|
2228 |
|
9166
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2229 |
Point size; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2230 |
Point delta; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2231 |
size.x = w->width; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2232 |
size.y = w->height; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2233 |
delta.x = neww - w->width; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2234 |
delta.y = 0; |
dce886fc5eeb
(svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents:
9165
diff
changeset
|
2235 |
w->OnResize(size, delta); |
7362
959896e9b55b
(svn r10725) -Codechange: move some window related code out of gfx.cpp to windows.cpp
rubidium
parents:
7354
diff
changeset
|
2236 |
} |
959896e9b55b
(svn r10725) -Codechange: move some window related code out of gfx.cpp to windows.cpp
rubidium
parents:
7354
diff
changeset
|
2237 |
|
2989 | 2238 |
top = w->top; |
2239 |
left = PositionMainToolbar(w); // changes toolbar orientation |
|
2240 |
break; |
|
2241 |
||
2242 |
case WC_SELECT_GAME: |
|
2243 |
case WC_GAME_OPTIONS: |
|
2244 |
case WC_NETWORK_WINDOW: |
|
2245 |
top = (newh - w->height) >> 1; |
|
2246 |
left = (neww - w->width) >> 1; |
|
2247 |
break; |
|
2248 |
||
2249 |
case WC_NEWS_WINDOW: |
|
2250 |
top = newh - w->height; |
|
2251 |
left = (neww - w->width) >> 1; |
|
2252 |
break; |
|
2253 |
||
2254 |
case WC_STATUS_BAR: |
|
7922
a7e266f966d9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
7918
diff
changeset
|
2255 |
ResizeWindow(w, Clamp(neww, 320, 640) - w->width, 0); |
2989 | 2256 |
top = newh - w->height; |
2257 |
left = (neww - w->width) >> 1; |
|
2258 |
break; |
|
2259 |
||
2260 |
case WC_SEND_NETWORK_MSG: |
|
7922
a7e266f966d9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
7918
diff
changeset
|
2261 |
ResizeWindow(w, Clamp(neww, 320, 640) - w->width, 0); |
2989 | 2262 |
top = (newh - 26); // 26 = height of status bar + height of chat bar |
2263 |
left = (neww - w->width) >> 1; |
|
2264 |
break; |
|
2265 |
||
5126
9084bb06e52e
(svn r7207) -Codechange: Pass the (unchanged) windowpointer to the console window and do it only once.
Darkvater
parents:
5124
diff
changeset
|
2266 |
case WC_CONSOLE: |
5143
43f7b9457827
(svn r7233) -Codechange: get rid of three console.c globals
Darkvater
parents:
5137
diff
changeset
|
2267 |
IConsoleResize(w); |
5137
54425dc8b5b3
(svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents:
5126
diff
changeset
|
2268 |
continue; |
5126
9084bb06e52e
(svn r7207) -Codechange: Pass the (unchanged) windowpointer to the console window and do it only once.
Darkvater
parents:
5124
diff
changeset
|
2269 |
|
8698
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2270 |
default: { |
2989 | 2271 |
left = w->left; |
2272 |
if (left + (w->width >> 1) >= neww) left = neww - w->width; |
|
8023
0753dcefda8f
(svn r11583) -Fix [FS#1484]: windows could get completely missing when one resized the window to something very small.
rubidium
parents:
8019
diff
changeset
|
2273 |
if (left < 0) left = 0; |
0753dcefda8f
(svn r11583) -Fix [FS#1484]: windows could get completely missing when one resized the window to something very small.
rubidium
parents:
8019
diff
changeset
|
2274 |
|
2989 | 2275 |
top = w->top; |
2276 |
if (top + (w->height >> 1) >= newh) top = newh - w->height; |
|
8698
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2277 |
|
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2278 |
const Window *wt = FindWindowById(WC_MAIN_TOOLBAR, 0); |
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2279 |
if (wt != NULL) { |
8940
afe7bc9fcc6e
(svn r12714) -Fix [FS#1904]: do not move windows below the toolbar on resizes unless they would go behind the toolbar.
rubidium
parents:
8925
diff
changeset
|
2280 |
if (top < wt->height && wt->left < (w->left + w->width) && (wt->left + wt->width) > w->left) top = wt->height; |
8698
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2281 |
if (top >= newh) top = newh - 1; |
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2282 |
} else { |
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2283 |
if (top < 0) top = 0; |
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2284 |
} |
67bf6670f66e
(svn r12371) -Fix [FS#1823]: do not let window hide behind the main toolbar after resizing the screen
smatz
parents:
8586
diff
changeset
|
2285 |
} break; |
0 | 2286 |
} |
2287 |
||
2639 | 2288 |
if (w->viewport != NULL) { |
0 | 2289 |
w->viewport->left += left - w->left; |
2290 |
w->viewport->top += top - w->top; |
|
2291 |
} |
|
2292 |
||
2293 |
w->left = left; |
|
2294 |
w->top = top; |
|
2295 |
} |
|
2296 |
} |
|
9267
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2297 |
|
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2298 |
/** Destructor of the base class PickerWindowBase |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2299 |
* Main utility is to stop the base Window destructor from triggering |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2300 |
* a free while the child will already be free, in this case by the ResetObjectToPlace(). |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2301 |
*/ |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2302 |
PickerWindowBase::~PickerWindowBase() |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2303 |
{ |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2304 |
this->window_class = WC_INVALID; // stop the ancestor from freeing the already (to be) child |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2305 |
ResetObjectToPlace(); |
22095cc802dd
(svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing.
belugas
parents:
9264
diff
changeset
|
2306 |
} |