Mercurial > pidgin.yaz
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); |