📄 xo-misc.c
字号:
undo->bg = (struct Background *)g_memdup(pg->bg, sizeof(struct Background)); undo->bg->canvas_item = NULL; pg->bg->color_no = color; pg->bg->color_rgba = predef_bgcolors_rgba[color]; update_canvas_bg(pg); } if (!ui.bg_apply_all_pages) break; } if (hasdone) undo->multiop -= MULTIOP_CONT_REDO;}void process_paperstyle_activate(GtkMenuItem *menuitem, int style){ struct Page *pg; GList *pglist; gboolean hasdone, must_upd; if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (menuitem))) return; if (ui.bg_apply_all_pages) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("paperstyleNA")), TRUE); pg = ui.cur_page; hasdone = FALSE; must_upd = FALSE; for (pglist = journal.pages; pglist!=NULL; pglist = pglist->next) { if (ui.bg_apply_all_pages) pg = (struct Page *)pglist->data; if (pg->bg->type != BG_SOLID || pg->bg->ruling != style) { prepare_new_undo(); undo->type = ITEM_NEW_BG_ONE; if (hasdone) undo->multiop |= MULTIOP_CONT_UNDO; undo->multiop |= MULTIOP_CONT_REDO; hasdone = TRUE; undo->page = pg; undo->bg = (struct Background *)g_memdup(pg->bg, sizeof(struct Background)); undo->bg->canvas_item = NULL; if (pg->bg->type != BG_SOLID) { pg->bg->type = BG_SOLID; pg->bg->color_no = COLOR_WHITE; pg->bg->color_rgba = predef_bgcolors_rgba[COLOR_WHITE]; pg->bg->filename = NULL; pg->bg->pixbuf = NULL; must_upd = TRUE; } pg->bg->ruling = style; update_canvas_bg(pg); } if (!ui.bg_apply_all_pages) break; } if (hasdone) undo->multiop -= MULTIOP_CONT_REDO; if (must_upd) update_page_stuff();}gboolean ok_to_close(void){ GtkWidget *dialog; GtkResponseType response; GList *pagelist; if (ui.saved) return TRUE; dialog = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, "Save changes to '%s'?", (ui.filename!=NULL) ? ui.filename:"Untitled"); gtk_dialog_add_button(GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); response = gtk_dialog_run(GTK_DIALOG (dialog)); gtk_widget_destroy(dialog); if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT) return FALSE; // aborted if (response == GTK_RESPONSE_YES) { on_fileSave_activate(NULL, NULL); if (!ui.saved) return FALSE; // if save failed, then we abort } return TRUE;}// test if we're still busy loading a PDF background filegboolean page_ops_forbidden(void){ return (bgpdf.status != STATUS_NOT_INIT && bgpdf.create_pages);}// send the focus back to the appropriate widgetvoid reset_focus(void){ if (ui.cur_item_type == ITEM_TEXT) gtk_widget_grab_focus(ui.cur_item->widget); else gtk_widget_grab_focus(GTK_WIDGET(canvas));}// selection / clipboard stuffvoid reset_selection(void){ if (ui.selection == NULL) return; if (ui.selection->canvas_item != NULL) gtk_object_destroy(GTK_OBJECT(ui.selection->canvas_item)); g_list_free(ui.selection->items); g_free(ui.selection); ui.selection = NULL; update_copy_paste_enabled(); update_color_menu(); update_thickness_buttons(); update_color_buttons(); update_font_button();}void move_journal_items_by(GList *itemlist, double dx, double dy, struct Layer *l1, struct Layer *l2, GList *depths){ struct Item *item; GnomeCanvasItem *refitem; GList *link; int i; double *pt; while (itemlist!=NULL) { item = (struct Item *)itemlist->data; if (item->type == ITEM_STROKE) for (pt=item->path->coords, i=0; i<item->path->num_points; i++, pt+=2) { pt[0] += dx; pt[1] += dy; } if (item->type == ITEM_STROKE || item->type == ITEM_TEXT || item->type == ITEM_TEMP_TEXT) { item->bbox.left += dx; item->bbox.right += dx; item->bbox.top += dy; item->bbox.bottom += dy; } if (l1 != l2) { // find out where to insert if (depths != NULL) { if (depths->data == NULL) link = l2->items; else { link = g_list_find(l2->items, depths->data); if (link != NULL) link = link->next; } } else link = NULL; l2->items = g_list_insert_before(l2->items, link, item); l2->nitems++; l1->items = g_list_remove(l1->items, item); l1->nitems--; } if (depths != NULL) { // also raise/lower the canvas items if (item->canvas_item!=NULL) { if (depths->data == NULL) link = NULL; else link = g_list_find(l2->items, depths->data); if (link != NULL) refitem = ((struct Item *)(link->data))->canvas_item; else refitem = NULL; lower_canvas_item_to(l2->group, item->canvas_item, refitem); } depths = depths->next; } itemlist = itemlist->next; }}// Switch between button mappings/* NOTE ABOUT BUTTON MAPPINGS: ui.cur_mapping is 0 except while a canvas click event is being processed ... */void switch_mapping(int m){ if (ui.cur_mapping == m) return; ui.cur_mapping = m; if (ui.toolno[m] < NUM_STROKE_TOOLS) ui.cur_brush = &(ui.brushes[m][ui.toolno[m]]); if (ui.toolno[m] == TOOL_TEXT) ui.cur_brush = &(ui.brushes[m][TOOL_PEN]); update_tool_buttons(); update_color_menu(); update_cursor();}void process_mapping_activate(GtkMenuItem *menuitem, int m, int tool){ if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; if (ui.cur_mapping!=0) return; if (ui.toolno[m] == tool) return; end_text(); reset_focus(); ui.toolno[m] = tool; ui.ruler[m] = FALSE; if (ui.linked_brush[m] == BRUSH_LINKED && (tool==TOOL_PEN || tool==TOOL_HIGHLIGHTER)) ui.ruler[m] = ui.ruler[0]; if (ui.linked_brush[m] == BRUSH_COPIED) { ui.linked_brush[m] = BRUSH_STATIC; update_mappings_menu_linkings(); }}// update the ordering of components in the main vboxconst char *vbox_component_names[VBOX_MAIN_NITEMS]= {"scrolledwindowMain", "menubar", "toolbarMain", "toolbarPen", "hbox1"};void update_vbox_order(int *order){ int i, j; GtkWidget *child; GtkBox *vboxMain = GTK_BOX(GET_COMPONENT("vboxMain")); gboolean present[VBOX_MAIN_NITEMS]; for (i=0; i<VBOX_MAIN_NITEMS; i++) present[i] = FALSE; j=0; for (i=0; i<VBOX_MAIN_NITEMS; i++) { if (order[i]<0 || order[i]>=VBOX_MAIN_NITEMS) continue; present[order[i]] = TRUE; child = GET_COMPONENT(vbox_component_names[order[i]]); gtk_box_reorder_child(vboxMain, child, j++); gtk_widget_show(child); } for (i=1; i<VBOX_MAIN_NITEMS; i++) // hide others, but not the drawing area! if (!present[i]) gtk_widget_hide(GET_COMPONENT(vbox_component_names[i]));}gchar *make_cur_font_name(void){ gchar *str; struct Item *it; if (ui.cur_item_type == ITEM_TEXT) str = g_strdup_printf("%s %.1f", ui.cur_item->font_name, ui.cur_item->font_size); else if (ui.selection!=NULL && ui.selection->items!=NULL && ui.selection->items->next==NULL && (it=(struct Item*)ui.selection->items->data)->type == ITEM_TEXT) str = g_strdup_printf("%s %.1f", it->font_name, it->font_size); else str = g_strdup_printf("%s %.1f", ui.font_name, ui.font_size); return str;}void update_font_button(void){ gchar *str; str = make_cur_font_name(); gtk_font_button_set_font_name(GTK_FONT_BUTTON(GET_COMPONENT("fontButton")), str); g_free(str);}gboolean can_accel(GtkWidget *widget, guint id, gpointer data){ return GTK_WIDGET_SENSITIVE(widget);}void allow_all_accels(void){ g_signal_connect((gpointer) GET_COMPONENT("fileNew"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("fileOpen"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("fileSave"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("filePrint"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("filePrintPDF"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("fileQuit"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editUndo"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editRedo"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editCut"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editCopy"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editPaste"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("editDelete"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewFullscreen"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewZoomIn"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewZoomOut"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewNormalSize"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewPageWidth"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewFirstPage"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewPreviousPage"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewNextPage"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("viewLastPage"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsPen"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsEraser"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsHighlighter"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsText"), "can-activate-accel", G_CALLBACK(can_accel), NULL);/* g_signal_connect((gpointer) GET_COMPONENT("toolsSelectRegion"), "can-activate-accel", G_CALLBACK(can_accel), NULL); */ g_signal_connect((gpointer) GET_COMPONENT("toolsSelectRectangle"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsVerticalSpace"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsHand"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsTextFont"), "can-activate-accel", G_CALLBACK(can_accel), NULL); g_signal_connect((gpointer) GET_COMPONENT("toolsRuler"), "can-activate-accel", G_CALLBACK(can_accel), NULL);}void add_scroll_bindings(void){ GtkBindingSet *binding_set; binding_set = gtk_binding_set_by_class( G_OBJECT_GET_CLASS(GET_COMPONENT("scrolledwindowMain"))); gtk_binding_entry_add_signal(binding_set, GDK_Up, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, FALSE); gtk_binding_entry_add_signal(binding_set, GDK_KP_Up, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, FALSE); gtk_binding_entry_add_signal(binding_set, GDK_Down, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, FALSE); gtk_binding_entry_add_signal(binding_set, GDK_KP_Down, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, FALSE); gtk_binding_entry_add_signal(binding_set, GDK_Left, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, TRUE); gtk_binding_entry_add_signal(binding_set, GDK_KP_Left, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, TRUE); gtk_binding_entry_add_signal(binding_set, GDK_Right, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, TRUE); gtk_binding_entry_add_signal(binding_set, GDK_KP_Right, 0, "scroll_child", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, TRUE); }gboolean is_event_within_textview(GdkEventButton *event){ double pt[2]; if (ui.cur_item_type!=ITEM_TEXT) return FALSE; get_pointer_coords((GdkEvent *)event, pt); if (pt[0]<ui.cur_item->bbox.left || pt[0]>ui.cur_item->bbox.right) return FALSE; if (pt[1]<ui.cur_item->bbox.top || pt[1]>ui.cur_item->bbox.bottom) return FALSE; return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -