summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/boxes.c1
-rw-r--r--src/core/display-private.h1
-rw-r--r--src/core/display.c145
-rw-r--r--src/core/frame.c23
-rw-r--r--src/core/prefs.c30
-rw-r--r--src/core/screen.c4
-rw-r--r--src/core/window-private.h2
-rw-r--r--src/core/window.c192
-rw-r--r--src/include/common.h17
-rw-r--r--src/include/errors.h1
-rw-r--r--src/include/prefs.h4
-rw-r--r--src/org.mate.marco.gschema.xml19
-rw-r--r--src/ui/ui.c1
13 files changed, 365 insertions, 75 deletions
diff --git a/src/core/boxes.c b/src/core/boxes.c
index 9ef8d94d..6262453e 100644
--- a/src/core/boxes.c
+++ b/src/core/boxes.c
@@ -26,6 +26,7 @@
* 02110-1301, USA.
*/
+#include <config.h>
#include "boxes.h"
#include "util.h"
#include <X11/Xutil.h> /* Just for the definition of the various gravities */
diff --git a/src/core/display-private.h b/src/core/display-private.h
index 70e3ce0d..f2e0f88e 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -192,6 +192,7 @@ struct _MetaDisplay {
int grab_wireframe_last_display_height;
GList* grab_old_window_stacking;
MetaEdgeResistanceData* grab_edge_resistance_data;
+ MetaWindow* grab_tile_match; /* Matching tiled window used for simultaneous resizing */
/* we use property updates as sentinels for certain window focus events
* to avoid some race conditions on EnterNotify events
diff --git a/src/core/display.c b/src/core/display.c
index ac63a3c6..44ffde0d 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -3666,6 +3666,22 @@ meta_display_begin_grab_op (MetaDisplay *display,
display->grab_tile_mode = META_TILE_NONE;
display->grab_tile_monitor_number = -1;
}
+
+ /* Find whether there's a tiled window that matches the one we're resizing. */
+ display->grab_tile_match = NULL;
+ if (window && meta_grab_op_is_resizing (op) && META_WINDOW_TILED (window))
+ {
+ int gravity = meta_resize_gravity_from_grab_op (op);
+
+ if ((window->tile_mode == META_TILE_LEFT && gravity == WestGravity) ||
+ (window->tile_mode == META_TILE_RIGHT && gravity == EastGravity) ||
+ (window->tile_mode == META_TILE_TOP_LEFT && (gravity == WestGravity || gravity == NorthWestGravity)) ||
+ (window->tile_mode == META_TILE_TOP_RIGHT && (gravity == EastGravity || gravity == NorthEastGravity)) ||
+ (window->tile_mode == META_TILE_BOTTOM_LEFT && (gravity == WestGravity || gravity == SouthWestGravity)) ||
+ (window->tile_mode == META_TILE_BOTTOM_RIGHT && (gravity == EastGravity || gravity == SouthEastGravity)))
+ display->grab_tile_match = meta_window_find_tile_match (window);
+ }
+
display->grab_anchor_root_x = root_x;
display->grab_anchor_root_y = root_y;
display->grab_latest_motion_x = root_x;
@@ -3846,6 +3862,8 @@ meta_display_end_grab_op (MetaDisplay *display,
if (display->grab_op == META_GRAB_OP_NONE)
return;
+ display->grab_tile_match = NULL;
+
if (display->grab_window != NULL)
display->grab_window->shaken_loose = FALSE;
@@ -4728,88 +4746,87 @@ meta_display_get_tab_list (MetaDisplay *display,
MetaScreen *screen,
MetaWorkspace *active_workspace)
{
- GList *tab_list, *mru_list, *l;
+ GList *tab_list, *window_list, *l;
+ GList *start_list, *mru_list, *end_list;
+ MetaMinimizedWindowPlacement minimized_placement;
+ MetaUrgentWindowPlacement urgent_placement;
+ gboolean all_workspaces;
g_return_val_if_fail (active_workspace != NULL, NULL);
- /* Build MRU list based on whether we use global or per-workspace */
- if (type == META_TAB_LIST_NORMAL_ALL_WORKSPACES)
- {
- /* Create global MRU list sorted by user_time */
- GSList *windows = meta_display_list_windows (display);
- GSList *w;
+ /* Get user preferences */
+ minimized_placement = meta_prefs_get_alt_tab_minimized_placement ();
+ urgent_placement = meta_prefs_get_alt_tab_urgent_placement ();
- mru_list = NULL;
- for (w = windows; w; w = w->next)
- {
- MetaWindow *window = w->data;
- if (window->screen == screen)
- mru_list = g_list_prepend (mru_list, window);
- }
+ /* Determine workspace scope */
+ all_workspaces = (type == META_TAB_LIST_NORMAL_ALL_WORKSPACES);
+ if (all_workspaces)
+ type = META_TAB_LIST_NORMAL;
- mru_list = g_list_sort (mru_list, mru_cmp);
+ /* Build a complete window list from all windows */
+ GSList *windows = meta_display_list_windows (display);
+ GSList *w;
- g_slist_free (windows);
- type = META_TAB_LIST_NORMAL;
- }
- else
+ window_list = NULL;
+ for (w = windows; w; w = w->next)
{
- mru_list = g_list_copy (active_workspace->mru_list);
+ MetaWindow *window = w->data;
+ if (window->screen == screen)
+ window_list = g_list_prepend (window_list, window);
}
+ window_list = g_list_sort (window_list, mru_cmp);
- tab_list = NULL;
- /* Windows sellout mode - MRU order. Collect unminimized windows
- * then minimized so minimized windows aren't in the way so much.
- */
- for (l = mru_list; l != NULL; l = l->next)
- {
- MetaWindow *window = l->data;
+ g_slist_free (windows);
- if (!window->minimized &&
- window->screen == screen &&
- IN_TAB_CHAIN (window, type))
- tab_list = g_list_prepend (tab_list, window);
- }
+ /* Initialize placement buckets */
+ start_list = NULL;
+ mru_list = NULL;
+ end_list = NULL;
- for (l = mru_list; l != NULL; l = l->next)
+ /* Windows sellout mode - MRU order. Collect windows into placement
+ * buckets to sort based on user preferences.
+ */
+ for (l = window_list; l != NULL; l = l->next)
{
MetaWindow *window = l->data;
+ gboolean include_window;
- if (window->minimized &&
- window->screen == screen &&
- IN_TAB_CHAIN (window, type))
- tab_list = g_list_prepend (tab_list, window);
- }
+ if (window->screen != screen || !IN_TAB_CHAIN (window, type))
+ continue;
- tab_list = g_list_reverse (tab_list);
+ /* Determine if window should be included based on workspace */
+ include_window = all_workspaces ||
+ meta_window_located_on_workspace (window, active_workspace);
- {
- GSList *windows, *tmp;
- MetaWindow *l_window;
-
- windows = meta_display_list_windows (display);
- tmp = windows;
-
- /* Go through all windows */
- while (tmp != NULL)
- {
- l_window=tmp->data;
-
- /* Check to see if it demands attention */
- if (l_window->wm_state_demands_attention &&
- l_window->workspace!=active_workspace &&
- IN_TAB_CHAIN (l_window, type))
- {
- /* if it does, add it to the popup */
- tab_list = g_list_prepend (tab_list, l_window);
- }
+ /* Handle minimized windows */
+ if (window->minimized && include_window)
+ {
+ if (minimized_placement == META_MINIMIZED_WINDOW_PLACEMENT_MRU)
+ mru_list = g_list_append (mru_list, window);
+ else if (minimized_placement == META_MINIMIZED_WINDOW_PLACEMENT_END)
+ end_list = g_list_append (end_list, window);
+ /* HIDDEN: skip */
+ }
+ /* Handle urgent windows */
+ else if (window->wm_state_demands_attention)
+ {
+ if (urgent_placement == META_URGENT_WINDOW_PLACEMENT_START)
+ start_list = g_list_append (start_list, window);
+ else
+ mru_list = g_list_append (mru_list, window);
+ }
+ /* Handle normal unminimized windows */
+ else if (include_window)
+ {
+ mru_list = g_list_append (mru_list, window);
+ }
+ }
- tmp = tmp->next;
- } /* End while tmp!=NULL */
- g_slist_free (windows);
- }
+ /* Concatenate buckets: start + MRU + end */
+ tab_list = g_list_concat (start_list, mru_list);
+ tab_list = g_list_concat (tab_list, end_list);
- g_list_free (mru_list);
+ g_list_free (window_list);
return tab_list;
}
diff --git a/src/core/frame.c b/src/core/frame.c
index a8ba65c0..caf8af94 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -170,6 +170,7 @@ meta_window_destroy_frame (MetaWindow *window)
{
MetaFrame *frame;
MetaFrameBorders borders;
+ int offset_x, offset_y;
if (window->frame == NULL)
return;
@@ -198,6 +199,24 @@ meta_window_destroy_frame (MetaWindow *window)
"Incrementing unmaps_pending on %s for reparent back to root\n", window->desc);
window->unmaps_pending += 1;
}
+
+ /* Account for window gravity when choosing where to place the client
+ * on the root window, so that re-managing it doesn't shift its
+ * position. StaticGravity clients (e.g. Qt) expect the client's own
+ * position; other gravities need the visible frame corner so that
+ * adjust_for_gravity() can add the borders back correctly.
+ */
+ if (window->size_hints.win_gravity == StaticGravity)
+ {
+ offset_x = frame->child_x;
+ offset_y = frame->child_y;
+ }
+ else
+ {
+ offset_x = borders.invisible.left;
+ offset_y = borders.invisible.top;
+ }
+
XReparentWindow (window->display->xdisplay,
window->xwindow,
window->screen->xroot,
@@ -205,8 +224,8 @@ meta_window_destroy_frame (MetaWindow *window)
* coordinates here means we'll need to ensure a configure
* notify event is sent; see bug 399552.
*/
- window->frame->rect.x + borders.invisible.left,
- window->frame->rect.y + borders.invisible.top);
+ window->frame->rect.x + offset_x,
+ window->frame->rect.y + offset_y);
meta_error_trap_pop (window->display, FALSE);
meta_ui_destroy_frame_window (window->screen->ui, frame->xwindow);
diff --git a/src/core/prefs.c b/src/core/prefs.c
index e1e09153..65bd1228 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -123,6 +123,8 @@ static int icon_size = META_DEFAULT_ICON_SIZE;
static int alt_tab_max_columns = META_DEFAULT_ALT_TAB_MAX_COLUMNS;
static gboolean alt_tab_raise_windows = META_DEFAULT_ALT_TAB_RAISE_WINDOWS;
static gboolean alt_tab_expand_to_fit_title = META_DEFAULT_ALT_TAB_EXPAND_TO_FIT_TITLE;
+static MetaMinimizedWindowPlacement alt_tab_minimized_placement = META_DEFAULT_ALT_TAB_MINIMIZED_PLACEMENT;
+static MetaUrgentWindowPlacement alt_tab_urgent_placement = META_DEFAULT_ALT_TAB_URGENT_PLACEMENT;
static gboolean use_force_compositor_manager = FALSE;
static gboolean force_compositor_manager = FALSE;
static gboolean compositing_manager = FALSE;
@@ -350,6 +352,16 @@ static MetaEnumPreference preferences_enum[] =
META_PREF_PLACEMENT_MODE,
(gint *) &placement_mode,
},
+ { "alt-tab-minimized-placement",
+ KEY_GENERAL_SCHEMA,
+ META_PREF_ALT_TAB_MINIMIZED_PLACEMENT,
+ (gint *) &alt_tab_minimized_placement,
+ },
+ { "alt-tab-urgent-placement",
+ KEY_GENERAL_SCHEMA,
+ META_PREF_ALT_TAB_URGENT_PLACEMENT,
+ (gint *) &alt_tab_urgent_placement,
+ },
{ NULL, NULL, 0, NULL },
};
@@ -1190,6 +1202,18 @@ meta_prefs_get_alt_tab_raise_windows (void)
return alt_tab_raise_windows;
}
+MetaMinimizedWindowPlacement
+meta_prefs_get_alt_tab_minimized_placement (void)
+{
+ return alt_tab_minimized_placement;
+}
+
+MetaUrgentWindowPlacement
+meta_prefs_get_alt_tab_urgent_placement (void)
+{
+ return alt_tab_urgent_placement;
+}
+
gboolean
meta_prefs_is_in_skip_list (char *class)
{
@@ -1729,6 +1753,12 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_ALT_TAB_RAISE_WINDOWS:
return "ALT_TAB_RAISE_WINDOWS";
+ case META_PREF_ALT_TAB_MINIMIZED_PLACEMENT:
+ return "ALT_TAB_MINIMIZED_PLACEMENT";
+
+ case META_PREF_ALT_TAB_URGENT_PLACEMENT:
+ return "ALT_TAB_URGENT_PLACEMENT";
+
case META_PREF_COMPOSITING_MANAGER:
return "COMPOSITING_MANAGER";
diff --git a/src/core/screen.c b/src/core/screen.c
index f6f1c14a..73de3695 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -529,7 +529,7 @@ meta_screen_new (MetaDisplay *display,
gc_values.line_width = META_WIREFRAME_XOR_LINE_WIDTH;
value_mask |= GCLineWidth;
- font_info = XLoadQueryFont (screen->display->xdisplay, "fixed");
+ font_info = XLoadQueryFont (screen->display->xdisplay, "10x20");
if (font_info != NULL)
{
@@ -538,7 +538,7 @@ meta_screen_new (MetaDisplay *display,
XFreeFontInfo (NULL, font_info, 1);
}
else
- meta_warning ("xserver doesn't have 'fixed' font.\n");
+ meta_warning ("xserver doesn't have '10x20' font.\n");
screen->root_xor_gc = XCreateGC (screen->display->xdisplay,
screen->xroot,
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 8ce9a121..83d0d6ae 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -642,6 +642,8 @@ void meta_window_get_work_area_all_xineramas (MetaWindow *window,
void meta_window_get_current_tile_area (MetaWindow *window,
MetaRectangle *tile_area);
+MetaWindow* meta_window_find_tile_match (MetaWindow *window);
+
gboolean meta_window_same_application (MetaWindow *window,
MetaWindow *other_window);
diff --git a/src/core/window.c b/src/core/window.c
index cdf7ab3b..4c8a3914 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -2158,6 +2158,14 @@ meta_window_show (MetaWindow *window)
if (!window->placed)
window->denied_focus_and_not_transient = TRUE;
}
+ else if (window->type == META_WINDOW_MODAL_DIALOG)
+ {
+ /* Keep the non-modal transient behavior from 6ea23df for GTK
+ * popups and VLC controls, but focus modal dialogs that block
+ * the focused ancestor.
+ */
+ takes_focus_on_map = TRUE;
+ }
}
if (!window->placed)
@@ -4238,14 +4246,17 @@ meta_window_get_xor_rect (MetaWindow *window,
{
if (window->frame)
{
- xor_rect->x = grab_wireframe_rect->x - window->frame->child_x;
- xor_rect->y = grab_wireframe_rect->y - window->frame->child_y;
- xor_rect->width = grab_wireframe_rect->width + window->frame->child_x + window->frame->right_width;
+ MetaFrameBorders borders;
+ meta_frame_calc_borders (window->frame, &borders);
+
+ xor_rect->x = grab_wireframe_rect->x - window->frame->child_x + borders.invisible.left;
+ xor_rect->y = grab_wireframe_rect->y - window->frame->child_y + borders.invisible.top;
+ xor_rect->width = grab_wireframe_rect->width + window->frame->child_x + window->frame->right_width - borders.invisible.left - borders.invisible.right;
if (window->shaded)
- xor_rect->height = window->frame->child_y;
+ xor_rect->height = window->frame->child_y - borders.invisible.top;
else
- xor_rect->height = grab_wireframe_rect->height + window->frame->child_y + window->frame->bottom_height;
+ xor_rect->height = grab_wireframe_rect->height + window->frame->child_y + window->frame->bottom_height - borders.invisible.top - borders.invisible.bottom;
}
else
*xor_rect = *grab_wireframe_rect;
@@ -4991,7 +5002,7 @@ meta_window_move_resize_request (MetaWindow *window,
* workarea smaller than the monitor.
*/
if (meta_prefs_get_force_fullscreen() &&
- (window->decorated || !meta_window_is_client_decorated (window)) &&
+ (!window->decorated && !meta_window_is_client_decorated (window)) &&
meta_rectangle_equal (&rect, &xinerama_info->rect) &&
window->has_fullscreen_func &&
!window->fullscreen)
@@ -7872,6 +7883,34 @@ update_resize (MetaWindow *window,
gravity = meta_resize_gravity_from_grab_op (window->display->grab_op);
g_assert (gravity >= 0);
+ /* Clamp resize to respect the minimum size of the matched window */
+ if (window->display->grab_tile_match != NULL)
+ {
+ MetaWindow *match = window->display->grab_tile_match;
+ MetaRectangle work_area;
+ MetaFrameBorders borders;
+ int max_primary_width;
+ int primary_borders_w = 0;
+ int match_borders_w = 0;
+
+ meta_window_get_work_area_for_xinerama (window,
+ window->tile_monitor_number,
+ &work_area);
+
+ /* Use visible borders only since invisible borders overlap between
+ * adjacent tiled windows and don't consume work area space */
+ meta_frame_calc_borders (window->frame, &borders);
+ primary_borders_w = borders.visible.left + borders.visible.right;
+
+ meta_frame_calc_borders (match->frame, &borders);
+ match_borders_w = borders.visible.left + borders.visible.right;
+
+ max_primary_width = work_area.width - primary_borders_w -
+ match->size_hints.min_width - match_borders_w;
+ if (new_w > max_primary_width)
+ new_w = max_primary_width;
+ }
+
/* Do any edge resistance/snapping */
meta_window_edge_resistance_for_resize (window,
old.width,
@@ -7906,6 +7945,61 @@ update_resize (MetaWindow *window,
meta_window_resize_with_gravity (window, TRUE, new_w, new_h, gravity);
}
+ /* Resize matching tiled window */
+ if (window->display->grab_tile_match != NULL && !window->display->grab_wireframe_active)
+ {
+ MetaWindow *match = window->display->grab_tile_match;
+
+ /* Validate match is still valid */
+ if (!match->tiled || match->minimized || match->workspace != window->workspace)
+ {
+ window->display->grab_tile_match = NULL;
+ }
+ else
+ {
+ MetaRectangle work_area;
+ MetaFrameBorders borders;
+ int match_gravity;
+ int match_width;
+ int primary_borders_w = 0;
+ int match_borders_w = 0;
+
+ meta_window_get_work_area_for_xinerama (window,
+ window->tile_monitor_number,
+ &work_area);
+
+ /* Use visible borders only since invisible borders overlap between
+ * adjacent tiled windows and don't consume work area space */
+ meta_frame_calc_borders (window->frame, &borders);
+ primary_borders_w = borders.visible.left + borders.visible.right;
+
+ meta_frame_calc_borders (match->frame, &borders);
+ match_borders_w = borders.visible.left + borders.visible.right;
+
+ /* Match client width */
+ match_width = work_area.width - window->rect.width - primary_borders_w - match_borders_w;
+
+ /* Determine what gravity to use regardless of
+ * whether it's corner tiled or edge tiled. */
+ if (match->tile_mode == META_TILE_LEFT ||
+ match->tile_mode == META_TILE_TOP_LEFT ||
+ match->tile_mode == META_TILE_BOTTOM_LEFT)
+ match_gravity = WestGravity;
+ else
+ match_gravity = EastGravity;
+
+ /* Do the actual resize of the matching window */
+ if (match_width >= match->size_hints.min_width)
+ {
+ match->tile_resized = TRUE;
+ meta_window_resize_with_gravity (match, TRUE,
+ match_width,
+ match->rect.height, /* keep original height */
+ match_gravity);
+ }
+ }
+ }
+
/* Store the latest resize time, if we actually resized. */
if (window->rect.width != old.width || window->rect.height != old.height)
window->display->grab_last_moveresize_time = g_get_real_time ();
@@ -8324,6 +8418,92 @@ meta_window_get_current_tile_area (MetaWindow *window,
tile_area->width = width;
}
+MetaWindow*
+meta_window_find_tile_match (MetaWindow *window)
+{
+ MetaTileMode opposite_mode;
+ GList *windows, *l;
+
+ if (!window->tiled || !window->frame)
+ return NULL;
+
+ switch (window->tile_mode)
+ {
+ case META_TILE_LEFT:
+ opposite_mode = META_TILE_RIGHT;
+ break;
+ case META_TILE_RIGHT:
+ opposite_mode = META_TILE_LEFT;
+ break;
+ case META_TILE_TOP_LEFT:
+ opposite_mode = META_TILE_TOP_RIGHT;
+ break;
+ case META_TILE_TOP_RIGHT:
+ opposite_mode = META_TILE_TOP_LEFT;
+ break;
+ case META_TILE_BOTTOM_LEFT:
+ opposite_mode = META_TILE_BOTTOM_RIGHT;
+ break;
+ case META_TILE_BOTTOM_RIGHT:
+ opposite_mode = META_TILE_BOTTOM_LEFT;
+ break;
+ default:
+ return NULL;
+ }
+
+ /* Use stack list and iterate backwards since meta_stack_list_windows returns
+ * bottom-to-top order. We want to match the most likely visible window */
+ windows = meta_stack_list_windows (window->screen->stack, window->workspace);
+
+ for (l = g_list_last (windows); l != NULL; l = l->prev)
+ {
+ MetaWindow *candidate = l->data;
+
+ /* Skip itself, non-tiled windows, and windows without frames (e.g. docks, etc.) */
+ if (candidate == window || !candidate->tiled || !candidate->frame)
+ continue;
+
+ /* Skip windows that don't match the opposite tile mode */
+ if (candidate->tile_mode != opposite_mode)
+ continue;
+
+ /* Skip windows on different monitors */
+ if (candidate->tile_monitor_number != window->tile_monitor_number)
+ continue;
+
+ /* Skip windows not visible in the current workspace (e.g. minimized) */
+ if (!meta_window_showing_on_its_workspace (candidate))
+ continue;
+
+ /* Since windows can be tiled at different sizes, we verify that their
+ * edges touch (or at least are close enough) */
+ MetaRectangle win_rect, cand_rect;
+ int tolerance = 8; /* pixels */
+
+ meta_window_get_outer_rect (window, &win_rect);
+ meta_window_get_outer_rect (candidate, &cand_rect);
+
+ if (window->tile_mode == META_TILE_LEFT ||
+ window->tile_mode == META_TILE_TOP_LEFT ||
+ window->tile_mode == META_TILE_BOTTOM_LEFT)
+ {
+ if (ABS (win_rect.x + win_rect.width - cand_rect.x) > tolerance)
+ continue;
+ }
+ else
+ {
+ if (ABS (cand_rect.x + cand_rect.width - win_rect.x) > tolerance)
+ continue;
+ }
+
+ g_list_free (windows);
+ return candidate;
+ }
+
+ g_list_free (windows);
+ return NULL;
+}
+
gboolean
meta_window_same_application (MetaWindow *window,
MetaWindow *other_window)
diff --git a/src/include/common.h b/src/include/common.h
index a0dfb69c..06f63bf5 100644
--- a/src/include/common.h
+++ b/src/include/common.h
@@ -211,6 +211,19 @@ typedef enum
typedef enum
{
+ META_MINIMIZED_WINDOW_PLACEMENT_MRU,
+ META_MINIMIZED_WINDOW_PLACEMENT_END,
+ META_MINIMIZED_WINDOW_PLACEMENT_HIDDEN
+} MetaMinimizedWindowPlacement;
+
+typedef enum
+{
+ META_URGENT_WINDOW_PLACEMENT_START,
+ META_URGENT_WINDOW_PLACEMENT_MRU
+} MetaUrgentWindowPlacement;
+
+typedef enum
+{
META_FRAME_TYPE_NORMAL,
META_FRAME_TYPE_DIALOG,
META_FRAME_TYPE_MODAL_DIALOG,
@@ -328,7 +341,7 @@ void meta_frame_borders_clear (MetaFrameBorders *self);
#define META_MINI_ICON_WIDTH 16
#define META_MINI_ICON_HEIGHT 16
-#define META_DEFAULT_ICON_NAME "preferences-desktop-theme"
+#define META_DEFAULT_ICON_NAME "application-x-executable"
#define META_PRIORITY_PREFS_NOTIFY (G_PRIORITY_DEFAULT_IDLE + 10)
#define META_PRIORITY_WORK_AREA_HINT (G_PRIORITY_DEFAULT_IDLE + 15)
@@ -355,5 +368,7 @@ typedef enum
#define META_DEFAULT_ALT_TAB_RAISE_WINDOWS FALSE
#define META_DEFAULT_ALT_TAB_EXPAND_TO_FIT_TITLE FALSE
+#define META_DEFAULT_ALT_TAB_MINIMIZED_PLACEMENT META_MINIMIZED_WINDOW_PLACEMENT_END
+#define META_DEFAULT_ALT_TAB_URGENT_PLACEMENT META_URGENT_WINDOW_PLACEMENT_START
#endif
diff --git a/src/include/errors.h b/src/include/errors.h
index 9282099c..50bc1f2a 100644
--- a/src/include/errors.h
+++ b/src/include/errors.h
@@ -26,6 +26,7 @@
#include <X11/Xlib.h>
+#include <config.h>
#include "util.h"
#include "display.h"
diff --git a/src/include/prefs.h b/src/include/prefs.h
index 1170e8e8..bf748e28 100644
--- a/src/include/prefs.h
+++ b/src/include/prefs.h
@@ -73,6 +73,8 @@ typedef enum
META_PREF_ALT_TAB_MAX_COLUMNS,
META_PREF_ALT_TAB_RAISE_WINDOWS,
META_PREF_ALT_TAB_EXPAND_TO_FIT_TITLE,
+ META_PREF_ALT_TAB_MINIMIZED_PLACEMENT,
+ META_PREF_ALT_TAB_URGENT_PLACEMENT,
META_PREF_COMPOSITING_MANAGER,
META_PREF_COMPOSITING_FAST_ALT_TAB,
META_PREF_RESIZE_WITH_RIGHT_BUTTON,
@@ -151,6 +153,8 @@ int meta_prefs_get_icon_size (void);
int meta_prefs_get_alt_tab_max_columns (void);
gboolean meta_prefs_get_alt_tab_expand_to_fit_title (void);
gboolean meta_prefs_get_alt_tab_raise_windows (void);
+MetaMinimizedWindowPlacement meta_prefs_get_alt_tab_minimized_placement (void);
+MetaUrgentWindowPlacement meta_prefs_get_alt_tab_urgent_placement (void);
gboolean meta_prefs_get_compositing_manager (void);
gboolean meta_prefs_get_compositing_fast_alt_tab (void);
gboolean meta_prefs_get_center_new_windows (void);
diff --git a/src/org.mate.marco.gschema.xml b/src/org.mate.marco.gschema.xml
index ec80cf40..158ab00f 100644
--- a/src/org.mate.marco.gschema.xml
+++ b/src/org.mate.marco.gschema.xml
@@ -41,6 +41,15 @@
<value value="1" nick="pointer"/>
<value value="2" nick="manual"/>
</enum>
+ <enum id="org.mate.Marco.MinimizedWindowPlacement">
+ <value nick="mru" value="0"/>
+ <value nick="end" value="1"/>
+ <value nick="hidden" value="2"/>
+ </enum>
+ <enum id="org.mate.Marco.UrgentWindowPlacement">
+ <value nick="start" value="0"/>
+ <value nick="mru" value="1"/>
+ </enum>
<schema id="org.mate.Marco" path="/org/mate/marco/">
<child name="general" schema="org.mate.Marco.general"/>
@@ -244,6 +253,16 @@
<summary>Raise windows to surface while cycling alt-tab popup</summary>
<description>While using the popup window, selected windows will be raised to make them easy to identify.</description>
</key>
+ <key name="alt-tab-minimized-placement" enum="org.mate.Marco.MinimizedWindowPlacement">
+ <default>'end'</default>
+ <summary>Minimized window placement</summary>
+ <description>Where to show minimized windows: mix in MRU order, show last (default), or hide completely.</description>
+ </key>
+ <key name="alt-tab-urgent-placement" enum="org.mate.Marco.UrgentWindowPlacement">
+ <default>'start'</default>
+ <summary>Urgent window placement</summary>
+ <description>Where to show urgent windows: first (default) or mixed in MRU order.</description>
+ </key>
</schema>
<schema id="org.mate.Marco.workspace-names" path="/org/mate/marco/workspace-names/">
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 00500c03..7abfa45b 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -20,6 +20,7 @@
* 02110-1301, USA.
*/
+#include <config.h>
#include "prefs.h"
#include "ui.h"
#include "frames.h"