diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/boxes.c | 1 | ||||
| -rw-r--r-- | src/core/display-private.h | 1 | ||||
| -rw-r--r-- | src/core/display.c | 145 | ||||
| -rw-r--r-- | src/core/frame.c | 23 | ||||
| -rw-r--r-- | src/core/prefs.c | 30 | ||||
| -rw-r--r-- | src/core/screen.c | 4 | ||||
| -rw-r--r-- | src/core/window-private.h | 2 | ||||
| -rw-r--r-- | src/core/window.c | 192 | ||||
| -rw-r--r-- | src/include/common.h | 17 | ||||
| -rw-r--r-- | src/include/errors.h | 1 | ||||
| -rw-r--r-- | src/include/prefs.h | 4 | ||||
| -rw-r--r-- | src/org.mate.marco.gschema.xml | 19 | ||||
| -rw-r--r-- | src/ui/ui.c | 1 |
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" |
