From 99c03a1cdafb3052e3503440843bf88754706667 Mon Sep 17 00:00:00 2001 From: Paul Sheer Date: Wed, 16 Dec 1998 12:35:43 +0000 Subject: [PATCH] gmc mcedit selection now works --- gtkedit/editcmd.c | 28 ++++++-------- gtkedit/editwidget.c | 32 +++++++--------- gtkedit/gtkedit.c | 89 +++++++++++++++++++++++++++++++++++++++----- gtkedit/syntax.c | 14 +++++-- 4 files changed, 115 insertions(+), 48 deletions(-) diff --git a/gtkedit/editcmd.c b/gtkedit/editcmd.c index 1c872194f..033268b73 100644 --- a/gtkedit/editcmd.c +++ b/gtkedit/editcmd.c @@ -2435,12 +2435,10 @@ int edit_copy_to_X_buf_cmd (WEdit * edit) return 1; } #ifdef GTK -#if 0 - gtk_set_selection_owner (CWindowOf (edit->widget)); -#else - /* *** */ - printf ("gtk_set_selection_owner\n"); -#endif + gtk_selection_owner_set (GTK_WIDGET (edit->widget), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); + edit->widget->editable.selection_start_pos = start_mark; + edit->widget->editable.selection_end_pos = end_mark; + edit->widget->editable.has_selection = TRUE; #else XSetSelectionOwner (CDisplay, XA_PRIMARY, CWindowOf (edit->widget), CurrentTime); #endif @@ -2455,16 +2453,15 @@ int edit_cut_to_X_buf_cmd (WEdit * edit) return 0; edit_XStore_block (edit, start_mark, end_mark); if (!edit_save_block_to_clip_file (edit, start_mark, end_mark)) { - edit_error_dialog (_(" Cut to clipboard "), _(" Unable to save to file. ")); + edit_error_dialog (_ (" Cut to clipboard "), _ (" Unable to save to file. ")); return 1; } edit_block_delete_cmd (edit); #ifdef GTK -#if 0 - gtk_set_selection_owner (CWindowOf (edit->widget)); -#else - printf ("gtk_set_selection_owner\n"); -#endif + gtk_selection_owner_set (GTK_WIDGET (edit->widget), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); + edit->widget->editable.selection_start_pos = start_mark; + edit->widget->editable.selection_end_pos = end_mark; + edit->widget->editable.has_selection = TRUE; #else XSetSelectionOwner (CDisplay, XA_PRIMARY, CWindowOf (edit->widget), CurrentTime); #endif @@ -2487,11 +2484,8 @@ void edit_paste_from_X_buf_cmd (WEdit * edit) #endif else #ifdef GTK -#if 0 - gtk_convert_selection (); -#else - /* *** */ -#endif + gtk_selection_convert (GTK_WIDGET (edit->widget), GDK_SELECTION_PRIMARY, + gdk_atom_intern ("COMPOUND_TEXT", FALSE), GDK_CURRENT_TIME); #else XConvertSelection (CDisplay, XA_PRIMARY, XA_STRING, XInternAtom (CDisplay, "VT_SELECTION", False), diff --git a/gtkedit/editwidget.c b/gtkedit/editwidget.c index 8e43eedc9..a66831af0 100644 --- a/gtkedit/editwidget.c +++ b/gtkedit/editwidget.c @@ -137,7 +137,7 @@ static void move_mark (WEdit *edit) edit_mark_cmd (edit, 0); } -static void release_mark (WEdit *edit, XEvent *event) +static void release_mark (WEdit * edit, XEvent * event) { if (edit->mark2 < 0) edit_mark_cmd (edit, 0); @@ -146,13 +146,21 @@ static void release_mark (WEdit *edit, XEvent *event) if (edit->mark1 != edit->mark2 && event) { edit_get_selection (edit); #ifdef GTK + { #if 0 -/* *** */ - gtk_set_selection_owner (CWindowOf (edit->widget)); + long start_mark = 0, end_mark = 0; + edit->widget->editable.has_selection = !eval_marks (edit, &start_mark, &end_mark); + edit->widget->editable.selection_start_pos = start_mark; + edit->widget->editable.selection_end_pos = end_mark; + if (edit->widget->editable.has_selection) #endif + gtk_selection_owner_set (GTK_WIDGET (edit->widget), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); + } #else XSetSelectionOwner (CDisplay, XA_PRIMARY, CWindowOf (edit->widget), event->xbutton.time); #endif + } else { + edit->widget->editable.has_selection = TRUE; } } @@ -589,6 +597,7 @@ void selection_send (XSelectionRequestEvent * rq) /*{{{ paste selection */ +#ifndef GTK /* * Respond to a notification that a primary selection has been sent */ @@ -606,20 +615,6 @@ void paste_prop (void *data, void (*insert) (void *, int), Window win, unsigned Atom actual_type; int actual_fmt, i; unsigned long nitems; - -#ifdef GTK -#if 0 -/* *** */ - if (gtk_get_window_property (win, prop, - nread / 4, 65536, delete, - AnyPropertyType, &actual_type, &actual_fmt, - &nitems, &bytes_after, - &s) != Success) { - XFree (s); - return; - } -#endif -#else if (XGetWindowProperty (CDisplay, win, prop, nread / 4, 65536, delete, AnyPropertyType, &actual_type, &actual_fmt, @@ -628,7 +623,6 @@ void paste_prop (void *data, void (*insert) (void *, int), Window win, unsigned XFree (s); return; } -#endif nread += nitems; for (i = 0; i < nitems; i++) (*insert) (data, s[i]); @@ -647,6 +641,8 @@ void selection_paste (WEdit * edit, Window win, unsigned prop, int delete) edit->force |= REDRAW_COMPLETELY | REDRAW_LINE; } +#endif + /*}}} */ void selection_clear (void) diff --git a/gtkedit/gtkedit.c b/gtkedit/gtkedit.c index 0c6974ab4..0d110d9dd 100644 --- a/gtkedit/gtkedit.c +++ b/gtkedit/gtkedit.c @@ -1,4 +1,5 @@ -/* gtkedit.c - front end for gtk/gnome version +/* gtkedit.c - + front end for gtk/gnome version Copyright (C) 1996, 1997 the Free Software Foundation @@ -533,6 +534,7 @@ static gint GtkEdit *edit; GtkEditable *editable; static GdkAtom ctext_atom = GDK_NONE; + long start_mark = 0, end_mark = 0; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_EDIT (widget), FALSE); @@ -573,6 +575,14 @@ static gint xevent.xbutton.state = event->state; edit_mouse_mark (edit->editor, &xevent, double_click); + + editable->current_pos = edit->editor->curs1; + editable->has_selection = !eval_marks (edit->editor, &start_mark, &end_mark); + editable->selection_start_pos = start_mark; + editable->selection_end_pos = end_mark; + if (event->type == GDK_BUTTON_PRESS && event->button == 2) + gtk_selection_convert (GTK_WIDGET (edit), GDK_SELECTION_PRIMARY, + ctext_atom, event->time); return FALSE; } @@ -691,6 +701,67 @@ static void get_home_dir (void) abort (); } +static gchar *gtk_edit_get_chars (GtkEditable * editable, + gint start_pos, + gint end_pos) +{ + GtkEdit *edit; + gchar *retval; + int i; + g_return_val_if_fail (editable != NULL, NULL); + g_return_val_if_fail (GTK_IS_EDIT (editable), NULL); + edit = GTK_EDIT (editable); + if (end_pos < 0) + end_pos = edit->editor->last_byte; + if ((start_pos < 0) || + (end_pos > edit->editor->last_byte) || + (end_pos < start_pos)) + return 0; + retval = malloc (end_pos - start_pos + 1); + retval[end_pos - start_pos] = '\0'; + for (i = 0; start_pos < end_pos; start_pos++, i++) + retval[i] = (gchar) edit_get_byte (edit->editor, start_pos); + return retval; +} + +static void gtk_edit_set_selection (GtkEditable * editable, + gint start, + gint end) +{ + GtkEdit *edit = GTK_EDIT (editable); + guint start1, end1, start2, end2; + if (end < 0) + end = edit->editor->last_byte; + start1 = MIN (start, end); + end1 = MAX (start, end); + start2 = MIN (editable->selection_start_pos, editable->selection_end_pos); + end2 = MAX (editable->selection_start_pos, editable->selection_end_pos); + if (start2 < start1) { + guint tmp; + tmp = start1; + start1 = start2; + start2 = tmp; + tmp = end1; + end1 = end2; + end2 = tmp; + } + editable->selection_start_pos = start; + editable->selection_end_pos = end; + editable->has_selection = TRUE; + return; +} + +static void gtk_edit_insert_text (GtkEditable * editable, + const gchar * new_text, + gint new_text_length, + gint * position) +{ + GtkEdit *edit = GTK_EDIT (editable); + edit_cursor_move (edit->editor, *position - edit->editor->curs1); + while (new_text_length--) + edit_insert_ahead (edit->editor, new_text[new_text_length]); + *position = edit->editor->curs1; +} static void gtk_edit_class_init (GtkEditClass * class) { @@ -726,19 +797,19 @@ static void gtk_edit_class_init (GtkEditClass * class) widget_class->focus_in_event = 0; widget_class->focus_out_event = 0; -#if 0 editable_class->insert_text = gtk_edit_insert_text; +#if 0 editable_class->delete_text = gtk_edit_delete_text; editable_class->update_text = gtk_edit_update_text; - editable_class->get_chars = gtk_edit_get_chars; - editable_class->set_selection = gtk_edit_set_selection; -#endif - editable_class->set_position = gtk_edit_set_position; - - editable_class->insert_text = 0; +#else editable_class->delete_text = 0; editable_class->update_text = 0; - editable_class->get_chars = 0; +#endif + + editable_class->get_chars = gtk_edit_get_chars; + editable_class->set_selection = gtk_edit_set_selection; + editable_class->set_position = gtk_edit_set_position; + #if 0 editable_class->set_position = 0; diff --git a/gtkedit/syntax.c b/gtkedit/syntax.c index b822aff6f..dec10e187 100644 --- a/gtkedit/syntax.c +++ b/gtkedit/syntax.c @@ -956,7 +956,7 @@ void edit_free_syntax_rules (WEdit * edit) syntax_free (edit->rules); } -#define CURRENT_SYNTAX_RULES_VERSION "43" +#define CURRENT_SYNTAX_RULES_VERSION "44" char *syntax_text[] = { "# syntax rules version " CURRENT_SYNTAX_RULES_VERSION, @@ -1051,9 +1051,6 @@ char *syntax_text[] = { "###############################################################################", "file ..\\*\\\\.sh$ Shell\\sScript ^#!\\s\\*/.\\*/(ksh|bash|sh|pdkzsh)$", "", -"wholechars right abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", -"wholechars left abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", -"", "context default", " keyword whole for yellow/24", " keyword whole in yellow/24", @@ -1170,6 +1167,9 @@ char *syntax_text[] = { "", " keyword wholeleft function*() brightblue/11", "", +"wholechars right abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", +"wholechars left abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", +"", " keyword whole arch cyan/14", " keyword whole ash cyan/14", " keyword whole awk cyan/14", @@ -1259,6 +1259,9 @@ char *syntax_text[] = { " keyword whole zcat cyan/14", " keyword whole zsh cyan/14", "", +"wholechars right abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_", +"wholechars left abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_", +"", "context # \\n brown/22", "", "context exclusive whole <\\[\\s\\\\\\]EOF EOF green/6", @@ -1452,6 +1455,9 @@ char *syntax_text[] = { "", " keyword $ brightgreen/16", "", +"wholechars right abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", +"wholechars left abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._", +"", " keyword whole arch cyan/14", " keyword whole ash cyan/14", " keyword whole awk cyan/14",