CVS: rdesktop ewmhints.c,1.10.2.5,1.10.2.6 xproto.h,1.4.2.4,1.4.2.5 xwin.c,1.205.2.17,1.205.2.18

Pierre Ossman <[email protected]> Thu, 16 Mar 2006 00:41:55 -0800
Newsgroups gmane.network.rdesktop.cvs
Message-ID <[email protected]>
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2182

Modified Files:
      Tag: seamlessrdp-branch
	ewmhints.c xproto.h xwin.c 
Log Message:
Set _NET_WM_STATE atoms via the window manager (as required by the spec.).
Unfortunately, this means we have to wait for the window to leave the
withdrawn state.


Index: ewmhints.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/ewmhints.c,v
retrieving revision 1.10.2.5
retrieving revision 1.10.2.6
diff -C2 -d -r1.10.2.5 -r1.10.2.6
*** ewmhints.c	16 Mar 2006 08:09:41 -0000	1.10.2.5
--- ewmhints.c	16 Mar 2006 08:41:53 -0000	1.10.2.6
***************
*** 229,255 ****
  }
  
! /* 
!    Set the window state: normal/minimized/maximized. 
!    Returns -1 on failure. 
! */
! int
! ewmh_change_state(Window wnd, int state)
  {
  	Status status;
  	XEvent xevent;
  
- 	/*
- 	 * Deal with the max atoms
- 	 */
  	xevent.type = ClientMessage;
  	xevent.xclient.window = wnd;
  	xevent.xclient.message_type = g_net_wm_state_atom;
  	xevent.xclient.format = 32;
! 	if (state == SEAMLESSRDP_MAXIMIZED)
! 		xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
! 	else
! 		xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
! 	xevent.xclient.data.l[1] = g_net_wm_state_maximized_vert_atom;
! 	xevent.xclient.data.l[2] = g_net_wm_state_maximized_horz_atom;
  	xevent.xclient.data.l[3] = 0;
  	xevent.xclient.data.l[4] = 0;
--- 229,268 ----
  }
  
! static int
! ewmh_add_state(Window wnd, Atom atom1, Atom atom2)
  {
  	Status status;
  	XEvent xevent;
  
  	xevent.type = ClientMessage;
  	xevent.xclient.window = wnd;
  	xevent.xclient.message_type = g_net_wm_state_atom;
  	xevent.xclient.format = 32;
! 	xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
! 	xevent.xclient.data.l[1] = atom1;
! 	xevent.xclient.data.l[2] = atom2;
! 	xevent.xclient.data.l[3] = 0;
! 	xevent.xclient.data.l[4] = 0;
! 	status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
! 			    SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
! 	if (!status)
! 		return -1;
! 
! 	return 0;
! }
! 
! static int
! ewmh_remove_state(Window wnd, Atom atom1, Atom atom2)
! {
! 	Status status;
! 	XEvent xevent;
! 
! 	xevent.type = ClientMessage;
! 	xevent.xclient.window = wnd;
! 	xevent.xclient.message_type = g_net_wm_state_atom;
! 	xevent.xclient.format = 32;
! 	xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
! 	xevent.xclient.data.l[1] = atom1;
! 	xevent.xclient.data.l[2] = atom2;
  	xevent.xclient.data.l[3] = 0;
  	xevent.xclient.data.l[4] = 0;
***************
*** 262,265 ****
--- 275,306 ----
  }
  
+ /* 
+    Set the window state: normal/minimized/maximized. 
+    Returns -1 on failure. 
+ */
+ int
+ ewmh_change_state(Window wnd, int state)
+ {
+ 	/*
+ 	 * Deal with the max atoms
+ 	 */
+ 	if (state == SEAMLESSRDP_MAXIMIZED)
+ 	{
+ 		if (ewmh_add_state
+ 		    (wnd, g_net_wm_state_maximized_vert_atom,
+ 		     g_net_wm_state_maximized_horz_atom) < 0)
+ 			return -1;
+ 	}
+ 	else
+ 	{
+ 		if (ewmh_remove_state
+ 		    (wnd, g_net_wm_state_maximized_vert_atom,
+ 		     g_net_wm_state_maximized_horz_atom) < 0)
+ 			return -1;
+ 	}
+ 
+ 	return 0;
+ }
+ 
  
  int
***************
*** 319,328 ****
  
  
! void
  ewmh_set_window_popup(Window wnd)
  {
! 	Atom atoms[2] = { g_net_wm_state_skip_taskbar_atom, g_net_wm_state_skip_pager_atom };
! 
! 	XChangeProperty(g_display, wnd, g_net_wm_state_atom, XA_ATOM, 32, PropModeAppend, atoms, 2);
  }
  
--- 360,370 ----
  
  
! int
  ewmh_set_window_popup(Window wnd)
  {
! 	if (ewmh_add_state(wnd, g_net_wm_state_skip_taskbar_atom, g_net_wm_state_skip_pager_atom) <
! 	    0)
! 		return -1;
! 	return 0;
  }
  

Index: xproto.h
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/xproto.h,v
retrieving revision 1.4.2.4
retrieving revision 1.4.2.5
diff -C2 -d -r1.4.2.4 -r1.4.2.5
*** xproto.h	15 Mar 2006 15:16:18 -0000	1.4.2.4
--- xproto.h	16 Mar 2006 08:41:53 -0000	1.4.2.5
***************
*** 8,10 ****
  int ewmh_get_window_desktop(Window wnd);
  void ewmh_set_wm_name(Window wnd, const char *title);
! void ewmh_set_window_popup(Window wnd);
--- 8,10 ----
  int ewmh_get_window_desktop(Window wnd);
  void ewmh_set_wm_name(Window wnd, const char *title);
! int ewmh_set_window_popup(Window wnd);

Index: xwin.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/xwin.c,v
retrieving revision 1.205.2.17
retrieving revision 1.205.2.18
diff -C2 -d -r1.205.2.17 -r1.205.2.18
*** xwin.c	16 Mar 2006 08:11:29 -0000	1.205.2.17
--- xwin.c	16 Mar 2006 08:41:53 -0000	1.205.2.18
***************
*** 55,58 ****
--- 55,59 ----
  	Window wnd;
  	unsigned long id;
+ 	unsigned long parent;
  	XWMHints *hints;
  	int xoffset, yoffset;
***************
*** 3087,3095 ****
  	}
  
- 	/* Handle popups without parents through some ewm hints */
- 	if (parent == 0xFFFFFFFF)
- 		ewmh_set_window_popup(wnd);
  	/* Set WM_TRANSIENT_FOR, if necessary */
! 	else if (parent != 0x00000000)
  	{
  		sw_parent = seamless_get_window_by_id(parent);
--- 3088,3093 ----
  	}
  
  	/* Set WM_TRANSIENT_FOR, if necessary */
! 	if ((parent != 0x00000000) && (parent != 0xFFFFFFFF))
  	{
  		sw_parent = seamless_get_window_by_id(parent);
***************
*** 3116,3119 ****
--- 3114,3118 ----
  	sw->wnd = wnd;
  	sw->id = id;
+ 	sw->parent = parent;
  	sw->hints = XAllocWMHints();
  	sw->hints->flags = 0;
***************
*** 3245,3248 ****
--- 3244,3251 ----
  	}
  
+ 	/* Handle popups without parents through some ewm hints */
+ 	if ((sw->state == SEAMLESSRDP_NOTYETMAPPED) && (sw->parent == 0xFFFFFFFF))
+ 		ewmh_set_window_popup(sw->wnd);
+ 
  	sw->state = state;
  }



-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642