summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/prefs.c36
-rw-r--r--src/core/screen.c4
-rw-r--r--src/include/common.h6
-rw-r--r--src/include/prefs.h4
-rw-r--r--src/include/tabpopup.h1
-rw-r--r--src/org.mate.marco.gschema.xml11
-rw-r--r--src/ui/tabpopup.c56
7 files changed, 104 insertions, 14 deletions
diff --git a/src/core/prefs.c b/src/core/prefs.c
index 2c93cf19..b9f0362b 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -53,6 +53,8 @@
#define KEY_GENERAL_COMPOSITOR_FAST_ALT_TAB "compositing-fast-alt-tab"
#define KEY_GENERAL_CENTER_NEW_WINDOWS "center-new-windows"
#define KEY_GENERAL_ICON_SIZE "icon-size"
+#define KEY_GENERAL_ALT_TAB_MAX_COLUMNS "alt-tab-max-columns"
+#define KEY_GENERAL_ALT_TAB_EXPAND_TO_FIT_TITLE "alt-tab-expand-to-fit-title"
#define KEY_COMMAND_SCHEMA "org.mate.Marco.keybinding-commands"
#define KEY_COMMAND_PREFIX "command-"
@@ -116,6 +118,8 @@ static gboolean mate_animations = TRUE;
static char *cursor_theme = NULL;
static int cursor_size = 24;
static int icon_size = META_DEFAULT_ICON_SIZE;
+static int alt_tab_max_columns = META_DEFAULT_ALT_TAB_MAX_COLUMNS;
+static gboolean alt_tab_expand_to_fit_title = META_DEFAULT_ALT_TAB_EXPAND_TO_FIT_TITLE;
static gboolean use_force_compositor_manager = FALSE;
static gboolean force_compositor_manager = FALSE;
static gboolean compositing_manager = FALSE;
@@ -439,6 +443,12 @@ static MetaBoolPreference preferences_bool[] =
&allow_top_tiling,
FALSE,
},
+ { "alt-tab-expand-to-fit-title",
+ KEY_GENERAL_SCHEMA,
+ META_PREF_ALT_TAB_EXPAND_TO_FIT_TITLE,
+ &alt_tab_expand_to_fit_title,
+ META_DEFAULT_ALT_TAB_EXPAND_TO_FIT_TITLE,
+ },
{ NULL, NULL, 0, NULL, FALSE },
};
@@ -520,6 +530,14 @@ static MetaIntPreference preferences_int[] =
&icon_size,
META_MIN_ICON_SIZE, META_MAX_ICON_SIZE, META_DEFAULT_ICON_SIZE,
},
+ { "alt-tab-max-columns",
+ KEY_GENERAL_SCHEMA,
+ META_PREF_ALT_TAB_MAX_COLUMNS,
+ &alt_tab_max_columns,
+ META_MIN_ALT_TAB_MAX_COLUMNS,
+ META_MAX_ALT_TAB_MAX_COLUMNS,
+ META_DEFAULT_ALT_TAB_MAX_COLUMNS,
+ },
{ NULL, NULL, 0, NULL, 0, 0, 0, },
};
@@ -1122,6 +1140,18 @@ meta_prefs_get_icon_size (void)
return icon_size;
}
+int
+meta_prefs_get_alt_tab_max_columns (void)
+{
+ return alt_tab_max_columns;
+}
+
+gboolean
+meta_prefs_get_alt_tab_expand_to_fit_title (void)
+{
+ return alt_tab_expand_to_fit_title;
+}
+
gboolean
meta_prefs_is_in_skip_list (char *class)
{
@@ -1637,6 +1667,12 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_ICON_SIZE:
return "ICON_SIZE";
+ case META_PREF_ALT_TAB_MAX_COLUMNS:
+ return "ALT_TAB_MAX_COLUMNS";
+
+ case META_PREF_ALT_TAB_EXPAND_TO_FIT_TITLE:
+ return "ALT_TAB_EXPAND_TO_FIT_TITLE";
+
case META_PREF_COMPOSITING_MANAGER:
return "COMPOSITING_MANAGER";
diff --git a/src/core/screen.c b/src/core/screen.c
index 8238d291..49e50506 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1398,7 +1398,8 @@ meta_screen_ensure_tab_popup (MetaScreen *screen,
screen->tab_popup = meta_ui_tab_popup_new (entries,
len,
- 5, /* FIXME */
+ meta_prefs_get_alt_tab_max_columns(),
+ meta_prefs_get_alt_tab_expand_to_fit_title(),
border);
for (i = 0; i < len; i++)
@@ -1470,6 +1471,7 @@ meta_screen_ensure_workspace_popup (MetaScreen *screen)
screen->tab_popup = meta_ui_tab_popup_new (entries,
len,
layout.cols,
+ FALSE, /* expand_for_titles */
BORDER_OUTLINE_WORKSPACE);
g_free (entries);
diff --git a/src/include/common.h b/src/include/common.h
index 85e4f630..0dc2165e 100644
--- a/src/include/common.h
+++ b/src/include/common.h
@@ -347,4 +347,10 @@ typedef enum
META_PLACEMENT_MODE_MANUAL
} MetaPlacementMode;
+#define META_DEFAULT_ALT_TAB_MAX_COLUMNS 5
+#define META_MIN_ALT_TAB_MAX_COLUMNS 1
+#define META_MAX_ALT_TAB_MAX_COLUMNS 1024
+
+#define META_DEFAULT_ALT_TAB_EXPAND_TO_FIT_TITLE FALSE
+
#endif
diff --git a/src/include/prefs.h b/src/include/prefs.h
index 7623dd19..515e9173 100644
--- a/src/include/prefs.h
+++ b/src/include/prefs.h
@@ -61,6 +61,8 @@ typedef enum
META_PREF_CURSOR_THEME,
META_PREF_CURSOR_SIZE,
META_PREF_ICON_SIZE,
+ META_PREF_ALT_TAB_MAX_COLUMNS,
+ META_PREF_ALT_TAB_EXPAND_TO_FIT_TITLE,
META_PREF_COMPOSITING_MANAGER,
META_PREF_COMPOSITING_FAST_ALT_TAB,
META_PREF_RESIZE_WITH_RIGHT_BUTTON,
@@ -131,6 +133,8 @@ void meta_prefs_change_workspace_name (int i,
const char* meta_prefs_get_cursor_theme (void);
int meta_prefs_get_cursor_size (void);
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_compositing_manager (void);
gboolean meta_prefs_get_compositing_fast_alt_tab (void);
gboolean meta_prefs_get_center_new_windows (void);
diff --git a/src/include/tabpopup.h b/src/include/tabpopup.h
index a93d1b2d..447264e1 100644
--- a/src/include/tabpopup.h
+++ b/src/include/tabpopup.h
@@ -59,6 +59,7 @@ struct _MetaTabEntry
MetaTabPopup* meta_ui_tab_popup_new (const MetaTabEntry *entries,
int entry_count,
int width,
+ gboolean expand_for_titles,
gboolean outline);
void meta_ui_tab_popup_free (MetaTabPopup *popup);
void meta_ui_tab_popup_set_showing (MetaTabPopup *popup,
diff --git a/src/org.mate.marco.gschema.xml b/src/org.mate.marco.gschema.xml
index 98a91485..012109fe 100644
--- a/src/org.mate.marco.gschema.xml
+++ b/src/org.mate.marco.gschema.xml
@@ -202,6 +202,17 @@
<summary>Icon size</summary>
<description>Size of the application icons displayed in alt-tab popup window. The screen's scale factor is applied to this value.</description>
</key>
+ <key name="alt-tab-max-columns" type="i">
+ <range min="1" max="1024"/>
+ <default>5</default>
+ <summary>Maximum number of columns in alt-tab popup window</summary>
+ <description>The popup window will be expanded to fit up to these many entries per row.</description>
+ </key>
+ <key name="alt-tab-expand-to-fit-title" type="b">
+ <default>false</default>
+ <summary>Expand the alt-tab popup window to fit longer window titles</summary>
+ <description>The popup window may be expanded up to the width determined by the config parameter 'alt-tab-max-columns'.</description>
+ </key>
</schema>
<schema id="org.mate.Marco.workspace-names" path="/org/mate/marco/workspace-names/">
diff --git a/src/ui/tabpopup.c b/src/ui/tabpopup.c
index d7887ca8..18ee83d5 100644
--- a/src/ui/tabpopup.c
+++ b/src/ui/tabpopup.c
@@ -221,10 +221,11 @@ MetaTabPopup*
meta_ui_tab_popup_new (const MetaTabEntry *entries,
int entry_count,
int width,
+ gboolean expand_for_titles,
gint border)
{
MetaTabPopup *popup;
- int i, left, right, top, bottom;
+ int i, left, top;
int height;
GtkWidget *grid;
GtkWidget *vbox;
@@ -233,7 +234,7 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
int max_label_width; /* the actual max width of the labels we create */
AtkObject *obj;
GdkScreen *screen;
- int screen_width, scale;
+ int scale;
popup = g_new (MetaTabPopup, 1);
@@ -278,7 +279,6 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
popup->border = border;
scale = gtk_widget_get_scale_factor (GTK_WIDGET (popup->window));
- screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen));
for (i = 0; i < entry_count; ++i)
{
TabEntry* new_entry = tab_entry_new (&entries[i], border & BORDER_OUTLINE_WINDOW, scale);
@@ -325,13 +325,14 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
max_label_width = 0;
top = 0;
- bottom = 1;
+ left = 0;
tmp = popup->entries;
+ gtk_widget_show(popup->label); /* for gtk_widget_get_preferred_size() */
+
while (tmp && top < height)
{
left = 0;
- right = 1;
while (tmp && left < width)
{
@@ -383,11 +384,9 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
tmp = tmp->next;
++left;
- ++right;
}
++top;
- ++bottom;
}
/* remove all the temporary text */
@@ -395,16 +394,47 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
/* Make it so that we ellipsize if the text is too long */
gtk_label_set_ellipsize (GTK_LABEL (popup->label), PANGO_ELLIPSIZE_END);
- /* Limit the window size to no bigger than screen_width/4 */
- if (max_label_width>(screen_width/4))
+ int default_window_width = 0; /* 0 == small as possible, truncate label */
+
+ if (expand_for_titles && top <= 1 && left < width)
{
- max_label_width = screen_width/4;
+ /* only one row partially filled with columns and additional_columns given
+ => calculate default_window_width to fit max_label_width if possible */
+
+ GtkWidget **dummies = g_try_malloc(sizeof(GtkWidget*) * (width - left));
+ if (dummies)
+ {
+ int j;
+ for (j = 0; j < width - left; ++j)
+ {
+ GtkWidget *dummy = gtk_label_new ("");
+ dummies[j] = dummy;
+ gtk_grid_attach (GTK_GRID (grid), dummy, left + j, top, 1, 1);
+ }
+
+ gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
+ gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
+ gtk_widget_show_all(grid); /* for gtk_widget_get_preferred_size */
+
+ GtkRequisition req;
+ gtk_widget_get_preferred_size (grid, &req, NULL);
+ default_window_width = req.width;
+
+ for (j = 0; j < width - left; ++j)
+ {
+ gtk_container_remove(GTK_CONTAINER(grid), dummies[j]);
+ }
+ g_free(dummies);
+ /* Limit the window size to no bigger than max_label_width */
+ if (max_label_width < default_window_width)
+ {
+ default_window_width = max_label_width;
+ }
+ }
}
- max_label_width += 20; /* add random padding */
-
gtk_window_set_default_size (GTK_WINDOW (popup->window),
- max_label_width,
+ default_window_width,
-1);
return popup;