mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 11:00:54 -05:00
update number of workspaces hint
2001-12-09 Havoc Pennington <hp@pobox.com> * src/workspace.c (meta_workspace_free): update number of workspaces hint * src/screen.c (update_num_workspaces): implement number of workspaces setting * src/window.c (meta_window_configure_request): honor configure requests on windows of type NORMAL, but still be mean to those of type DIALOG * src/main.c (main): add more log domains to those we set a log handler for, and only set warnings fatal in debug mode * src/metacity.schemas: add number of workspaces setting
This commit is contained in:
parent
06a0c62f86
commit
041b33c450
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
2001-12-09 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
|
* src/workspace.c (meta_workspace_free): update number of
|
||||||
|
workspaces hint
|
||||||
|
|
||||||
|
* src/screen.c (update_num_workspaces): implement number of
|
||||||
|
workspaces setting
|
||||||
|
|
||||||
|
* src/window.c (meta_window_configure_request): honor configure
|
||||||
|
requests on windows of type NORMAL, but still be mean to those of
|
||||||
|
type DIALOG
|
||||||
|
|
||||||
|
* src/main.c (main): add more log domains to those we set a log
|
||||||
|
handler for, and only set warnings fatal in debug mode
|
||||||
|
|
||||||
|
* src/metacity.schemas: add number of workspaces setting
|
||||||
|
|
||||||
2001-12-09 Havoc Pennington <hp@pobox.com>
|
2001-12-09 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
* src/display.c (event_callback): in click-to-focus mode don't
|
* src/display.c (event_callback): in click-to-focus mode don't
|
||||||
|
@ -51,7 +51,7 @@ meta_error_trap_push (MetaDisplay *display)
|
|||||||
int
|
int
|
||||||
meta_error_trap_pop (MetaDisplay *display)
|
meta_error_trap_pop (MetaDisplay *display)
|
||||||
{
|
{
|
||||||
/* just use GDK trap */
|
/* just use GDK trap, but we do the sync since GDK doesn't */
|
||||||
XSync (display->xdisplay, False);
|
XSync (display->xdisplay, False);
|
||||||
|
|
||||||
return gdk_error_trap_pop ();
|
return gdk_error_trap_pop ();
|
||||||
|
22
src/main.c
22
src/main.c
@ -49,7 +49,7 @@ log_handler (const gchar *log_domain,
|
|||||||
const gchar *message,
|
const gchar *message,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
meta_warning ("GLib log level %d: %s\n", log_level, message);
|
meta_warning ("Log level %d: %s\n", log_level, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -184,6 +184,26 @@ main (int argc, char **argv)
|
|||||||
g_log_set_handler (NULL,
|
g_log_set_handler (NULL,
|
||||||
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
log_handler, NULL);
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("Gtk",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("Gdk",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("GLib",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("Pango",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("GLib-GObject",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
g_log_set_handler ("GThread",
|
||||||
|
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
|
||||||
|
log_handler, NULL);
|
||||||
|
|
||||||
|
if (meta_is_debugging ())
|
||||||
g_log_set_always_fatal (G_LOG_LEVEL_MASK);
|
g_log_set_always_fatal (G_LOG_LEVEL_MASK);
|
||||||
|
|
||||||
/* Connect to SM as late as possible - but before managing display,
|
/* Connect to SM as late as possible - but before managing display,
|
||||||
|
@ -76,6 +76,22 @@
|
|||||||
</locale>
|
</locale>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
<schema>
|
||||||
|
<key>/schemas/apps/metacity/general/num_workspaces</key>
|
||||||
|
<applyto>/apps/metacity/general/num_workspaces</applyto>
|
||||||
|
<owner>metacity</owner>
|
||||||
|
<type>int</type>
|
||||||
|
<default>4</default>
|
||||||
|
<locale name="C">
|
||||||
|
<short>Number of workspaces</short>
|
||||||
|
<long>
|
||||||
|
Number of workspaces. Must be more than zero, and
|
||||||
|
has a fixed maximum (to prevent accidentally destroying
|
||||||
|
your desktop by asking for 34 million workspaces).
|
||||||
|
</long>
|
||||||
|
</locale>
|
||||||
|
</schema>
|
||||||
|
|
||||||
<!-- Keybindings -->
|
<!-- Keybindings -->
|
||||||
|
|
||||||
<schema>
|
<schema>
|
||||||
|
65
src/prefs.c
65
src/prefs.c
@ -32,6 +32,7 @@
|
|||||||
#define KEY_USE_DESKTOP_FONT "/apps/metacity/general/titlebar_uses_desktop_font"
|
#define KEY_USE_DESKTOP_FONT "/apps/metacity/general/titlebar_uses_desktop_font"
|
||||||
#define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
|
#define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
|
||||||
#define KEY_TITLEBAR_FONT_SIZE "/apps/metacity/general/titlebar_font_size"
|
#define KEY_TITLEBAR_FONT_SIZE "/apps/metacity/general/titlebar_font_size"
|
||||||
|
#define KEY_NUM_WORKSPACES "/apps/metacity/general/num_workspaces"
|
||||||
|
|
||||||
static GConfClient *client = NULL;
|
static GConfClient *client = NULL;
|
||||||
static GList *listeners = NULL;
|
static GList *listeners = NULL;
|
||||||
@ -41,11 +42,13 @@ static gboolean use_desktop_font = TRUE;
|
|||||||
static PangoFontDescription *titlebar_font = NULL;
|
static PangoFontDescription *titlebar_font = NULL;
|
||||||
static int titlebar_font_size = 0;
|
static int titlebar_font_size = 0;
|
||||||
static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
|
static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
|
||||||
|
static int num_workspaces = 4;
|
||||||
|
|
||||||
static gboolean update_use_desktop_font (gboolean value);
|
static gboolean update_use_desktop_font (gboolean value);
|
||||||
static gboolean update_titlebar_font (const char *value);
|
static gboolean update_titlebar_font (const char *value);
|
||||||
static gboolean update_titlebar_font_size (int value);
|
static gboolean update_titlebar_font_size (int value);
|
||||||
static gboolean update_focus_mode (const char *value);
|
static gboolean update_focus_mode (const char *value);
|
||||||
|
static gboolean update_num_workspaces (int value);
|
||||||
|
|
||||||
static void queue_changed (MetaPreference pref);
|
static void queue_changed (MetaPreference pref);
|
||||||
static void change_notify (GConfClient *client,
|
static void change_notify (GConfClient *client,
|
||||||
@ -174,7 +177,7 @@ cleanup_error (GError **error)
|
|||||||
{
|
{
|
||||||
if (*error)
|
if (*error)
|
||||||
{
|
{
|
||||||
meta_warning ("%s", (*error)->message);
|
meta_warning ("%s\n", (*error)->message);
|
||||||
|
|
||||||
g_error_free (*error);
|
g_error_free (*error);
|
||||||
*error = NULL;
|
*error = NULL;
|
||||||
@ -206,6 +209,11 @@ meta_prefs_init (void)
|
|||||||
update_focus_mode (str_val);
|
update_focus_mode (str_val);
|
||||||
g_free (str_val);
|
g_free (str_val);
|
||||||
|
|
||||||
|
/* If the keys aren't set in the database, we use essentially
|
||||||
|
* bogus values instead of any kind of default. This is
|
||||||
|
* just lazy. But they keys ought to be set, anyhow.
|
||||||
|
*/
|
||||||
|
|
||||||
bool_val = gconf_client_get_bool (client, KEY_USE_DESKTOP_FONT,
|
bool_val = gconf_client_get_bool (client, KEY_USE_DESKTOP_FONT,
|
||||||
&err);
|
&err);
|
||||||
cleanup_error (&err);
|
cleanup_error (&err);
|
||||||
@ -222,6 +230,11 @@ meta_prefs_init (void)
|
|||||||
update_titlebar_font (str_val);
|
update_titlebar_font (str_val);
|
||||||
g_free (str_val);
|
g_free (str_val);
|
||||||
|
|
||||||
|
int_val = gconf_client_get_int (client, KEY_NUM_WORKSPACES,
|
||||||
|
&err);
|
||||||
|
cleanup_error (&err);
|
||||||
|
update_num_workspaces (int_val);
|
||||||
|
|
||||||
gconf_client_notify_add (client, "/apps/metacity",
|
gconf_client_notify_add (client, "/apps/metacity",
|
||||||
change_notify,
|
change_notify,
|
||||||
NULL,
|
NULL,
|
||||||
@ -310,6 +323,23 @@ change_notify (GConfClient *client,
|
|||||||
if (update_use_desktop_font (b))
|
if (update_use_desktop_font (b))
|
||||||
queue_changed (META_PREF_TITLEBAR_FONT);
|
queue_changed (META_PREF_TITLEBAR_FONT);
|
||||||
}
|
}
|
||||||
|
else if (strcmp (key, KEY_NUM_WORKSPACES) == 0)
|
||||||
|
{
|
||||||
|
int d;
|
||||||
|
|
||||||
|
if (value && value->type != GCONF_VALUE_INT)
|
||||||
|
{
|
||||||
|
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
|
||||||
|
KEY_NUM_WORKSPACES);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 4 is a fallback that should never be used */
|
||||||
|
d = value ? gconf_value_get_int (value) : 4;
|
||||||
|
|
||||||
|
if (update_num_workspaces (d))
|
||||||
|
queue_changed (META_PREF_NUM_WORKSPACES);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
meta_verbose ("Key %s doesn't mean anything to Metacity\n",
|
meta_verbose ("Key %s doesn't mean anything to Metacity\n",
|
||||||
key);
|
key);
|
||||||
@ -419,6 +449,35 @@ meta_prefs_get_titlebar_font_size (void)
|
|||||||
return titlebar_font_size;
|
return titlebar_font_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_REASONABLE_WORKSPACES 32
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
update_num_workspaces (int value)
|
||||||
|
{
|
||||||
|
int old = num_workspaces;
|
||||||
|
|
||||||
|
if (value < 1 || value > MAX_REASONABLE_WORKSPACES)
|
||||||
|
{
|
||||||
|
meta_warning (_("%d stored in GConf key %s is not a reasonable number of workspaces, current maximum is %d\n"),
|
||||||
|
value, KEY_NUM_WORKSPACES, MAX_REASONABLE_WORKSPACES);
|
||||||
|
if (value < 1)
|
||||||
|
value = 1;
|
||||||
|
else if (value > MAX_REASONABLE_WORKSPACES)
|
||||||
|
value = MAX_REASONABLE_WORKSPACES;
|
||||||
|
}
|
||||||
|
|
||||||
|
num_workspaces = value;
|
||||||
|
|
||||||
|
return old != num_workspaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
meta_prefs_get_num_workspaces (void)
|
||||||
|
{
|
||||||
|
return num_workspaces;
|
||||||
|
}
|
||||||
|
|
||||||
const char*
|
const char*
|
||||||
meta_preference_to_string (MetaPreference pref)
|
meta_preference_to_string (MetaPreference pref)
|
||||||
{
|
{
|
||||||
@ -435,6 +494,10 @@ meta_preference_to_string (MetaPreference pref)
|
|||||||
case META_PREF_TITLEBAR_FONT_SIZE:
|
case META_PREF_TITLEBAR_FONT_SIZE:
|
||||||
return "TITLEBAR_FONT_SIZE";
|
return "TITLEBAR_FONT_SIZE";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case META_PREF_NUM_WORKSPACES:
|
||||||
|
return "NUM_WORKSPACES";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "(unknown)";
|
return "(unknown)";
|
||||||
|
@ -30,7 +30,8 @@ typedef enum
|
|||||||
{
|
{
|
||||||
META_PREF_FOCUS_MODE,
|
META_PREF_FOCUS_MODE,
|
||||||
META_PREF_TITLEBAR_FONT,
|
META_PREF_TITLEBAR_FONT,
|
||||||
META_PREF_TITLEBAR_FONT_SIZE
|
META_PREF_TITLEBAR_FONT_SIZE,
|
||||||
|
META_PREF_NUM_WORKSPACES
|
||||||
|
|
||||||
} MetaPreference;
|
} MetaPreference;
|
||||||
|
|
||||||
@ -50,6 +51,7 @@ MetaFocusMode meta_prefs_get_focus_mode (void);
|
|||||||
const PangoFontDescription* meta_prefs_get_titlebar_font (void);
|
const PangoFontDescription* meta_prefs_get_titlebar_font (void);
|
||||||
/* returns 0 if default should be used */
|
/* returns 0 if default should be used */
|
||||||
int meta_prefs_get_titlebar_font_size (void);
|
int meta_prefs_get_titlebar_font_size (void);
|
||||||
|
int meta_prefs_get_num_workspaces (void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
105
src/screen.c
105
src/screen.c
@ -25,6 +25,7 @@
|
|||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
|
#include "prefs.h"
|
||||||
#include "workspace.h"
|
#include "workspace.h"
|
||||||
#include "keybindings.h"
|
#include "keybindings.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
@ -36,6 +37,9 @@
|
|||||||
static char* get_screen_name (MetaDisplay *display,
|
static char* get_screen_name (MetaDisplay *display,
|
||||||
int number);
|
int number);
|
||||||
|
|
||||||
|
static void update_num_workspaces (MetaScreen *screen);
|
||||||
|
static void prefs_changed_callback (MetaPreference pref,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_wm_check_hint (MetaScreen *screen)
|
set_wm_check_hint (MetaScreen *screen)
|
||||||
@ -232,6 +236,8 @@ meta_screen_new (MetaDisplay *display,
|
|||||||
|
|
||||||
screen->stack = meta_stack_new (screen);
|
screen->stack = meta_stack_new (screen);
|
||||||
|
|
||||||
|
meta_prefs_add_listener (prefs_changed_callback, screen);
|
||||||
|
|
||||||
meta_verbose ("Added screen %d ('%s') root 0x%lx\n",
|
meta_verbose ("Added screen %d ('%s') root 0x%lx\n",
|
||||||
screen->number, screen->screen_name, screen->xroot);
|
screen->number, screen->screen_name, screen->xroot);
|
||||||
|
|
||||||
@ -241,6 +247,8 @@ meta_screen_new (MetaDisplay *display,
|
|||||||
void
|
void
|
||||||
meta_screen_free (MetaScreen *screen)
|
meta_screen_free (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
|
meta_prefs_remove_listener (prefs_changed_callback, screen);
|
||||||
|
|
||||||
meta_screen_ungrab_keys (screen);
|
meta_screen_ungrab_keys (screen);
|
||||||
|
|
||||||
meta_ui_free (screen->ui);
|
meta_ui_free (screen->ui);
|
||||||
@ -303,6 +311,19 @@ meta_screen_for_x_screen (Screen *xscreen)
|
|||||||
return meta_display_screen_for_x_screen (display, xscreen);
|
return meta_display_screen_for_x_screen (display, xscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
prefs_changed_callback (MetaPreference pref,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
MetaScreen *screen = data;
|
||||||
|
|
||||||
|
if (pref == META_PREF_NUM_WORKSPACES)
|
||||||
|
{
|
||||||
|
update_num_workspaces (screen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
get_screen_name (MetaDisplay *display,
|
get_screen_name (MetaDisplay *display,
|
||||||
int number)
|
int number)
|
||||||
@ -437,7 +458,91 @@ meta_screen_get_n_workspaces (MetaScreen *screen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_num_workspaces (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
int new_num;
|
||||||
|
GList *tmp;
|
||||||
|
int i;
|
||||||
|
GList *extras;
|
||||||
|
MetaWorkspace *last_remaining;
|
||||||
|
gboolean need_change_space;
|
||||||
|
|
||||||
|
new_num = meta_prefs_get_num_workspaces ();
|
||||||
|
|
||||||
|
g_assert (new_num > 0);
|
||||||
|
|
||||||
|
last_remaining = NULL;
|
||||||
|
extras = NULL;
|
||||||
|
i = 0;
|
||||||
|
tmp = screen->display->workspaces;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
MetaWorkspace *w = tmp->data;
|
||||||
|
|
||||||
|
if (w->screen == screen)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
|
||||||
|
if (i > new_num)
|
||||||
|
extras = g_list_prepend (extras, w);
|
||||||
|
else
|
||||||
|
last_remaining = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert (last_remaining);
|
||||||
|
|
||||||
|
/* Get rid of the extra workspaces by moving all their windows
|
||||||
|
* to last_remaining, then activating last_remaining if
|
||||||
|
* one of the removed workspaces was active. This will be a bit
|
||||||
|
* wacky if the config tool for changing number of workspaces
|
||||||
|
* is on a removed workspace ;-)
|
||||||
|
*/
|
||||||
|
need_change_space = FALSE;
|
||||||
|
tmp = extras;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
MetaWorkspace *w = tmp->data;
|
||||||
|
|
||||||
|
meta_workspace_relocate_windows (w, last_remaining);
|
||||||
|
|
||||||
|
if (w == screen->active_workspace)
|
||||||
|
need_change_space = TRUE;
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_change_space)
|
||||||
|
meta_workspace_activate (last_remaining);
|
||||||
|
|
||||||
|
/* Should now be safe to free the workspaces */
|
||||||
|
tmp = extras;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
MetaWorkspace *w = tmp->data;
|
||||||
|
|
||||||
|
g_assert (w->windows == NULL);
|
||||||
|
meta_workspace_free (w);
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (extras);
|
||||||
|
|
||||||
|
/* Add missing workspaces. FIXME This will keep setting the
|
||||||
|
* number-of-workspaces root window property on each workspace
|
||||||
|
* creation, kind of a lame thing
|
||||||
|
*/
|
||||||
|
while (i < new_num)
|
||||||
|
{
|
||||||
|
meta_workspace_new (screen);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
10
src/window.c
10
src/window.c
@ -2200,12 +2200,9 @@ meta_window_configure_request (MetaWindow *window,
|
|||||||
if (((window->type == META_WINDOW_DESKTOP ||
|
if (((window->type == META_WINDOW_DESKTOP ||
|
||||||
window->type == META_WINDOW_DOCK ||
|
window->type == META_WINDOW_DOCK ||
|
||||||
window->type == META_WINDOW_TOOLBAR ||
|
window->type == META_WINDOW_TOOLBAR ||
|
||||||
window->type == META_WINDOW_MENU) &&
|
window->type == META_WINDOW_MENU ||
|
||||||
|
window->type == META_WINDOW_NORMAL) &&
|
||||||
(window->size_hints.flags & PPosition)) ||
|
(window->size_hints.flags & PPosition)) ||
|
||||||
/* This is here exactly until some crap app annoys me
|
|
||||||
* by misusing it. ;-) Then I remove it and only honor
|
|
||||||
* USPosition at map time.
|
|
||||||
*/
|
|
||||||
(window->size_hints.flags & USPosition))
|
(window->size_hints.flags & USPosition))
|
||||||
{
|
{
|
||||||
if (event->xconfigurerequest.value_mask & CWX)
|
if (event->xconfigurerequest.value_mask & CWX)
|
||||||
@ -2224,7 +2221,8 @@ meta_window_configure_request (MetaWindow *window,
|
|||||||
if (window->type == META_WINDOW_DESKTOP ||
|
if (window->type == META_WINDOW_DESKTOP ||
|
||||||
window->type == META_WINDOW_DOCK ||
|
window->type == META_WINDOW_DOCK ||
|
||||||
window->type == META_WINDOW_TOOLBAR ||
|
window->type == META_WINDOW_TOOLBAR ||
|
||||||
window->type == META_WINDOW_MENU)
|
window->type == META_WINDOW_MENU ||
|
||||||
|
window->type == META_WINDOW_NORMAL)
|
||||||
{
|
{
|
||||||
if (event->xconfigurerequest.value_mask & CWWidth)
|
if (event->xconfigurerequest.value_mask & CWWidth)
|
||||||
width = event->xconfigurerequest.width;
|
width = event->xconfigurerequest.width;
|
||||||
|
@ -58,24 +58,39 @@ void
|
|||||||
meta_workspace_free (MetaWorkspace *workspace)
|
meta_workspace_free (MetaWorkspace *workspace)
|
||||||
{
|
{
|
||||||
GList *tmp;
|
GList *tmp;
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
g_return_if_fail (workspace != workspace->screen->active_workspace);
|
||||||
|
|
||||||
|
/* Here we assume all the windows are already on another workspace
|
||||||
|
* as well, so they won't be "orphaned"
|
||||||
|
*/
|
||||||
|
|
||||||
tmp = workspace->windows;
|
tmp = workspace->windows;
|
||||||
while (tmp != NULL)
|
while (tmp != NULL)
|
||||||
{
|
{
|
||||||
GList *next;
|
GList *next;
|
||||||
|
MetaWindow *window = tmp->data;
|
||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
/* pop front of list */
|
|
||||||
meta_workspace_remove_window (workspace, tmp->data);
|
/* pop front of list we're iterating over */
|
||||||
|
meta_workspace_remove_window (workspace, window);
|
||||||
|
g_assert (window->workspaces != NULL);
|
||||||
|
|
||||||
tmp = next;
|
tmp = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (workspace->windows == NULL);
|
g_assert (workspace->windows == NULL);
|
||||||
|
|
||||||
|
screen = workspace->screen;
|
||||||
|
|
||||||
workspace->screen->display->workspaces =
|
workspace->screen->display->workspaces =
|
||||||
g_list_remove (workspace->screen->display->workspaces, workspace);
|
g_list_remove (workspace->screen->display->workspaces, workspace);
|
||||||
|
|
||||||
g_free (workspace);
|
g_free (workspace);
|
||||||
|
|
||||||
|
/* Update hint for current number of workspaces */
|
||||||
|
set_number_of_spaces_hint (screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -106,6 +121,34 @@ meta_workspace_remove_window (MetaWorkspace *workspace,
|
|||||||
meta_window_queue_calc_showing (window);
|
meta_window_queue_calc_showing (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_workspace_relocate_windows (MetaWorkspace *workspace,
|
||||||
|
MetaWorkspace *new_home)
|
||||||
|
{
|
||||||
|
GList *tmp;
|
||||||
|
GList *copy;
|
||||||
|
|
||||||
|
g_return_if_fail (workspace != new_home);
|
||||||
|
|
||||||
|
/* can't modify list we're iterating over */
|
||||||
|
copy = g_list_copy (workspace->windows);
|
||||||
|
|
||||||
|
tmp = copy;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
MetaWindow *window = tmp->data;
|
||||||
|
|
||||||
|
meta_workspace_add_window (new_home, window);
|
||||||
|
meta_workspace_remove_window (workspace, window);
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (copy);
|
||||||
|
|
||||||
|
g_assert (workspace->windows == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_workspace_contains_window (MetaWorkspace *workspace,
|
meta_workspace_contains_window (MetaWorkspace *workspace,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
@ -226,6 +269,3 @@ set_active_space_hint (MetaScreen *screen)
|
|||||||
32, PropModeReplace, (guchar*) data, 1);
|
32, PropModeReplace, (guchar*) data, 1);
|
||||||
return meta_error_trap_pop (screen->display);
|
return meta_error_trap_pop (screen->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@ void meta_workspace_add_window (MetaWorkspace *workspace,
|
|||||||
MetaWindow *window);
|
MetaWindow *window);
|
||||||
void meta_workspace_remove_window (MetaWorkspace *workspace,
|
void meta_workspace_remove_window (MetaWorkspace *workspace,
|
||||||
MetaWindow *window);
|
MetaWindow *window);
|
||||||
|
void meta_workspace_relocate_windows (MetaWorkspace *workspace,
|
||||||
|
MetaWorkspace *new_home);
|
||||||
/* don't confuse with meta_window_visible_on_workspace() */
|
/* don't confuse with meta_window_visible_on_workspace() */
|
||||||
gboolean meta_workspace_contains_window (MetaWorkspace *workspace,
|
gboolean meta_workspace_contains_window (MetaWorkspace *workspace,
|
||||||
MetaWindow *window);
|
MetaWindow *window);
|
||||||
|
Loading…
Reference in New Issue
Block a user