summaryrefslogtreecommitdiff
path: root/gtk/gtkentry.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2001-03-29 00:24:58 +0000
committerOwen Taylor <otaylor@src.gnome.org>2001-03-29 00:24:58 +0000
commit1586ade9c57e3e497ea730a78f3adfc2c3da8fd4 (patch)
tree71aa2817af44446695d6a938aee0bc0a4d48f1b7 /gtk/gtkentry.c
parented6076b2e0dab716b9ea4dfdb37c003d5f05798f (diff)
downloadgtk+-1586ade9c57e3e497ea730a78f3adfc2c3da8fd4.tar.gz
Add missing NULL on valist.
Wed Mar 28 19:20:43 2001 Owen Taylor <otaylor@redhat.com> * gtk/testtext.c (create_buffer): Add missing NULL on valist. * gtk/gtkcheckmenuitem.c (gtk_check_menu_item_class_init): Fix c-n-p problem with INCONSISTENT property. [ Patch from Havoc Pennington <hp@redhat.com> ] * gtk/gtkentry.h (struct _GtkEntryClass): add same populate_popup hook. * gtk/gtktextview.h (struct _GtkTextViewClass): add populate_popup signal as a hook for extending the default popup menu * gtk/gtkimmulticontext.c (gtk_im_multicontext_append_menuitems): use radio menu items for the input method menuitems * gtk/gtkimcontextsimple.c (check_hex): do better validation of inserted unicode from Ctrl-Shift-hex input method * gtk/gtktextbtree.c (_gtk_text_btree_insert): remove utf8 validatation here, already done at GtkTextBuffer level. * gtk/gtkwidget.c (gtk_widget_class_init): add binding set, add popup_menu run action signal and Shift+F10 and Menu keybindings. * gtk/gtkentry.c: implement a default handler for popup_menu * gtk/gtktextview.c: implement a default handler for popup_menu * gtk/gtkmenu.c (gtk_menu_popup): select first item if popup is from a key event * gtk/gtklabel.c: remove "trailer" cruft
Diffstat (limited to 'gtk/gtkentry.c')
-rw-r--r--gtk/gtkentry.c122
1 files changed, 97 insertions, 25 deletions
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 046980492a..9597e85255 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -58,6 +58,7 @@ enum {
DELETE_TEXT,
CHANGED,
ACTIVATE,
+ POPULATE_POPUP,
MOVE_CURSOR,
INSERT_AT_CURSOR,
DELETE_FROM_CURSOR,
@@ -207,6 +208,7 @@ static void gtk_entry_copy_clipboard (GtkEntry *entry);
static void gtk_entry_paste_clipboard (GtkEntry *entry);
static void gtk_entry_toggle_overwrite (GtkEntry *entry);
static void gtk_entry_real_activate (GtkEntry *entry);
+static void gtk_entry_popup_menu (GtkWidget *widget);
/* IM Context Callbacks
*/
@@ -248,7 +250,7 @@ static char * gtk_entry_get_public_chars (GtkEntry *entry,
static void gtk_entry_paste (GtkEntry *entry,
GdkAtom selection);
static void gtk_entry_update_primary_selection (GtkEntry *entry);
-static void gtk_entry_popup_menu (GtkEntry *entry,
+static void gtk_entry_do_popup (GtkEntry *entry,
GdkEventButton *event);
static gboolean gtk_entry_activate_mnemonic (GtkWidget *widget,
gboolean group_cycling);
@@ -351,6 +353,8 @@ gtk_entry_class_init (GtkEntryClass *class)
widget_class->drag_data_get = gtk_entry_drag_data_get;
widget_class->drag_data_delete = gtk_entry_drag_data_delete;
+ widget_class->popup_menu = gtk_entry_popup_menu;
+
class->insert_text = gtk_entry_real_insert_text;
class->delete_text = gtk_entry_real_delete_text;
class->move_cursor = gtk_entry_move_cursor;
@@ -456,6 +460,14 @@ gtk_entry_class_init (GtkEntryClass *class)
gtk_marshal_VOID__VOID,
GTK_TYPE_NONE, 0);
+ signals[POPULATE_POPUP] =
+ gtk_signal_new ("populate_popup",
+ GTK_RUN_LAST,
+ GTK_CLASS_TYPE (object_class),
+ GTK_SIGNAL_OFFSET (GtkEntryClass, populate_popup),
+ gtk_marshal_VOID__OBJECT,
+ GTK_TYPE_NONE, 1, GTK_TYPE_MENU);
+
/* Action signals */
signals[ACTIVATE] =
@@ -1312,7 +1324,7 @@ gtk_entry_button_press (GtkWidget *widget,
}
else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
{
- gtk_entry_popup_menu (entry, event);
+ gtk_entry_do_popup (entry, event);
entry->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */
return TRUE;
@@ -3149,7 +3161,8 @@ static void
append_action_signal (GtkEntry *entry,
GtkWidget *menu,
const gchar *label,
- const gchar *signal)
+ const gchar *signal,
+ gboolean sensitive)
{
GtkWidget *menuitem = gtk_menu_item_new_with_label (label);
@@ -3157,6 +3170,8 @@ append_action_signal (GtkEntry *entry,
gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
GTK_SIGNAL_FUNC (activate_cb), entry);
+ gtk_widget_set_sensitive (menuitem, sensitive);
+
gtk_widget_show (menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
}
@@ -3169,34 +3184,91 @@ popup_menu_detach (GtkWidget *attach_widget,
}
static void
-gtk_entry_popup_menu (GtkEntry *entry,
- GdkEventButton *event)
+popup_position_func (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data)
{
- if (!entry->popup_menu)
- {
- GtkWidget *menuitem;
-
- entry->popup_menu = gtk_menu_new ();
+ GtkEntry *entry;
+ GtkWidget *widget;
+ GtkRequisition req;
+
+ entry = GTK_ENTRY (user_data);
+ widget = GTK_WIDGET (entry);
+
+ g_return_if_fail (GTK_WIDGET_REALIZED (entry));
- gtk_menu_attach_to_widget (GTK_MENU (entry->popup_menu),
- GTK_WIDGET (entry),
- popup_menu_detach);
+ gdk_window_get_origin (widget->window, x, y);
- append_action_signal (entry, entry->popup_menu, _("Cut"), "cut_clipboard");
- append_action_signal (entry, entry->popup_menu, _("Copy"), "copy_clipboard");
- append_action_signal (entry, entry->popup_menu, _("Paste"), "paste_clipboard");
+ gtk_widget_size_request (entry->popup_menu, &req);
+
+ *x += widget->allocation.width / 2;
+ *y += widget->allocation.height;
- menuitem = gtk_separator_menu_item_new ();
- gtk_widget_show (menuitem);
- gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem);
+ *x = CLAMP (*x, 0, MAX (0, gdk_screen_width () - req.width));
+ *y = CLAMP (*y, 0, MAX (0, gdk_screen_height () - req.height));
+}
- gtk_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (entry->im_context),
- GTK_MENU_SHELL (entry->popup_menu));
- }
+static void
+gtk_entry_do_popup (GtkEntry *entry,
+ GdkEventButton *event)
+{
- gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL,
- NULL, NULL,
- event->button, event->time);
+ GtkWidget *menuitem;
+ GtkWidget *submenu;
+ gboolean have_selection;
+
+ if (entry->popup_menu)
+ gtk_widget_destroy (entry->popup_menu);
+
+ entry->popup_menu = gtk_menu_new ();
+
+ gtk_menu_attach_to_widget (GTK_MENU (entry->popup_menu),
+ GTK_WIDGET (entry),
+ popup_menu_detach);
+
+ have_selection = entry->current_pos != entry->selection_bound;
+
+ append_action_signal (entry, entry->popup_menu, _("Cut"), "cut_clipboard",
+ have_selection);
+ append_action_signal (entry, entry->popup_menu, _("Copy"), "copy_clipboard",
+ have_selection);
+ append_action_signal (entry, entry->popup_menu, _("Paste"), "paste_clipboard",
+ TRUE);
+
+ menuitem = gtk_separator_menu_item_new ();
+ gtk_widget_show (menuitem);
+ gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem);
+
+ menuitem = gtk_menu_item_new_with_label (_("Input Methods"));
+ 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_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (entry->im_context),
+ GTK_MENU_SHELL (submenu));
+
+ gtk_signal_emit (GTK_OBJECT (entry),
+ signals[POPULATE_POPUP],
+ entry->popup_menu);
+
+ if (event)
+ gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL,
+ NULL, NULL,
+ event->button, event->time);
+ else
+ gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL,
+ popup_position_func, entry,
+ 0, gtk_get_current_event_time ());
+}
+
+static void
+gtk_entry_popup_menu (GtkWidget *widget)
+{
+ gtk_entry_do_popup (GTK_ENTRY (widget), NULL);
}
static void