Unicode char menu



Hi,

I made a patch for this based on Dov's patch here:
  
  http://bugzilla.gnome.org/show_bug.cgi?id=63495

Comments?

Havoc

Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gtk+/ChangeLog,v
retrieving revision 1.2668
diff -u -p -u -r1.2668 ChangeLog
--- ChangeLog	2001/12/05 13:55:14	1.2668
+++ ChangeLog	2001/12/06 21:31:55
@@ -1,3 +1,19 @@
+2001-12-06  Havoc Pennington  <hp redhat com>
+
+        Add Unicode control char menu, based on patch from Dov.
+	Bug #63495
+	
+	* gtk/gtkentry.c (gtk_entry_commit_cb): share code via
+	gtk_entry_enter_text
+	(gtk_entry_enter_text): function to do "typing in text"
+	(popup_targets_received): add the Unicode menu items
+
+	* gtk/gtktextview.c (popup_targets_received): add missing mnemonic
+	on Input Methods item, and add the unicode menu items.
+
+	* gtk/gtktextutil.h, gtk/gtktextutil.c: private utilities to be
+	used in GtkEntry and GtkTextView - may become public later.	
+
 2001-12-05  Sven Neumann  <sven gimp org>
 
 	* gtk/gtkwidget.c (gtk_widget_reset_shapes): close comment.
Index: gtk/Makefile.am
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/Makefile.am,v
retrieving revision 1.192
diff -u -p -u -r1.192 Makefile.am
--- gtk/Makefile.am	2001/11/19 19:17:49	1.192
+++ gtk/Makefile.am	2001/12/06 21:31:55
@@ -234,6 +234,7 @@ gtk_private_h_sources = @STRIP_BEGIN@ \
 	gtktextchildprivate.h   \
 	gtktextsegment.h	\
 	gtktexttypes.h		\
+	gtktextutil.h		\
 	gtktextiterprivate.h	\
 	gtktextmarkprivate.h	\
 	gtktexttagprivate.h	\
@@ -364,6 +365,7 @@ gtk_c_sources = @STRIP_BEGIN@   \
 	gtktexttag.c		\
 	gtktexttagtable.c	\
 	gtktexttypes.c		\
+	gtktextutil.c		\
 	gtktextview.c		\
 	gtkthemes.c		\
 	gtktipsquery.c		\
Index: gtk/gtkentry.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkentry.c,v
retrieving revision 1.167
diff -u -p -u -r1.167 gtkentry.c
--- gtk/gtkentry.c	2001/12/04 03:27:28	1.167
+++ gtk/gtkentry.c	2001/12/06 21:31:55
@@ -46,6 +46,7 @@
 #include "gtksettings.h"
 #include "gtkstock.h"
 #include "gtksignal.h"
+#include "gtktextutil.h"
 #include "gtkwindow.h"
 
 #define MIN_ENTRY_WIDTH  150
@@ -247,6 +248,8 @@ static gboolean gtk_entry_delete_surroun
 
 /* Internal routines
  */
+static void         gtk_entry_enter_text               (GtkEntry       *entry,
+                                                        const gchar    *str);
 static void         gtk_entry_set_positions            (GtkEntry       *entry,
 							gint            current_pos,
 							gint            selection_bound);
@@ -2226,19 +2229,7 @@ gtk_entry_commit_cb (GtkIMContext *conte
 		     const gchar  *str,
 		     GtkEntry     *entry)
 {
-  GtkEditable *editable = GTK_EDITABLE (entry);
-  gint tmp_pos = entry->current_pos;
-
-  if (gtk_editable_get_selection_bounds (editable, NULL, NULL))
-    gtk_editable_delete_selection (editable);
-  else
-    {
-      if (entry->overwrite_mode)
-        gtk_entry_delete_from_cursor (entry, GTK_DELETE_CHARS, 1);
-    }
-
-  gtk_editable_insert_text (editable, str, strlen (str), &tmp_pos);
-  gtk_editable_set_position (editable, tmp_pos);
+  gtk_entry_enter_text (entry, str);
 }
 
 static void 
