📄 gtkentry.c
字号:
editable->has_selection = FALSE; editable->current_pos = editable->selection_start_pos; if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window) gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time); } } return FALSE;}static gintgtk_entry_button_release (GtkWidget *widget, GdkEventButton *event){ GtkEntry *entry; GtkEditable *editable; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); entry = GTK_ENTRY (widget); editable = GTK_EDITABLE (widget); if (entry->button != event->button) return FALSE; entry->button = 0; if (event->button == 1) { 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_entry_queue_draw (entry); } 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); } return FALSE;}static gintgtk_entry_motion_notify (GtkWidget *widget, GdkEventMotion *event){ GtkEntry *entry; gint x; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); entry = GTK_ENTRY (widget); if (entry->button == 0) return FALSE; x = event->x; if (event->is_hint || (entry->text_area != event->window)) gdk_window_get_pointer (entry->text_area, &x, NULL, NULL); GTK_EDITABLE(entry)->selection_end_pos = gtk_entry_position (entry, x + entry->scroll_offset); GTK_EDITABLE(entry)->current_pos = GTK_EDITABLE(entry)->selection_end_pos; entry_adjust_scroll (entry); gtk_entry_queue_draw (entry); return FALSE;}static gintgtk_entry_key_press (GtkWidget *widget, GdkEventKey *event){ GtkEntry *entry; GtkEditable *editable; gint return_val; gint key; guint initial_pos; gint extend_selection; gint extend_start; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); entry = GTK_ENTRY (widget); editable = GTK_EDITABLE (widget); return_val = FALSE; if(editable->editable == FALSE) return FALSE; initial_pos = editable->current_pos; extend_selection = event->state & GDK_SHIFT_MASK; extend_start = FALSE; if (extend_selection) { if (editable->selection_start_pos == editable->selection_end_pos) { editable->selection_start_pos = editable->current_pos; editable->selection_end_pos = editable->current_pos; } extend_start = (editable->current_pos == editable->selection_start_pos); } switch (event->keyval) { case GDK_BackSpace: return_val = TRUE; if (event->state & GDK_CONTROL_MASK) gtk_delete_backward_word (entry); else gtk_delete_backward_character (entry); break; case GDK_Clear: return_val = TRUE; gtk_delete_line (entry); break; case GDK_Insert: return_val = TRUE; 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(entry) -- IMPLEMENT */ } break; case GDK_Delete: return_val = TRUE; if (event->state & GDK_CONTROL_MASK) gtk_delete_forward_word (entry); else if (event->state & GDK_SHIFT_MASK) { extend_selection = FALSE; gtk_editable_cut_clipboard (editable); } else gtk_delete_forward_character (entry); break; case GDK_Home: return_val = TRUE; gtk_move_beginning_of_line (entry); break; case GDK_End: return_val = TRUE; gtk_move_end_of_line (entry); break; case GDK_Left: return_val = TRUE; if (event->state & GDK_CONTROL_MASK) gtk_move_backward_word (entry); else gtk_move_backward_character (entry); break; case GDK_Right: return_val = TRUE; if (event->state & GDK_CONTROL_MASK) gtk_move_forward_word (entry); else gtk_move_forward_character (entry); break; case GDK_Return: return_val = TRUE; gtk_widget_activate (widget); break; /* The next two keys should not be inserted literally. Any others ??? */ case GDK_Tab: case GDK_Escape: break; default: if ((event->keyval >= 0x20) && (event->keyval <= 0xFF)) { key = event->keyval; if (event->state & GDK_CONTROL_MASK) { if ((key >= 'A') && (key <= 'Z')) key -= 'A' - 'a'; if ((key >= 'a') && (key <= 'z') && control_keys[key - 'a']) { (* control_keys[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[key - 'a']) { (* alt_keys[key - 'a']) (editable, event->time); return_val = TRUE; } break; } } if (event->length > 0) { gint tmp_pos; extend_selection = FALSE; gtk_editable_delete_selection (editable); tmp_pos = editable->current_pos; gtk_editable_insert_text (editable, event->string, event->length, &tmp_pos); editable->current_pos = tmp_pos; return_val = TRUE; } break; } /* since we emit signals from within the above code, * the widget might already be destroyed or at least * unrealized. */ if (GTK_WIDGET_REALIZED (editable) && return_val && (editable->current_pos != initial_pos)) { if (extend_selection) { if (editable->current_pos < editable->selection_start_pos) editable->selection_start_pos = editable->current_pos; else if (editable->current_pos > editable->selection_end_pos) editable->selection_end_pos = editable->current_pos; else { if (extend_start) editable->selection_start_pos = editable->current_pos; else editable->selection_end_pos = editable->current_pos; } } else { editable->selection_start_pos = 0; editable->selection_end_pos = 0; } gtk_editable_claim_selection (editable, editable->selection_start_pos != editable->selection_end_pos, event->time); entry_adjust_scroll (entry); gtk_entry_queue_draw (entry); } return return_val;}static gintgtk_entry_focus_in (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); 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_ENTRY(widget)->text_area);#endif return FALSE;}static gintgtk_entry_focus_out (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); gtk_widget_draw_focus (widget);#ifdef USE_XIM gdk_im_end ();#endif return FALSE;}static voidgtk_entry_make_backing_pixmap (GtkEntry *entry, gint width, gint height){ gint pixmap_width, pixmap_height; if (!entry->backing_pixmap) { /* allocate */ entry->backing_pixmap = gdk_pixmap_new (entry->text_area, width, height, -1); } else { /* reallocate if sizes don't match */ gdk_window_get_size (entry->backing_pixmap, &pixmap_width, &pixmap_height); if ((pixmap_width != width) || (pixmap_height != height)) { gdk_pixmap_unref (entry->backing_pixmap); entry->backing_pixmap = gdk_pixmap_new (entry->text_area, width, height, -1); } }}static voidgtk_entry_draw_text (GtkEntry *entry){ GtkWidget *widget; GtkEditable *editable; GtkStateType selected_state; gint start_pos; gint end_pos; gint start_xoffset; gint selection_start_pos; gint selection_end_pos; gint selection_start_xoffset; gint selection_end_xoffset; gint width, height; gint y; GdkDrawable *drawable; gint use_backing_pixmap; GdkWChar *stars; GdkWChar *toprint; g_return_if_fail (entry != NULL); g_return_if_fail (GTK_IS_ENTRY (entry)); if (entry->timer) { gtk_timeout_remove (entry->timer); entry->timer = 0; } if (GTK_WIDGET_DRAWABLE (entry)) { widget = GTK_WIDGET (entry); editable = GTK_EDITABLE (entry); if (!entry->text) { gtk_paint_flat_box (widget->style, entry->text_area, GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE, NULL, widget, "entry_bg", 0, 0, -1, -1); if (editable->editable) gtk_entry_draw_cursor (entry); return; } gdk_window_get_size (entry->text_area, &width, &height); /* If the widget has focus, draw on a backing pixmap to avoid flickering and copy it to the text_area. Otherwise draw to text_area directly for better speed. */ use_backing_pixmap = GTK_WIDGET_HAS_FOCUS (widget) && (entry->text != NULL); if (use_backing_pixmap) { gtk_entry_make_backing_pixmap (entry, width, height); drawable = entry->backing_pixmap; } else { drawable = entry->text_area; } gtk_paint_flat_box (widget->style, drawable, GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE, NULL, widget, "entry_bg", 0, 0, width, height); y = (height - (widget->style->font->ascent + widget->style->font->descent)) / 2; y += widget->style->font->ascent; start_pos = gtk_entry_find_position (entry, entry->scroll_offset); start_xoffset = entry->char_offset[start_pos] - entry->scroll_offset; end_pos = gtk_entry_find_position (entry, entry->scroll_offset + width); if (end_pos < entry->text_length) end_pos += 1; selected_state = GTK_STATE_SELECTED; if (!editable->has_selection) selected_state = GTK_STATE_ACTIVE; selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos); selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos); selection_start_pos = CLAMP (selection_start_pos, start_pos, end_pos); selection_end_pos = CLAMP (selection_end_pos, start_pos, end_pos); selection_start_xoffset = entry->char_offset[selection_start_pos] - entry->scroll_offset; selection_end_xoffset = entry->char_offset[selection_end_pos] -entry->scroll_offset; /* if editable->visible, print a bunch of stars. If not, print the standard text. */ if (editable->visible) { toprint = entry->text + start_pos; } else { gint i; stars = g_new (GdkWChar, end_pos - start_pos); for (i = 0; i < end_pos - start_pos; i++) stars[i] = '*'; toprint = stars; } if (selection_start_pos > start_pos) gdk_draw_text_wc (drawable, widget->style->font, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], INNER_BORDER + start_xoffset, y, toprint, selection_start_pos - start_pos); if ((selection_end_pos >= start_pos) && (selection_start_pos < end_pos) && (selection_start_pos != selection_end_pos))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -