Commit 68f497bd authored by Alexandre Julliard's avatar Alexandre Julliard

winex11: Improve management of the lifetime of embedded windows.

parent 8c963852
...@@ -72,11 +72,26 @@ extern BOOL ximInComposeMode; ...@@ -72,11 +72,26 @@ extern BOOL ximInComposeMode;
#define DndURL 128 /* KDE drag&drop */ #define DndURL 128 /* KDE drag&drop */
#define XEMBED_EMBEDDED_NOTIFY 0
#define XEMBED_WINDOW_ACTIVATE 1
#define XEMBED_WINDOW_DEACTIVATE 2
#define XEMBED_REQUEST_FOCUS 3
#define XEMBED_FOCUS_IN 4
#define XEMBED_FOCUS_OUT 5
#define XEMBED_FOCUS_NEXT 6
#define XEMBED_FOCUS_PREV 7
#define XEMBED_MODALITY_ON 10
#define XEMBED_MODALITY_OFF 11
#define XEMBED_REGISTER_ACCELERATOR 12
#define XEMBED_UNREGISTER_ACCELERATOR 13
#define XEMBED_ACTIVATE_ACCELERATOR 14
/* Event handlers */ /* Event handlers */
static void X11DRV_FocusIn( HWND hwnd, XEvent *event ); static void X11DRV_FocusIn( HWND hwnd, XEvent *event );
static void X11DRV_FocusOut( HWND hwnd, XEvent *event ); static void X11DRV_FocusOut( HWND hwnd, XEvent *event );
static void X11DRV_Expose( HWND hwnd, XEvent *event ); static void X11DRV_Expose( HWND hwnd, XEvent *event );
static void X11DRV_MapNotify( HWND hwnd, XEvent *event ); static void X11DRV_MapNotify( HWND hwnd, XEvent *event );
static void X11DRV_ReparentNotify( HWND hwnd, XEvent *event );
static void X11DRV_ConfigureNotify( HWND hwnd, XEvent *event ); static void X11DRV_ConfigureNotify( HWND hwnd, XEvent *event );
static void X11DRV_PropertyNotify( HWND hwnd, XEvent *event ); static void X11DRV_PropertyNotify( HWND hwnd, XEvent *event );
static void X11DRV_ClientMessage( HWND hwnd, XEvent *event ); static void X11DRV_ClientMessage( HWND hwnd, XEvent *event );
...@@ -111,7 +126,7 @@ static struct event_handler handlers[MAX_EVENT_HANDLERS] = ...@@ -111,7 +126,7 @@ static struct event_handler handlers[MAX_EVENT_HANDLERS] =
/* UnmapNotify */ /* UnmapNotify */
{ MapNotify, X11DRV_MapNotify }, { MapNotify, X11DRV_MapNotify },
/* MapRequest */ /* MapRequest */
/* ReparentNotify */ { ReparentNotify, X11DRV_ReparentNotify },
{ ConfigureNotify, X11DRV_ConfigureNotify }, { ConfigureNotify, X11DRV_ConfigureNotify },
/* ConfigureRequest */ /* ConfigureRequest */
/* GravityNotify */ /* GravityNotify */
...@@ -127,7 +142,7 @@ static struct event_handler handlers[MAX_EVENT_HANDLERS] = ...@@ -127,7 +142,7 @@ static struct event_handler handlers[MAX_EVENT_HANDLERS] =
{ MappingNotify, X11DRV_MappingNotify }, { MappingNotify, X11DRV_MappingNotify },
}; };
static int nb_event_handlers = 18; /* change this if you add handlers above */ static int nb_event_handlers = 19; /* change this if you add handlers above */
/* return the name of an X event */ /* return the name of an X event */
...@@ -814,6 +829,30 @@ static BOOL is_net_wm_state_maximized( Display *display, struct x11drv_win_data ...@@ -814,6 +829,30 @@ static BOOL is_net_wm_state_maximized( Display *display, struct x11drv_win_data
/*********************************************************************** /***********************************************************************
* X11DRV_ReparentNotify
*/
static void X11DRV_ReparentNotify( HWND hwnd, XEvent *xev )
{
XReparentEvent *event = &xev->xreparent;
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
if (!data->embedded) return;
if (event->parent == root_window)
{
TRACE( "%p/%lx reparented to root\n", hwnd, data->whole_window );
data->embedder = 0;
SendMessageW( hwnd, WM_CLOSE, 0, 0 );
}
else
{
TRACE( "%p/%lx reparented to %lx\n", hwnd, data->whole_window, event->parent );
data->embedder = event->parent;
}
}
/***********************************************************************
* X11DRV_ConfigureNotify * X11DRV_ConfigureNotify
*/ */
void X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev ) void X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
...@@ -1334,6 +1373,30 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event ) ...@@ -1334,6 +1373,30 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
} }
} }
/**********************************************************************
* handle_xembed_protocol
*/
static void handle_xembed_protocol( HWND hwnd, XClientMessageEvent *event )
{
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
if (!data) return;
switch (event->data.l[1])
{
case XEMBED_EMBEDDED_NOTIFY:
TRACE( "win %p/%lx XEMBED_EMBEDDED_NOTIFY owner %lx\n", hwnd, event->window, event->data.l[3] );
data->embedder = event->data.l[3];
break;
default:
TRACE( "win %p/%lx XEMBED message %lu(%lu)\n",
hwnd, event->window, event->data.l[1], event->data.l[2] );
break;
}
}
/********************************************************************** /**********************************************************************
* handle_dnd_protocol * handle_dnd_protocol
*/ */
...@@ -1366,6 +1429,7 @@ struct client_message_handler ...@@ -1366,6 +1429,7 @@ struct client_message_handler
static const struct client_message_handler client_messages[] = static const struct client_message_handler client_messages[] =
{ {
{ XATOM_WM_PROTOCOLS, handle_wm_protocols }, { XATOM_WM_PROTOCOLS, handle_wm_protocols },
{ XATOM__XEMBED, handle_xembed_protocol },
{ XATOM_DndProtocol, handle_dnd_protocol }, { XATOM_DndProtocol, handle_dnd_protocol },
{ XATOM_XdndEnter, X11DRV_XDND_EnterEvent }, { XATOM_XdndEnter, X11DRV_XDND_EnterEvent },
{ XATOM_XdndPosition, X11DRV_XDND_PositionEvent }, { XATOM_XdndPosition, X11DRV_XDND_PositionEvent },
......
...@@ -309,6 +309,15 @@ static LRESULT WINAPI tray_icon_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPAR ...@@ -309,6 +309,15 @@ static LRESULT WINAPI tray_icon_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPAR
case WM_TIMER: case WM_TIMER:
if (!IsWindow( icon->owner )) delete_icon( icon ); if (!IsWindow( icon->owner )) delete_icon( icon );
return 0; return 0;
case WM_CLOSE:
if (icon->display == -1)
{
TRACE( "icon %u no longer embedded\n", icon->id );
hide_icon( icon );
add_to_standalone_tray( icon );
}
return 0;
} }
return DefWindowProcW( hwnd, msg, wparam, lparam ); return DefWindowProcW( hwnd, msg, wparam, lparam );
} }
......
...@@ -1890,8 +1890,9 @@ void X11DRV_DestroyNotify( HWND hwnd, XEvent *event ) ...@@ -1890,8 +1890,9 @@ void X11DRV_DestroyNotify( HWND hwnd, XEvent *event )
if (!(data = X11DRV_get_win_data( hwnd ))) return; if (!(data = X11DRV_get_win_data( hwnd ))) return;
FIXME( "window %p/%lx destroyed from the outside\n", hwnd, data->whole_window ); if (!data->embedded) FIXME( "window %p/%lx destroyed from the outside\n", hwnd, data->whole_window );
destroy_whole_window( display, data, TRUE ); destroy_whole_window( display, data, TRUE );
if (data->embedded) SendMessageW( hwnd, WM_CLOSE, 0, 0 );
} }
......
...@@ -660,6 +660,7 @@ enum x11drv_atoms ...@@ -660,6 +660,7 @@ enum x11drv_atoms
XATOM__NET_WM_WINDOW_TYPE_NORMAL, XATOM__NET_WM_WINDOW_TYPE_NORMAL,
XATOM__NET_WM_WINDOW_TYPE_UTILITY, XATOM__NET_WM_WINDOW_TYPE_UTILITY,
XATOM__NET_WORKAREA, XATOM__NET_WORKAREA,
XATOM__XEMBED,
XATOM__XEMBED_INFO, XATOM__XEMBED_INFO,
XATOM_XdndAware, XATOM_XdndAware,
XATOM_XdndEnter, XATOM_XdndEnter,
...@@ -758,6 +759,7 @@ struct x11drv_win_data ...@@ -758,6 +759,7 @@ struct x11drv_win_data
BOOL shaped : 1; /* is window using a custom region shape? */ BOOL shaped : 1; /* is window using a custom region shape? */
int wm_state; /* current value of the WM_STATE property */ int wm_state; /* current value of the WM_STATE property */
DWORD net_wm_state; /* bit mask of active x11drv_net_wm_state values */ DWORD net_wm_state; /* bit mask of active x11drv_net_wm_state values */
Window embedder; /* window id of embedder */
unsigned long configure_serial; /* serial number of last configure request */ unsigned long configure_serial; /* serial number of last configure request */
HBITMAP hWMIconBitmap; HBITMAP hWMIconBitmap;
HBITMAP hWMIconMask; HBITMAP hWMIconMask;
......
...@@ -160,6 +160,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = ...@@ -160,6 +160,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"_NET_WM_WINDOW_TYPE_NORMAL", "_NET_WM_WINDOW_TYPE_NORMAL",
"_NET_WM_WINDOW_TYPE_UTILITY", "_NET_WM_WINDOW_TYPE_UTILITY",
"_NET_WORKAREA", "_NET_WORKAREA",
"_XEMBED",
"_XEMBED_INFO", "_XEMBED_INFO",
"XdndAware", "XdndAware",
"XdndEnter", "XdndEnter",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment