diff options
Diffstat (limited to 'packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff')
-rw-r--r-- | packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff b/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff index e69de29bb2..7323574a64 100644 --- a/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff +++ b/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextview.c.diff @@ -0,0 +1,417 @@ +--- gtk+-2.6.4/gtk/gtktextview.c 2005-03-01 08:28:56.000000000 +0200 ++++ gtk+-2.6.4/gtk/gtktextview.c 2005-04-06 16:19:38.152738264 +0300 +@@ -99,6 +99,11 @@ + + #define SPACE_FOR_CURSOR 1 + ++typedef struct _GtkTextViewPrivate GtkTextViewPrivate; ++ ++#define GTK_TEXT_VIEW_GET_PRIVATE(obj) ( G_TYPE_INSTANCE_GET_PRIVATE ((obj),\ ++ GTK_TYPE_TEXT_VIEW, GtkTextViewPrivate) ) ++ + struct _GtkTextPendingScroll + { + GtkTextMark *mark; +@@ -145,6 +150,8 @@ + PROP_BUFFER, + PROP_OVERWRITE, + PROP_ACCEPTS_TAB, ++ PROP_AUTOCAP, ++ PROP_INPUT_MODE, + LAST_PROP + }; + +@@ -343,6 +350,13 @@ + + static void gtk_text_view_update_im_spot_location (GtkTextView *text_view); + ++static void gtk_text_view_set_autocap (GtkTextView *text_view, ++ gboolean autocap); ++static gboolean gtk_text_view_get_autocap (GtkTextView *text_view); ++static void gtk_text_view_set_input_mode (GtkTextView *text_view, ++ gint mode); ++static gint gtk_text_view_get_input_mode (GtkTextView *text_view); ++ + /* Container methods */ + static void gtk_text_view_add (GtkContainer *container, + GtkWidget *child); +@@ -412,6 +426,10 @@ + static gint text_window_get_width (GtkTextWindow *win); + static gint text_window_get_height (GtkTextWindow *win); + ++struct _GtkTextViewPrivate ++{ ++ guint release_selection : 1; ++}; + + static const GtkTargetEntry target_table[] = { + { "GTK_TEXT_BUFFER_CONTENTS", GTK_TARGET_SAME_APP, 0 }, +@@ -481,6 +499,7 @@ + + parent_class = g_type_class_peek_parent (klass); + ++ g_type_class_add_private( klass, sizeof(GtkTextViewPrivate) ); + /* Default handlers and virtual methods + */ + gobject_class->set_property = gtk_text_view_set_property; +@@ -667,6 +686,24 @@ + TRUE, + G_PARAM_READWRITE)); + ++ g_object_class_install_property (gobject_class, ++ PROP_AUTOCAP, ++ g_param_spec_boolean ("autocap", ++ P_("auto capitalization"), ++ P_("Enable autocap support"), ++ TRUE, ++ G_PARAM_READABLE | G_PARAM_WRITABLE)); ++ ++ g_object_class_install_property (gobject_class, ++ PROP_INPUT_MODE, ++ g_param_spec_int ("input_mode", ++ P_("input mode"), ++ P_("Define widget's input mode"), ++ 0, ++ 9, /* keep me updated */ ++ 0, ++ G_PARAM_READABLE | G_PARAM_WRITABLE)); ++ + /* + * Style properties + */ +@@ -676,6 +713,14 @@ + P_("Color with which to draw error-indication underlines"), + GDK_TYPE_COLOR, + G_PARAM_READABLE)); ++ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_boolean ("autocap", ++ _("auto capitalization"), ++ _("Enable autocap support"), ++ TRUE, ++ G_PARAM_READABLE)); ++ + + /* + * Signals +@@ -1040,8 +1085,9 @@ + gtk_text_view_init (GtkTextView *text_view) + { + GtkWidget *widget; +- ++ GtkTextViewPrivate *priv = NULL; + widget = GTK_WIDGET (text_view); ++ priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view); + + GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); + +@@ -1057,6 +1103,8 @@ + text_view->tabs = NULL; + text_view->editable = TRUE; + ++ priv->release_selection = TRUE; ++ + gtk_drag_dest_set (widget, + 0, + target_table, G_N_ELEMENTS (target_table), +@@ -1070,6 +1118,10 @@ + * to it; so we create it here and destroy it in finalize (). + */ + text_view->im_context = gtk_im_multicontext_new (); ++ /* Set default stuff. */ ++ gtk_text_view_set_autocap (text_view, TRUE); ++ gtk_text_view_set_input_mode (text_view, 0); /* alpha-numeric-special */ ++ g_object_set (G_OBJECT (text_view->im_context), "use-show-hide", TRUE, NULL); + + g_signal_connect (text_view->im_context, "commit", + G_CALLBACK (gtk_text_view_commit_handler), text_view); +@@ -2664,6 +2716,14 @@ + gtk_text_view_set_accepts_tab (text_view, g_value_get_boolean (value)); + break; + ++ case PROP_AUTOCAP: ++ gtk_text_view_set_autocap (text_view, g_value_get_boolean (value)); ++ break; ++ ++ case PROP_INPUT_MODE: ++ gtk_text_view_set_input_mode (text_view, g_value_get_int (value)); ++ break; ++ + default: + g_assert_not_reached (); + break; +@@ -2738,6 +2798,14 @@ + g_value_set_boolean (value, text_view->accepts_tab); + break; + ++ case PROP_AUTOCAP: ++ g_value_set_boolean (value, gtk_text_view_get_autocap (text_view)); ++ break; ++ ++ case PROP_INPUT_MODE: ++ g_value_set_int (value, gtk_text_view_get_input_mode (text_view)); ++ break; ++ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -3916,7 +3984,7 @@ + GtkTextView *text_view = GTK_TEXT_VIEW (widget); + GtkTextMark *insert; + GtkTextIter iter; +- ++ + if (text_view->layout == NULL || get_buffer (text_view) == NULL) + return FALSE; + +@@ -4039,6 +4107,9 @@ + if (event->window != text_view->text_window->bin_window) + return FALSE; + ++ if (text_view->editable) ++ gtk_im_context_show (text_view->im_context); ++ + if (event->button == 1) + { + if (text_view->drag_start_x >= 0) +@@ -4083,7 +4154,15 @@ + static gint + gtk_text_view_focus_in_event (GtkWidget *widget, GdkEventFocus *event) + { ++ /*gboolean have_selection; ++ GtkTextIter sel_start, sel_end;*/ ++ + GtkTextView *text_view = GTK_TEXT_VIEW (widget); ++ ++ /*have_selection = gtk_text_buffer_get_selection_bounds(text_view->buffer, &sel_start, &sel_end); ++ ++ if(!have_selection) ++ gtk_text_view_move_cursor(text_view, GTK_MOVEMENT_BUFFER_ENDS, 1, FALSE);*//*FIXME some other way to place the cursor in the end*/ + + gtk_widget_queue_draw (widget); + +@@ -4100,8 +4179,10 @@ + G_CALLBACK (keymap_direction_changed), text_view); + gtk_text_view_check_keymap_direction (text_view); + ++ /* Keyboard hack */ + text_view->need_im_reset = TRUE; + gtk_im_context_focus_in (GTK_TEXT_VIEW (widget)->im_context); ++ gtk_text_view_reset_im_context (text_view); + + return FALSE; + } +@@ -4110,6 +4191,14 @@ + gtk_text_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event) + { + GtkTextView *text_view = GTK_TEXT_VIEW (widget); ++ GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view); ++ /*{ ++ GtkTextIter start; ++ GtkTextIter end; ++ ++ gtk_text_buffer_get_bounds(text_view->buffer, &start, &end); ++ gtk_text_buffer_select_range(text_view->buffer, &start, &start); ++ }*//*FIXME need a hack here to take away the focus*/ + + gtk_widget_queue_draw (widget); + +@@ -4125,8 +4214,11 @@ + keymap_direction_changed, + text_view); + +- text_view->need_im_reset = TRUE; +- gtk_im_context_focus_out (GTK_TEXT_VIEW (widget)->im_context); ++ /* This is commented out to disable unselect feature. ++ When the decition of this has been made, we can either remove this patch ++ or to leave it. ++ if( priv->release_selection ) ++ gtk_text_view_unselect( text_view );*/ + + return FALSE; + } +@@ -5082,7 +5174,8 @@ + GtkTextIter end; + gboolean leave_one = FALSE; + +- gtk_text_view_reset_im_context (text_view); ++ /*gtk_text_view_reset_im_context (text_view);*/ /*backspace should not clear ++ the word completion*/ + + if (type == GTK_DELETE_CHARS) + { +@@ -5200,7 +5293,8 @@ + { + GtkTextIter insert; + +- gtk_text_view_reset_im_context (text_view); ++ /*gtk_text_view_reset_im_context (text_view);*/ /*backspace should not clear ++ the word completion*/ + + /* Backspace deletes the selection, if one exists */ + if (gtk_text_buffer_delete_selection (get_buffer (text_view), TRUE, +@@ -5928,11 +6022,11 @@ + static void + gtk_text_view_reset_im_context (GtkTextView *text_view) + { +- if (text_view->need_im_reset) ++/* if (text_view->need_im_reset) + { +- text_view->need_im_reset = FALSE; ++ text_view->need_im_reset = FALSE;*/ + gtk_im_context_reset (text_view->im_context); +- } ++/* }*/ + } + + /* +@@ -6665,18 +6759,23 @@ + { + GtkTextIter start; + GtkTextIter end; +- gint pos; ++ gint pos, endpos; + gchar *text; + +- gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start, ++ gtk_text_buffer_get_iter_at_line (text_view->buffer, &start, 0); ++ gtk_text_buffer_get_iter_at_mark (text_view->buffer, &end, + gtk_text_buffer_get_insert (text_view->buffer)); +- end = start; + +- pos = gtk_text_iter_get_line_index (&start); +- gtk_text_iter_set_line_offset (&start, 0); ++ pos = gtk_text_iter_get_line_index (&end); ++ + gtk_text_iter_forward_to_line_end (&end); ++ endpos = gtk_text_iter_get_line_index (&end); + + text = gtk_text_iter_get_slice (&start, &end); ++ if (text) ++ pos = strlen (text) - (endpos - pos); /* want bytes, not characters */ ++ else ++ pos = 0; + gtk_im_context_set_surrounding (context, text, -1, pos); + g_free (text); + +@@ -6726,8 +6825,8 @@ + need_reset = TRUE; + } + +- if (need_reset) +- gtk_text_view_reset_im_context (text_view); ++ /*if (need_reset) ++ gtk_text_view_reset_im_context (text_view);*//*FIXME need a hack here*/ + } + + static void +@@ -6957,6 +7056,13 @@ + } + + static void ++block_selection_change( GtkMenuShell *menushell, gpointer user_data ) ++{ ++ GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(user_data); ++ priv->release_selection = TRUE; ++} ++ ++static void + unichar_chosen_func (const char *text, + gpointer data) + { +@@ -7064,7 +7170,12 @@ + signals[POPULATE_POPUP], + 0, + text_view->popup_menu); +- ++ { ++ GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view); ++ g_signal_connect( GTK_WIDGET(text_view->popup_menu), "selection-done", ++ G_CALLBACK(block_selection_change), text_view ); ++ priv->release_selection = FALSE; ++ } + if (info->button) + gtk_menu_popup (GTK_MENU (text_view->popup_menu), NULL, NULL, + NULL, NULL, +@@ -8301,3 +8412,81 @@ + + return gtk_text_layout_move_iter_visually (text_view->layout, iter, count); + } ++ ++/* ++ * gtk_text_view_set_autocap: ++ * @entry: a #GtkTextView ++ * @autocap: autocap ++ * ++ * Sets autocapitalization of the widget. ++ */ ++static void ++gtk_text_view_set_autocap (GtkTextView *text_view, ++ gboolean autocap) ++{ ++ g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); ++ ++ if (gtk_text_view_get_autocap (text_view) != autocap) ++ { ++ g_object_set (G_OBJECT (text_view->im_context), "autocap", autocap, NULL); ++ g_object_notify (G_OBJECT (text_view), "autocap"); ++ } ++} ++ ++/* ++ * gtk_text_view_get_autocap: ++ * @entry: a #GtkTextView ++ * ++ * Gets autocapitalization state of the widget. ++ * ++ * Return value: a state ++ */ ++static gboolean ++gtk_text_view_get_autocap (GtkTextView *text_view) ++{ ++ gboolean autocap; ++ g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), FALSE); ++ ++ g_object_get (G_OBJECT (text_view->im_context), "autocap", &autocap, NULL); ++ ++ return autocap; ++} ++ ++/* ++ * gtk_text_view_set_input_mode: ++ * @text_view: a #GtkTextView ++ * @mode: input mode ++ * ++ * Sets autocapitalization of the widget. ++ */ ++static void ++gtk_text_view_set_input_mode (GtkTextView *text_view, ++ gint mode) ++{ ++ g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); ++ ++ if (gtk_text_view_get_input_mode (text_view) != mode) ++ { ++ g_object_set (G_OBJECT (text_view->im_context), "input_mode", mode, NULL); ++ g_object_notify (G_OBJECT (text_view), "input_mode"); ++ } ++} ++ ++/* ++ * gtk_text_view_get_input_mode: ++ * @text_view: a #GtkTextView ++ * ++ * Gets input mode of the widget. ++ * ++ * Return value: input mode ++ */ ++static gint ++gtk_text_view_get_input_mode (GtkTextView *text_view) ++{ ++ gint mode; ++ g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), FALSE); ++ ++ g_object_get (G_OBJECT (text_view->im_context), "input_mode", &mode, NULL); ++ ++ return mode; ++} |