X-Git-Url: https://git.donarmstrong.com/?p=xournal.git;a=blobdiff_plain;f=src%2Fxo-paint.c;fp=src%2Fxo-paint.c;h=33576f8a21cca3fc5ccbef072e631fb5d9f4e361;hp=c777482546691566c085be2dba87571d7be913c3;hb=bc1db27c7eef7de6d5097a5e708d2de540d35b88;hpb=dbcc72baab610c58a36586f75b7ce7e17a0d4f41 diff --git a/src/xo-paint.c b/src/xo-paint.c index c777482..33576f8 100644 --- a/src/xo-paint.c +++ b/src/xo-paint.c @@ -964,211 +964,6 @@ void selection_delete(void) the forward direction */ } -void callback_clipboard_get(GtkClipboard *clipboard, - GtkSelectionData *selection_data, - guint info, gpointer user_data) -{ - int length; - - g_memmove(&length, user_data, sizeof(int)); - gtk_selection_data_set(selection_data, - gdk_atom_intern("_XOURNAL", FALSE), 8, user_data, length); -} - -void callback_clipboard_clear(GtkClipboard *clipboard, gpointer user_data) -{ - g_free(user_data); -} - -void selection_to_clip(void) -{ - int bufsz, nitems, val; - char *buf, *p; - GList *list; - struct Item *item; - GtkTargetEntry target; - - if (ui.selection == NULL) return; - bufsz = 2*sizeof(int) // bufsz, nitems - + sizeof(struct BBox); // bbox - nitems = 0; - for (list = ui.selection->items; list != NULL; list = list->next) { - item = (struct Item *)list->data; - nitems++; - if (item->type == ITEM_STROKE) { - bufsz+= sizeof(int) // type - + sizeof(struct Brush) // brush - + sizeof(int) // num_points - + 2*item->path->num_points*sizeof(double); // the points - if (item->brush.variable_width) - bufsz += (item->path->num_points-1)*sizeof(double); // the widths - } - else if (item->type == ITEM_TEXT) { - bufsz+= sizeof(int) // type - + sizeof(struct Brush) // brush - + 2*sizeof(double) // bbox upper-left - + sizeof(int) // text len - + strlen(item->text)+1 // text - + sizeof(int) // font_name len - + strlen(item->font_name)+1 // font_name - + sizeof(double); // font_size - } - else bufsz+= sizeof(int); // type - } - p = buf = g_malloc(bufsz); - g_memmove(p, &bufsz, sizeof(int)); p+= sizeof(int); - g_memmove(p, &nitems, sizeof(int)); p+= sizeof(int); - g_memmove(p, &ui.selection->bbox, sizeof(struct BBox)); p+= sizeof(struct BBox); - for (list = ui.selection->items; list != NULL; list = list->next) { - item = (struct Item *)list->data; - g_memmove(p, &item->type, sizeof(int)); p+= sizeof(int); - if (item->type == ITEM_STROKE) { - g_memmove(p, &item->brush, sizeof(struct Brush)); p+= sizeof(struct Brush); - g_memmove(p, &item->path->num_points, sizeof(int)); p+= sizeof(int); - g_memmove(p, item->path->coords, 2*item->path->num_points*sizeof(double)); - p+= 2*item->path->num_points*sizeof(double); - if (item->brush.variable_width) { - g_memmove(p, item->widths, (item->path->num_points-1)*sizeof(double)); - p+= (item->path->num_points-1)*sizeof(double); - } - } - if (item->type == ITEM_TEXT) { - g_memmove(p, &item->brush, sizeof(struct Brush)); p+= sizeof(struct Brush); - g_memmove(p, &item->bbox.left, sizeof(double)); p+= sizeof(double); - g_memmove(p, &item->bbox.top, sizeof(double)); p+= sizeof(double); - val = strlen(item->text); - g_memmove(p, &val, sizeof(int)); p+= sizeof(int); - g_memmove(p, item->text, val+1); p+= val+1; - val = strlen(item->font_name); - g_memmove(p, &val, sizeof(int)); p+= sizeof(int); - g_memmove(p, item->font_name, val+1); p+= val+1; - g_memmove(p, &item->font_size, sizeof(double)); p+= sizeof(double); - } - } - - target.target = "_XOURNAL"; - target.flags = 0; - target.info = 0; - - gtk_clipboard_set_with_data(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), - &target, 1, - callback_clipboard_get, callback_clipboard_clear, buf); -} - - -void clipboard_paste(void) -{ - GtkSelectionData *sel_data; - unsigned char *p; - int nitems, npts, i, len; - struct Item *item; - double hoffset, voffset, cx, cy; - double *pf; - int sx, sy, wx, wy; - - if (ui.cur_layer == NULL) return; - - ui.cur_item_type = ITEM_PASTE; - sel_data = gtk_clipboard_wait_for_contents( - gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), - gdk_atom_intern("_XOURNAL", FALSE)); - ui.cur_item_type = ITEM_NONE; - if (sel_data == NULL) return; // paste failed - - reset_selection(); - - ui.selection = g_new(struct Selection, 1); - p = sel_data->data + sizeof(int); - g_memmove(&nitems, p, sizeof(int)); p+= sizeof(int); - ui.selection->type = ITEM_SELECTRECT; - ui.selection->layer = ui.cur_layer; - g_memmove(&ui.selection->bbox, p, sizeof(struct BBox)); p+= sizeof(struct BBox); - ui.selection->items = NULL; - - // find by how much we translate the pasted selection - gnome_canvas_get_scroll_offsets(canvas, &sx, &sy); - gdk_window_get_geometry(GTK_WIDGET(canvas)->window, NULL, NULL, &wx, &wy, NULL); - gnome_canvas_window_to_world(canvas, sx + wx/2, sy + wy/2, &cx, &cy); - cx -= ui.cur_page->hoffset; - cy -= ui.cur_page->voffset; - if (cx + (ui.selection->bbox.right-ui.selection->bbox.left)/2 > ui.cur_page->width) - cx = ui.cur_page->width - (ui.selection->bbox.right-ui.selection->bbox.left)/2; - if (cx - (ui.selection->bbox.right-ui.selection->bbox.left)/2 < 0) - cx = (ui.selection->bbox.right-ui.selection->bbox.left)/2; - if (cy + (ui.selection->bbox.bottom-ui.selection->bbox.top)/2 > ui.cur_page->height) - cy = ui.cur_page->height - (ui.selection->bbox.bottom-ui.selection->bbox.top)/2; - if (cy - (ui.selection->bbox.bottom-ui.selection->bbox.top)/2 < 0) - cy = (ui.selection->bbox.bottom-ui.selection->bbox.top)/2; - hoffset = cx - (ui.selection->bbox.right+ui.selection->bbox.left)/2; - voffset = cy - (ui.selection->bbox.top+ui.selection->bbox.bottom)/2; - ui.selection->bbox.left += hoffset; - ui.selection->bbox.right += hoffset; - ui.selection->bbox.top += voffset; - ui.selection->bbox.bottom += voffset; - - ui.selection->canvas_item = gnome_canvas_item_new(ui.cur_layer->group, - gnome_canvas_rect_get_type(), "width-pixels", 1, - "outline-color-rgba", 0x000000ff, - "fill-color-rgba", 0x80808040, - "x1", ui.selection->bbox.left, "x2", ui.selection->bbox.right, - "y1", ui.selection->bbox.top, "y2", ui.selection->bbox.bottom, NULL); - make_dashed(ui.selection->canvas_item); - - while (nitems-- > 0) { - item = g_new(struct Item, 1); - ui.selection->items = g_list_append(ui.selection->items, item); - ui.cur_layer->items = g_list_append(ui.cur_layer->items, item); - ui.cur_layer->nitems++; - g_memmove(&item->type, p, sizeof(int)); p+= sizeof(int); - if (item->type == ITEM_STROKE) { - g_memmove(&item->brush, p, sizeof(struct Brush)); p+= sizeof(struct Brush); - g_memmove(&npts, p, sizeof(int)); p+= sizeof(int); - item->path = gnome_canvas_points_new(npts); - pf = (double *)p; - for (i=0; ipath->coords[2*i] = pf[2*i] + hoffset; - item->path->coords[2*i+1] = pf[2*i+1] + voffset; - } - p+= 2*item->path->num_points*sizeof(double); - if (item->brush.variable_width) { - item->widths = g_memdup(p, (item->path->num_points-1)*sizeof(double)); - p+= (item->path->num_points-1)*sizeof(double); - } - else item->widths = NULL; - update_item_bbox(item); - make_canvas_item_one(ui.cur_layer->group, item); - } - if (item->type == ITEM_TEXT) { - g_memmove(&item->brush, p, sizeof(struct Brush)); p+= sizeof(struct Brush); - g_memmove(&item->bbox.left, p, sizeof(double)); p+= sizeof(double); - g_memmove(&item->bbox.top, p, sizeof(double)); p+= sizeof(double); - item->bbox.left += hoffset; - item->bbox.top += voffset; - g_memmove(&len, p, sizeof(int)); p+= sizeof(int); - item->text = g_malloc(len+1); - g_memmove(item->text, p, len+1); p+= len+1; - g_memmove(&len, p, sizeof(int)); p+= sizeof(int); - item->font_name = g_malloc(len+1); - g_memmove(item->font_name, p, len+1); p+= len+1; - g_memmove(&item->font_size, p, sizeof(double)); p+= sizeof(double); - make_canvas_item_one(ui.cur_layer->group, item); - } - } - - prepare_new_undo(); - undo->type = ITEM_PASTE; - undo->layer = ui.cur_layer; - undo->itemlist = g_list_copy(ui.selection->items); - - gtk_selection_data_free(sel_data); - update_copy_paste_enabled(); - update_color_menu(); - update_thickness_buttons(); - update_color_buttons(); - update_font_button(); - update_cursor(); // FIXME: can't know if pointer is within selection! -} - // modify the color or thickness of pen strokes in a selection void recolor_selection(int color_no, guint color_rgba)