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