Remove non-normal windows from task list.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@25626 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2007-11-29 00:56:11 +00:00
parent 1966afda06
commit b5fc3678f3
3 changed files with 52 additions and 22 deletions

View file

@ -1,3 +1,11 @@
2007-11-29 Fred Kiefer <FredKiefer@gmx.de>
* Headers/x11/XGGeneric.h: Add atoms for new window types. Add
definition of _NET_WM_STATE_ADD and _NET_WM_STATE_REMOVE
* Source/x11/XGServerWindow.m (-setwindowlevel::): Better setting
of skip state for window.
* Source/x11/XGServerWindow.m (-orderwindow:::): Use it here as well.
2007-11-22 Fred Kiefer <FredKiefer@gmx.de>
* Source/gsc/GSContext.m (-GSDrawImage:):Implement via

View file

@ -50,11 +50,18 @@ typedef struct {
Atom win_splash_atom;
Atom win_override_atom;
Atom win_topmenu_atom;
Atom win_popup_menu_atom;
Atom win_dropdown_menu_atom;
Atom win_tooltip_atom;
Atom win_notification_atom;
Atom win_combo_atom;
Atom win_dnd_atom;
} XGWMWinTypes;
typedef struct {
Atom net_wm_state_atom;
Atom net_wm_state_skip_taskbar_atom;
Atom net_wm_state_skip_pager_atom;
} XGWMNetStates;
/*
@ -126,5 +133,10 @@ struct XGGeneric {
#define WIN_LAYER_ABOVE_DOCK 10
#define WIN_LAYER_MENU 12
/* NET WM State */
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
#endif

View file

@ -1181,6 +1181,19 @@ _get_next_prop_new_event(Display *display, XEvent *event, char *arg)
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_UTILITY", False);
generic.wintypes.win_splash_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_SPLASH", False);
// New in wmspec 1.4
generic.wintypes.win_popup_menu_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_POPUP_MENU", False);
generic.wintypes.win_dropdown_menu_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False);
generic.wintypes.win_tooltip_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_TOOLTIP", False);
generic.wintypes.win_notification_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_NOTIFICATION", False);
generic.wintypes.win_combo_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_COMBO", False);
generic.wintypes.win_dnd_atom =
XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DND", False);
//KDE extensions
generic.wintypes.win_override_atom =
XInternAtom(dpy, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", False);
@ -1192,6 +1205,8 @@ _get_next_prop_new_event(Display *display, XEvent *event, char *arg)
XInternAtom(dpy, "_NET_WM_STATE", False);
generic.netstates.net_wm_state_skip_taskbar_atom =
XInternAtom(dpy, "_NET_WM_STATE_SKIP_TASKBAR", False);
generic.netstates.net_wm_state_skip_pager_atom =
XInternAtom(dpy, "_NET_WM_STATE_SKIP_PAGER", False);
}
if (win1)
{
@ -2835,6 +2850,16 @@ static BOOL didCreatePixmaps;
*
* [self _resetDragTypesForWindow: GSWindowWithNumber(window->number)];
*/
if (window->win_attrs.window_level != NSNormalWindowLevel)
{
[self _sendRoot: window->root
type: generic.netstates.net_wm_state_atom
window: window->ident
data0: _NET_WM_STATE_ADD
data1: generic.netstates.net_wm_state_skip_taskbar_atom
data2: generic.netstates.net_wm_state_skip_pager_atom
data3: 1];
}
}
XFlush(dpy);
}
@ -3031,7 +3056,6 @@ static BOOL didCreatePixmaps;
- (void) setwindowlevel: (int)level : (int)win
{
static Atom net_wm_state_skip_pager = None;
gswindow_device_t *window;
window = WINDOW_WITH_TAG(win);
@ -3124,6 +3148,7 @@ static BOOL didCreatePixmaps;
data[1] = generic.wintypes.win_floating_atom;
len = 2;
#else
// data[0] = generic.wintypes.win_popup_menu_atom;
data[0] = generic.wintypes.win_modal_atom;
len = 1;
#endif
@ -3149,42 +3174,27 @@ static BOOL didCreatePixmaps;
* This feature is only needed for window managers that cannot properly
* handle the window type set above.
*/
if (skipTaskbar)
if (skipTaskbar)
{
static Atom net_wm_state_add = None;
if (net_wm_state_add == None)
net_wm_state_add = XInternAtom(dpy, "_NET_WM_STATE_ADD", False);
if (net_wm_state_skip_pager == None)
net_wm_state_skip_pager = XInternAtom(dpy, "_NET_WM_STATE_SKIP_PAGER",
False);
[self _sendRoot: window->root
type: generic.netstates.net_wm_state_atom
window: window->ident
data0: net_wm_state_add
data0: _NET_WM_STATE_ADD
data1: generic.netstates.net_wm_state_skip_taskbar_atom
data2: net_wm_state_skip_pager
data2: generic.netstates.net_wm_state_skip_pager_atom
data3: 1];
}
else
{
static Atom net_wm_state_remove = None;
if (net_wm_state_remove == None)
net_wm_state_remove = XInternAtom(dpy, "_NET_WM_STATE_REMOVE", False);
if (net_wm_state_skip_pager == None)
net_wm_state_skip_pager = XInternAtom(dpy, "_NET_WM_STATE_SKIP_PAGER",
False);
[self _sendRoot: window->root
type: generic.netstates.net_wm_state_atom
window: window->ident
data0: net_wm_state_remove
data0: _NET_WM_STATE_REMOVE
data1: generic.netstates.net_wm_state_skip_taskbar_atom
data2: net_wm_state_skip_pager
data2: generic.netstates.net_wm_state_skip_pager_atom
data3: 1];
}
}
}
else if ((generic.wm & XGWM_GNOME) != 0)
{
long flag = WIN_LAYER_NORMAL;