From fd07e032df0a9b16f3c1cfbf5cc2a48ead22cd02 Mon Sep 17 00:00:00 2001 From: "Carlos R. Mafra" Date: Mon, 16 Jan 2012 05:31:06 +0000 Subject: [PATCH] Fix non-ascii workspace rename via menu MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit As pointed out in the comments in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=304480 it's not possible to rename workspaces with non-ascii characters -- more precisely characters which require deadkeys with your particular keyboard. According to the investigation made by Rodolfo PeƱas: http://lists.windowmaker.org/dev/msg02529.html the fundamental issue behind this bug is the fact that XLookupString can't handle deadkeys. So either we do something radical or live with the bug. However -- as Rodolfo also pointed out -- renaming the workspaces via the Clip works with non-ascii chars. The reason is that the Clip uses a input dialog function from WINGs to handle the renaming. So instead of doing the low-level handling of text inside the menu in order to rename workspaces, just fire up the same WINGs input dialog to handle it. It works and the old function editEntry() can be removed. Furthermore, it makes the whole set of functions in src/wtext.c useless, and they are removed in the next patch. Overall, 600 lines of code are gone now. Signed-off-by: Carlos R. Mafra --- src/menu.c | 97 +++++++++++--------------------------------------------------- 1 file changed, 16 insertions(+), 81 deletions(-) diff --git a/src/menu.c b/src/menu.c index 11e6a7fd..d9caa15b 100644 --- a/src/menu.c +++ b/src/menu.c @@ -42,6 +42,7 @@ #include "text.h" #include "xinerama.h" #include "workspace.h" +#include "dialog.h" /****** Global Variables ******/ @@ -1146,86 +1147,6 @@ void wMenuSetEnabled(WMenu * menu, int index, int enable) paintEntry(menu->brother, index, index == menu->selected_entry); } -/* ====================================================================== */ - -static void editEntry(WMenu * menu, WMenuEntry * entry) -{ - WTextInput *text; - XEvent event; - WObjDescriptor *desc; - char *t; - int done = 0; - Window old_focus; - int old_revert; - - menu->flags.editing = 1; - - text = wTextCreate(menu->menu, 1, menu->entry_height * entry->order, - menu->menu->width - 2, menu->entry_height - 1); - - wTextPutText(text, entry->text); - XGetInputFocus(dpy, &old_focus, &old_revert); - XSetInputFocus(dpy, text->core->window, RevertToNone, CurrentTime); - - if (XGrabKeyboard(dpy, text->core->window, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) { - wwarning(_("could not grab keyboard")); - wTextDestroy(text); - - wSetFocusTo(menu->frame->screen_ptr, menu->frame->screen_ptr->focused_window); - return; - } - - while (!done && !text->done) { - XSync(dpy, 0); - XAllowEvents(dpy, AsyncKeyboard | AsyncPointer, CurrentTime); - XSync(dpy, 0); - WMNextEvent(dpy, &event); - - if (XFindContext(dpy, event.xany.window, wWinContext, (XPointer *) & desc) == XCNOENT) - desc = NULL; - - if ((desc != NULL) && (desc->handle_anything != NULL)) { - - (*desc->handle_anything) (desc, &event); - - } else { - switch (event.type) { - case ButtonPress: - XAllowEvents(dpy, ReplayPointer, CurrentTime); - done = 1; - - default: - WMHandleEvent(&event); - break; - } - } - } - - XSetInputFocus(dpy, old_focus, old_revert, CurrentTime); - - wSetFocusTo(menu->frame->screen_ptr, menu->frame->screen_ptr->focused_window); - - t = wTextGetText(text); - /* if !t, the user has canceled editing */ - if (t) { - if (entry->text) - wfree(entry->text); - entry->text = wstrdup(t); - - menu->flags.realized = 0; - } - wTextDestroy(text); - - XUngrabKeyboard(dpy, CurrentTime); - - if (t && menu->on_edit) - (*menu->on_edit) (menu, entry); - - menu->flags.editing = 0; - - if (!menu->flags.realized) - wMenuRealize(menu); -} static void selectEntry(WMenu * menu, int entry_no) { @@ -1832,7 +1753,21 @@ static void menuMouseDown(WObjDescriptor * desc, XEvent * event) entry = menu->entries[entry_no]; if (!close_on_exit && (bev->state & ControlMask) && smenu && entry->flags.editable) { - editEntry(smenu, entry); + char buffer[128]; + char *name; + int number = entry_no - 2; /* Entries "New" and "Destroy Last" appear before workspaces */ + + name = wstrdup(scr->workspaces[number]->name); + snprintf(buffer, sizeof(buffer), _("Type the name for workspace %i:"), number + 1); + + wMenuUnmap(scr->root_menu); + + if (wInputDialog(scr, _("Rename Workspace"), buffer, &name)) + wWorkspaceRename(scr, number, name); + + if (name) + wfree(name); + goto byebye; } else if (bev->state & ControlMask) { goto byebye; -- 2.11.4.GIT