📄 gtktext.c
字号:
g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); text = GTK_TEXT (widget); gtk_grab_remove (widget); if (text->button != event->button) return FALSE; text->button = 0; if (text->timer) { gtk_timeout_remove (text->timer); text->timer = 0; } if (event->button == 1) { text = GTK_TEXT (widget); editable = GTK_EDITABLE (widget); gtk_grab_remove (widget); editable->has_selection = FALSE; if (editable->selection_start_pos != editable->selection_end_pos) { if (gtk_selection_owner_set (widget, GDK_SELECTION_PRIMARY, event->time)) editable->has_selection = TRUE; else gtk_text_update_text (editable, editable->selection_start_pos, editable->selection_end_pos); } else { if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window) gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time); } } else if (event->button == 3) { gtk_grab_remove (widget); } undraw_cursor (text, FALSE); find_cursor (text, TRUE); draw_cursor (text, FALSE); return FALSE;}static gintgtk_text_motion_notify (GtkWidget *widget, GdkEventMotion *event){ GtkText *text; gint x, y; gint height; GdkModifierType mask; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); text = GTK_TEXT (widget); x = event->x; y = event->y; mask = event->state; if (event->is_hint || (text->text_area != event->window)) { gdk_window_get_pointer (text->text_area, &x, &y, &mask); } if ((text->button == 0) || !(mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK))) return FALSE; gdk_window_get_size (text->text_area, NULL, &height); if ((y < 0) || (y > height)) { if (text->timer == 0) { text->timer = gtk_timeout_add (SCROLL_TIME, gtk_text_scroll_timeout, text); if (y < 0) scroll_int (text, y/2); else scroll_int (text, (y - height)/2); } else return FALSE; } undraw_cursor (GTK_TEXT (widget), FALSE); find_mouse_cursor (GTK_TEXT (widget), x, y); draw_cursor (GTK_TEXT (widget), FALSE); gtk_text_set_selection (GTK_EDITABLE(text), GTK_EDITABLE(text)->selection_start_pos, text->cursor_mark.index); return FALSE;}static void gtk_text_insert_text (GtkEditable *editable, const gchar *new_text, gint new_text_length, gint *position){ GtkText *text = GTK_TEXT (editable); GdkFont *font; GdkColor *fore, *back; TextProperty *property; gtk_text_set_point (text, *position); property = MARK_CURRENT_PROPERTY (&text->point); font = property->flags & PROPERTY_FONT ? property->font->gdk_font : NULL; fore = property->flags & PROPERTY_FOREGROUND ? &property->fore_color : NULL; back = property->flags & PROPERTY_BACKGROUND ? &property->back_color : NULL; gtk_text_insert (text, font, fore, back, new_text, new_text_length); *position = text->point.index;}static void gtk_text_delete_text (GtkEditable *editable, gint start_pos, gint end_pos){ GtkText *text; g_return_if_fail (start_pos >= 0); text = GTK_TEXT (editable); gtk_text_set_point (text, start_pos); if (end_pos < 0) end_pos = TEXT_LENGTH (text); if (end_pos > start_pos) gtk_text_forward_delete (text, end_pos - start_pos);}static gintgtk_text_key_press (GtkWidget *widget, GdkEventKey *event){ GtkText *text; GtkEditable *editable; gchar key; gint return_val; gint position; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); return_val = FALSE; text = GTK_TEXT (widget); editable = GTK_EDITABLE (widget); key = event->keyval; return_val = TRUE; if ((GTK_EDITABLE(text)->editable == FALSE)) { switch (event->keyval) { case GDK_Home: if (event->state & GDK_CONTROL_MASK) scroll_int (text, -text->vadj->value); else return_val = FALSE; break; case GDK_End: if (event->state & GDK_CONTROL_MASK) scroll_int (text, +text->vadj->upper); else return_val = FALSE; break; case GDK_Page_Up: scroll_int (text, -text->vadj->page_increment); break; case GDK_Page_Down: scroll_int (text, +text->vadj->page_increment); break; case GDK_Up: scroll_int (text, -KEY_SCROLL_PIXELS); break; case GDK_Down: scroll_int (text, +KEY_SCROLL_PIXELS); break; case GDK_Return: if (event->state & GDK_CONTROL_MASK) gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); else return_val = FALSE; break; default: return_val = FALSE; break; } } else { gint extend_selection; gint extend_start; guint initial_pos = editable->current_pos; text->point = find_mark (text, text->cursor_mark.index); extend_selection = event->state & GDK_SHIFT_MASK; extend_start = FALSE; if (extend_selection) { editable->has_selection = TRUE; if (editable->selection_start_pos == editable->selection_end_pos) { editable->selection_start_pos = text->point.index; editable->selection_end_pos = text->point.index; } extend_start = (text->point.index == editable->selection_start_pos); } switch (event->keyval) { case GDK_Home: if (event->state & GDK_CONTROL_MASK) move_cursor_buffer_ver (text, -1); else gtk_text_move_beginning_of_line (text); break; case GDK_End: if (event->state & GDK_CONTROL_MASK) move_cursor_buffer_ver (text, +1); else gtk_text_move_end_of_line (text); break; case GDK_Page_Up: move_cursor_page_ver (text, -1); break; case GDK_Page_Down: move_cursor_page_ver (text, +1); break; /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */ case GDK_Up: move_cursor_ver (text, -1); break; case GDK_Down: move_cursor_ver (text, +1); break; case GDK_Left: if (event->state & GDK_CONTROL_MASK) gtk_text_move_backward_word (text); else move_cursor_hor (text, -1); break; case GDK_Right: if (event->state & GDK_CONTROL_MASK) gtk_text_move_forward_word (text); else move_cursor_hor (text, +1); break; case GDK_BackSpace: if (event->state & GDK_CONTROL_MASK) gtk_text_delete_backward_word (text); else gtk_text_delete_backward_character (text); break; case GDK_Clear: gtk_text_delete_line (text); break; case GDK_Insert: if (event->state & GDK_SHIFT_MASK) { extend_selection = FALSE; gtk_editable_paste_clipboard (editable); } else if (event->state & GDK_CONTROL_MASK) { gtk_editable_copy_clipboard (editable); } else { /* gtk_toggle_insert(text) -- IMPLEMENT */ } break; case GDK_Delete: if (event->state & GDK_CONTROL_MASK) gtk_text_delete_forward_word (text); else if (event->state & GDK_SHIFT_MASK) { extend_selection = FALSE; gtk_editable_cut_clipboard (editable); } else gtk_text_delete_forward_character (text); break; case GDK_Tab: position = text->point.index; gtk_editable_insert_text (editable, "\t", 1, &position); break; case GDK_Return: if (event->state & GDK_CONTROL_MASK) gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); else { position = text->point.index; gtk_editable_insert_text (editable, "\n", 1, &position); } break; case GDK_Escape: /* Don't insert literally */ return_val = FALSE; break; default: return_val = FALSE; if (event->state & GDK_CONTROL_MASK) { if ((key >= 'A') && (key <= 'Z')) key -= 'A' - 'a'; if ((key >= 'a') && (key <= 'z') && control_keys[(int) (key - 'a')]) { (* control_keys[(int) (key - 'a')]) (editable, event->time); return_val = TRUE; } break; } else if (event->state & GDK_MOD1_MASK) { if ((key >= 'A') && (key <= 'Z')) key -= 'A' - 'a'; if ((key >= 'a') && (key <= 'z') && alt_keys[(int) (key - 'a')]) { (* alt_keys[(int) (key - 'a')]) (editable, event->time); return_val = TRUE; } break; } else if (event->length > 0) { extend_selection = FALSE; gtk_editable_delete_selection (editable); position = text->point.index; gtk_editable_insert_text (editable, event->string, event->length, &position); return_val = TRUE; } else return_val = FALSE; } if (return_val && (editable->current_pos != initial_pos)) { if (extend_selection) { if (editable->current_pos < editable->selection_start_pos) gtk_text_set_selection (editable, editable->current_pos, editable->selection_end_pos); else if (editable->current_pos > editable->selection_end_pos) gtk_text_set_selection (editable, editable->selection_start_pos, editable->current_pos); else { if (extend_start) gtk_text_set_selection (editable, editable->current_pos, editable->selection_end_pos); else gtk_text_set_selection (editable, editable->selection_start_pos, editable->current_pos); } } else gtk_text_set_selection (editable, 0, 0); gtk_editable_claim_selection (editable, editable->selection_start_pos != editable->selection_end_pos, event->time); } } return return_val;}static gintgtk_text_focus_in (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); TDEBUG (("in gtk_text_focus_in\n")); GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS); gtk_widget_draw_focus (widget); #ifdef USE_XIM if (GTK_EDITABLE(widget)->ic) gdk_im_begin (GTK_EDITABLE(widget)->ic, GTK_TEXT(widget)->text_area);#endif draw_cursor (GTK_TEXT(widget), TRUE); return FALSE;}static gintgtk_text_focus_out (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); TDEBUG (("in gtk_text_focus_out\n")); GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); gtk_widget_draw_focus (widget); undraw_cursor (GTK_TEXT(widget), TRUE); #ifdef USE_XIM gdk_im_end ();#endif return FALSE;}static voidgtk_text_adjustment (GtkAdjustment *adjustment, GtkText *text){ gfloat old_val; g_return_if_fail (adjustment != NULL); g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); g_return_if_fail (text != NULL); g_return_if_fail (GTK_IS_TEXT (text)); /* Clamp the value here, because we'll get really confused * if someone tries to move the adjusment outside of the * allowed bounds */ old_val = adjustment->value; adjustment->value = MIN (adjustment->value, adjustment->upper - adjus
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -