[Spice-devel] [PATCH spice 3/4] spicec-x11: Change WmSizeHints in fullscreen mode
Arnon Gilboa
agilboa at redhat.com
Sun Oct 17 06:50:59 PDT 2010
Ack, with 2 notes below
Hans de Goede wrote:
> Some window managers will ignore the fullscreen hint, unless WmSizeHints
> allow them to resize the window so that they can give it the size of
> the roo-window. This fixes fullscreen mode in compiz.
> ---
> client/x11/red_window.cpp | 50 ++++++++++++++++++++++++++++----------------
> client/x11/red_window_p.h | 9 +++++--
> 2 files changed, 38 insertions(+), 21 deletions(-)
>
> diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp
> index e7b6815..8f6535b 100644
> --- a/client/x11/red_window.cpp
> +++ b/client/x11/red_window.cpp
> @@ -1063,18 +1063,27 @@ void RedWindow_p::set_glx(int width, int height)
> }
> #endif // USE_OGL
>
> -void RedWindow_p::set_minmax(PixelsSource_p& pix_source, int width, int height)
> +void RedWindow_p::set_minmax(PixelsSource_p& pix_source)
> {
> //todo: auto res
> XSizeHints* size_hints = XAllocSizeHints();
> ASSERT(size_hints);
> size_hints->flags = PMinSize | PMaxSize;
> - size_hints->min_width = size_hints->max_width = width;
> - size_hints->min_height = size_hints->max_height = height;
> + if (_red_window->_type == RedWindow::TYPE_FULLSCREEN) {
> + /* Some window managers won't allow full screen mode with a fixed
> + width / height */
>
so u need to give them the complete theoretical range?
> + size_hints->min_width = 1;
> + size_hints->max_width = 65535;
> + size_hints->min_height = 1;
> + size_hints->max_height = 65535;
> + } else {
> + size_hints->min_width = size_hints->max_width = _width;
> + size_hints->min_height = size_hints->max_height = _height;
> + }
> XSetWMNormalHints(x_display, _win, size_hints);
> XFree(size_hints);
> - pix_source.x_drawable.height = height;
> - pix_source.x_drawable.width = width;
> + pix_source.x_drawable.height = _height;
> + pix_source.x_drawable.width = _width;
> }
>
> Cursor RedWindow_p::create_invisible_cursor(Window window)
> @@ -1100,6 +1109,8 @@ RedWindow_p::RedWindow_p()
> , _ignore_foucs (false)
> , _pointer_in_window (false)
> , _ignore_pointer (false)
> + ,_width (200)
> + ,_height (200)
>
i guess these are just random values?
> {
> }
>
> @@ -1145,8 +1156,8 @@ void RedWindow_p::destroy(RedWindow& red_window, PixelsSource_p& pix_source)
> }
> }
>
> -void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pix_source, int x, int y,
> - unsigned int width, unsigned int height, int in_screen)
> +void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pix_source,
> + int x, int y, int in_screen)
> {
> Window window = None;
> Cursor cursor = None;
> @@ -1168,7 +1179,7 @@ void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pix_source, int
> win_attributes.colormap = _colormap;
> mask |= CWColormap;
> window = XCreateWindow(x_display, root_window, x, y,
> - width, height, 0, XPlatform::get_vinfo()[in_screen]->depth,
> + _width, _height, 0, XPlatform::get_vinfo()[in_screen]->depth,
> InputOutput, XPlatform::get_vinfo()[in_screen]->visual, mask,
> &win_attributes);
> XUnlockDisplay(x_display);
> @@ -1223,11 +1234,12 @@ void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pix_source, int
> _show_pos.y = y;
> _visibale = false;
> _expect_parent = false;
> + _red_window = &red_window;
> pix_source.type = PIXELS_SOURCE_TYPE_X_DRAWABLE;
> pix_source.x_drawable.drawable = window;
> pix_source.x_drawable.screen = _screen;
> pix_source.x_drawable.gc = gc;
> - set_minmax(pix_source, width, height);
> + set_minmax(pix_source);
> sync();
> }
>
> @@ -1236,17 +1248,12 @@ void RedWindow_p::migrate(RedWindow& red_window, PixelsSource_p& pix_source, int
> if (to_screen == _screen) {
> return;
> }
> - XWindowAttributes attrib;
> - if (!XGetWindowAttributes(x_display, _win, &attrib)) {
> - THROW("get attributes failed");
> - }
> XTextProperty text_pro;
> XLockDisplay(x_display);
> bool valid_title = XGetWMName(x_display, _win, &text_pro) && text_pro.value;
> XUnlockDisplay(x_display);
> destroy(red_window, pix_source);
> - create(red_window, pix_source, _show_pos.x, _show_pos.y, attrib.width, attrib.height,
> - to_screen);
> + create(red_window, pix_source, _show_pos.x, _show_pos.y, to_screen);
> if (valid_title) {
> XSetWMName(x_display, _win, &text_pro);
> XFree(text_pro.value); //???
> @@ -1304,7 +1311,7 @@ RedWindow::RedWindow(RedWindow::Listener& listener, int screen)
> , _menu (NULL)
> {
> ASSERT(x_display);
> - create(*this, *(PixelsSource_p*)get_opaque(), 0, 0, 200, 200,
> + create(*this, *(PixelsSource_p*)get_opaque(), 0, 0,
> (screen == DEFAULT_SCREEN) ? DefaultScreen(x_display) : screen);
> }
>
> @@ -1505,6 +1512,9 @@ void RedWindow::show(int screen_id)
> _listener.post_migrate();
> }
>
> + /* We must update min/max for fullscreen / normal switching */
> + set_minmax(*(PixelsSource_p*)get_opaque());
> +
> if (_type == TYPE_FULLSCREEN) {
> Atom state[2];
> state[0] = wm_state_above;
> @@ -1621,7 +1631,9 @@ static void send_expose(Window window, int width, int height)
>
> void RedWindow::move_and_resize(int x, int y, int width, int height)
> {
> - set_minmax(*(PixelsSource_p*)get_opaque(), width, height);
> + _width = width;
> + _height = height;
> + set_minmax(*(PixelsSource_p*)get_opaque());
> XMoveResizeWindow(x_display, _win, x, y, width, height);
> _show_pos.x = x;
> _show_pos.y = y;
> @@ -1639,7 +1651,9 @@ void RedWindow::move(int x, int y)
>
> void RedWindow::resize(int width, int height)
> {
> - set_minmax(*(PixelsSource_p*)get_opaque(), width, height);
> + _width = width;
> + _height = height;
> + set_minmax(*(PixelsSource_p*)get_opaque());
> XResizeWindow(x_display, _win, width, height);
> if (_visibale) {
> send_expose(_win, width, height);
> diff --git a/client/x11/red_window_p.h b/client/x11/red_window_p.h
> index 29121d9..8f14d4e 100644
> --- a/client/x11/red_window_p.h
> +++ b/client/x11/red_window_p.h
> @@ -39,10 +39,10 @@ public:
> RedWindow_p();
>
> void migrate(RedWindow& red_window, PixelsSource_p& pix_source, int dest_screen);
> - void create(RedWindow& red_window, PixelsSource_p& pix_source, int x, int y,
> - unsigned int width, unsigned int height, int in_screen);
> + void create(RedWindow& red_window, PixelsSource_p& pix_source,
> + int x, int y, int in_screen);
> void destroy(RedWindow& red_window, PixelsSource_p& pix_source);
> - void set_minmax(PixelsSource_p& pix_source, int width, int height);
> + void set_minmax(PixelsSource_p& pix_source);
> void wait_for_reparent();
> void wait_for_map();
> void wait_for_unmap();
> @@ -79,6 +79,9 @@ protected:
> bool _shadow_pointer_state;
> XEvent _shadow_pointer_event;
> Colormap _colormap;
> + RedWindow *_red_window;
> + int _width;
> + int _height;
> };
>
> #endif
>
More information about the Spice-devel
mailing list