Module: wine Branch: refs/heads/master Commit: ef72c1d1002c4f9af0c9d85dee32c40144e27d2f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ef72c1d1002c4f9af0c9d85d...
Author: Dmitry Timoshkov dmitry@codeweavers.com Date: Tue Jun 20 02:25:54 2006 +0900
winex11.drv: Add support for full screen window state using the NETWM protocol.
---
dlls/winex11.drv/winpos.c | 51 +++++++++++++++++++++++++++++++++++++++- dlls/winex11.drv/x11drv.h | 4 ++- dlls/winex11.drv/x11drv_main.c | 4 ++- 3 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c index 07b4005..80626b4 100644 --- a/dlls/winex11.drv/winpos.c +++ b/dlls/winex11.drv/winpos.c @@ -79,6 +79,9 @@ #define _NET_WM_MOVERESIZE_MOVE #define _NET_WM_MOVERESIZE_SIZE_KEYBOARD 9 /* size via keyboard */ #define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10 /* move via keyboard */
+#define _NET_WM_STATE_REMOVE 0 +#define _NET_WM_STATE_ADD 1 +#define _NET_WM_STATE_TOGGLE 2
/*********************************************************************** * X11DRV_Expose @@ -521,6 +524,49 @@ void X11DRV_SetWindowStyle( HWND hwnd, D
/*********************************************************************** + * update_fullscreen_state + * + * Use the NETWM protocol to set the fullscreen state. + * This only works for mapped windows. + */ +static void update_fullscreen_state( Display *display, struct x11drv_win_data *data, + const RECT *old_client_rect ) +{ + XEvent xev; + BOOL old_fs_state = FALSE, new_fs_state = FALSE; + + if (old_client_rect->left <= 0 && old_client_rect->right >= screen_width && + old_client_rect->top <= 0 && old_client_rect->bottom >= screen_height) + old_fs_state = TRUE; + + if (data->client_rect.left <= 0 && data->client_rect.right >= screen_width && + data->client_rect.top <= 0 && data->client_rect.bottom >= screen_height) + new_fs_state = TRUE; + + if (new_fs_state == old_fs_state) return; + + TRACE("setting fullscreen state for hwnd %p to %s\n", data->hwnd, new_fs_state ? "true" : "false"); + + if (data->whole_window) + { + xev.xclient.type = ClientMessage; + xev.xclient.window = data->whole_window; + xev.xclient.message_type = x11drv_atom(_NET_WM_STATE); + xev.xclient.serial = 0; + xev.xclient.display = display; + xev.xclient.send_event = True; + xev.xclient.format = 32; + xev.xclient.data.l[0] = new_fs_state ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; + xev.xclient.data.l[1] = x11drv_atom(_NET_WM_STATE_FULLSCREEN); + xev.xclient.data.l[2] = 0; + wine_tsx11_lock(); + XSendEvent(display, root_window, False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); + wine_tsx11_unlock(); + } +} + + +/*********************************************************************** * X11DRV_set_window_pos * * Set a window position and Z order. @@ -529,7 +575,7 @@ BOOL X11DRV_set_window_pos( HWND hwnd, H const RECT *rectClient, UINT swp_flags, const RECT *valid_rects ) { struct x11drv_win_data *data; - RECT new_whole_rect; + RECT new_whole_rect, old_client_rect; WND *win; DWORD old_style, new_style; BOOL ret; @@ -539,6 +585,8 @@ BOOL X11DRV_set_window_pos( HWND hwnd, H new_whole_rect = *rectWindow; X11DRV_window_to_X_rect( data, &new_whole_rect );
+ old_client_rect = data->client_rect; + if (!IsRectEmpty( &valid_rects[0] )) { int x_offset = 0, y_offset = 0; @@ -671,6 +719,7 @@ BOOL X11DRV_set_window_pos( HWND hwnd, H XMapWindow( display, data->whole_window ); wine_tsx11_unlock(); } + update_fullscreen_state( display, data, &old_client_rect ); } } } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 7cfdbc4..adbb1f7 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -566,9 +566,11 @@ enum x11drv_atoms XATOM__MOTIF_WM_HINTS, XATOM__KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR, XATOM__NET_WM_MOVERESIZE, + XATOM__NET_WM_NAME, XATOM__NET_WM_PID, XATOM__NET_WM_PING, - XATOM__NET_WM_NAME, + XATOM__NET_WM_STATE, + XATOM__NET_WM_STATE_FULLSCREEN, XATOM__NET_WM_WINDOW_TYPE, XATOM__NET_WM_WINDOW_TYPE_UTILITY, XATOM_XdndAware, diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 5655e60..51a6ac4 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -128,9 +128,11 @@ static const char * const atom_names[NB_ "_MOTIF_WM_HINTS", "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", "_NET_WM_MOVERESIZE", + "_NET_WM_NAME", "_NET_WM_PID", "_NET_WM_PING", - "_NET_WM_NAME", + "_NET_WM_STATE", + "_NET_WM_STATE_FULLSCREEN", "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_UTILITY", "XdndAware",