UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2017 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 #include <string.h> 32 33 #include "dnd.h" 34 #include <ucx/buffer.h> 35 36 #ifdef UI_GTK2LEGACY 37 static gboolean selection_data_set_uris(GtkSelectionData *selection_data, char **uris) { 38 UcxBuffer *buf = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); 39 char *uri; 40 int i = 0; 41 while((uri = uris[i]) != NULL) { 42 ucx_buffer_puts(buf, uri); 43 ucx_buffer_puts(buf, "\r\n"); 44 } 45 GdkAtom type = gdk_atom_intern("text/uri-list", FALSE); 46 gtk_selection_data_set(selection_data, type, 8, (guchar*)buf->space, buf->pos); 47 ucx_buffer_free(buf); 48 return TRUE; 49 } 50 static char** selection_data_get_uris(GtkSelectionData *selection_data) { 51 // TODO: implement 52 return NULL; 53 } 54 #define gtk_selection_data_set_uris selection_data_set_uris 55 #define gtk_selection_data_get_uris selection_data_get_uris 56 #endif 57 58 void ui_selection_settext(UiSelection *sel, char *str, int len) { 59 // TODO: handle error? 60 gtk_selection_data_set_text(sel->data, str, len); 61 } 62 63 void ui_selection_seturis(UiSelection *sel, char **uris, int nelm) { 64 char **uriarray = calloc(nelm+1, sizeof(char*)); 65 for(int i=0;i<nelm;i++) { 66 uriarray[i] = uris[i]; 67 } 68 uriarray[nelm] = NULL; 69 gtk_selection_data_set_uris(sel->data, uriarray); 70 } 71 72 char* ui_selection_gettext(UiSelection *sel) { 73 guchar *text = gtk_selection_data_get_text(sel->data); 74 if(text) { 75 char *textcp = strdup((char*)text); 76 g_free(text); 77 return textcp; 78 } 79 return NULL; 80 } 81 82 char** ui_selection_geturis(UiSelection *sel, size_t *nelm) { 83 gchar **uris = gtk_selection_data_get_uris(sel->data); 84 if(uris) { 85 size_t al = 32; 86 char **array = malloc(al * sizeof(char*)); 87 size_t i = 0; 88 while(uris[i] != NULL) { 89 if(i >= al) { 90 al *= 2; 91 array = realloc(array, al * sizeof(char*)); 92 } 93 array[i] = strdup((char*)uris[i]); 94 i++; 95 } 96 *nelm = i; 97 g_strfreev(uris); 98 return array; 99 } 100 return NULL; 101 } 102