📄 gtktext.c
字号:
} attrmask |= GDK_IC_PREEDIT_POSITION_REQ; gdk_window_get_size (text->text_area, &width, &height); attr->spot_location.x = 0; attr->spot_location.y = height; attr->preedit_area.x = 0; attr->preedit_area.y = 0; attr->preedit_area.width = width; attr->preedit_area.height = height; attr->preedit_fontset = widget->style->font; break; } editable->ic = gdk_ic_new (attr, attrmask); if (editable->ic == NULL) g_warning ("Can't create input context."); else { mask = gdk_window_get_events (text->text_area); mask |= gdk_ic_get_events (editable->ic); gdk_window_set_events (text->text_area, mask); if (GTK_WIDGET_HAS_FOCUS (widget)) gdk_im_begin (editable->ic, text->text_area); } }#endif realize_properties (text); gdk_window_show (text->text_area); init_properties (text); if (editable->selection_start_pos != editable->selection_end_pos) gtk_editable_claim_selection (editable, TRUE, GDK_CURRENT_TIME); recompute_geometry (text);}static void gtk_text_style_set (GtkWidget *widget, GtkStyle *previous_style){ GtkText *text; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); text = GTK_TEXT (widget); if (GTK_WIDGET_REALIZED (widget)) { gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]); gdk_window_set_background (text->text_area, &widget->style->base[GTK_STATE_NORMAL]); if (text->bg_gc) { gdk_gc_destroy (text->bg_gc); text->bg_gc = NULL; } if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) text->bg_gc = create_bg_gc (text); recompute_geometry (text); } if (text->current_font) text_font_unref (text->current_font); text->current_font = get_text_font (widget->style->font);}static voidgtk_text_unrealize (GtkWidget *widget){ GtkText *text; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); text = GTK_TEXT (widget);#ifdef USE_XIM if (GTK_EDITABLE (widget)->ic) { gdk_ic_destroy (GTK_EDITABLE (widget)->ic); GTK_EDITABLE (widget)->ic = NULL; } if (GTK_EDITABLE (widget)->ic_attr) { gdk_ic_attr_destroy (GTK_EDITABLE (widget)->ic_attr); GTK_EDITABLE (widget)->ic_attr = NULL; }#endif gdk_window_set_user_data (text->text_area, NULL); gdk_window_destroy (text->text_area); text->text_area = NULL; gdk_gc_destroy (text->gc); text->gc = NULL; if (text->bg_gc) { gdk_gc_destroy (text->bg_gc); text->bg_gc = NULL; } gdk_pixmap_unref (text->line_wrap_bitmap); gdk_pixmap_unref (text->line_arrow_bitmap); unrealize_properties (text); free_cache (text); if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidclear_focus_area (GtkText *text, gint area_x, gint area_y, gint area_width, gint area_height){ GtkWidget *widget = GTK_WIDGET (text); gint ythick = TEXT_BORDER_ROOM + widget->style->klass->ythickness; gint xthick = TEXT_BORDER_ROOM + widget->style->klass->xthickness; gint width, height; gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height); gdk_gc_set_ts_origin (text->bg_gc, (- (gint)text->first_onscreen_hor_pixel + xthick) % width, (- (gint)text->first_onscreen_ver_pixel + ythick) % height); gdk_draw_rectangle (GTK_WIDGET (text)->window, text->bg_gc, TRUE, area_x, area_y, area_width, area_height);}static voidgtk_text_draw_focus (GtkWidget *widget){ GtkText *text; gint width, height; gint x, y; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); text = GTK_TEXT (widget); if (GTK_WIDGET_DRAWABLE (widget)) { gint ythick = widget->style->klass->ythickness; gint xthick = widget->style->klass->xthickness; gint xextra = TEXT_BORDER_ROOM; gint yextra = TEXT_BORDER_ROOM; TDEBUG (("in gtk_text_draw_focus\n")); x = 0; y = 0; width = widget->allocation.width; height = widget->allocation.height; if (GTK_WIDGET_HAS_FOCUS (widget)) { x += 1; y += 1; width -= 2; height -= 2; xextra -= 1; yextra -= 1; gtk_paint_focus (widget->style, widget->window, NULL, widget, "text", 0, 0, widget->allocation.width - 1, widget->allocation.height - 1); } gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, widget, "text", x, y, width, height); x += xthick; y += ythick; width -= 2 * xthick; height -= 2 * ythick; if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) { /* top rect */ clear_focus_area (text, x, y, width, yextra); /* left rect */ clear_focus_area (text, x, y + yextra, xextra, y + height - 2 * yextra); /* right rect */ clear_focus_area (text, x + width - xextra, y + yextra, xextra, height - 2 * ythick); /* bottom rect */ clear_focus_area (text, x, x + height - yextra, width, yextra); } } else { TDEBUG (("in gtk_text_draw_focus (undrawable !!!)\n")); }}static voidgtk_text_size_request (GtkWidget *widget, GtkRequisition *requisition){ gint xthickness; gint ythickness; gint char_height; gint char_width; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); g_return_if_fail (requisition != NULL); xthickness = widget->style->klass->xthickness + TEXT_BORDER_ROOM; ythickness = widget->style->klass->ythickness + TEXT_BORDER_ROOM; char_height = MIN_TEXT_HEIGHT_LINES * (widget->style->font->ascent + widget->style->font->descent); char_width = MIN_TEXT_WIDTH_LINES * (gdk_text_width (widget->style->font, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26) / 26); requisition->width = char_width + xthickness * 2; requisition->height = char_height + ythickness * 2;}static voidgtk_text_size_allocate (GtkWidget *widget, GtkAllocation *allocation){ GtkText *text; GtkEditable *editable; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); g_return_if_fail (allocation != NULL); text = GTK_TEXT (widget); editable = GTK_EDITABLE (widget); widget->allocation = *allocation; if (GTK_WIDGET_REALIZED (widget)) { gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); gdk_window_move_resize (text->text_area, widget->style->klass->xthickness + TEXT_BORDER_ROOM, widget->style->klass->ythickness + TEXT_BORDER_ROOM, MAX (1, (gint)widget->allocation.width - (gint)(widget->style->klass->xthickness + (gint)TEXT_BORDER_ROOM) * 2), MAX (1, (gint)widget->allocation.height - (gint)(widget->style->klass->ythickness + (gint)TEXT_BORDER_ROOM) * 2)); #ifdef USE_XIM if (editable->ic && (gdk_ic_get_style (editable->ic) & GDK_IM_PREEDIT_POSITION)) { gint width, height; gdk_window_get_size (text->text_area, &width, &height); editable->ic_attr->preedit_area.width = width; editable->ic_attr->preedit_area.height = height; gdk_ic_set_attr (editable->ic, editable->ic_attr, GDK_IC_PREEDIT_AREA); }#endif recompute_geometry (text); }}static voidgtk_text_draw (GtkWidget *widget, GdkRectangle *area){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TEXT (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) { expose_text (GTK_TEXT (widget), area, TRUE); gtk_widget_draw_focus (widget); }}static gintgtk_text_expose (GtkWidget *widget, GdkEventExpose *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); if (event->window == GTK_TEXT (widget)->text_area) { TDEBUG (("in gtk_text_expose (expose)\n")); expose_text (GTK_TEXT (widget), &event->area, TRUE); } else if (event->count == 0) { TDEBUG (("in gtk_text_expose (focus)\n")); gtk_widget_draw_focus (widget); } return FALSE;}static gintgtk_text_scroll_timeout (gpointer data){ GtkText *text; GdkEventMotion event; gint x, y; GdkModifierType mask; GDK_THREADS_ENTER (); text = GTK_TEXT (data); text->timer = 0; gdk_window_get_pointer (text->text_area, &x, &y, &mask); if (mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK)) { event.is_hint = 0; event.x = x; event.y = y; event.state = mask; gtk_text_motion_notify (GTK_WIDGET (text), &event); } GDK_THREADS_LEAVE (); return FALSE;}static gintgtk_text_button_press (GtkWidget *widget, GdkEventButton *event){ GtkText *text; GtkEditable *editable; static GdkAtom ctext_atom = GDK_NONE; 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); if (ctext_atom == GDK_NONE) ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE); text = GTK_TEXT (widget); editable = GTK_EDITABLE (widget); if (text->button && (event->button != text->button)) return FALSE; text->button = event->button; if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); if (event->button == 1) { switch (event->type) { case GDK_BUTTON_PRESS: gtk_grab_add (widget); undraw_cursor (text, FALSE); find_mouse_cursor (text, (gint)event->x, (gint)event->y); draw_cursor (text, FALSE); /* Set it now, so we display things right. We'll unset it * later if things don't work out */ editable->has_selection = TRUE; gtk_text_set_selection (GTK_EDITABLE(text), text->cursor_mark.index, text->cursor_mark.index); break; case GDK_2BUTTON_PRESS: gtk_text_select_word (text, event->time); break; case GDK_3BUTTON_PRESS: gtk_text_select_line (text, event->time); break; default: break; } } else if (event->type == GDK_BUTTON_PRESS) { if ((event->button == 2) && editable->editable) { if (editable->selection_start_pos == editable->selection_end_pos || editable->has_selection) { undraw_cursor (text, FALSE); find_mouse_cursor (text, (gint)event->x, (gint)event->y); draw_cursor (text, FALSE); } gtk_selection_convert (widget, GDK_SELECTION_PRIMARY, ctext_atom, event->time); } else { gtk_grab_add (widget); undraw_cursor (text, FALSE); find_mouse_cursor (text, event->x, event->y); draw_cursor (text, FALSE); gtk_text_set_selection (GTK_EDITABLE(text), text->cursor_mark.index, text->cursor_mark.index); editable->has_selection = FALSE; if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window) gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time); } } return FALSE;}static gintgtk_text_button_release (GtkWidget *widget, GdkEventButton *event){ GtkText *text; GtkEditable *editable; g_return_val_if_fail (widget != NULL, FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -