Add copy hash to clipboard stuff
[doldaconnect.git] / clients / gtk2 / main.c
index 72e4680..25c0c21 100644 (file)
@@ -107,7 +107,9 @@ void cb_main_srchcanbtn_clicked(GtkWidget *widget, gpointer data);
 gboolean cb_main_trlist_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data);
 void cb_main_filternoslots_toggled(GtkToggleButton *widget, gpointer data);
 void cb_main_srhash_activate(GtkWidget *widget, gpointer data);
+void cb_main_srcopy_activate(GtkWidget *widget, gpointer data);
 void cb_main_trhash_activate(GtkWidget *widget, gpointer data);
+void cb_main_trcopy_activate(GtkWidget *widget, gpointer data);
 void cb_main_trcancel_activate(GtkWidget *widget, gpointer data);
 gboolean cb_main_srpopup(GtkWidget *widget, GdkEventButton *event, gpointer data);
 gboolean cb_main_trpopup(GtkWidget *widget, GdkEventButton *event, gpointer data);
@@ -846,7 +848,15 @@ gint ksupdatecb(gpointer data)
        }
     }
     if(oldnum != numspeeds)
-       knownspeeds = srealloc(knownspeeds, numspeeds * sizeof(*knownspeeds));
+    {
+       if(numspeeds == 0)
+       {
+           free(knownspeeds);
+           knownspeeds = NULL;
+       } else {
+           knownspeeds = srealloc(knownspeeds, numspeeds * sizeof(*knownspeeds));
+       }
+    }
     gtk_tree_model_foreach(GTK_TREE_MODEL(srchmodel), ksupdaterow, NULL);
     if(ksqueryseq == -2)
     {
@@ -1192,22 +1202,27 @@ void cb_main_sdmenu_activate(GtkWidget *widget, gpointer data)
 void cb_main_fnaddr_activate(GtkWidget *widget, gpointer data)
 {
     int tag;
-    char *buf;
     struct dc_response *resp;
+    wchar_t **toks;
     
     if(dcfd < 0)
     {
        msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Not connected to DC server"));
        return;
     }
-    buf = sstrdup(gtk_entry_get_text(GTK_ENTRY(main_fnaddr)));
-    if(strchr(buf, ':') == NULL)
+    toks = dc_lexsexpr(icsmbstowcs((char *)gtk_entry_get_text(GTK_ENTRY(main_fnaddr)), "UTF-8", NULL));
+    if(*toks == NULL)
     {
-       buf = srealloc(buf, strlen(buf) + 5);
-       strcat(buf, ":411");
+       msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Illegal address entered"));
+       return;
     }
-    tag = dc_queuecmd(NULL, NULL, L"cnct", L"dc", L"%%s", buf, NULL);
-    free(buf);
+    if(wcschr(toks[0], L':') == NULL)
+    {
+       toks[0] = srealloc(toks[0], (wcslen(toks[0]) + 5) * sizeof(wchar_t));
+       wcscat(toks[0], L":411");
+    }
+    tag = dc_queuecmd(NULL, NULL, L"cnct", L"dc", L"%%a", toks, NULL);
+    dc_freewcsarr(toks);
     if((resp = dc_gettaggedrespsync(tag)) != NULL)
     {
        if(resp->code == 502)
@@ -1762,6 +1777,25 @@ void cb_main_srhash_activate(GtkWidget *widget, gpointer data)
     }
 }
 
+void cb_main_srcopy_activate(GtkWidget *widget, gpointer data)
+{
+    GtkClipboard *cb;
+    GtkTreeSelection *sel;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    char *hash;
+    
+    if(nextsrch != -1)
+       return;
+    sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(main_srchres));
+    if(!gtk_tree_selection_get_selected(sel, &model, &iter))
+       return;
+    gtk_tree_model_get(model, &iter, 9, &hash, -1);
+    cb = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+    gtk_clipboard_set_text(cb, hash, -1);
+    g_free(hash);
+}
+
 void cb_main_trhash_activate(GtkWidget *widget, gpointer data)
 {
     GtkTreeSelection *sel;
@@ -1785,6 +1819,23 @@ void cb_main_trhash_activate(GtkWidget *widget, gpointer data)
     }
 }
 
+void cb_main_trcopy_activate(GtkWidget *widget, gpointer data)
+{
+    GtkClipboard *cb;
+    GtkTreeSelection *sel;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    char *hash;
+    
+    sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(main_downloads));
+    if(!gtk_tree_selection_get_selected(sel, &model, &iter))
+       return;
+    gtk_tree_model_get(model, &iter, 12, &hash, -1);
+    cb = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+    gtk_clipboard_set_text(cb, hash, -1);
+    g_free(hash);
+}
+
 void cb_main_trcancel_activate(GtkWidget *widget, gpointer data)
 {
     GtkTreeSelection *sel;
@@ -1831,9 +1882,13 @@ gboolean cb_main_srpopup(GtkWidget *widget, GdkEventButton *event, gpointer data
     {
        gtk_tree_model_get(model, &iter, 9, &hash, -1);
        if((nextsrch != -1) || (hash == NULL) || (*hash == 0))
+       {
            gtk_widget_set_sensitive(main_srhash, FALSE);
-       else
+           gtk_widget_set_sensitive(main_srcopy, FALSE);
+       } else {
            gtk_widget_set_sensitive(main_srhash, TRUE);
+           gtk_widget_set_sensitive(main_srcopy, TRUE);
+       }
        g_free(hash);
     } else {
        return(FALSE);
@@ -1860,9 +1915,13 @@ gboolean cb_main_trpopup(GtkWidget *widget, GdkEventButton *event, gpointer data
     {
        gtk_tree_model_get(model, &iter, 12, &hash, -1);
        if((nextsrch != -1) || (hash == NULL) || (*hash == 0))
+       {
            gtk_widget_set_sensitive(main_trhash, FALSE);
-       else
+           gtk_widget_set_sensitive(main_trcopy, FALSE);
+       } else {
            gtk_widget_set_sensitive(main_trhash, TRUE);
+           gtk_widget_set_sensitive(main_trcopy, TRUE);
+       }
        g_free(hash);
     } else {
        return(FALSE);