/**
* SECTION:hildon-window-stack
- * @short_description: Object representing a stack of windows in the Hildon framework
+ * @short_description: A stack of windows in Hildon applications.
* @see_also: #HildonStackableWindow
*
- * The #HildonWindowStack is an object used to represent a stack of
- * windows in the Hildon framework.
+ * The #HildonWindowStack is a stack of top-level windows.
*
* Stacks contain all #HildonStackableWindow<!-- -->s that are being
* shown. The user can only interact with the topmost window from each
if (current_stack == NULL) {
GtkWidget *parent = hildon_window_stack_peek (stack);
+ gint pos = 0;
+
+ if (parent) {
+ pos = HILDON_STACKABLE_WINDOW_GET_PRIVATE (parent)->stack_position + 1;
+ }
/* Push the window */
- hildon_stackable_window_set_stack (win, stack, g_list_length (stack->priv->list));
+ hildon_stackable_window_set_stack (win, stack, pos);
stack->priv->list = g_list_prepend (stack->priv->list, win);
/* Make the window part of the same group as its parent */
GList **popped_windows,
GList *list)
{
- gint i;
+ gint i, topmost_index;
GList *l;
GList *popped = NULL;
GList *pushed = NULL;
+ HildonStackableWindowPrivate *priv;
g_return_if_fail (HILDON_IS_WINDOW_STACK (stack));
g_return_if_fail (nwindows > 0);
g_return_if_fail (g_list_length (stack->priv->list) >= nwindows);
+ /* Store the index of the topmost window */
+ priv = HILDON_STACKABLE_WINDOW_GET_PRIVATE (hildon_window_stack_peek (stack));
+ topmost_index = priv->stack_position;
+
/* Pop windows */
for (i = 0; i < nwindows; i++) {
GtkWidget *win = _hildon_window_stack_do_pop (stack);
}
}
+ if (pushed != NULL) {
+ /* The WM will be confused if the old topmost window and the new
+ * one have the same index, so make sure that they're different */
+ priv = HILDON_STACKABLE_WINDOW_GET_PRIVATE (hildon_window_stack_peek (stack));
+ if (priv->stack_position == topmost_index) {
+ priv->stack_position++;
+ }
+ }
+
/* Show windows in reverse order (topmost first) */
g_list_foreach (pushed, (GFunc) gtk_widget_show, NULL);