1 --- gtk+-2.6.4/gtk/gtktextview.c 2005-03-01 08:28:56.000000000 +0200
2 +++ gtk+-2.6.4/gtk/gtktextview.c 2005-04-06 16:19:38.152738264 +0300
5 #define SPACE_FOR_CURSOR 1
7 +typedef struct _GtkTextViewPrivate GtkTextViewPrivate;
9 +#define GTK_TEXT_VIEW_GET_PRIVATE(obj) ( G_TYPE_INSTANCE_GET_PRIVATE ((obj),\
10 + GTK_TYPE_TEXT_VIEW, GtkTextViewPrivate) )
12 struct _GtkTextPendingScroll
26 static void gtk_text_view_update_im_spot_location (GtkTextView *text_view);
28 +static void gtk_text_view_set_autocap (GtkTextView *text_view,
30 +static gboolean gtk_text_view_get_autocap (GtkTextView *text_view);
31 +static void gtk_text_view_set_input_mode (GtkTextView *text_view,
33 +static gint gtk_text_view_get_input_mode (GtkTextView *text_view);
35 /* Container methods */
36 static void gtk_text_view_add (GtkContainer *container,
39 static gint text_window_get_width (GtkTextWindow *win);
40 static gint text_window_get_height (GtkTextWindow *win);
42 +struct _GtkTextViewPrivate
44 + guint release_selection : 1;
47 static const GtkTargetEntry target_table[] = {
48 { "GTK_TEXT_BUFFER_CONTENTS", GTK_TARGET_SAME_APP, 0 },
51 parent_class = g_type_class_peek_parent (klass);
53 + g_type_class_add_private( klass, sizeof(GtkTextViewPrivate) );
54 /* Default handlers and virtual methods
56 gobject_class->set_property = gtk_text_view_set_property;
61 + g_object_class_install_property (gobject_class,
63 + g_param_spec_boolean ("autocap",
64 + P_("auto capitalization"),
65 + P_("Enable autocap support"),
67 + G_PARAM_READABLE | G_PARAM_WRITABLE));
69 + g_object_class_install_property (gobject_class,
71 + g_param_spec_int ("input_mode",
73 + P_("Define widget's input mode"),
75 + 9, /* keep me updated */
77 + G_PARAM_READABLE | G_PARAM_WRITABLE));
83 P_("Color with which to draw error-indication underlines"),
87 + gtk_widget_class_install_style_property (widget_class,
88 + g_param_spec_boolean ("autocap",
89 + _("auto capitalization"),
90 + _("Enable autocap support"),
98 gtk_text_view_init (GtkTextView *text_view)
102 + GtkTextViewPrivate *priv = NULL;
103 widget = GTK_WIDGET (text_view);
104 + priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view);
106 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
108 @@ -1057,6 +1103,8 @@
109 text_view->tabs = NULL;
110 text_view->editable = TRUE;
112 + priv->release_selection = TRUE;
114 gtk_drag_dest_set (widget,
116 target_table, G_N_ELEMENTS (target_table),
117 @@ -1070,6 +1118,10 @@
118 * to it; so we create it here and destroy it in finalize ().
120 text_view->im_context = gtk_im_multicontext_new ();
121 + /* Set default stuff. */
122 + gtk_text_view_set_autocap (text_view, TRUE);
123 + gtk_text_view_set_input_mode (text_view, 0); /* alpha-numeric-special */
124 + g_object_set (G_OBJECT (text_view->im_context), "use-show-hide", TRUE, NULL);
126 g_signal_connect (text_view->im_context, "commit",
127 G_CALLBACK (gtk_text_view_commit_handler), text_view);
128 @@ -2664,6 +2716,14 @@
129 gtk_text_view_set_accepts_tab (text_view, g_value_get_boolean (value));
133 + gtk_text_view_set_autocap (text_view, g_value_get_boolean (value));
136 + case PROP_INPUT_MODE:
137 + gtk_text_view_set_input_mode (text_view, g_value_get_int (value));
141 g_assert_not_reached ();
143 @@ -2738,6 +2798,14 @@
144 g_value_set_boolean (value, text_view->accepts_tab);
148 + g_value_set_boolean (value, gtk_text_view_get_autocap (text_view));
151 + case PROP_INPUT_MODE:
152 + g_value_set_int (value, gtk_text_view_get_input_mode (text_view));
156 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
158 @@ -3916,7 +3984,7 @@
159 GtkTextView *text_view = GTK_TEXT_VIEW (widget);
164 if (text_view->layout == NULL || get_buffer (text_view) == NULL)
167 @@ -4039,6 +4107,9 @@
168 if (event->window != text_view->text_window->bin_window)
171 + if (text_view->editable)
172 + gtk_im_context_show (text_view->im_context);
174 if (event->button == 1)
176 if (text_view->drag_start_x >= 0)
177 @@ -4083,7 +4154,15 @@
179 gtk_text_view_focus_in_event (GtkWidget *widget, GdkEventFocus *event)
181 + /*gboolean have_selection;
182 + GtkTextIter sel_start, sel_end;*/
184 GtkTextView *text_view = GTK_TEXT_VIEW (widget);
186 + /*have_selection = gtk_text_buffer_get_selection_bounds(text_view->buffer, &sel_start, &sel_end);
188 + if(!have_selection)
189 + gtk_text_view_move_cursor(text_view, GTK_MOVEMENT_BUFFER_ENDS, 1, FALSE);*//*FIXME some other way to place the cursor in the end*/
191 gtk_widget_queue_draw (widget);
193 @@ -4100,8 +4179,10 @@
194 G_CALLBACK (keymap_direction_changed), text_view);
195 gtk_text_view_check_keymap_direction (text_view);
197 + /* Keyboard hack */
198 text_view->need_im_reset = TRUE;
199 gtk_im_context_focus_in (GTK_TEXT_VIEW (widget)->im_context);
200 + gtk_text_view_reset_im_context (text_view);
204 @@ -4110,6 +4191,14 @@
205 gtk_text_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event)
207 GtkTextView *text_view = GTK_TEXT_VIEW (widget);
208 + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view);
213 + gtk_text_buffer_get_bounds(text_view->buffer, &start, &end);
214 + gtk_text_buffer_select_range(text_view->buffer, &start, &start);
215 + }*//*FIXME need a hack here to take away the focus*/
217 gtk_widget_queue_draw (widget);
219 @@ -4125,8 +4214,11 @@
220 keymap_direction_changed,
223 - text_view->need_im_reset = TRUE;
224 - gtk_im_context_focus_out (GTK_TEXT_VIEW (widget)->im_context);
225 + /* This is commented out to disable unselect feature.
226 + When the decition of this has been made, we can either remove this patch
228 + if( priv->release_selection )
229 + gtk_text_view_unselect( text_view );*/
233 @@ -5082,7 +5174,8 @@
235 gboolean leave_one = FALSE;
237 - gtk_text_view_reset_im_context (text_view);
238 + /*gtk_text_view_reset_im_context (text_view);*/ /*backspace should not clear
239 + the word completion*/
241 if (type == GTK_DELETE_CHARS)
243 @@ -5200,7 +5293,8 @@
247 - gtk_text_view_reset_im_context (text_view);
248 + /*gtk_text_view_reset_im_context (text_view);*/ /*backspace should not clear
249 + the word completion*/
251 /* Backspace deletes the selection, if one exists */
252 if (gtk_text_buffer_delete_selection (get_buffer (text_view), TRUE,
253 @@ -5928,11 +6022,11 @@
255 gtk_text_view_reset_im_context (GtkTextView *text_view)
257 - if (text_view->need_im_reset)
258 +/* if (text_view->need_im_reset)
260 - text_view->need_im_reset = FALSE;
261 + text_view->need_im_reset = FALSE;*/
262 gtk_im_context_reset (text_view->im_context);
268 @@ -6665,18 +6759,23 @@
276 - gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start,
277 + gtk_text_buffer_get_iter_at_line (text_view->buffer, &start, 0);
278 + gtk_text_buffer_get_iter_at_mark (text_view->buffer, &end,
279 gtk_text_buffer_get_insert (text_view->buffer));
282 - pos = gtk_text_iter_get_line_index (&start);
283 - gtk_text_iter_set_line_offset (&start, 0);
284 + pos = gtk_text_iter_get_line_index (&end);
286 gtk_text_iter_forward_to_line_end (&end);
287 + endpos = gtk_text_iter_get_line_index (&end);
289 text = gtk_text_iter_get_slice (&start, &end);
291 + pos = strlen (text) - (endpos - pos); /* want bytes, not characters */
294 gtk_im_context_set_surrounding (context, text, -1, pos);
297 @@ -6726,8 +6825,8 @@
302 - gtk_text_view_reset_im_context (text_view);
304 + gtk_text_view_reset_im_context (text_view);*//*FIXME need a hack here*/
308 @@ -6957,6 +7056,13 @@
312 +block_selection_change( GtkMenuShell *menushell, gpointer user_data )
314 + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(user_data);
315 + priv->release_selection = TRUE;
319 unichar_chosen_func (const char *text,
322 @@ -7064,7 +7170,12 @@
323 signals[POPULATE_POPUP],
325 text_view->popup_menu);
328 + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE(text_view);
329 + g_signal_connect( GTK_WIDGET(text_view->popup_menu), "selection-done",
330 + G_CALLBACK(block_selection_change), text_view );
331 + priv->release_selection = FALSE;
334 gtk_menu_popup (GTK_MENU (text_view->popup_menu), NULL, NULL,
336 @@ -8301,3 +8412,81 @@
338 return gtk_text_layout_move_iter_visually (text_view->layout, iter, count);
342 + * gtk_text_view_set_autocap:
343 + * @entry: a #GtkTextView
344 + * @autocap: autocap
346 + * Sets autocapitalization of the widget.
349 +gtk_text_view_set_autocap (GtkTextView *text_view,
352 + g_return_if_fail (GTK_IS_TEXT_VIEW (text_view));
354 + if (gtk_text_view_get_autocap (text_view) != autocap)
356 + g_object_set (G_OBJECT (text_view->im_context), "autocap", autocap, NULL);
357 + g_object_notify (G_OBJECT (text_view), "autocap");
362 + * gtk_text_view_get_autocap:
363 + * @entry: a #GtkTextView
365 + * Gets autocapitalization state of the widget.
367 + * Return value: a state
370 +gtk_text_view_get_autocap (GtkTextView *text_view)
373 + g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), FALSE);
375 + g_object_get (G_OBJECT (text_view->im_context), "autocap", &autocap, NULL);
381 + * gtk_text_view_set_input_mode:
382 + * @text_view: a #GtkTextView
383 + * @mode: input mode
385 + * Sets autocapitalization of the widget.
388 +gtk_text_view_set_input_mode (GtkTextView *text_view,
391 + g_return_if_fail (GTK_IS_TEXT_VIEW (text_view));
393 + if (gtk_text_view_get_input_mode (text_view) != mode)
395 + g_object_set (G_OBJECT (text_view->im_context), "input_mode", mode, NULL);
396 + g_object_notify (G_OBJECT (text_view), "input_mode");
401 + * gtk_text_view_get_input_mode:
402 + * @text_view: a #GtkTextView
404 + * Gets input mode of the widget.
406 + * Return value: input mode
409 +gtk_text_view_get_input_mode (GtkTextView *text_view)
412 + g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), FALSE);
414 + g_object_get (G_OBJECT (text_view->im_context), "input_mode", &mode, NULL);