📄 gtkeditable.c
字号:
gtk_editable_get_public_chars (GtkEditable *editable, gint start, gint end){ if (editable->visible) return gtk_editable_get_chars (editable, start, end); else { gint i; gint nchars = end - start; gchar *str; if (nchars < 0) nchars = -nchars; str = g_new (gchar, nchars + 1); for (i = 0; i<nchars; i++) str[i] = '*'; str[i] = '\0'; return str; }}static voidgtk_editable_set_selection (GtkEditable *editable, gint start_pos, gint end_pos){ GtkEditableClass *klass; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); klass = GTK_EDITABLE_CLASS (GTK_OBJECT (editable)->klass); klass->set_selection (editable, start_pos, end_pos);}voidgtk_editable_set_position (GtkEditable *editable, gint position){ GtkEditableClass *klass; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); klass = GTK_EDITABLE_CLASS (GTK_OBJECT (editable)->klass); klass->set_position (editable, position);}gintgtk_editable_get_position (GtkEditable *editable){ g_return_val_if_fail (editable != NULL, -1); g_return_val_if_fail (GTK_IS_EDITABLE (editable), -1); return editable->current_pos;}static gintgtk_editable_selection_clear (GtkWidget *widget, GdkEventSelection *event){ GtkEditable *editable; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_EDITABLE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); /* Let the selection handling code know that the selection * has been changed, since we've overriden the default handler */ if (!gtk_selection_clear (widget, event)) return FALSE; editable = GTK_EDITABLE (widget); if (event->selection == GDK_SELECTION_PRIMARY) { if (editable->has_selection) { editable->has_selection = FALSE; gtk_editable_update_text (editable, editable->selection_start_pos, editable->selection_end_pos); } } else if (event->selection == clipboard_atom) { g_free (editable->clipboard_text); editable->clipboard_text = NULL; } return TRUE;}static voidgtk_editable_selection_get (GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time){ GtkEditable *editable; gint selection_start_pos; gint selection_end_pos; gchar *str; gint length; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_EDITABLE (widget)); editable = GTK_EDITABLE (widget); if (selection_data->selection == GDK_SELECTION_PRIMARY) { selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos); selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos); str = gtk_editable_get_public_chars(editable, selection_start_pos, selection_end_pos); if (!str) return; /* Refuse */ length = strlen (str); } else /* CLIPBOARD */ { if (!editable->clipboard_text) return; /* Refuse */ str = editable->clipboard_text; length = strlen (editable->clipboard_text); } if (info == TARGET_STRING) { gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING, 8*sizeof(gchar), (guchar *)str, length); } else if ((info == TARGET_TEXT) || (info == TARGET_COMPOUND_TEXT)) { guchar *text; gchar c; GdkAtom encoding; gint format; gint new_length; c = str[length]; str[length] = '\0'; gdk_string_to_compound_text (str, &encoding, &format, &text, &new_length); gtk_selection_data_set (selection_data, encoding, format, text, new_length); gdk_free_compound_text (text); str[length] = c; } if (str != editable->clipboard_text) g_free (str);}static voidgtk_editable_selection_received (GtkWidget *widget, GtkSelectionData *selection_data, guint time){ GtkEditable *editable; gint reselect; gint old_pos; gint tmp_pos; enum {INVALID, STRING, CTEXT} type; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_EDITABLE (widget)); editable = GTK_EDITABLE (widget); if (selection_data->type == GDK_TARGET_STRING) type = STRING; else if ((selection_data->type == gdk_atom_intern ("COMPOUND_TEXT", FALSE)) || (selection_data->type == gdk_atom_intern ("TEXT", FALSE))) type = CTEXT; else type = INVALID; if (type == INVALID || selection_data->length < 0) { /* avoid infinite loop */ if (selection_data->target != GDK_TARGET_STRING) gtk_selection_convert (widget, selection_data->selection, GDK_TARGET_STRING, time); return; } reselect = FALSE; if ((editable->selection_start_pos != editable->selection_end_pos) && (!editable->has_selection || (selection_data->selection == clipboard_atom))) { reselect = TRUE; /* Don't want to call gtk_editable_delete_selection here if we are going * to reclaim the selection to avoid extra server traffic */ if (editable->has_selection) { gtk_editable_delete_text (editable, MIN (editable->selection_start_pos, editable->selection_end_pos), MAX (editable->selection_start_pos, editable->selection_end_pos)); } else gtk_editable_delete_selection (editable); } tmp_pos = old_pos = editable->current_pos; switch (type) { case STRING: selection_data->data[selection_data->length] = 0; gtk_editable_insert_text (editable, (gchar *)selection_data->data, strlen ((gchar *)selection_data->data), &tmp_pos); editable->current_pos = tmp_pos; break; case CTEXT: { gchar **list; gint count; gint i; count = gdk_text_property_to_text_list (selection_data->type, selection_data->format, selection_data->data, selection_data->length, &list); for (i=0; i<count; i++) { gtk_editable_insert_text (editable, list[i], strlen (list[i]), &tmp_pos); editable->current_pos = tmp_pos; } if (count > 0) gdk_free_text_list (list); } break; case INVALID: /* quiet compiler */ break; } if (reselect) gtk_editable_set_selection (editable, old_pos, editable->current_pos);}voidgtk_editable_delete_selection (GtkEditable *editable){ guint start; guint end; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); if (!editable->editable) return; start = editable->selection_start_pos; end = editable->selection_end_pos; editable->selection_start_pos = 0; editable->selection_end_pos = 0; if (start != end) gtk_editable_delete_text (editable, MIN (start, end), MAX (start,end)); if (editable->has_selection) { editable->has_selection = FALSE; if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == GTK_WIDGET (editable)->window) gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); }}voidgtk_editable_claim_selection (GtkEditable *editable, gboolean claim, guint32 time){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); g_return_if_fail (GTK_WIDGET_REALIZED (editable)); editable->has_selection = FALSE; if (claim) { if (gtk_selection_owner_set (GTK_WIDGET(editable), GDK_SELECTION_PRIMARY, time)) editable->has_selection = TRUE; } else { if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == GTK_WIDGET(editable)->window) gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, time); }}voidgtk_editable_select_region (GtkEditable *editable, gint start, gint end){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); if (GTK_WIDGET_REALIZED (editable)) gtk_editable_claim_selection (editable, start != end, GDK_CURRENT_TIME); gtk_editable_set_selection (editable, start, end);}/* Get the timestamp of the current event. Actually, the only thing * we really care about below is the key event */static guint32gtk_editable_get_event_time (GtkEditable *editable){ GdkEvent *event; guint32 tm = GDK_CURRENT_TIME; event = gtk_get_current_event(); if (event) switch (event->type) { case GDK_MOTION_NOTIFY: tm = event->motion.time; break; case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: case GDK_BUTTON_RELEASE: tm = event->button.time; break; case GDK_KEY_PRESS: case GDK_KEY_RELEASE: tm = event->key.time; break; case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: tm = event->crossing.time; break; case GDK_PROPERTY_NOTIFY: tm = event->property.time; break; case GDK_SELECTION_CLEAR: case GDK_SELECTION_REQUEST: case GDK_SELECTION_NOTIFY: tm = event->selection.time; break; case GDK_PROXIMITY_IN: case GDK_PROXIMITY_OUT: tm = event->proximity.time; break; default: /* use current time */ break; } gdk_event_free(event); return tm;}voidgtk_editable_cut_clipboard (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_signal_emit (GTK_OBJECT (editable), editable_signals[CUT_CLIPBOARD]);}voidgtk_editable_copy_clipboard (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_signal_emit (GTK_OBJECT (editable), editable_signals[COPY_CLIPBOARD]);}voidgtk_editable_paste_clipboard (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_signal_emit (GTK_OBJECT (editable), editable_signals[PASTE_CLIPBOARD]);}voidgtk_editable_set_editable (GtkEditable *editable, gboolean is_editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_signal_emit (GTK_OBJECT (editable), editable_signals[SET_EDITABLE], is_editable != FALSE);}static voidgtk_editable_real_set_editable (GtkEditable *editable, gboolean is_editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); editable->editable = is_editable != FALSE; gtk_widget_queue_draw (GTK_WIDGET (editable));}static voidgtk_editable_real_cut_clipboard (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_editable_real_copy_clipboard (editable); gtk_editable_delete_selection (editable);}static voidgtk_editable_real_copy_clipboard (GtkEditable *editable){ guint32 time; gint selection_start_pos; gint selection_end_pos; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); time = gtk_editable_get_event_time (editable); selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos); selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos); if (selection_start_pos != selection_end_pos) { if (gtk_selection_owner_set (GTK_WIDGET (editable), clipboard_atom, time)) editable->clipboard_text = gtk_editable_get_public_chars (editable, selection_start_pos, selection_end_pos); }}static voidgtk_editable_real_paste_clipboard (GtkEditable *editable){ guint32 time; g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); time = gtk_editable_get_event_time (editable); if (editable->editable) gtk_selection_convert (GTK_WIDGET(editable), clipboard_atom, gdk_atom_intern ("COMPOUND_TEXT", FALSE), time);}voidgtk_editable_changed (GtkEditable *editable){ g_return_if_fail (editable != NULL); g_return_if_fail (GTK_IS_EDITABLE (editable)); gtk_signal_emit (GTK_OBJECT (editable), editable_signals[CHANGED]);}#if 0static voidgtk_editable_parent_set (GtkWidget *widget, GtkWidget *old_parent, GtkWidget *editable){ GtkWidget *parent; parent = old_parent; while (parent) { gtk_signal_disconnect_by_func (GTK_OBJECT (parent), GTK_SIGNAL_FUNC (gtk_editable_parent_set), editable); parent = parent->parent; } parent = widget->parent; while (parent) { gtk_signal_connect (GTK_OBJECT (parent), "parent_set", GTK_SIGNAL_FUNC (gtk_editable_parent_set), editable); parent = parent->parent; }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -