[vlc-devel] [vlc-commits] xcb: support for WM_DELETE_WINDOW(WM_PROTOCOLS)
Rémi Denis-Courmont
remi at remlab.net
Fri Jan 28 20:52:34 CET 2011
I disagree and I purposefully did not implement this. I dont see why closing one video window should terminate the whole instance.
----- Message d'origine -----
> vlc | branch: master | Erwan Tulou <erwan10 at videolan.org> | Fri Jan 28 13:03:29
> 2011 +0100| [95b63292214d81df212edafc7a228f8ec66d7958] | committer: Erwan Tulou
>
> xcb: support for WM_DELETE_WINDOW(WM_PROTOCOLS)
>
> When the default window provider is used (dummy, rc, ... interfaces),
> rather decide what to do when the user closes the video window than let
> the WM blindly destroy it. Till now, this led to an error message, input
> dying and the playlist being stopped. For -I dummy, it also meant leaving
> vlc hanging since no interface could then be used to stop vlc.
>
> Action taken is to stop vlc, but feel free to change/improve/make it
> more configurable if need be.
>
> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=95b63292214d81df212edafc7a228f8ec66d7958
> ---
>
> modules/video_output/xcb/window.c | 46 ++++++++++++++++++++++++++++++++++++-
> 1 files changed, 45 insertions(+), 1 deletions(-)
>
> diff --git a/modules/video_output/xcb/window.c
> b/modules/video_output/xcb/window.c index 0fdd2bc..833c68d 100644
> --- a/modules/video_output/xcb/window.c
> +++ b/modules/video_output/xcb/window.c
> @@ -37,6 +37,7 @@ typedef xcb_atom_t Atom;
> #include <vlc_common.h>
> #include <vlc_plugin.h>
> #include <vlc_vout_window.h>
> +#include <vlc_interface.h>
>
> #include "xcb_vlc.h"
>
> @@ -99,6 +100,8 @@ struct vout_window_sys_t
> vlc_thread_t thread;
>
> xcb_window_t root;
> + xcb_atom_t wm_protocols;
> + xcb_atom_t wm_delete_window;
> xcb_atom_t wm_state;
> xcb_atom_t wm_state_above;
> xcb_atom_t wm_state_below;
> @@ -140,6 +143,18 @@ void set_wm_hints (xcb_connection_t *conn, xcb_window_t
> window) XA_WM_HINTS, 32, 8, wm_hints);
> }
>
> +static inline
> +void set_wm_protocols (vout_window_t *wnd, xcb_connection_t *conn,
> + xcb_window_t window)
> +{
> + const xcb_atom_t wm_protocols[1] = {
> + wnd->sys->wm_delete_window,
> + };
> + xcb_change_property (conn, XCB_PROP_MODE_REPLACE, window,
> + wnd->sys->wm_protocols, XA_ATOM,
> + 32, 1, wm_protocols);
> +}
> +
> /** Set the Window ICCCM client machine property */
> static inline
> void set_hostname_prop (xcb_connection_t *conn, xcb_window_t window)
> @@ -188,9 +203,12 @@ xcb_atom_t get_atom (xcb_connection_t *conn,
> xcb_intern_atom_cookie_t ck) static void CacheAtoms (vout_window_sys_t *p_sys)
> {
> xcb_connection_t *conn = p_sys->conn;
> - xcb_intern_atom_cookie_t wm_state_ck, wm_state_above_ck,
> + xcb_intern_atom_cookie_t wm_protocols_ck, wm_delete_window_ck,
> + wm_state_ck, wm_state_above_ck,
> wm_state_below_ck, wm_state_fs_ck;
>
> + wm_protocols_ck = intern_string (conn, "WM_PROTOCOLS");
> + wm_delete_window_ck = intern_string (conn, "WM_DELETE_WINDOW");
> wm_state_ck = intern_string (conn, "_NET_WM_STATE");
> wm_state_above_ck = intern_string (conn, "_NET_WM_STATE_ABOVE");
> wm_state_below_ck = intern_string (conn, "_NET_WM_STATE_BELOW");
> @@ -202,6 +220,8 @@ static void CacheAtoms (vout_window_sys_t *p_sys)
> "_MB_CURRENT_APP_WINDOW");
> #endif
>
> + p_sys->wm_protocols = get_atom (conn, wm_protocols_ck);
> + p_sys->wm_delete_window = get_atom (conn, wm_delete_window_ck);
> p_sys->wm_state = get_atom (conn, wm_state_ck);
> p_sys->wm_state_above = get_atom (conn, wm_state_above_ck);
> p_sys->wm_state_below = get_atom (conn, wm_state_below_ck);
> @@ -334,6 +354,10 @@ static int Open (vout_window_t *wnd, const
> vout_window_cfg_t *cfg)
> /* Cache any EWMH atom we may need later */
> CacheAtoms (p_sys);
> +
> + /* tell the WM which protocols we support */
> + set_wm_protocols (wnd, conn, window );
> +
> #ifdef MATCHBOX_HACK
> if (p_sys->mb_current_app_window)
> {
> @@ -394,6 +418,24 @@ static void Close (vout_window_t *wnd)
> }
>
>
> +static int ProcessClientMessage (vout_window_t *wnd, xcb_generic_event_t *ev)
> +{
> + if ((ev->response_type & 0x7f) != XCB_CLIENT_MESSAGE)
> + return -1;
> +
> + xcb_client_message_event_t* evt = (xcb_client_message_event_t*)ev;
> + if (evt->type == wnd->sys->wm_protocols
> + && evt->data.data32[0] == wnd->sys->wm_delete_window)
> + {
> + msg_Dbg (wnd, "WM_DELETE_WINDOW received from the Window Manager");
> + libvlc_Quit (wnd->p_libvlc);
> + }
> + else
> + msg_Dbg (wnd, "unhandled client message");
> + return 0;
> +}
> +
> +
> /** Background thread for X11 events handling */
> static void *Thread (void *data)
> {
> @@ -415,6 +457,8 @@ static void *Thread (void *data)
> int canc = vlc_savecancel ();
> while ((ev = xcb_poll_for_event (conn)) != NULL)
> {
> + if (ProcessClientMessage (wnd, ev) == 0)
> + continue;
> if (ProcessKeyEvent (p_sys->keys, ev) == 0)
> continue;
> #ifdef MATCHBOX_HACK
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> http://mailman.videolan.org/listinfo/vlc-commits
More information about the vlc-devel
mailing list