mark a window as needing or not needing the user's attention use the new

2006-03-29  Thomas Thurman   <thomas@thurman.org.uk>
        * src/window.c, src/window.h (meta_window_set_demands_attention,
        meta_window_unset_demands_attention): mark a window as needing
        or not needing the user's attention
        * src/window.c (meta_window_show, window_activate,
        meta_window_focus, meta_window_configure_request,
        meta_window_client_message): use the new set/unset
        demands attention functions. Fixes #305822.
This commit is contained in:
Thomas Thurman 2006-03-29 18:43:22 +00:00 committed by Thomas James Alexander Thurman
parent 28aeacb247
commit cf3deef6ea
3 changed files with 94 additions and 15 deletions

View File

@ -1,3 +1,12 @@
2006-03-29 Thomas Thurman <thomas@thurman.org.uk>
* src/window.c, src/window.h (meta_window_set_demands_attention,
meta_window_unset_demands_attention): mark a window as needing
or not needing the user's attention
* src/window.c (meta_window_show, window_activate,
meta_window_focus, meta_window_configure_request,
meta_window_client_message): use the new set/unset
demands attention functions. Fixes #305822.
2006-03-29 Björn Lindqvist <bjourne@gmail.com> 2006-03-29 Björn Lindqvist <bjourne@gmail.com>
* src/resizepopup.c: * src/resizepopup.c:

View File

@ -2006,6 +2006,11 @@ meta_window_show (MetaWindow *window)
/* If the window will be obscured by the focus window, then the /* If the window will be obscured by the focus window, then the
* user might not notice the window appearing so set the * user might not notice the window appearing so set the
* demands attention hint. * demands attention hint.
*
* We set the hint ourselves rather than calling
* meta_window_set_demands_attention() because that would cause
* a recalculation of overlap, and a call to set_net_wm_state()
* which we are going to call ourselves here a few lines down.
*/ */
if (overlap) if (overlap)
window->wm_state_demands_attention = TRUE; window->wm_state_demands_attention = TRUE;
@ -2484,8 +2489,7 @@ window_activate (MetaWindow *window,
"last_user_time (%lu) is more recent; ignoring " "last_user_time (%lu) is more recent; ignoring "
" _NET_ACTIVE_WINDOW message.\n", " _NET_ACTIVE_WINDOW message.\n",
window->display->last_user_time); window->display->last_user_time);
window->wm_state_demands_attention = TRUE; meta_window_set_demands_attention(window);
set_net_wm_state (window);
return; return;
} }
@ -3758,10 +3762,7 @@ meta_window_focus (MetaWindow *window,
} }
if (window->wm_state_demands_attention) if (window->wm_state_demands_attention)
{ meta_window_unset_demands_attention(window);
window->wm_state_demands_attention = FALSE;
set_net_wm_state (window);
}
} }
static void static void
@ -4281,10 +4282,7 @@ meta_window_configure_request (MetaWindow *window,
active_window->desc, active_window->desc,
active_window->net_wm_user_time); active_window->net_wm_user_time);
if (event->xconfigurerequest.detail == Above) if (event->xconfigurerequest.detail == Above)
{ meta_window_set_demands_attention(window);
window->wm_state_demands_attention = TRUE;
set_net_wm_state (window);
}
} }
else else
{ {
@ -4530,11 +4528,11 @@ meta_window_client_message (MetaWindow *window,
if (first == display->atom_net_wm_state_demands_attention || if (first == display->atom_net_wm_state_demands_attention ||
second == display->atom_net_wm_state_demands_attention) second == display->atom_net_wm_state_demands_attention)
{ {
window->wm_state_demands_attention = if ((action == _NET_WM_STATE_ADD) ||
(action == _NET_WM_STATE_ADD) || (action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention))
(action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention); meta_window_set_demands_attention(window);
else
set_net_wm_state (window); meta_window_unset_demands_attention(window);
} }
return TRUE; return TRUE;
@ -7656,3 +7654,72 @@ meta_window_set_user_time (MetaWindow *window,
window->display->allow_terminal_deactivation = FALSE; window->display->allow_terminal_deactivation = FALSE;
} }
} }
/* Sets the demands_attention hint on a window, but only
* if it's at least partially obscured (see #305882).
*/
void
meta_window_set_demands_attention (MetaWindow *window)
{
MetaRectangle candidate_rect, other_rect;
GList *stack = window->screen->stack->sorted;
MetaWindow *other_window;
gboolean obscured = FALSE;
/* Does the window have any other window on this workspace
* overlapping it?
*/
meta_window_get_outer_rect (window, &candidate_rect);
/* The stack is sorted with the top windows first. */
while (stack != NULL && stack->data != window)
{
other_window = stack->data;
stack = stack->next;
if (other_window->on_all_workspaces ||
window->on_all_workspaces ||
other_window->workspace == window->workspace)
{
meta_window_get_outer_rect (other_window, &other_rect);
if (meta_rectangle_overlap (&candidate_rect, &other_rect))
{
obscured = TRUE;
break;
}
}
}
/* If the window's in full view, there's no point setting the flag. */
if (!obscured)
{
meta_topic (META_DEBUG_WINDOW_OPS,
"Not marking %s as needing attention because it's in full view\n",
window->desc);
return;
}
/* Otherwise, go ahead and set the flag. */
meta_topic (META_DEBUG_WINDOW_OPS,
"Marking %s as needing attention\n", window->desc);
window->wm_state_demands_attention = TRUE;
set_net_wm_state (window);
}
void
meta_window_unset_demands_attention (MetaWindow *window)
{
meta_topic (META_DEBUG_WINDOW_OPS,
"Marking %s as not needing attention\n", window->desc);
window->wm_state_demands_attention = FALSE;
set_net_wm_state (window);
}

View File

@ -582,4 +582,7 @@ void meta_window_stack_just_below (MetaWindow *window,
void meta_window_set_user_time (MetaWindow *window, void meta_window_set_user_time (MetaWindow *window,
Time timestamp); Time timestamp);
void meta_window_set_demands_attention (MetaWindow *window);
void meta_window_unset_demands_attention (MetaWindow *window);
#endif #endif