📄 clipboard.c
字号:
(GCompareFunc) find_by_widget); if (gtmp) last = gtmp->data; edit = GTK_EDITABLE (node->relative); position = gtk_editable_get_position (edit); switch (node->delta) { case DELTA_DELETE_BLOCK: ignore_next = TRUE; gtk_editable_delete_text (edit, node->offset, node->offset + node->length); break; case DELTA_ADD_BLOCK: ignore_next = TRUE; gtk_editable_set_position (edit, node->offset); dum = node->offset; ignore_next = TRUE; gtk_editable_insert_text (edit, node->charecter, node->length, &dum); break; case DELTA_DELETE_ALL: ignore_next = TRUE; gtk_editable_delete_text (edit, 0, -1); break; } if (gtmp) { char *tmp = gtk_editable_get_chars (edit, 0, -1); last = gtmp->data; last->last = strdup (tmp); g_free (tmp); } if (node->charecter) free (node->charecter); node->last = NULL; undo_list = g_list_remove (undo_list, node); free (node); } } if (undo_list) { GList *seek; for (seek = undo_widgets; seek; seek = seek->next) { gtk_widget_set_sensitive (seek->data, TRUE); } } else { GList *seek; for (seek = undo_widgets; seek; seek = seek->next) { gtk_widget_set_sensitive (seek->data, FALSE); } }}voidundo_editable_changed (GtkEditable * editable){ GList *seek; char *current; if (ignore_next == TRUE) { ignore_next = FALSE; return; } current = gtk_editable_get_chars (editable, 0, -1); seek = g_list_find_custom (undo_list, GTK_WIDGET (editable), (GCompareFunc) find_by_widget); if (seek) { UndoNode *last = seek->data; if (!last) { g_free (current); return; } if (!last->last) { g_free (current); return; } if (strlen (current) > strlen (last->last)) { UndoNode *node = (UndoNode *) calloc (1, sizeof (UndoNode)); node->relative = GTK_WIDGET (editable); node->offset = find_offset (current, last->last); g_return_if_fail (node->offset != -1); node->length = strlen (current) - strlen (last->last); node->delta = DELTA_DELETE_BLOCK; node->last = current; node->timestamp = time (NULL); add_node (node); } else { UndoNode *node = (UndoNode *) calloc (1, sizeof (UndoNode)); node->relative = GTK_WIDGET (editable); node->offset = find_offset (current, last->last); node->length = strlen (last->last) - strlen (current); node->charecter = (char *) calloc (node->length + 5, sizeof (char)); memmove (node->charecter, last->last + node->offset, node->length); node->delta = DELTA_ADD_BLOCK; node->last = current; node->timestamp = time (NULL); add_node (node); } last->last = NULL; } else { UndoNode *node = (UndoNode *) calloc (1, sizeof (UndoNode)); node->relative = GTK_WIDGET (editable); node->delta = DELTA_DELETE_ALL; node->last = current; node->timestamp = time (NULL); add_node (node); } if (undo_list) { GList *seek; for (seek = undo_widgets; seek; seek = seek->next) { gtk_widget_set_sensitive (seek->data, TRUE); } } else { GList *seek; for (seek = undo_widgets; seek; seek = seek->next) { gtk_widget_set_sensitive (seek->data, FALSE); } }#ifdef DMALLOC if (current) dmalloc_verify (current);#endif return;}voidclip_handle_editable (GtkWidget * editable){#ifdef CLIPBOARD gtk_signal_connect (GTK_OBJECT (editable), "focus_in_event", GTK_SIGNAL_FUNC (clip_focus_in_event), NULL); gtk_signal_connect (GTK_OBJECT (editable), "button_press_event", GTK_SIGNAL_FUNC (clip_button_press_event), NULL); gtk_signal_connect_after (GTK_OBJECT (editable), "button_press_event", GTK_SIGNAL_FUNC (clip_button_press_event_after), NULL); if (GTK_EDITABLE (editable)->editable) gtk_signal_connect (GTK_OBJECT (editable), "changed", GTK_SIGNAL_FUNC (undo_editable_changed), NULL); gtk_signal_connect (GTK_OBJECT (editable), "destroy", GTK_SIGNAL_FUNC (undo_destroy_notify), NULL);#endif}voidundo_widget_destroy_notify (GtkObject * object){ GtkWidget *widget = GTK_WIDGET (object); undo_widgets = g_list_remove (undo_widgets, widget);}GtkWidget *clip_create_menu (GtkWidget ** undo, GtkAccelGroup * accel_group){ GtkWidget *menu; GtkAccelGroup *menu_accels; GtkWidget *menuitem, *tearoff; menu = gtk_menu_new (); gtk_widget_set_name (menu, "menu"); gtk_object_set_data (GTK_OBJECT (menu), "menu", menu); menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (menu)); tearoff = gtk_tearoff_menu_item_new (); gtk_widget_show (tearoff); gtk_container_add (GTK_CONTAINER (menu), tearoff); menuitem = gtk_menu_item_new_with_label (_("Cut")); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); if (accel_group) gtk_widget_add_accelerator (menuitem, "activate", accel_group, GDK_x, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_cut), NULL); menuitem = gtk_menu_item_new_with_label (_("Copy")); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); if (accel_group) gtk_widget_add_accelerator (menuitem, "activate", accel_group, GDK_c, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_copy), NULL); menuitem = gtk_menu_item_new_with_label (_("Paste")); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); if (accel_group) gtk_widget_add_accelerator (menuitem, "activate", accel_group, GDK_v, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_paste), NULL); menuitem = gtk_menu_item_new_with_label (_("Select All")); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); if (accel_group) gtk_widget_add_accelerator (menuitem, "activate", accel_group, GDK_a, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_select_all), NULL); menuitem = gtk_menu_item_new_with_label (_("Clear")); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_clear), NULL); menuitem = gtk_menu_item_new (); gtk_widget_set_name (menuitem, "menuitem"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "menuitem", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); menuitem = gtk_menu_item_new_with_label (_("Undo")); gtk_widget_set_name (menuitem, "undo"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "undo", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); if (accel_group) gtk_widget_add_accelerator (menuitem, "activate", accel_group, GDK_z, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (clip_undo), NULL); if (undo) *undo = menuitem; if (!undo_list) gtk_widget_set_sensitive (menuitem, FALSE); return menu;}GtkWidget *clip_create_menuitem (GtkWidget * parent, GtkAccelGroup * group){ GtkWidget *menu, *menuitem; GtkWidget *undo; menuitem = gtk_menu_item_new_with_label (_("Edit")); menu = clip_create_menu (&undo, group); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); gtk_widget_set_name (menuitem, "edit_base"); gtk_widget_ref (menuitem); gtk_object_set_data_full (GTK_OBJECT (menu), "edit_base", menuitem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (parent), menuitem); gtk_signal_connect (GTK_OBJECT (undo), "destroy", GTK_SIGNAL_FUNC (undo_widget_destroy_notify), NULL); undo_widgets = g_list_append (undo_widgets, undo); return menuitem;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -