4 * Pidgin is the legal property of its developers, whose names are too numerous
5 * to list here. Please refer to the COPYRIGHT file distributed with this
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
29 #include "smiley-custom.h"
30 #include "smiley-list.h"
32 #include "gtksmiley-manager.h"
34 #include "pidginstock.h"
36 #include "gtk3compat.h"
43 PurpleImage
*new_image
;
56 PurpleHttpConnection
*running_request
;
61 SMILEY_LIST_MODEL_ICON
,
62 SMILEY_LIST_MODEL_SHORTCUT
,
63 SMILEY_LIST_MODEL_PURPLESMILEY
,
64 SMILEY_LIST_MODEL_N_COL
69 PIDGIN_RESPONSE_MODIFY
72 static SmileyManager
*smiley_manager
= NULL
;
75 edit_dialog_update_buttons(SmileyEditDialog
*edit_dialog
);
78 manager_list_fill(SmileyManager
*manager
);
81 /*******************************************************************************
82 * Custom smiley edit dialog image.
83 ******************************************************************************/
86 edit_dialog_image_update_thumb(SmileyEditDialog
*edit_dialog
)
88 GdkPixbuf
*pixbuf
= NULL
;
90 if (edit_dialog
->new_image
) {
91 pixbuf
= pidgin_pixbuf_from_image(edit_dialog
->new_image
);
92 } else if (edit_dialog
->filename
) {
93 pixbuf
= pidgin_pixbuf_new_from_file(edit_dialog
->filename
);
95 g_free(edit_dialog
->filename
);
96 edit_dialog
->filename
= NULL
;
101 pixbuf
= pidgin_pixbuf_scale_down(pixbuf
, 64, 64,
102 GDK_INTERP_HYPER
, TRUE
);
106 GtkIconSize icon_size
=
107 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL
);
108 pixbuf
= gtk_widget_render_icon(GTK_WIDGET(edit_dialog
->window
),
109 PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR
, icon_size
,
110 "PidginSmileyManager");
112 g_return_if_fail(pixbuf
!= NULL
);
114 gtk_image_set_from_pixbuf(GTK_IMAGE(edit_dialog
->thumbnail
), pixbuf
);
116 g_object_unref(G_OBJECT(pixbuf
));
120 edit_dialog_set_image(SmileyEditDialog
*edit_dialog
, PurpleImage
*image
)
122 GdkPixbuf
*tmp
= NULL
;
124 if (edit_dialog
->new_image
)
125 g_object_unref(edit_dialog
->new_image
);
127 if (edit_dialog
->smiley
) {
128 g_object_set_data(G_OBJECT(edit_dialog
->smiley
),
129 "pidgin-smiley-manager-list-thumb", NULL
);
132 /* check, if image is valid */
134 tmp
= pidgin_pixbuf_from_image(image
);
138 g_object_unref(image
);
142 edit_dialog
->new_image
= image
;
144 edit_dialog_image_update_thumb(edit_dialog
);
145 edit_dialog_update_buttons(edit_dialog
);
147 return (image
!= NULL
);
151 edit_dialog_set_shortcut(SmileyEditDialog
*edit_dialog
,
152 const gchar
*shortcut
)
154 gtk_entry_set_text(edit_dialog
->shortcut
, shortcut
? shortcut
: "");
158 edit_dialog_image_choosen(const char *filename
, gpointer _edit_dialog
)
161 SmileyEditDialog
*edit_dialog
= _edit_dialog
;
166 image
= purple_image_new_from_file(filename
, NULL
);
170 g_free(edit_dialog
->filename
);
171 edit_dialog
->filename
= NULL
;
173 if (!edit_dialog_set_image(edit_dialog
, image
))
175 edit_dialog
->filename
= g_strdup(filename
);
177 gtk_widget_grab_focus(GTK_WIDGET(edit_dialog
->shortcut
));
181 edit_dialog_image_choose(GtkWidget
*widget
, gpointer _edit_dialog
)
183 GtkFileChooserNative
*file_chooser
;
184 file_chooser
= pidgin_buddy_icon_chooser_new(
185 GTK_WINDOW(gtk_widget_get_toplevel(widget
)),
186 edit_dialog_image_choosen
, _edit_dialog
);
187 gtk_window_set_title(GTK_WINDOW(file_chooser
), _("Custom Smiley"));
188 gtk_window_set_role(GTK_WINDOW(file_chooser
),
189 "file-selector-custom-smiley");
190 gtk_native_dialog_run(GTK_NATIVE_DIALOG(file_chooser
));
191 g_object_unref(file_chooser
);
195 /*******************************************************************************
196 * Custom smiley edit dialog.
197 ******************************************************************************/
200 edit_dialog_destroy(GtkWidget
*window
, gpointer _edit_dialog
)
202 SmileyEditDialog
*edit_dialog
= _edit_dialog
;
204 if (edit_dialog
->smiley
) {
205 g_object_set_data(G_OBJECT(edit_dialog
->smiley
),
206 "pidgin-smiley-manager-edit-dialog", NULL
);
207 g_object_unref(edit_dialog
->smiley
);
210 if (edit_dialog
->new_image
)
211 g_object_unref(edit_dialog
->new_image
);
213 g_free(edit_dialog
->filename
);
218 edit_dialog_save(SmileyEditDialog
*edit_dialog
)
220 const gchar
*shortcut
;
221 PurpleSmiley
*existing_smiley
;
222 gboolean shortcut_changed
, image_changed
;
224 shortcut
= gtk_entry_get_text(edit_dialog
->shortcut
);
226 existing_smiley
= purple_smiley_list_get_by_shortcut(
227 purple_smiley_custom_get_list(), shortcut
);
229 if (existing_smiley
&& existing_smiley
!= edit_dialog
->smiley
) {
230 gchar
*msg
= g_strdup_printf(
231 _("A custom smiley for '%s' already exists. "
232 "Please use a different shortcut."), shortcut
);
233 purple_notify_error(edit_dialog
, _("Custom Smiley"),
234 _("Duplicate Shortcut"), msg
, NULL
);
239 if (edit_dialog
->smiley
== NULL
)
240 shortcut_changed
= image_changed
= TRUE
;
242 shortcut_changed
= purple_strequal(purple_smiley_get_shortcut(
243 edit_dialog
->smiley
), shortcut
);
244 image_changed
= (edit_dialog
->new_image
!= NULL
);
247 if (!shortcut_changed
&& !image_changed
) {
248 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
252 if (edit_dialog
->new_image
== NULL
) {
253 edit_dialog
->new_image
= PURPLE_IMAGE(edit_dialog
->smiley
);
254 g_return_if_fail(edit_dialog
->new_image
);
257 if (edit_dialog
->smiley
)
258 purple_smiley_custom_remove(edit_dialog
->smiley
);
259 purple_smiley_custom_add(edit_dialog
->new_image
, shortcut
);
262 manager_list_fill(smiley_manager
);
264 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
268 edit_dialog_update_buttons(SmileyEditDialog
*edit_dialog
)
270 gboolean shortcut_ok
, image_ok
;
272 shortcut_ok
= (gtk_entry_get_text_length(edit_dialog
->shortcut
) > 0);
273 image_ok
= (edit_dialog
->filename
|| edit_dialog
->new_image
);
275 gtk_dialog_set_response_sensitive(edit_dialog
->window
,
276 GTK_RESPONSE_ACCEPT
, shortcut_ok
&& image_ok
);
280 edit_dialog_shortcut_changed(GtkEditable
*shortcut
, gpointer _edit_dialog
)
282 SmileyEditDialog
*edit_dialog
= _edit_dialog
;
284 edit_dialog_update_buttons(edit_dialog
);
288 edit_dialog_response(GtkDialog
*window
, gint response_id
,
289 gpointer _edit_dialog
)
291 SmileyEditDialog
*edit_dialog
= _edit_dialog
;
293 switch (response_id
) {
294 case GTK_RESPONSE_ACCEPT
:
295 edit_dialog_save(edit_dialog
);
297 case GTK_RESPONSE_DELETE_EVENT
:
298 case GTK_RESPONSE_CANCEL
:
299 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
306 static SmileyEditDialog
*
307 edit_dialog_show(SmileyManager
*manager
, PurpleSmiley
*smiley
)
309 SmileyEditDialog
*edit_dialog
;
310 GtkWidget
*vbox
, *hbox
;
315 edit_dialog
= g_object_get_data(G_OBJECT(smiley
),
316 "pidgin-smiley-manager-edit-dialog");
318 gtk_window_present(GTK_WINDOW(edit_dialog
->window
));
323 edit_dialog
= g_new0(SmileyEditDialog
, 1);
325 edit_dialog
->window
= GTK_DIALOG(gtk_dialog_new_with_buttons(
326 smiley
? _("Edit Smiley") : _("Add Smiley"),
327 manager
? GTK_WINDOW(manager
->window
) : NULL
,
328 GTK_DIALOG_DESTROY_WITH_PARENT
,
329 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
330 smiley
? GTK_STOCK_SAVE
: GTK_STOCK_ADD
, GTK_RESPONSE_ACCEPT
,
332 gtk_dialog_set_default_response(
333 edit_dialog
->window
, GTK_RESPONSE_ACCEPT
);
336 edit_dialog
->smiley
= smiley
;
337 g_object_set_data(G_OBJECT(smiley
),
338 "pidgin-smiley-manager-edit-dialog", edit_dialog
);
339 g_object_ref(smiley
);
344 vbox
= gtk_grid_new();
345 gtk_grid_set_row_spacing(GTK_GRID(vbox
), PIDGIN_HIG_BORDER
);
346 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(
347 edit_dialog
->window
)), vbox
);
348 gtk_widget_show(vbox
);
351 hbox
= gtk_grid_new();
352 gtk_grid_set_column_spacing(GTK_GRID(hbox
), PIDGIN_HIG_BORDER
);
353 gtk_grid_attach(GTK_GRID(vbox
), hbox
, 0, 0, 1, 1);
355 label
= GTK_LABEL(gtk_label_new_with_mnemonic(_("_Image:")));
356 gtk_grid_attach(GTK_GRID(hbox
), GTK_WIDGET(label
), 0, 0, 1, 1);
357 gtk_widget_show(GTK_WIDGET(label
));
359 filech
= GTK_BUTTON(gtk_button_new());
360 gtk_grid_attach_next_to(GTK_GRID(hbox
), GTK_WIDGET(filech
), NULL
,
361 GTK_POS_RIGHT
, 1, 1);
362 pidgin_set_accessible_label(GTK_WIDGET(filech
), label
);
364 edit_dialog
->thumbnail
= GTK_IMAGE(gtk_image_new());
365 gtk_container_add(GTK_CONTAINER(filech
),
366 GTK_WIDGET(edit_dialog
->thumbnail
));
368 gtk_widget_show_all(hbox
);
371 hbox
= gtk_grid_new();
372 gtk_grid_set_column_spacing(GTK_GRID(hbox
), PIDGIN_HIG_BORDER
);
374 gtk_grid_attach_next_to(GTK_GRID(vbox
), hbox
, NULL
,
375 GTK_POS_BOTTOM
, 1, 1);
378 label
= GTK_LABEL(gtk_label_new_with_mnemonic(_("S_hortcut text:")));
379 gtk_grid_attach(GTK_GRID(hbox
), GTK_WIDGET(label
), 0, 0, 1, 1);
380 gtk_widget_show(GTK_WIDGET(label
));
382 edit_dialog
->shortcut
= GTK_ENTRY(gtk_entry_new());
383 gtk_entry_set_activates_default(edit_dialog
->shortcut
, TRUE
);
384 pidgin_set_accessible_label(GTK_WIDGET(edit_dialog
->shortcut
), label
);
386 gtk_grid_attach_next_to(GTK_GRID(hbox
),
387 GTK_WIDGET(edit_dialog
->shortcut
), NULL
, GTK_POS_RIGHT
, 1, 1);
389 gtk_widget_show(GTK_WIDGET(edit_dialog
->shortcut
));
390 gtk_widget_show(hbox
);
391 gtk_widget_show(GTK_WIDGET(edit_dialog
->window
));
394 edit_dialog
->filename
= g_strdup(purple_image_get_path(
395 PURPLE_IMAGE(smiley
)));
396 gtk_entry_set_text(edit_dialog
->shortcut
,
397 purple_smiley_get_shortcut(smiley
));
400 edit_dialog_image_update_thumb(edit_dialog
);
401 edit_dialog_update_buttons(edit_dialog
);
403 g_signal_connect(edit_dialog
->window
, "response",
404 G_CALLBACK(edit_dialog_response
), edit_dialog
);
405 g_signal_connect(filech
, "clicked",
406 G_CALLBACK(edit_dialog_image_choose
), edit_dialog
);
407 g_signal_connect(edit_dialog
->shortcut
, "changed",
408 G_CALLBACK(edit_dialog_shortcut_changed
), edit_dialog
);
410 g_signal_connect(edit_dialog
->window
, "destroy",
411 G_CALLBACK(edit_dialog_destroy
), edit_dialog
);
412 g_signal_connect(edit_dialog
->window
, "destroy",
413 G_CALLBACK(purple_notify_close_with_handle
), edit_dialog
);
419 pidgin_smiley_manager_add(PurpleImage
*image
, const gchar
*shortcut
)
421 SmileyEditDialog
*edit_dialog
;
423 g_return_if_fail(image
!= NULL
);
427 edit_dialog
= edit_dialog_show(NULL
, NULL
);
428 edit_dialog_set_shortcut(edit_dialog
, shortcut
);
429 if (!edit_dialog_set_image(edit_dialog
, image
))
430 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
434 /*******************************************************************************
435 * Custom smiley list Drag-and-drop support.
436 ******************************************************************************/
439 smiley_list_dnd_url_got(PurpleHttpConnection
*http_conn
,
440 PurpleHttpResponse
*response
, gpointer _manager
)
442 SmileyManager
*manager
= _manager
;
443 SmileyEditDialog
*edit_dialog
;
445 const gchar
*image_data
;
448 g_return_if_fail(manager
== smiley_manager
);
449 g_return_if_fail(manager
->running_request
== http_conn
);
450 manager
->running_request
= NULL
;
452 if (!purple_http_response_is_successful(response
))
455 image_data
= purple_http_response_get_data(response
, &image_size
);
456 image
= purple_image_new_from_data((const guint8
*)image_data
, image_size
);
460 edit_dialog
= edit_dialog_show(manager
, NULL
);
461 if (!edit_dialog_set_image(edit_dialog
, image
))
462 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
466 smiley_list_dnd_recv(GtkWidget
*widget
, GdkDragContext
*dc
, gint x
, gint y
,
467 GtkSelectionData
*sd
, guint info
, guint time
, gpointer _manager
)
469 SmileyManager
*manager
= _manager
;
472 /* We don't need anything, that is not 8-bit per element (char). */
473 if (gtk_selection_data_get_format(sd
) != 8) {
474 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
478 if (gtk_selection_data_get_length(sd
) <= 0) {
479 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
483 memset(&content
, 0, sizeof(content
));
484 memcpy(&content
, gtk_selection_data_get_data(sd
),
485 MIN((guint
)gtk_selection_data_get_length(sd
), sizeof(content
)));
487 if (content
[0] == '\0') {
488 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
492 /* Well, it looks like the drag event was cool.
493 * Let's do something with it */
495 if (purple_str_has_caseprefix(content
, "file://")) {
496 SmileyEditDialog
*edit_dialog
;
500 filename
= g_filename_from_uri(content
, NULL
, NULL
);
501 if (!filename
|| !g_file_test(filename
, G_FILE_TEST_EXISTS
)) {
502 purple_debug_warning("gtksmiley-manager",
503 "dropped file does not exists");
504 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
508 image
= purple_image_new_from_file(filename
, NULL
);
510 purple_debug_warning("gtksmiley-manager",
511 "dropped file is not a valid image");
512 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
515 edit_dialog
= edit_dialog_show(manager
, NULL
);
516 if (!edit_dialog_set_image(edit_dialog
, image
)) {
517 gtk_widget_destroy(GTK_WIDGET(edit_dialog
->window
));
518 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
522 gtk_drag_finish(dc
, TRUE
, FALSE
, time
);
526 if (purple_str_has_caseprefix(content
, "http://") ||
527 purple_str_has_caseprefix(content
, "https://"))
529 purple_http_conn_cancel(smiley_manager
->
531 smiley_manager
->running_request
= purple_http_get(NULL
,
532 smiley_list_dnd_url_got
, manager
, content
);
534 gtk_drag_finish(dc
, TRUE
, FALSE
, time
);
538 gtk_drag_finish(dc
, FALSE
, FALSE
, time
);
541 /*******************************************************************************
542 * Custom smiley list.
543 ******************************************************************************/
546 smiley_list_selected(GtkTreeSelection
*sel
, gpointer _manager
)
548 SmileyManager
*manager
= _manager
;
551 sens
= (gtk_tree_selection_count_selected_rows(sel
) > 0);
553 gtk_dialog_set_response_sensitive(manager
->window
,
554 GTK_RESPONSE_NO
, sens
);
555 gtk_dialog_set_response_sensitive(manager
->window
,
556 PIDGIN_RESPONSE_MODIFY
, sens
);
560 smiley_list_activated(GtkTreeView
*tree
, GtkTreePath
*path
,
561 GtkTreeViewColumn
*col
, gpointer _manager
)
563 SmileyManager
*manager
= _manager
;
565 PurpleSmiley
*smiley
= NULL
;
567 if (!gtk_tree_model_get_iter(
568 GTK_TREE_MODEL(manager
->model
), &iter
, path
))
573 gtk_tree_model_get(GTK_TREE_MODEL(manager
->model
), &iter
,
574 SMILEY_LIST_MODEL_PURPLESMILEY
, &smiley
, -1);
575 g_return_if_fail(PURPLE_IS_SMILEY(smiley
));
577 edit_dialog_show(manager
, smiley
);
581 manager_list_add(SmileyManager
*manager
, PurpleSmiley
*smiley
)
583 GdkPixbuf
*smiley_image
;
586 smiley_image
= g_object_get_data(G_OBJECT(smiley
),
587 "pidgin-smiley-manager-list-thumb");
588 if (smiley_image
== NULL
) {
589 smiley_image
= pidgin_pixbuf_from_image(PURPLE_IMAGE(smiley
));
590 smiley_image
= pidgin_pixbuf_scale_down(smiley_image
,
591 22, 22, GDK_INTERP_BILINEAR
, TRUE
);
592 g_object_set_data_full(G_OBJECT(smiley
),
593 "pidgin-smiley-manager-list-thumb",
594 smiley_image
, g_object_unref
);
597 gtk_list_store_append(manager
->model
, &iter
);
598 gtk_list_store_set(manager
->model
, &iter
,
599 SMILEY_LIST_MODEL_ICON
, smiley_image
,
600 SMILEY_LIST_MODEL_SHORTCUT
, purple_smiley_get_shortcut(smiley
),
601 SMILEY_LIST_MODEL_PURPLESMILEY
, smiley
,
606 manager_list_fill(SmileyManager
*manager
)
608 GList
*custom_smileys
, *it
;
609 gtk_list_store_clear(manager
->model
);
611 custom_smileys
= purple_smiley_list_get_all(
612 purple_smiley_custom_get_list());
614 for (it
= custom_smileys
; it
; it
= g_list_next(it
)) {
615 PurpleSmiley
*smiley
= it
->data
;
617 manager_list_add(manager
, smiley
);
619 g_list_free(custom_smileys
);
623 manager_list_create(SmileyManager
*manager
)
626 GtkTreeSelection
*sel
;
627 GtkCellRenderer
*cellrend
;
628 GtkTreeViewColumn
*column
;
629 GtkTargetEntry targets
[3] = {
630 {"text/plain", 0, 0},
631 {"text/uri-list", 0, 1},
635 manager
->model
= gtk_list_store_new(SMILEY_LIST_MODEL_N_COL
,
636 GDK_TYPE_PIXBUF
, /* icon */
637 G_TYPE_STRING
, /* shortcut */
638 G_TYPE_OBJECT
/* PurpleSmiley */
641 manager
->tree
= tree
= GTK_TREE_VIEW(gtk_tree_view_new_with_model(
642 GTK_TREE_MODEL(manager
->model
)));
644 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(manager
->model
),
645 SMILEY_LIST_MODEL_SHORTCUT
, GTK_SORT_ASCENDING
);
647 g_object_unref(manager
->model
);
649 sel
= gtk_tree_view_get_selection(tree
);
650 gtk_tree_selection_set_mode(sel
, GTK_SELECTION_MULTIPLE
);
652 g_signal_connect(sel
, "changed",
653 G_CALLBACK(smiley_list_selected
), manager
);
654 g_signal_connect(tree
, "row-activated",
655 G_CALLBACK(smiley_list_activated
), manager
);
657 gtk_drag_dest_set(GTK_WIDGET(tree
), GTK_DEST_DEFAULT_MOTION
|
658 GTK_DEST_DEFAULT_HIGHLIGHT
| GTK_DEST_DEFAULT_DROP
,
659 targets
, G_N_ELEMENTS(targets
),
660 GDK_ACTION_COPY
| GDK_ACTION_MOVE
);
661 g_signal_connect(tree
, "drag-data-received",
662 G_CALLBACK(smiley_list_dnd_recv
), manager
);
664 gtk_widget_show(GTK_WIDGET(tree
));
666 /* setting up columns */
668 column
= gtk_tree_view_column_new();
669 gtk_tree_view_column_set_title(column
, _("Smiley"));
670 gtk_tree_view_column_set_resizable(column
, TRUE
);
671 gtk_tree_view_append_column(tree
, column
);
672 cellrend
= gtk_cell_renderer_pixbuf_new();
673 gtk_tree_view_column_pack_start(column
, cellrend
, FALSE
);
674 gtk_tree_view_column_add_attribute(column
, cellrend
,
675 "pixbuf", SMILEY_LIST_MODEL_ICON
);
677 column
= gtk_tree_view_column_new();
678 gtk_tree_view_column_set_title(column
, _("Shortcut Text"));
679 gtk_tree_view_column_set_resizable(column
, TRUE
);
680 gtk_tree_view_append_column(tree
, column
);
681 cellrend
= gtk_cell_renderer_text_new();
682 gtk_tree_view_column_pack_start(column
, cellrend
, TRUE
);
683 gtk_tree_view_column_add_attribute(column
, cellrend
,
684 "text", SMILEY_LIST_MODEL_SHORTCUT
);
686 manager_list_fill(manager
);
688 return pidgin_make_scrollable(GTK_WIDGET(tree
), GTK_POLICY_AUTOMATIC
,
689 GTK_POLICY_AUTOMATIC
, GTK_SHADOW_IN
, -1, -1);
692 /*******************************************************************************
693 * Custom smiley manager window.
694 ******************************************************************************/
697 manager_select_cb(GtkWidget
*widget
, gint resp
, SmileyManager
*manager
)
699 GtkTreeSelection
*selection
= NULL
;
700 GList
*selected_rows
, *selected_smileys
= NULL
, *it
;
701 GtkTreeModel
*model
= GTK_TREE_MODEL(manager
->model
);
703 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(manager
->tree
));
704 selected_rows
= gtk_tree_selection_get_selected_rows(selection
, NULL
);
705 for (it
= selected_rows
; it
; it
= g_list_next(it
)) {
706 GtkTreePath
*path
= it
->data
;
708 PurpleSmiley
*smiley
= NULL
;
710 if (!gtk_tree_model_get_iter(model
, &iter
, path
))
713 gtk_tree_model_get(model
, &iter
,
714 SMILEY_LIST_MODEL_PURPLESMILEY
, &smiley
, -1);
718 selected_smileys
= g_list_prepend(selected_smileys
, smiley
);
720 g_list_free_full(selected_rows
, (GDestroyNotify
)gtk_tree_path_free
);
723 case GTK_RESPONSE_YES
:
724 edit_dialog_show(manager
, NULL
);
726 case GTK_RESPONSE_NO
:
727 for (it
= selected_smileys
; it
; it
= g_list_next(it
))
728 purple_smiley_custom_remove(it
->data
);
729 manager_list_fill(manager
);
731 case GTK_RESPONSE_DELETE_EVENT
:
732 case GTK_RESPONSE_CLOSE
:
733 gtk_widget_destroy(GTK_WIDGET(manager
->window
));
734 purple_http_conn_cancel(manager
->running_request
);
736 smiley_manager
= NULL
;
738 case PIDGIN_RESPONSE_MODIFY
:
739 for (it
= selected_smileys
; it
; it
= g_list_next(it
))
740 edit_dialog_show(manager
, it
->data
);
746 g_list_free(selected_smileys
);
750 pidgin_smiley_manager_show(void)
752 SmileyManager
*manager
;
754 GtkWidget
*sw
, *vbox
;
756 if (smiley_manager
) {
757 gtk_window_present(GTK_WINDOW(smiley_manager
->window
));
761 manager
= g_new0(SmileyManager
, 1);
762 smiley_manager
= manager
;
764 manager
->window
= win
= GTK_DIALOG(gtk_dialog_new_with_buttons(
765 _("Custom Smiley Manager"), NULL
,
766 GTK_DIALOG_DESTROY_WITH_PARENT
,
767 PIDGIN_STOCK_ADD
, GTK_RESPONSE_YES
,
768 PIDGIN_STOCK_MODIFY
, PIDGIN_RESPONSE_MODIFY
,
769 GTK_STOCK_DELETE
, GTK_RESPONSE_NO
,
770 GTK_STOCK_CLOSE
, GTK_RESPONSE_CLOSE
,
773 gtk_window_set_default_size(GTK_WINDOW(win
), 50, 400);
774 gtk_window_set_role(GTK_WINDOW(win
), "custom_smiley_manager");
775 gtk_dialog_set_response_sensitive(win
, GTK_RESPONSE_NO
, FALSE
);
776 gtk_dialog_set_response_sensitive(win
, PIDGIN_RESPONSE_MODIFY
, FALSE
);
778 g_signal_connect(win
, "response",
779 G_CALLBACK(manager_select_cb
), manager
);
782 vbox
= gtk_dialog_get_content_area(win
);
784 /* get the scrolled window with all stuff */
785 sw
= manager_list_create(manager
);
786 gtk_box_pack_start(GTK_BOX(vbox
), sw
, TRUE
, TRUE
, 0);
789 gtk_widget_show(GTK_WIDGET(win
));