mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 07:57:22 +00:00
winemac.drv: Omit WM_ENTER/EXITSIZEMOVE on non-interactive window changes.
The motivating example is when a newly created window gets moved off the system menu bar. A program might not be prepared to handle these messages yet. Fixes a crash in Lord of the Rings online. Signed-off-by: Jan Sikorski <jsikorski@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
dc48a9ac06
commit
0d22e8455a
|
@ -1785,7 +1785,7 @@ - (void) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next activate:(BOOL)a
|
|||
/* Cocoa may adjust the frame when the window is ordered onto the screen.
|
||||
Generate a frame-changed event just in case. The back end will ignore
|
||||
it if nothing actually changed. */
|
||||
[self windowDidResize:nil];
|
||||
[self windowDidResize:nil skipSizeMove:TRUE];
|
||||
|
||||
if (![self isExcludedFromWindowsMenu])
|
||||
[NSApp addWindowsItem:self title:[self title] filename:NO];
|
||||
|
@ -1964,7 +1964,7 @@ - (void) setFrameFromWine:(NSRect)contentRect
|
|||
{
|
||||
/* In case Cocoa adjusted the frame we tried to set, generate a frame-changed
|
||||
event. The back end will ignore it if nothing actually changed. */
|
||||
[self windowDidResize:nil];
|
||||
[self windowDidResize:nil skipSizeMove:TRUE];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2129,7 +2129,7 @@ - (void) postBroughtForwardEvent
|
|||
macdrv_release_event(event);
|
||||
}
|
||||
|
||||
- (void) postWindowFrameChanged:(NSRect)frame fullscreen:(BOOL)isFullscreen resizing:(BOOL)resizing
|
||||
- (void) postWindowFrameChanged:(NSRect)frame fullscreen:(BOOL)isFullscreen resizing:(BOOL)resizing skipSizeMove:(BOOL)skipSizeMove
|
||||
{
|
||||
macdrv_event* event;
|
||||
NSUInteger style = self.styleMask;
|
||||
|
@ -2149,6 +2149,7 @@ - (void) postWindowFrameChanged:(NSRect)frame fullscreen:(BOOL)isFullscreen resi
|
|||
event->window_frame_changed.frame = cgrect_win_from_mac(NSRectToCGRect(frame));
|
||||
event->window_frame_changed.fullscreen = isFullscreen;
|
||||
event->window_frame_changed.in_resize = resizing;
|
||||
event->window_frame_changed.skip_size_move_loop = skipSizeMove;
|
||||
[queue postEvent:event];
|
||||
macdrv_release_event(event);
|
||||
}
|
||||
|
@ -2912,7 +2913,7 @@ - (void)windowDidResignKey:(NSNotification *)notification
|
|||
macdrv_release_event(event);
|
||||
}
|
||||
|
||||
- (void)windowDidResize:(NSNotification *)notification
|
||||
- (void)windowDidResize:(NSNotification *)notification skipSizeMove:(BOOL)skipSizeMove
|
||||
{
|
||||
NSRect frame = self.wine_fractionalFrame;
|
||||
|
||||
|
@ -2935,12 +2936,18 @@ - (void)windowDidResize:(NSNotification *)notification
|
|||
|
||||
[self postWindowFrameChanged:frame
|
||||
fullscreen:([self styleMask] & NSWindowStyleMaskFullScreen) != 0
|
||||
resizing:[self inLiveResize]];
|
||||
resizing:[self inLiveResize]
|
||||
skipSizeMove:skipSizeMove];
|
||||
|
||||
[[[self contentView] inputContext] invalidateCharacterCoordinates];
|
||||
[self updateFullscreen];
|
||||
}
|
||||
|
||||
- (void)windowDidResize:(NSNotification *)notification
|
||||
{
|
||||
[self windowDidResize:notification skipSizeMove:FALSE];
|
||||
}
|
||||
|
||||
- (BOOL)windowShouldClose:(id)sender
|
||||
{
|
||||
macdrv_event* event = macdrv_create_event(WINDOW_CLOSE_REQUESTED, self);
|
||||
|
@ -2997,7 +3004,7 @@ - (void) windowWillEnterFullScreen:(NSNotification*)notification
|
|||
- (void) windowWillExitFullScreen:(NSNotification*)notification
|
||||
{
|
||||
exitingFullScreen = TRUE;
|
||||
[self postWindowFrameChanged:nonFullscreenFrame fullscreen:FALSE resizing:FALSE];
|
||||
[self postWindowFrameChanged:nonFullscreenFrame fullscreen:FALSE resizing:FALSE skipSizeMove:FALSE];
|
||||
}
|
||||
|
||||
- (void)windowWillMiniaturize:(NSNotification *)notification
|
||||
|
|
|
@ -443,6 +443,7 @@ extern int macdrv_set_display_mode(const struct macdrv_display* display,
|
|||
CGRect frame;
|
||||
int fullscreen;
|
||||
int in_resize;
|
||||
int skip_size_move_loop;
|
||||
} window_frame_changed;
|
||||
struct {
|
||||
unsigned long serial;
|
||||
|
|
|
@ -2322,10 +2322,11 @@ void macdrv_window_frame_changed(HWND hwnd, const macdrv_event *event)
|
|||
flags |= SWP_NOSENDCHANGING;
|
||||
if (!(flags & SWP_NOSIZE) || !(flags & SWP_NOMOVE))
|
||||
{
|
||||
if (!event->window_frame_changed.in_resize && !being_dragged)
|
||||
int send_sizemove = !event->window_frame_changed.in_resize && !being_dragged && !event->window_frame_changed.skip_size_move_loop;
|
||||
if (send_sizemove)
|
||||
SendMessageW(hwnd, WM_ENTERSIZEMOVE, 0, 0);
|
||||
SetWindowPos(hwnd, 0, rect.left, rect.top, width, height, flags);
|
||||
if (!event->window_frame_changed.in_resize && !being_dragged)
|
||||
if (send_sizemove)
|
||||
SendMessageW(hwnd, WM_EXITSIZEMOVE, 0, 0);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue