diff options
author | Christian Grothoff <christian@grothoff.org> | 2007-01-29 04:25:51 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2007-01-29 04:25:51 +0000 |
commit | 114486ee8b55c736089480dff30eb76491b39016 (patch) | |
tree | 92607cce7f39d1d6b43647bd4ce9e0f74ac0041d | |
parent | 896553254a8deda9c62b78c3b0d0c39c091511f1 (diff) | |
download | gnunet-gtk-114486ee8b55c736089480dff30eb76491b39016.tar.gz gnunet-gtk-114486ee8b55c736089480dff30eb76491b39016.zip |
fixing Mantis 1042
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | gnunet-gtk.glade | 2 | ||||
-rw-r--r-- | po/Makefile.in | 2 | ||||
-rw-r--r-- | src/plugins/fs/fs.c | 96 | ||||
-rw-r--r-- | src/plugins/fs/fs.h | 15 | ||||
-rw-r--r-- | src/plugins/fs/search.c | 86 | ||||
-rw-r--r-- | src/plugins/fs/upload.c | 17 |
8 files changed, 211 insertions, 17 deletions
@@ -1,3 +1,7 @@ | |||
1 | Sun Jan 28 20:16:46 MST 2007 | ||
2 | Added ability to copy URIs of search results and | ||
3 | uploads to clipboard. | ||
4 | |||
1 | Fri Dec 22 19:21:07 MST 2006 | 5 | Fri Dec 22 19:21:07 MST 2006 |
2 | Releasing gnunet-gtk 0.7.1. | 6 | Releasing gnunet-gtk 0.7.1. |
3 | 7 | ||
diff --git a/configure.ac b/configure.ac index f09f7da1..2748fffe 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -1,5 +1,5 @@ | |||
1 | # This file is part of GNUnet. | 1 | # This file is part of GNUnet. |
2 | # (C) 2001, 2002, 2003, 2004, 2005, 2006 Christian Grothoff (and other contributing authors) | 2 | # (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Christian Grothoff (and other contributing authors) |
3 | # | 3 | # |
4 | # GNUnet is free software; you can redistribute it and/or modify | 4 | # GNUnet is free software; you can redistribute it and/or modify |
5 | # it under the terms of the GNU General Public License as published | 5 | # it under the terms of the GNU General Public License as published |
@@ -20,8 +20,8 @@ | |||
20 | # Process this file with autoconf to produce a configure script. | 20 | # Process this file with autoconf to produce a configure script. |
21 | # | 21 | # |
22 | AC_PREREQ(2.57) | 22 | AC_PREREQ(2.57) |
23 | AC_INIT([gnunet-gtk],[0.7.1],[bug-gnunet@gnu.org]) | 23 | AC_INIT([gnunet-gtk],[0.7.1b],[bug-gnunet@gnu.org]) |
24 | AM_INIT_AUTOMAKE([gnunet-gtk], [0.7.1]) | 24 | AM_INIT_AUTOMAKE([gnunet-gtk], [0.7.1b]) |
25 | AM_CONFIG_HEADER(config.h) | 25 | AM_CONFIG_HEADER(config.h) |
26 | 26 | ||
27 | AH_TOP([#define _GNU_SOURCE 1]) | 27 | AH_TOP([#define _GNU_SOURCE 1]) |
diff --git a/gnunet-gtk.glade b/gnunet-gtk.glade index 322716df..b17509de 100644 --- a/gnunet-gtk.glade +++ b/gnunet-gtk.glade | |||
@@ -87,7 +87,7 @@ | |||
87 | <child> | 87 | <child> |
88 | <widget class="GtkLabel" id="titleLabel"> | 88 | <widget class="GtkLabel" id="titleLabel"> |
89 | <property name="visible">True</property> | 89 | <property name="visible">True</property> |
90 | <property name="label" translatable="yes"><span size="x-large">Welcome to gnunet-gtk 0.7.1pre2</span></property> | 90 | <property name="label" translatable="yes"><span size="x-large">Welcome to gnunet-gtk 0.7.1b</span></property> |
91 | <property name="use_underline">False</property> | 91 | <property name="use_underline">False</property> |
92 | <property name="use_markup">True</property> | 92 | <property name="use_markup">True</property> |
93 | <property name="justify">GTK_JUSTIFY_CENTER</property> | 93 | <property name="justify">GTK_JUSTIFY_CENTER</property> |
diff --git a/po/Makefile.in b/po/Makefile.in index 5d50a430..c7659930 100644 --- a/po/Makefile.in +++ b/po/Makefile.in | |||
@@ -11,7 +11,7 @@ | |||
11 | # Origin: gettext-0.13 | 11 | # Origin: gettext-0.13 |
12 | 12 | ||
13 | PACKAGE = gnunet-gtk | 13 | PACKAGE = gnunet-gtk |
14 | VERSION = 0.7.1 | 14 | VERSION = 0.7.1b |
15 | 15 | ||
16 | SHELL = /bin/sh | 16 | SHELL = /bin/sh |
17 | 17 | ||
diff --git a/src/plugins/fs/fs.c b/src/plugins/fs/fs.c index 58ddc34a..1bf8877f 100644 --- a/src/plugins/fs/fs.c +++ b/src/plugins/fs/fs.c | |||
@@ -51,6 +51,17 @@ GtkTreeStore * download_summary; | |||
51 | 51 | ||
52 | GtkTreeStore * upload_summary; | 52 | GtkTreeStore * upload_summary; |
53 | 53 | ||
54 | /** | ||
55 | * Last right-click event coordinates in summary. | ||
56 | */ | ||
57 | static unsigned int last_x; | ||
58 | |||
59 | /** | ||
60 | * Last right-click event coordinates in summary. | ||
61 | */ | ||
62 | static unsigned int last_y; | ||
63 | |||
64 | |||
54 | static void * | 65 | static void * |
55 | saveEventProcessor(void * cls) { | 66 | saveEventProcessor(void * cls) { |
56 | const FSUI_Event * event = cls; | 67 | const FSUI_Event * event = cls; |
@@ -178,7 +189,7 @@ saveEventProcessor(void * cls) { | |||
178 | ret = fs_upload_started(event->data.UploadResumed.uc.pos, | 189 | ret = fs_upload_started(event->data.UploadResumed.uc.pos, |
179 | event->data.UploadResumed.uc.pcctx, | 190 | event->data.UploadResumed.uc.pcctx, |
180 | event->data.UploadResumed.filename, | 191 | event->data.UploadResumed.filename, |
181 | NULL, /* FIXME: maybe completed!? */ | 192 | event->data.UploadResumed.uri, |
182 | event->data.UploadResumed.total, | 193 | event->data.UploadResumed.total, |
183 | event->data.UploadResumed.completed, | 194 | event->data.UploadResumed.completed, |
184 | event->data.UploadResumed.state); | 195 | event->data.UploadResumed.state); |
@@ -271,6 +282,85 @@ static void on_search_summary_selection_changed(gpointer signal, | |||
271 | gtk_tree_selection_count_selected_rows(selection) > 0); | 282 | gtk_tree_selection_count_selected_rows(selection) > 0); |
272 | } | 283 | } |
273 | 284 | ||
285 | static int | ||
286 | on_upload_copy_uri_activate(void * cls, | ||
287 | GtkWidget * searchEntry) { | ||
288 | GtkTreeView * uploadList = cls; | ||
289 | GtkTreePath *path; | ||
290 | GtkTreeIter iter; | ||
291 | struct ECRS_URI * uri; | ||
292 | char * str; | ||
293 | GtkClipboard * clip; | ||
294 | |||
295 | path = NULL; | ||
296 | if (FALSE == gtk_tree_view_get_path_at_pos(uploadList, | ||
297 | last_x, | ||
298 | last_y, | ||
299 | &path, | ||
300 | NULL, | ||
301 | NULL, | ||
302 | NULL)) { | ||
303 | GE_BREAK(NULL, 0); | ||
304 | return FALSE; | ||
305 | } | ||
306 | if (FALSE == gtk_tree_model_get_iter(GTK_TREE_MODEL(upload_summary), | ||
307 | &iter, | ||
308 | path)) { | ||
309 | GE_BREAK(NULL, 0); | ||
310 | gtk_tree_path_free(path); | ||
311 | return FALSE; | ||
312 | } | ||
313 | gtk_tree_path_free(path); | ||
314 | uri = NULL; | ||
315 | gtk_tree_model_get(GTK_TREE_MODEL(upload_summary), | ||
316 | &iter, | ||
317 | UPLOAD_URISTRING, &str, | ||
318 | -1); | ||
319 | clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); | ||
320 | gtk_clipboard_set_text(clip, | ||
321 | str, | ||
322 | strlen(str)); | ||
323 | FREE(str); | ||
324 | return FALSE; | ||
325 | } | ||
326 | |||
327 | static gint | ||
328 | upload_click_handler(void * cls, | ||
329 | GdkEvent *event) { | ||
330 | GtkTreeView * uploadList = cls; | ||
331 | GtkMenu * menu; | ||
332 | GtkWidget * entry; | ||
333 | GdkEventButton * event_button; | ||
334 | |||
335 | g_return_val_if_fail (event != NULL, FALSE); | ||
336 | if (event->type != GDK_BUTTON_PRESS) | ||
337 | return FALSE; | ||
338 | event_button = (GdkEventButton *) event; | ||
339 | if (event_button->button != 3) | ||
340 | return FALSE; | ||
341 | last_x = event_button->x; | ||
342 | last_y = event_button->y; | ||
343 | entry = gtk_menu_item_new_with_label(_("_Copy URI to Clipboard")); | ||
344 | g_signal_connect_swapped (entry, | ||
345 | "activate", | ||
346 | G_CALLBACK(on_upload_copy_uri_activate), | ||
347 | uploadList); | ||
348 | gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), | ||
349 | TRUE); | ||
350 | gtk_widget_show(entry); | ||
351 | menu = GTK_MENU(gtk_menu_new()); | ||
352 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), | ||
353 | entry); | ||
354 | gtk_menu_popup (menu, | ||
355 | NULL, | ||
356 | NULL, | ||
357 | NULL, | ||
358 | NULL, | ||
359 | event_button->button, | ||
360 | event_button->time); | ||
361 | return TRUE; | ||
362 | } | ||
363 | |||
274 | /** | 364 | /** |
275 | * Setup the summary views (in particular the models | 365 | * Setup the summary views (in particular the models |
276 | * and the renderers). | 366 | * and the renderers). |
@@ -421,6 +511,10 @@ static void fs_summary_start() { | |||
421 | /* upload summary setup */ | 511 | /* upload summary setup */ |
422 | uploadList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(), | 512 | uploadList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(), |
423 | "activeUploadsList")); | 513 | "activeUploadsList")); |
514 | g_signal_connect_swapped (uploadList, | ||
515 | "button-press-event", | ||
516 | G_CALLBACK(upload_click_handler), | ||
517 | uploadList); | ||
424 | upload_summary = | 518 | upload_summary = |
425 | gtk_tree_store_new(UPLOAD_NUM, | 519 | gtk_tree_store_new(UPLOAD_NUM, |
426 | G_TYPE_STRING, /* filename */ | 520 | G_TYPE_STRING, /* filename */ |
diff --git a/src/plugins/fs/fs.h b/src/plugins/fs/fs.h index 95ec2cbd..acd24776 100644 --- a/src/plugins/fs/fs.h +++ b/src/plugins/fs/fs.h | |||
@@ -194,14 +194,25 @@ typedef struct SL { | |||
194 | char * searchString; | 194 | char * searchString; |
195 | 195 | ||
196 | /** | 196 | /** |
197 | * FSUI search handle. | ||
198 | */ | ||
199 | struct FSUI_SearchList * fsui_list; | ||
200 | |||
201 | /** | ||
197 | * Number of results received so far. | 202 | * Number of results received so far. |
198 | */ | 203 | */ |
199 | unsigned int resultsReceived; | 204 | unsigned int resultsReceived; |
200 | 205 | ||
201 | /** | 206 | /** |
202 | * FSUI search handle. | 207 | * X-coordinate of the last right-click in the search list. |
203 | */ | 208 | */ |
204 | struct FSUI_SearchList * fsui_list; | 209 | unsigned int last_x; |
210 | |||
211 | /** | ||
212 | * Y-coordinate of the last right-click in the search list. | ||
213 | */ | ||
214 | unsigned int last_y; | ||
215 | |||
205 | } SearchList; | 216 | } SearchList; |
206 | 217 | ||
207 | 218 | ||
diff --git a/src/plugins/fs/search.c b/src/plugins/fs/search.c index 86c117bd..d1e5676a 100644 --- a/src/plugins/fs/search.c +++ b/src/plugins/fs/search.c | |||
@@ -160,6 +160,87 @@ void fs_search_result_received(SearchList * searchContext, | |||
160 | updateSearchSummary(searchContext); | 160 | updateSearchSummary(searchContext); |
161 | } | 161 | } |
162 | 162 | ||
163 | static int | ||
164 | on_search_copy_uri_activate(void * cls, | ||
165 | GtkWidget * searchEntry) { | ||
166 | SearchList * list = cls; | ||
167 | GtkTreePath *path; | ||
168 | GtkTreeIter iter; | ||
169 | struct ECRS_URI * uri; | ||
170 | char * str; | ||
171 | GtkClipboard * clip; | ||
172 | |||
173 | path = NULL; | ||
174 | if (FALSE == gtk_tree_view_get_path_at_pos(list->treeview, | ||
175 | list->last_x, | ||
176 | list->last_y, | ||
177 | &path, | ||
178 | NULL, | ||
179 | NULL, | ||
180 | NULL)) { | ||
181 | GE_BREAK(NULL, 0); | ||
182 | return FALSE; | ||
183 | } | ||
184 | if (FALSE == gtk_tree_model_get_iter(GTK_TREE_MODEL(list->tree), | ||
185 | &iter, | ||
186 | path)) { | ||
187 | GE_BREAK(NULL, 0); | ||
188 | gtk_tree_path_free(path); | ||
189 | return FALSE; | ||
190 | } | ||
191 | gtk_tree_path_free(path); | ||
192 | uri = NULL; | ||
193 | gtk_tree_model_get(GTK_TREE_MODEL(list->tree), | ||
194 | &iter, | ||
195 | SEARCH_URI, &uri, | ||
196 | -1); | ||
197 | str = ECRS_uriToString(uri); | ||
198 | clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); | ||
199 | gtk_clipboard_set_text(clip, | ||
200 | str, | ||
201 | strlen(str)); | ||
202 | FREE(str); | ||
203 | return FALSE; | ||
204 | } | ||
205 | |||
206 | static gint | ||
207 | search_click_handler(void * cls, | ||
208 | GdkEvent *event) { | ||
209 | SearchList * list = cls; | ||
210 | GtkMenu * menu; | ||
211 | GtkWidget * entry; | ||
212 | GdkEventButton * event_button; | ||
213 | |||
214 | g_return_val_if_fail (event != NULL, FALSE); | ||
215 | |||
216 | if (event->type != GDK_BUTTON_PRESS) | ||
217 | return FALSE; | ||
218 | event_button = (GdkEventButton *) event; | ||
219 | if (event_button->button != 3) | ||
220 | return FALSE; | ||
221 | list->last_x = event_button->x; | ||
222 | list->last_y = event_button->y; | ||
223 | entry = gtk_menu_item_new_with_label(_("_Copy URI to Clipboard")); | ||
224 | g_signal_connect_swapped (entry, | ||
225 | "activate", | ||
226 | G_CALLBACK(on_search_copy_uri_activate), | ||
227 | list); | ||
228 | gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), | ||
229 | TRUE); | ||
230 | gtk_widget_show(entry); | ||
231 | menu = GTK_MENU(gtk_menu_new()); | ||
232 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), | ||
233 | entry); | ||
234 | gtk_menu_popup (menu, | ||
235 | NULL, | ||
236 | NULL, | ||
237 | NULL, | ||
238 | NULL, | ||
239 | event_button->button, | ||
240 | event_button->time); | ||
241 | return TRUE; | ||
242 | } | ||
243 | |||
163 | /** | 244 | /** |
164 | * FSUI event: a search was started; create the | 245 | * FSUI event: a search was started; create the |
165 | * tab and add an entry to the summary. | 246 | * tab and add an entry to the summary. |
@@ -224,7 +305,10 @@ fs_search_started(struct FSUI_SearchList * fsui_list, | |||
224 | /* setup tree view and renderers */ | 305 | /* setup tree view and renderers */ |
225 | list->treeview = GTK_TREE_VIEW(glade_xml_get_widget(list->searchXML, | 306 | list->treeview = GTK_TREE_VIEW(glade_xml_get_widget(list->searchXML, |
226 | "searchResults")); | 307 | "searchResults")); |
227 | 308 | g_signal_connect_swapped (list->treeview, | |
309 | "button-press-event", | ||
310 | G_CALLBACK(search_click_handler), | ||
311 | list); | ||
228 | list->tree = | 312 | list->tree = |
229 | gtk_tree_store_new(SEARCH_NUM, | 313 | gtk_tree_store_new(SEARCH_NUM, |
230 | G_TYPE_STRING, /* name */ | 314 | G_TYPE_STRING, /* name */ |
diff --git a/src/plugins/fs/upload.c b/src/plugins/fs/upload.c index 2e80c165..e8d91b2e 100644 --- a/src/plugins/fs/upload.c +++ b/src/plugins/fs/upload.c | |||
@@ -315,7 +315,7 @@ void on_fileInformationKeywordEntry_changed_fs(gpointer dummy2, | |||
315 | } | 315 | } |
316 | 316 | ||
317 | typedef struct { | 317 | typedef struct { |
318 | const char * filename; | 318 | char * filename; |
319 | unsigned int anonymity; | 319 | unsigned int anonymity; |
320 | unsigned int priority; | 320 | unsigned int priority; |
321 | int index; | 321 | int index; |
@@ -349,6 +349,7 @@ static void * start_upload_helper(void * cls) { | |||
349 | void on_fsinsertuploadbutton_clicked_fs(gpointer dummy, | 349 | void on_fsinsertuploadbutton_clicked_fs(gpointer dummy, |
350 | GtkWidget * uploadButton) { | 350 | GtkWidget * uploadButton) { |
351 | FSUC fsuc; | 351 | FSUC fsuc; |
352 | const char * filename; | ||
352 | const char * filenamerest; | 353 | const char * filenamerest; |
353 | GtkWidget * dialog; | 354 | GtkWidget * dialog; |
354 | EXTRACTOR_ExtractorList * extractors; | 355 | EXTRACTOR_ExtractorList * extractors; |
@@ -367,8 +368,8 @@ void on_fsinsertuploadbutton_clicked_fs(gpointer dummy, | |||
367 | extractors = EXTRACTOR_loadConfigLibraries(extractors, | 368 | extractors = EXTRACTOR_loadConfigLibraries(extractors, |
368 | config); | 369 | config); |
369 | FREE(config); | 370 | FREE(config); |
370 | fsuc.filename = getEntryLineValue(getMainXML(), | 371 | filename = getEntryLineValue(getMainXML(), |
371 | "uploadFilenameComboBoxEntry"); | 372 | "uploadFilenameComboBoxEntry"); |
372 | metaXML | 373 | metaXML |
373 | = glade_xml_new(getGladeFileName(), | 374 | = glade_xml_new(getGladeFileName(), |
374 | "metaDataDialog", | 375 | "metaDataDialog", |
@@ -379,11 +380,11 @@ void on_fsinsertuploadbutton_clicked_fs(gpointer dummy, | |||
379 | meta = ECRS_createMetaData(); | 380 | meta = ECRS_createMetaData(); |
380 | ECRS_extractMetaData(ectx, | 381 | ECRS_extractMetaData(ectx, |
381 | meta, | 382 | meta, |
382 | fsuc.filename, | 383 | filename, |
383 | extractors); | 384 | extractors); |
384 | EXTRACTOR_removeAll(extractors); | 385 | EXTRACTOR_removeAll(extractors); |
385 | filenamerest = &fsuc.filename[strlen(fsuc.filename)-1]; | 386 | filenamerest = &filename[strlen(filename)-1]; |
386 | while ( (filenamerest > fsuc.filename) && | 387 | while ( (filenamerest > filename) && |
387 | (filenamerest[-1] != DIR_SEPARATOR) ) | 388 | (filenamerest[-1] != DIR_SEPARATOR) ) |
388 | filenamerest--; | 389 | filenamerest--; |
389 | ECRS_addToMetaData(meta, | 390 | ECRS_addToMetaData(meta, |
@@ -437,8 +438,10 @@ void on_fsinsertuploadbutton_clicked_fs(gpointer dummy, | |||
437 | fsuc.gkeywordURI = ECRS_stringToUri(ectx, | 438 | fsuc.gkeywordURI = ECRS_stringToUri(ectx, |
438 | ECRS_URI_PREFIX | 439 | ECRS_URI_PREFIX |
439 | ECRS_SEARCH_INFIX); | 440 | ECRS_SEARCH_INFIX); |
441 | fsuc.filename = STRDUP(filename); | ||
440 | run_with_save_calls(&start_upload_helper, | 442 | run_with_save_calls(&start_upload_helper, |
441 | &fsuc); | 443 | &fsuc); |
444 | FREE(fsuc.filename); | ||
442 | ECRS_freeMetaData(fsuc.meta); | 445 | ECRS_freeMetaData(fsuc.meta); |
443 | ECRS_freeUri(fsuc.gkeywordURI); | 446 | ECRS_freeUri(fsuc.gkeywordURI); |
444 | ECRS_freeUri(fsuc.keywordURI); | 447 | ECRS_freeUri(fsuc.keywordURI); |
@@ -529,8 +532,6 @@ void on_mainFileSharingInsertBrowseButton_clicked_fs(GtkWidget * browseButton, | |||
529 | free(filename); | 532 | free(filename); |
530 | } | 533 | } |
531 | 534 | ||
532 | /* FIXME: handlers for clear and stop! */ | ||
533 | |||
534 | struct FCBC { | 535 | struct FCBC { |
535 | int (*method)(struct FSUI_Context * ctx, | 536 | int (*method)(struct FSUI_Context * ctx, |
536 | struct FSUI_UploadList * list); | 537 | struct FSUI_UploadList * list); |