ui/gtk/dnd.c

Mon, 22 Jan 2024 17:27:47 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 22 Jan 2024 17:27:47 +0100
changeset 1
b5bb7b3cd597
parent 0
2483f517c562
child 29
3fc287f06305
permissions
-rw-r--r--

add libidav code

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2017 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "dnd.h"
#include <cx/buffer.h>

#ifdef UI_GTK2LEGACY
static gboolean selection_data_set_uris(GtkSelectionData *selection_data, char **uris) {
    CxBuffer *buf = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
    char *uri;
    int i = 0;
    while((uri = uris[i]) != NULL) {
        cxBufferPutString(buf, uri);
        cxBufferPutString(buf, "\r\n");
    }
    GdkAtom type = gdk_atom_intern("text/uri-list", FALSE);
    gtk_selection_data_set(selection_data, type, 8, (guchar*)buf->space, buf->pos);
    cxBufferFree(buf);
    return TRUE;
}
static char** selection_data_get_uris(GtkSelectionData *selection_data) {
    // TODO: implement
    return NULL;
}
#define gtk_selection_data_set_uris selection_data_set_uris
#define gtk_selection_data_get_uris selection_data_get_uris
#endif

void ui_selection_settext(UiSelection *sel, char *str, int len) {
    // TODO: handle error?
    gtk_selection_data_set_text(sel->data, str, len);
}

void ui_selection_seturis(UiSelection *sel, char **uris, int nelm) {
    char **uriarray = calloc(nelm+1, sizeof(char*));
    for(int i=0;i<nelm;i++) {
        uriarray[i] = uris[i];
    }
    uriarray[nelm] = NULL;
    gtk_selection_data_set_uris(sel->data, uriarray);
}

char* ui_selection_gettext(UiSelection *sel) {
    guchar *text = gtk_selection_data_get_text(sel->data);
    if(text) {
        char *textcp = strdup((char*)text);
        g_free(text);
        return textcp;
    }
    return NULL;
}

char** ui_selection_geturis(UiSelection *sel, size_t *nelm) {
    gchar **uris = gtk_selection_data_get_uris(sel->data);
    if(uris) {
        size_t al = 32;
        char **array = malloc(al * sizeof(char*));
        size_t i = 0;
        while(uris[i] != NULL) {
            if(i >= al) {
                al *= 2;
                array = realloc(array, al * sizeof(char*));
            }
            array[i] = strdup((char*)uris[i]);
            i++;
        }
        *nelm = i;
        g_strfreev(uris);
        return array;
    }
    return NULL;
}

mercurial