summaryrefslogtreecommitdiff
path: root/src/core/keybindings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/keybindings.c')
-rw-r--r--src/core/keybindings.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 271cf885..5eec52d0 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -38,6 +38,8 @@
#include "effects.h"
#include "util.h"
+#include <gio/gio.h>
+
#include <X11/keysym.h>
#include <string.h>
#include <stdio.h>
@@ -64,6 +66,8 @@ handler (MetaDisplay *display,\
XEvent *event,\
MetaKeyBinding *binding);
#include "all-keybindings.h"
+#include "../include/util.h"
+
#undef keybind
/* These can't be bound to anything, but they are used to handle
@@ -3466,3 +3470,153 @@ handle_run_terminal (MetaDisplay *display,
g_error_free (err);
}
}
+
+static gboolean already_displaying_rename_workspace = FALSE;
+#define RENAME_WORKSPACE_BUFSIZE 512
+
+static gboolean
+handle_rename_workspace_callback(GIOChannel *ioc, GIOCondition cond, gpointer data)
+{
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: called.\n");
+ gint *workspace_index = data;
+
+ if (!already_displaying_rename_workspace)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: done, already_displaying_rename_workspace=FALSE\n");
+ return FALSE;
+ }
+
+ if (cond & G_IO_HUP)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: done.\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+
+ if (cond & G_IO_ERR )
+ {
+ meta_warning ("handle_rename_workspace_callback: error. G_IO_ERR.\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+ if (cond & G_IO_NVAL )
+ {
+ meta_warning ("handle_rename_workspace_callback: error. G_IO_NVAL.\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: workspace_index=%d\n", *workspace_index);
+ if (*workspace_index < 0 || *workspace_index > 36)
+ {
+ meta_warning ("handle_rename_workspace_callback: invalid workspace_index=%d\n", *workspace_index);
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+
+ if (cond & (!G_IO_IN & !G_IO_PRI))
+ {
+ meta_warning ("handle_rename_workspace_callback: unknown error\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+ GIOStatus ret;
+
+ gchar buf[RENAME_WORKSPACE_BUFSIZE];
+ gchar clean_buf[RENAME_WORKSPACE_BUFSIZE];
+ gsize buf_len = 0;
+ glong clean_buf_len = 0;
+
+ memset (buf, 0x00, RENAME_WORKSPACE_BUFSIZE);
+ memset (clean_buf, 0x00, RENAME_WORKSPACE_BUFSIZE);
+
+ ret = g_io_channel_read_chars (ioc, buf, RENAME_WORKSPACE_BUFSIZE, &buf_len, NULL);
+
+ if (buf_len <= 0 || ret != G_IO_STATUS_NORMAL)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: error getting the new name.\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+ if (!g_utf8_validate (buf, -1, NULL))
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: the string is not utf-8: %s\n", buf);
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+ clean_buf_len = g_utf8_strlen (buf, -1);
+ if (clean_buf_len <= 1)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace_callback: invalid name.\n");
+ g_free(workspace_index);
+ already_displaying_rename_workspace = FALSE;
+ return FALSE;
+ }
+
+ g_utf8_strncpy (clean_buf, buf, clean_buf_len - 1);
+ meta_prefs_change_workspace_name(*workspace_index, clean_buf);
+ already_displaying_rename_workspace = FALSE;
+
+ return TRUE;
+}
+
+static void
+handle_rename_workspace(MetaDisplay *display,
+ MetaScreen *screen,
+ MetaWindow *window,
+ XEvent *event,
+ MetaKeyBinding *binding)
+{
+ gchar *window_title, *window_content, *entry_text;
+ GPid dialog_pid;
+
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace: called.\n");
+
+ if (already_displaying_rename_workspace)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "handle_rename_workspace: return, already_displaying_rename_workspace=TRUE.\n");
+ return;
+ }
+
+ window_title = g_strdup_printf (_("<tt>Rename Workspace</tt>"));
+ window_content = g_strdup_printf (_("New Workspace Name:"));
+
+ gint *workspace_index = g_malloc (sizeof (gint));
+ *workspace_index = meta_workspace_index (screen->active_workspace);
+ meta_topic (META_DEBUG_KEYBINDINGS, "handle_rename_workspace: workspace_index=%d\n", *workspace_index);
+
+ entry_text = meta_prefs_get_workspace_name(*workspace_index);
+ dialog_pid = meta_show_entry_dialog (window_content,
+ workspace_index,
+ entry_text,
+ screen->screen_name,
+ _("OK"), _("Cancel"),
+ 0,
+ handle_rename_workspace_callback);
+
+ g_free (window_title);
+ g_free (window_content);
+ if (dialog_pid > 0)
+ {
+ already_displaying_rename_workspace = TRUE;
+ }
+ else
+ {
+ g_free(workspace_index);
+ }
+}