comparison pidgin/gtksmiley.c @ 23136:6c4f47b9d201

Make PurpleSmiley a GObject. Removed some functions from the API that are not really necessary, including purple_smileys_add and purple_smileys_remove. They are called automatically when a new smiley is created or removed. PurpleSmiley has a 'destroy' signal, and 'shortcut' and 'image' properties. These might be of interest to UIs.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 10 May 2008 16:31:06 +0000
parents 9c0a47402f7a
children b37b9e53a31b
comparison
equal deleted inserted replaced
23135:cb0759d9fe30 23136:6c4f47b9d201
74 } 74 }
75 75
76 /****************************************************************************** 76 /******************************************************************************
77 * GtkIMHtmlSmileys stuff 77 * GtkIMHtmlSmileys stuff
78 *****************************************************************************/ 78 *****************************************************************************/
79 /* Perhaps these should be in gtkimhtml.c instead. -- sadrul */
79 static void add_gtkimhtml_to_list(GtkIMHtmlSmiley *gtksmiley) 80 static void add_gtkimhtml_to_list(GtkIMHtmlSmiley *gtksmiley)
80 { 81 {
81 gtk_smileys = g_slist_prepend(gtk_smileys, gtksmiley); 82 gtk_smileys = g_slist_prepend(gtk_smileys, gtksmiley);
82 83
83 purple_debug_info("gtksmiley", "adding %s to gtk_smileys\n", gtksmiley->smile); 84 purple_debug_info("gtksmiley", "adding %s to gtk_smileys\n", gtksmiley->smile);
84 } 85 }
85 86
86 /* Perhaps this should be in gtkimhtml.c instead. -- sad */ 87 static void
88 shortcut_changed_cb(PurpleSmiley *smiley, gpointer dontcare, GtkIMHtmlSmiley *gtksmiley)
89 {
90 g_free(gtksmiley->smile);
91 gtksmiley->smile = g_strdup(purple_smiley_get_shortcut(smiley));
92 }
93
87 static GtkIMHtmlSmiley *smiley_purple_to_gtkimhtml(PurpleSmiley *smiley) 94 static GtkIMHtmlSmiley *smiley_purple_to_gtkimhtml(PurpleSmiley *smiley)
88 { 95 {
89 GtkIMHtmlSmiley *gtksmiley; 96 GtkIMHtmlSmiley *gtksmiley;
90 gchar *filename; 97 gchar *filename;
91 const gchar *file; 98 const gchar *file;
92 99
93 file = purple_imgstore_get_filename(purple_smiley_get_stored_image(smiley)); 100 file = purple_imgstore_get_filename(purple_smiley_get_stored_image(smiley));
94 101
95 filename = g_build_filename(purple_smileys_get_storing_dir(),file, NULL); 102 filename = g_build_filename(purple_smileys_get_storing_dir(), file, NULL);
96 103
97 gtksmiley = gtk_imhtml_smiley_create(filename, purple_smiley_get_shortcut(smiley), 104 gtksmiley = gtk_imhtml_smiley_create(filename, purple_smiley_get_shortcut(smiley),
98 FALSE, GTK_IMHTML_SMILEY_CUSTOM); 105 FALSE, GTK_IMHTML_SMILEY_CUSTOM);
99 g_free(filename); 106 g_free(filename);
100 107
108 /* Make sure the shortcut for the GtkIMHtmlSmiley is updated with the PurpleSmiley */
109 g_signal_connect(G_OBJECT(smiley), "notify::shortcut",
110 G_CALLBACK(shortcut_changed_cb), gtksmiley);
111
101 return gtksmiley; 112 return gtksmiley;
113 }
114
115 void pidgin_smiley_del_from_list(PurpleSmiley *smiley)
116 {
117 GSList *list = NULL;
118 GtkIMHtmlSmiley *gtksmiley;
119
120 if (gtk_smileys == NULL)
121 return;
122
123 list = gtk_smileys;
124
125 for (; list; list = list->next) {
126 gtksmiley = (GtkIMHtmlSmiley*)list->data;
127
128 if (strcmp(gtksmiley->smile, purple_smiley_get_shortcut(smiley)))
129 continue;
130
131 gtk_imhtml_smiley_destroy(gtksmiley);
132 g_signal_handlers_disconnect_matched(G_OBJECT(smiley), G_SIGNAL_MATCH_DATA,
133 0, 0, NULL, NULL, gtksmiley);
134 break;
135 }
136
137 if (list)
138 gtk_smileys = g_slist_delete_link(gtk_smileys, list);
102 } 139 }
103 140
104 void pidgin_smiley_add_to_list(PurpleSmiley *smiley) 141 void pidgin_smiley_add_to_list(PurpleSmiley *smiley)
105 { 142 {
106 GtkIMHtmlSmiley *gtksmiley; 143 GtkIMHtmlSmiley *gtksmiley;
107 144
108 gtksmiley = smiley_purple_to_gtkimhtml(smiley); 145 gtksmiley = smiley_purple_to_gtkimhtml(smiley);
109 add_gtkimhtml_to_list(gtksmiley); 146 add_gtkimhtml_to_list(gtksmiley);
110 } 147 g_signal_connect(G_OBJECT(smiley), "destroy", G_CALLBACK(pidgin_smiley_del_from_list), NULL);
111
112 void pidgin_smiley_del_from_list(PurpleSmiley *smiley)
113 {
114 GSList *list = NULL;
115 GtkIMHtmlSmiley *gtksmiley;
116
117 if (gtk_smileys == NULL)
118 return;
119
120 list = gtk_smileys;
121
122 for (; list; list = list->next) {
123 gtksmiley = (GtkIMHtmlSmiley*)list->data;
124
125 if (strcmp(gtksmiley->smile, purple_smiley_get_shortcut(smiley)))
126 continue;
127
128 gtk_imhtml_smiley_destroy(gtksmiley);
129 break;
130 }
131
132 if (list)
133 gtk_smileys = g_slist_delete_link(gtk_smileys, list);
134 } 148 }
135 149
136 void pidgin_smileys_init(void) 150 void pidgin_smileys_init(void)
137 { 151 {
138 GList *smileys; 152 GList *smileys;
222 return; 236 return;
223 } 237 }
224 238
225 purple_debug_info("gtksmiley", "adding a new smiley\n"); 239 purple_debug_info("gtksmiley", "adding a new smiley\n");
226 emoticon = purple_smiley_new_from_file(entry, s->filename); 240 emoticon = purple_smiley_new_from_file(entry, s->filename);
227 purple_smileys_add(emoticon);
228 if (gtk_smileys != NULL) 241 if (gtk_smileys != NULL)
229 pidgin_smiley_add_to_list(emoticon); 242 pidgin_smiley_add_to_list(emoticon);
230 } 243 }
231 244
232 if (smiley_manager != NULL) 245 if (smiley_manager != NULL)
369 * Delete smiley 382 * Delete smiley
370 *****************************************************************************/ 383 *****************************************************************************/
371 static void delete_foreach(GtkTreeModel *model, GtkTreePath *path, 384 static void delete_foreach(GtkTreeModel *model, GtkTreePath *path,
372 GtkTreeIter *iter, gpointer data) 385 GtkTreeIter *iter, gpointer data)
373 { 386 {
374 PurpleSmiley *smiley; 387 PurpleSmiley *smiley = NULL;
375 char *shortcut;
376 SmileyManager *dialog; 388 SmileyManager *dialog;
377 389
378 dialog = (SmileyManager*)data; 390 dialog = (SmileyManager*)data;
379 391
380 gtk_tree_model_get(model, iter, 392 gtk_tree_model_get(model, iter,
381 SHORTCUT, &shortcut, 393 SMILEY, &smiley,
382 -1); 394 -1);
383 395
384 purple_debug_info("gtksmiley", "delete_foreach shortcut = %s\n", shortcut); 396 if(smiley != NULL) {
385 397 g_object_unref(G_OBJECT(smiley));
386 smiley = purple_smileys_find_by_shortcut(shortcut);
387
388 if(smiley == NULL)
389 purple_debug_error("gtksmiley", "%s not found\n", shortcut);
390 else {
391 pidgin_smiley_del_from_list(smiley); 398 pidgin_smiley_del_from_list(smiley);
392 purple_smiley_delete(smiley); 399 purple_smiley_delete(smiley);
393 } 400 }
394 401 }
395 g_free(shortcut); 402
403 static void append_to_list(GtkTreeModel *model, GtkTreePath *path,
404 GtkTreeIter *iter, gpointer data)
405 {
406 GList **list = data;
407 *list = g_list_prepend(*list, gtk_tree_path_copy(path));
396 } 408 }
397 409
398 static void smiley_delete(SmileyManager *dialog) 410 static void smiley_delete(SmileyManager *dialog)
399 { 411 {
400 GtkTreeSelection *selection; 412 GtkTreeSelection *selection;
413 GList *list = NULL;
401 414
402 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); 415 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
403 gtk_tree_selection_selected_foreach(selection, delete_foreach, dialog); 416 gtk_tree_selection_selected_foreach(selection, delete_foreach, dialog);
417 gtk_tree_selection_selected_foreach(selection, append_to_list, &list);
418
419 while (list) {
420 GtkTreeIter iter;
421 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, list->data))
422 gtk_list_store_remove(GTK_LIST_STORE(dialog->model), &iter);
423 gtk_tree_path_free(list->data);
424 list = g_list_delete_link(list, list);
425 }
404 } 426 }
405 /****************************************************************************** 427 /******************************************************************************
406 * The Smiley Manager 428 * The Smiley Manager
407 *****************************************************************************/ 429 *****************************************************************************/
408 static void add_columns(GtkWidget *treeview, SmileyManager *dialog) 430 static void add_columns(GtkWidget *treeview, SmileyManager *dialog)
497 PurpleSmiley *smiley = NULL; 519 PurpleSmiley *smiley = NULL;
498 520
499 gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); 521 gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path);
500 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, SMILEY, &smiley, -1); 522 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, SMILEY, &smiley, -1);
501 pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), smiley); 523 pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), smiley);
524 g_object_unref(G_OBJECT(smiley));
502 } 525 }
503 526
504 static GtkWidget *smiley_list_create(SmileyManager *dialog) 527 static GtkWidget *smiley_list_create(SmileyManager *dialog)
505 { 528 {
506 GtkWidget *sw; 529 GtkWidget *sw;
517 540
518 /* Create the list model */ 541 /* Create the list model */
519 dialog->model = gtk_list_store_new(N_COL, 542 dialog->model = gtk_list_store_new(N_COL,
520 GDK_TYPE_PIXBUF, /* ICON */ 543 GDK_TYPE_PIXBUF, /* ICON */
521 G_TYPE_STRING, /* SHORTCUT */ 544 G_TYPE_STRING, /* SHORTCUT */
522 G_TYPE_POINTER /* SMILEY */ 545 G_TYPE_OBJECT /* SMILEY */
523 ); 546 );
524 547
525 /* the actual treeview */ 548 /* the actual treeview */
526 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); 549 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model));
527 dialog->treeview = treeview; 550 dialog->treeview = treeview;
555 case GTK_RESPONSE_YES: 578 case GTK_RESPONSE_YES:
556 pidgin_smiley_edit(dialog->window, NULL); 579 pidgin_smiley_edit(dialog->window, NULL);
557 break; 580 break;
558 case GTK_RESPONSE_NO: 581 case GTK_RESPONSE_NO:
559 smiley_delete(dialog); 582 smiley_delete(dialog);
560 refresh_list();
561 break; 583 break;
562 case GTK_RESPONSE_DELETE_EVENT: 584 case GTK_RESPONSE_DELETE_EVENT:
563 case GTK_RESPONSE_CLOSE: 585 case GTK_RESPONSE_CLOSE:
564 gtk_widget_destroy(dialog->window); 586 gtk_widget_destroy(dialog->window);
565 g_free(smiley_manager); 587 g_free(smiley_manager);