+void cb_main_srhash_activate(GtkWidget *widget, gpointer data)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *hash, *buf;
+
+ if(nextsrch != -1)
+ return;
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(main_srchres));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 9, &hash, -1);
+ buf = sprintf2("H=%s", hash);
+ gtk_entry_set_text(GTK_ENTRY(main_realsrch), buf);
+ g_free(hash);
+ free(buf);
+ cb_main_srchbtn_clicked(widget, NULL);
+ } else {
+ return;
+ }
+}
+
+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;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *hash, *buf;
+
+ if(nextsrch != -1)
+ return;
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(main_downloads));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 12, &hash, -1);
+ buf = sprintf2("H=%s", hash);
+ gtk_entry_set_text(GTK_ENTRY(main_realsrch), buf);
+ g_free(hash);
+ free(buf);
+ cb_main_srchbtn_clicked(widget, NULL);
+ } else {
+ return;
+ }
+}
+
+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;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ int id, tag;
+ struct dc_response *resp;
+
+ if(nextsrch != -1)
+ return;
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(main_downloads));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 0, &id, -1);
+ tag = dc_queuecmd(NULL, NULL, L"cancel", L"%%i", id, NULL);
+ if((resp = dc_gettaggedrespsync(tag)) != NULL)
+ {
+ if(resp->code == 502)
+ msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("You do not have permission to do that"));
+ else if(resp->code != 200)
+ msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("An error occurred while trying to cancel (%i)"), resp->code);
+ dc_freeresp(resp);
+ }
+ handleresps();
+ } else {
+ return;
+ }
+}
+
+/* XXX: This is quite a hack, since the calling convention is
+ * different for the popup-menu sig and the button-press-event sig. It
+ * most certainly works, but I don't know how portable it is. */
+gboolean cb_main_srpopup(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *hash;
+
+ if((event != NULL) && (event->button != 3))
+ return(FALSE);
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 9, &hash, -1);
+ if((hash == NULL) || (*hash == 0))
+ {
+ gtk_widget_set_sensitive(main_srhash, FALSE);
+ gtk_widget_set_sensitive(main_srcopy, FALSE);
+ } else {
+ if(nextsrch == -1)
+ gtk_widget_set_sensitive(main_srhash, TRUE);
+ else
+ gtk_widget_set_sensitive(main_srhash, FALSE);
+ gtk_widget_set_sensitive(main_srcopy, TRUE);
+ }
+ g_free(hash);
+ } else {
+ return(FALSE);
+ }
+ if(event == NULL)
+ gtk_menu_popup(GTK_MENU(main_srpopup), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+ else
+ gtk_menu_popup(GTK_MENU(main_srpopup), NULL, NULL, NULL, NULL, event->button, event->time);
+ return(FALSE);
+}
+
+/* The above hack note goes for this one too. */
+gboolean cb_main_trpopup(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *hash;
+
+ if((event != NULL) && (event->button != 3))
+ return(FALSE);
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 12, &hash, -1);
+ if((hash == NULL) || (*hash == 0))
+ {
+ gtk_widget_set_sensitive(main_trhash, FALSE);
+ gtk_widget_set_sensitive(main_trcopy, FALSE);
+ } else {
+ if(nextsrch == -1)
+ gtk_widget_set_sensitive(main_trhash, TRUE);
+ else
+ gtk_widget_set_sensitive(main_trhash, FALSE);
+ gtk_widget_set_sensitive(main_trcopy, TRUE);
+ }
+ g_free(hash);
+ } else {
+ return(FALSE);
+ }
+ if(event == NULL)
+ gtk_menu_popup(GTK_MENU(main_trpopup), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+ else
+ gtk_menu_popup(GTK_MENU(main_trpopup), NULL, NULL, NULL, NULL, event->button, event->time);
+ return(FALSE);
+}
+
+void cb_reslist_reload_clicked(GtkWidget *widget, gpointer data)
+{
+ if(lsrestag != -1)
+ return;
+ gtk_widget_set_sensitive(reslist_delete, FALSE);
+ gtk_widget_set_sensitive(reslist_search, FALSE);
+ gtk_list_store_clear(reslist);
+ lsrestag = dc_queuecmd(NULL, NULL, L"filtercmd", L"lsres", NULL);
+ gtk_widget_set_sensitive(reslist_reload, FALSE);
+}
+
+int rmres(char *id)
+{
+ int tag, ret;
+ struct dc_response *resp;
+
+ ret = -1;
+ tag = dc_queuecmd(NULL, NULL, L"filtercmd", L"rmres", L"%%s", id, NULL);
+ if((resp = dc_gettaggedrespsync(tag)) != NULL)
+ {
+ if(resp->numlines > 0)
+ {
+ if(!wcscmp(resp->rlines[0].argv[1], L"ok"))
+ ret = 0;
+ else if(!wcsncmp(resp->rlines[0].argv[1], L"err:", 4))
+ msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("An error occurred (%ls)"), resp->rlines[0].argv[1] + 4);
+ }
+ dc_freeresp(resp);
+ }
+ handleresps();
+ return(ret);
+}
+
+void cb_reslist_delete_clicked(GtkWidget *widget, gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ char *id;
+ gboolean locked;
+
+ if(nextsrch != -1)
+ return;
+ if(!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(reslist_list)), &model, &iter))
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &id, 4, &locked, -1);
+ if(locked)
+ {
+ g_free(id);
+ return;
+ }
+ if(!rmres(id))
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ g_free(id);
+}
+
+void cb_reslist_search_clicked(GtkWidget *widget, gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ char *hash, *buf;
+
+ if(nextsrch != -1)
+ return;
+ if(!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(reslist_list)), &model, &iter))
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 5, &hash, -1);
+ buf = sprintf2("H=%s", hash);
+ gtk_entry_set_text(GTK_ENTRY(main_realsrch), buf);
+ free(buf);
+ g_free(hash);
+ cb_main_srchbtn_clicked(widget, NULL);
+}
+
+void cb_reslist_list_cchange(GtkWidget *widget, gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gboolean locked;
+ char *hash;
+
+ if(!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(reslist_list)), &model, &iter))
+ {
+ gtk_widget_set_sensitive(reslist_delete, FALSE);
+ gtk_widget_set_sensitive(reslist_search, FALSE);
+ return;
+ }
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 4, &locked, 5, &hash, -1);
+ gtk_widget_set_sensitive(reslist_delete, !locked);
+ gtk_widget_set_sensitive(reslist_search, hash && *hash);
+ g_free(hash);
+}
+
+void cb_reslist_list_activate(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ char *hash, *buf;
+
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+ if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path))
+ return;
+ if(nextsrch != -1)
+ return;
+ gtk_tree_model_get(model, &iter, 5, &hash, -1);
+ buf = sprintf2("H=%s", hash);
+ gtk_entry_set_text(GTK_ENTRY(main_realsrch), buf);
+ free(buf);
+ g_free(hash);
+ cb_main_srchbtn_clicked(widget, NULL);
+}
+
+gboolean cb_reslist_list_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *id;
+ gboolean locked;
+
+ if((event->type == GDK_KEY_PRESS) && (event->keyval == GDK_Delete))
+ {
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+ if(gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 0, &id, 4, &locked, -1);
+ if(!locked)
+ {
+ if(!rmres(id))
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ }
+ g_free(id);
+ }
+ return(TRUE);
+ }
+ return(FALSE);
+}
+