GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject, SmartPasteInclusion shouldInludeSmartPaste) { GtkTargetList* list = gtk_target_list_new(nullptr, 0); if (dataObject->hasText()) gtk_target_list_add_text_targets(list, TargetTypeText); if (dataObject->hasMarkup()) gtk_target_list_add(list, markupAtom, 0, TargetTypeMarkup); if (dataObject->hasURIList()) { gtk_target_list_add_uri_targets(list, TargetTypeURIList); gtk_target_list_add(list, netscapeURLAtom, 0, TargetTypeNetscapeURL); } if (dataObject->hasImage()) gtk_target_list_add_image_targets(list, TargetTypeImage, TRUE); if (dataObject->hasUnknownTypeData()) gtk_target_list_add(list, unknownAtom, 0, TargetTypeUnknown); if (shouldInludeSmartPaste == IncludeSmartPaste) gtk_target_list_add(list, smartPasteAtom, 0, TargetTypeSmartPaste); return list; }
static GtkTargetList * gnm_soi_get_target_list (SheetObject const *so) { SheetObjectImage *soi = SHEET_OBJECT_IMAGE (so); GtkTargetList *tl = gtk_target_list_new (NULL, 0); char *mime_str = go_image_format_to_mime (soi->type); GSList *mimes, *ptr; GdkPixbuf *pixbuf; mimes = go_strsplit_to_slist (mime_str, ','); for (ptr = mimes; ptr != NULL; ptr = ptr->next) { const char *mime = ptr->data; if (mime != NULL && *mime != '\0') gtk_target_list_add (tl, gdk_atom_intern (mime, FALSE), 0, 0); } g_free (mime_str); go_slist_free_custom (mimes, g_free); /* No need to eliminate duplicates. */ if ((pixbuf = soi_get_pixbuf (soi, 1.0)) != NULL) { gtk_target_list_add_image_targets (tl, 0, TRUE); g_object_unref (pixbuf); } return tl; }
void Ctrl::DndTargets(GdkDragContext *context) { static Index<String> text_targets; static Index<String> image_targets; ONCELOCK { GtkTargetList *target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_text_targets (target_list, 0); ToIndex(target_list, text_targets); GtkTargetList *target_list2 = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets (target_list2, 0, TRUE); ToIndex(target_list2, image_targets); } dnd_targets.Clear(); dnd_text_target.Clear(); for(GList *list = gdk_drag_context_list_targets(context); list; list = g_list_next (list)) { String g = gdk_atom_name((GdkAtom)list->data); if(text_targets.Find(g) >= 0) { dnd_targets.Add("text"); if(dnd_text_target.IsEmpty()) dnd_text_target = g; } else if(image_targets.Find(g) >= 0) { dnd_targets.Add("image"); if(dnd_image_target.IsEmpty()) dnd_image_target = g; } else dnd_targets.Add(g); } }
void PasteboardHelper::initializeTargetList() { gtk_target_list_add_text_targets(m_targetList, getIdForTargetType(TargetTypeText)); gtk_target_list_add(m_targetList, markupAtom, 0, getIdForTargetType(TargetTypeMarkup)); gtk_target_list_add_uri_targets(m_targetList, getIdForTargetType(TargetTypeURIList)); gtk_target_list_add(m_targetList, netscapeURLAtom, 0, getIdForTargetType(TargetTypeNetscapeURL)); gtk_target_list_add_image_targets(m_targetList, getIdForTargetType(TargetTypeImage), TRUE); }
/** * gtk_drag_dest_add_image_targets: (method) * @widget: a #GtkWidget that’s a drag destination * * Add the image targets supported by #GtkSelectionData to * the target list of the drag destination. The targets * are added with @info = 0. If you need another value, * use gtk_target_list_add_image_targets() and * gtk_drag_dest_set_target_list(). * * Since: 2.6 */ void gtk_drag_dest_add_image_targets (GtkWidget *widget) { GtkTargetList *target_list; target_list = gtk_drag_dest_get_target_list (widget); if (target_list) gtk_target_list_ref (target_list); else target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets (target_list, 0, FALSE); gtk_drag_dest_set_target_list (widget, target_list); gtk_target_list_unref (target_list); }
static void update_dest_target_list (GtkWidget *ebox) { GtkTargetList *target_list; target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets (target_list, TARGET_IMAGE, FALSE); gtk_target_list_add_text_targets (target_list, TARGET_TEXT); gtk_drag_dest_set_target_list (ebox, target_list); gtk_target_list_unref (target_list); }
static void add_target_from_jstring(JNIEnv *env, GtkTargetList *list, jstring string) { const char *gstring = env->GetStringUTFChars(string, NULL); if (g_strcmp0(gstring, "text/plain") == 0) { gtk_target_list_add_text_targets(list, 0); } else if (g_strcmp0(gstring, "application/x-java-rawimage") == 0) { gtk_target_list_add_image_targets(list, 0, TRUE); } else if (g_strcmp0(gstring, "application/x-java-file-list") == 0) { gtk_target_list_add(list, MIME_TEXT_URI_LIST_TARGET, 0, 0); } else { gtk_target_list_add(list, gdk_atom_intern(gstring, FALSE), 0, 0); } env->ReleaseStringUTFChars(string, gstring); }
static void update_source_target_list (GtkWidget *ebox, GtkWidget *image) { GtkTargetList *target_list; target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets (target_list, TARGET_IMAGE, FALSE); if (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME) gtk_target_list_add_text_targets (target_list, TARGET_TEXT); gtk_drag_source_set_target_list (ebox, target_list); gtk_target_list_unref (target_list); }
PasteboardHelper::PasteboardHelper() : m_targetList(adoptGRef(gtk_target_list_new(nullptr, 0))) { textPlainAtom = gdk_atom_intern_static_string("text/plain;charset=utf-8"); markupAtom = gdk_atom_intern_static_string("text/html"); netscapeURLAtom = gdk_atom_intern_static_string("_NETSCAPE_URL"); uriListAtom = gdk_atom_intern_static_string("text/uri-list"); smartPasteAtom = gdk_atom_intern_static_string("application/vnd.webkitgtk.smartpaste"); unknownAtom = gdk_atom_intern_static_string("application/vnd.webkitgtk.unknown"); gtk_target_list_add_text_targets(m_targetList.get(), PasteboardHelper::TargetTypeText); gtk_target_list_add(m_targetList.get(), markupAtom, 0, PasteboardHelper::TargetTypeMarkup); gtk_target_list_add_uri_targets(m_targetList.get(), PasteboardHelper::TargetTypeURIList); gtk_target_list_add(m_targetList.get(), netscapeURLAtom, 0, PasteboardHelper::TargetTypeNetscapeURL); gtk_target_list_add_image_targets(m_targetList.get(), PasteboardHelper::TargetTypeImage, TRUE); gtk_target_list_add(m_targetList.get(), unknownAtom, 0, PasteboardHelper::TargetTypeUnknown); }
void DragClient::startDrag(DragImageRef image, const IntPoint& dragImageOrigin, const IntPoint& eventPos, Clipboard*, Frame* frame, bool linkDrag) { Element* targetElement = frame->document()->elementFromPoint(m_startPos.x(), m_startPos.y()); bool imageDrag = false; if (targetElement) imageDrag = targetElement->renderer()->isImage(); GdkAtom textHtml = gdk_atom_intern_static_string("text/html"); GdkAtom netscapeUrl = gdk_atom_intern_static_string("_NETSCAPE_URL"); GtkTargetList* targetList = gtk_target_list_new(NULL, 0); gtk_target_list_add(targetList, textHtml, 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML); gtk_target_list_add_text_targets(targetList, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT); if (linkDrag || imageDrag) { gtk_target_list_add(targetList, netscapeUrl, 0, WEBKIT_WEB_VIEW_TARGET_INFO_NETSCAPE_URL); gtk_target_list_add_uri_targets(targetList, WEBKIT_WEB_VIEW_TARGET_INFO_URI_LIST); } if (imageDrag) gtk_target_list_add_image_targets(targetList, WEBKIT_WEB_VIEW_TARGET_INFO_IMAGE, false); GdkDragAction dragAction = GDK_ACTION_COPY; if (linkDrag) { dragAction = GDK_ACTION_LINK; if (imageDrag) dragAction = (GdkDragAction)(dragAction | GDK_ACTION_COPY); } GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS); reinterpret_cast<GdkEventButton*>(event)->window = gtk_widget_get_window(GTK_WIDGET(m_webView)); reinterpret_cast<GdkEventButton*>(event)->time = GDK_CURRENT_TIME; GdkDragContext* context = gtk_drag_begin(GTK_WIDGET(m_webView), targetList, dragAction, 1, event); g_object_ref(context); if (image) gtk_drag_set_icon_pixbuf(context, image, eventPos.x() - dragImageOrigin.x(), eventPos.y() - dragImageOrigin.y()); else gtk_drag_set_icon_default(context); gtk_target_list_unref(targetList); }
Vector<GdkAtom> PasteboardHelper::dropAtomsForContext(GtkWidget* widget, GdkDragContext* context) { // Always search for these common atoms. Vector<GdkAtom> dropAtoms; dropAtoms.append(textPlainAtom); dropAtoms.append(markupAtom); dropAtoms.append(uriListAtom); dropAtoms.append(netscapeURLAtom); // For images, try to find the most applicable image type. PlatformRefPtr<GtkTargetList> list(gtk_target_list_new(0, 0)); gtk_target_list_add_image_targets(list.get(), getIdForTargetType(TargetTypeImage), TRUE); GdkAtom atom = gtk_drag_dest_find_target(widget, context, list.get()); if (atom != GDK_NONE) dropAtoms.append(atom); return dropAtoms; }
void Ctrl::DndTargets(GdkDragContext *context) { static Index<String> text_targets; static Index<String> image_targets; static Index<String> files_targets; ONCELOCK { GtkTargetList *target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_text_targets(target_list, 0); ToIndex(target_list, text_targets); GtkTargetList *target_list2 = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets(target_list2, 0, TRUE); ToIndex(target_list2, image_targets); GtkTargetList *target_list3 = gtk_target_list_new (NULL, 0); gtk_target_list_add_uri_targets(target_list3, 0); ToIndex(target_list3, files_targets); } dnd_targets.Clear(); dnd_text_target.Clear(); #if GTK_CHECK_VERSION(2,22,0) // No drag&drop support before 2.22, sorry... for(GList *list = gdk_drag_context_list_targets(context); list; list = g_list_next (list)) { String g = gdk_atom_name((GdkAtom)list->data); if(text_targets.Find(g) >= 0) { dnd_targets.Add("text"); if(dnd_text_target.IsEmpty()) dnd_text_target = g; } else if(image_targets.Find(g) >= 0) { dnd_targets.Add("image"); if(dnd_image_target.IsEmpty()) dnd_image_target = g; } else if(files_targets.Find(g) >= 0) { dnd_targets.Add("files"); if(dnd_files_target.IsEmpty()) dnd_files_target = g; } else dnd_targets.Add(g); } #endif }
GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject) { GtkTargetList* list = gtk_target_list_new(0, 0); if (dataObject->hasText()) gtk_target_list_add_text_targets(list, getIdForTargetType(TargetTypeText)); if (dataObject->hasMarkup()) gtk_target_list_add(list, markupAtom, 0, getIdForTargetType(TargetTypeMarkup)); if (dataObject->hasURIList()) { gtk_target_list_add_uri_targets(list, getIdForTargetType(TargetTypeURIList)); gtk_target_list_add(list, netscapeURLAtom, 0, getIdForTargetType(TargetTypeNetscapeURL)); } if (dataObject->hasImage()) gtk_target_list_add_image_targets(list, getIdForTargetType(TargetTypeImage), TRUE); return list; }
void selection_to_clip(void) { struct XojSelectionData *sel; int bufsz, nitems, val; char *p; GList *list; struct Item *item; GtkTargetList *targetlist; GtkTargetEntry *targets; int n_targets; 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 if (item->type == ITEM_IMAGE) { if (item->image_png == NULL) { set_cursor_busy(TRUE); if (!gdk_pixbuf_save_to_buffer(item->image, &item->image_png, &item->image_png_len, "png", NULL, NULL)) item->image_png_len = 0; // failed for some reason, so forget it set_cursor_busy(FALSE); } bufsz+= sizeof(int) // type + sizeof(struct BBox) + sizeof(gsize) // png_buflen + item->image_png_len; } else bufsz+= sizeof(int); // type } // allocate selection data structure and buffer sel = g_malloc(sizeof(struct XojSelectionData)); sel->xo_data_len = bufsz; sel->xo_data = g_malloc(bufsz); sel->image_data = NULL; sel->text_data = NULL; // fill in the data p = sel->xo_data; 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); if (nitems==1) sel->text_data = g_strdup(item->text); // single text item } if (item->type == ITEM_IMAGE) { g_memmove(p, &item->bbox, sizeof(struct BBox)); p+= sizeof(struct BBox); g_memmove(p, &item->image_png_len, sizeof(gsize)); p+= sizeof(gsize); if (item->image_png_len > 0) { g_memmove(p, item->image_png, item->image_png_len); p+= item->image_png_len; } if (nitems==1) sel->image_data = gdk_pixbuf_copy(item->image); // single image } } /* build list of valid targets */ targetlist = gtk_target_list_new(NULL, 0); gtk_target_list_add(targetlist, gdk_atom_intern(XOURNAL_TARGET_ATOM, FALSE), 0, TARGET_XOURNAL); if (sel->image_data!=NULL) gtk_target_list_add_image_targets(targetlist, TARGET_PIXBUF, TRUE); if (sel->text_data!=NULL) gtk_target_list_add_text_targets(targetlist, TARGET_TEXT); targets = gtk_target_table_new_from_list(targetlist, &n_targets); gtk_target_list_unref(targetlist); gtk_clipboard_set_with_data(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), targets, n_targets, callback_clipboard_get, callback_clipboard_clear, sel); gtk_target_table_free(targets, n_targets); }
static VALUE rg_add_image_targets(VALUE self, VALUE info, VALUE writable) { gtk_target_list_add_image_targets(_SELF(self), NUM2UINT(info), RVAL2CBOOL(writable)); return self; }
NS_IMETHODIMP nsClipboard::SetData(nsITransferable *aTransferable, nsIClipboardOwner *aOwner, PRInt32 aWhichClipboard) { // See if we can short cut if ((aWhichClipboard == kGlobalClipboard && aTransferable == mGlobalTransferable.get() && aOwner == mGlobalOwner.get()) || (aWhichClipboard == kSelectionClipboard && aTransferable == mSelectionTransferable.get() && aOwner == mSelectionOwner.get())) { return NS_OK; } nsresult rv; if (!mPrivacyHandler) { rv = NS_NewClipboardPrivacyHandler(getter_AddRefs(mPrivacyHandler)); NS_ENSURE_SUCCESS(rv, rv); } rv = mPrivacyHandler->PrepareDataForClipboard(aTransferable); NS_ENSURE_SUCCESS(rv, rv); // Clear out the clipboard in order to set the new data EmptyClipboard(aWhichClipboard); // List of suported targets GtkTargetList *list = gtk_target_list_new(NULL, 0); // Get the types of supported flavors nsCOMPtr<nsISupportsArray> flavors; rv = aTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavors)); if (!flavors || NS_FAILED(rv)) return NS_ERROR_FAILURE; // Add all the flavors to this widget's supported type. PRBool imagesAdded = PR_FALSE; PRUint32 count; flavors->Count(&count); for (PRUint32 i=0; i < count; i++) { nsCOMPtr<nsISupports> tastesLike; flavors->GetElementAt(i, getter_AddRefs(tastesLike)); nsCOMPtr<nsISupportsCString> flavor = do_QueryInterface(tastesLike); if (flavor) { nsXPIDLCString flavorStr; flavor->ToString(getter_Copies(flavorStr)); // special case text/unicode since we can handle all of // the string types if (!strcmp(flavorStr, kUnicodeMime)) { gtk_target_list_add(list, gdk_atom_intern("UTF8_STRING", FALSE), 0, 0); gtk_target_list_add(list, gdk_atom_intern("COMPOUND_TEXT", FALSE), 0, 0); gtk_target_list_add(list, gdk_atom_intern("TEXT", FALSE), 0, 0); gtk_target_list_add(list, GDK_SELECTION_TYPE_STRING, 0, 0); continue; } if (flavorStr.EqualsLiteral(kNativeImageMime) || flavorStr.EqualsLiteral(kPNGImageMime) || flavorStr.EqualsLiteral(kJPEGImageMime) || flavorStr.EqualsLiteral(kGIFImageMime)) { // don't bother adding image targets twice if (!imagesAdded) { // accept any writable image type gtk_target_list_add_image_targets(list, 0, TRUE); imagesAdded = PR_TRUE; } continue; } // Add this to our list of valid targets GdkAtom atom = gdk_atom_intern(flavorStr, FALSE); gtk_target_list_add(list, atom, 0, 0); } } // Get GTK clipboard (CLIPBOARD or PRIMARY) GtkClipboard *gtkClipboard = gtk_clipboard_get(GetSelectionAtom(aWhichClipboard)); gint numTargets; GtkTargetEntry *gtkTargets = gtk_target_table_new_from_list(list, &numTargets); // Set getcallback and request to store data after an application exit if (gtk_clipboard_set_with_data(gtkClipboard, gtkTargets, numTargets, clipboard_get_cb, clipboard_clear_cb, this)) { // We managed to set-up the clipboard so update internal state // We have to set it now because gtk_clipboard_set_with_data() calls clipboard_clear_cb() // which reset our internal state if (aWhichClipboard == kSelectionClipboard) { mSelectionOwner = aOwner; mSelectionTransferable = aTransferable; } else { mGlobalOwner = aOwner; mGlobalTransferable = aTransferable; gtk_clipboard_set_can_store(gtkClipboard, gtkTargets, numTargets); } rv = NS_OK; } else { rv = NS_ERROR_FAILURE; } gtk_target_table_free(gtkTargets, numTargets); gtk_target_list_unref(list); return rv; }