@@ -2287,6 +2278,26 @@ gtk_entry_delete_surrounding_cb (GtkIMCo
 /* Internal functions
  */
 
+/* Used for im_commit_cb and inserting Unicode chars */
+static void
+gtk_entry_enter_text (GtkEntry       *entry,
+                      const gchar    *str)
+{
+  GtkEditable *editable = GTK_EDITABLE (entry);
+  gint tmp_pos = entry->current_pos;
+
+  if (gtk_editable_get_selection_bounds (editable, NULL, NULL))
+    gtk_editable_delete_selection (editable);
+  else
+    {
+      if (entry->overwrite_mode)
+        gtk_entry_delete_from_cursor (entry, GTK_DELETE_CHARS, 1);
+    }
+
+  gtk_editable_insert_text (editable, str, strlen (str), &tmp_pos);
+  gtk_editable_set_position (editable, tmp_pos);
+}
+
 /* All changes to entry->current_pos and entry->selection_bound
  * should go through this function.
  */
@@ -3765,6 +3776,16 @@ popup_position_func (GtkMenu   *menu,
   *y = CLAMP (*y, 0, MAX (0, gdk_screen_height () - req.height));
 }
 
+
+static void
+unichar_chosen_func (const char *text,
+                     gpointer    data)
+{
+  GtkEntry *entry = GTK_ENTRY (data);
+
+  gtk_entry_enter_text (entry, text);
+}
+
 typedef struct
 {
   GtkEntry *entry;
@@ -3821,6 +3842,19 @@ popup_targets_received (GtkClipboard    
       
       gtk_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (entry->im_context),
 					    GTK_MENU_SHELL (submenu));
+      
+      menuitem = gtk_menu_item_new_with_mnemonic (_("_Insert Unicode control character"));
+      gtk_widget_show (menuitem);
+      
+      submenu = gtk_menu_new ();
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+      gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem);      
+
+      _gtk_text_util_append_special_char_menuitems (GTK_MENU_SHELL (submenu),
+                                                    unichar_chosen_func,
+                                                    entry);
+      if (!entry->editable)
+        gtk_widget_set_sensitive (menuitem, FALSE);
       
       gtk_signal_emit (GTK_OBJECT (entry),
 		       signals[POPULATE_POPUP],
Index: gtk/gtktextutil.c
===================================================================
RCS file: gtktextutil.c
diff -N gtktextutil.c
--- /dev/null	Tue May  5 16:32:27 1998
+++ gtktextutil.c	Thu Dec  6 16:31:55 2001
@@ -0,0 +1,117 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2001.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+#include "gtktextutil.h"
+#include "gtkintl.h"
+#include "gtkmenuitem.h"
+
+typedef struct _GtkUnicodeMenuEntry GtkUnicodeMenuEntry;
+typedef struct _GtkTextUtilCallbackInfo GtkTextUtilCallbackInfo;
+
+struct _GtkUnicodeMenuEntry {
+  const char *label;
+  gunichar ch;
+};
+
+struct _GtkTextUtilCallbackInfo
+{
+  GtkTextUtilCharChosenFunc func;
+  gpointer data;
+};
+
+GtkUnicodeMenuEntry bidi_menu_entries[] = {
+  { N_("LRM _Left-to-right mark"), 0x200E },
+  { N_("RLM _Right-to-left mark"), 0x200F },
+  { N_("LRE Left-to-right _embedding"), 0x202A },
+  { N_("RLE Right-to-left e_mbedding"), 0x202B },
+  { N_("LRO Left-to-right _override"), 0x202D },
+  { N_("RLO Right-to-left o_verride"), 0x202E },
+  { N_("PDF _Pop directional formatting"), 0x202C },
+  { N_("ZWS _Zero width space"), 0x200B },
+  { N_("ZWN Zero width _joiner"), 0x200D },
+  { N_("ZWNJ Zero width _non-joiner"), 0x200C }
+};
+
+static void
+activate_cb (GtkWidget *menu_item,
+             gpointer   data)
+{
+  GtkUnicodeMenuEntry *entry;
+  GtkTextUtilCallbackInfo *info = data;
+  char buf[7];
+  
+  entry = g_object_get_data (G_OBJECT (menu_item), "gtk-unicode-menu-entry");
+
+  buf[g_unichar_to_utf8 (entry->ch, buf)] = '\0';
+  
+  (* info->func) (buf, info->data);
+}
+
+/**
+ * _gtk_text_util_append_special_char_menuitems
+ * @menushell: a #GtkMenuShell
+ * @callback:  call this when an item is chosen
+ * @data: data for callback
+ * 
+ * Add menuitems for various bidi control characters  to a menu;
+ * the menuitems, when selected, will call the given function
+ * with the chosen character.
+ *
+ * This function is private/internal in GTK 2.0, the functionality may
+ * become public sometime, but it probably needs more thought first.
+ * e.g. maybe there should be a way to just get the list of items,
+ * instead of requiring the menu items to be created.
+ **/
+void
+_gtk_text_util_append_special_char_menuitems (GtkMenuShell              *menushell,
+                                              GtkTextUtilCharChosenFunc  func,
+                                              gpointer                   data)
+{
+  int i;
+  
+  for (i = 0; i < G_N_ELEMENTS (bidi_menu_entries); i++)
+    {
+      GtkWidget *menuitem;
+      GtkTextUtilCallbackInfo *info;
+
+      /* wasteful to have a bunch of copies, but simplifies mem management */
+      info = g_new (GtkTextUtilCallbackInfo, 1);
+      info->func = func;
+      info->data = data;
+      
+      menuitem = gtk_menu_item_new_with_mnemonic (bidi_menu_entries[i].label);
+      g_object_set_data (G_OBJECT (menuitem), "gtk-unicode-menu-entry",
+                         &bidi_menu_entries[i]);
+      
+      g_signal_connect_data (G_OBJECT (menuitem), "activate",
+                             G_CALLBACK (activate_cb),
+                             info, (GClosureNotify) g_free, 0);
+      
+      gtk_widget_show (menuitem);
+      gtk_menu_shell_append (menushell, menuitem);
+    }
+}
+
Index: gtk/gtktextutil.h
===================================================================
RCS file: gtktextutil.h
diff -N gtktextutil.h
--- /dev/null	Tue May  5 16:32:27 1998
+++ gtktextutil.h	Thu Dec  6 16:31:55 2001
@@ -0,0 +1,54 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2001.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+#ifndef __GTK_TEXT_UTIL_H__
+#define __GTK_TEXT_UTIL_H__
+
+
+#include <gtk/gtkwidget.h>
+#include <gtk/gtkmenushell.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* This is a private uninstalled header shared between GtkTextView and GtkEntry */
+typedef void (* GtkTextUtilCharChosenFunc) (const char *text,
+                                            gpointer    data);
+
+void _gtk_text_util_append_special_char_menuitems (GtkMenuShell              *menushell,
+                                                   GtkTextUtilCharChosenFunc  func,
+                                                   gpointer                   data);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GTK_TEXT_UTIL_H__ */
Index: gtk/gtktextview.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtktextview.c,v
retrieving revision 1.150
diff -u -p -u -r1.150 gtktextview.c
--- gtk/gtktextview.c	2001/12/04 03:27:29	1.150
+++ gtk/gtktextview.c	2001/12/06 21:31:56
@@ -43,6 +43,7 @@
 #include "gtktextview.h"
 #include "gtkimmulticontext.h"
 #include "gdk/gdkkeysyms.h"
+#include "gtktextutil.h"
 #include <string.h>
 
 /* How scrolling, validation, exposes, etc. work.
@@ -5693,6 +5694,15 @@ range_contains_editable_text (const GtkT
 }                             
 
 static void
+unichar_chosen_func (const char *text,
+                     gpointer    data)
+{
+  GtkTextView *text_view = GTK_TEXT_VIEW (data);
+
+  gtk_text_view_commit_text (text_view, text);
+}
+
+static void
 popup_targets_received (GtkClipboard     *clipboard,
 			GtkSelectionData *data,
 			gpointer          user_data)
@@ -5744,7 +5754,7 @@ popup_targets_received (GtkClipboard    
       gtk_widget_show (menuitem);
       gtk_menu_shell_append (GTK_MENU_SHELL (text_view->popup_menu), menuitem);
       
-      menuitem = gtk_menu_item_new_with_label (_("Input Methods"));
+      menuitem = gtk_menu_item_new_with_mnemonic (_("Input _Methods"));
       gtk_widget_show (menuitem);
       submenu = gtk_menu_new ();
       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
@@ -5752,6 +5762,18 @@ popup_targets_received (GtkClipboard    
       
       gtk_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (text_view->im_context),
 					    GTK_MENU_SHELL (submenu));
+
+      menuitem = gtk_menu_item_new_with_mnemonic (_("_Insert Unicode control character"));
+      gtk_widget_show (menuitem);
+      gtk_widget_set_sensitive (menuitem, can_insert);
+      
+      submenu = gtk_menu_new ();
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+      gtk_menu_shell_append (GTK_MENU_SHELL (text_view->popup_menu), menuitem);      
+
+      _gtk_text_util_append_special_char_menuitems (GTK_MENU_SHELL (submenu),
+                                                    unichar_chosen_func,
+                                                    text_view);
       
       gtk_signal_emit (GTK_OBJECT (text_view),
 		       signals[POPULATE_POPUP],



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]