libpurple/cmds.c

changeset 41722
eee8aa10c2a0
parent 41685
ca22b00972d4
child 42172
7c2d151b410d
equal deleted inserted replaced
41721:aefc93bef426 41722:eee8aa10c2a0
18 18
19 #include "account.h" 19 #include "account.h"
20 #include "purplemarkup.h" 20 #include "purplemarkup.h"
21 #include "cmds.h" 21 #include "cmds.h"
22 22
23 static PurpleCommandsUiOps *cmds_ui_ops = NULL;
24 static GList *cmds = NULL; 23 static GList *cmds = NULL;
25 static guint next_id = 1; 24 static guint next_id = 1;
26 25
27 typedef struct { 26 typedef struct {
28 PurpleCmdId id; 27 PurpleCmdId id;
47 const gchar *protocol_id, PurpleCmdFunc func, 46 const gchar *protocol_id, PurpleCmdFunc func,
48 const gchar *helpstr, void *data) 47 const gchar *helpstr, void *data)
49 { 48 {
50 PurpleCmdId id; 49 PurpleCmdId id;
51 PurpleCmd *c; 50 PurpleCmd *c;
52 PurpleCommandsUiOps *ops;
53 51
54 g_return_val_if_fail(cmd != NULL && *cmd != '\0', 0); 52 g_return_val_if_fail(cmd != NULL && *cmd != '\0', 0);
55 g_return_val_if_fail(args != NULL, 0); 53 g_return_val_if_fail(args != NULL, 0);
56 g_return_val_if_fail(func != NULL, 0); 54 g_return_val_if_fail(func != NULL, 0);
57 55
68 c->help = g_strdup(helpstr); 66 c->help = g_strdup(helpstr);
69 c->data = data; 67 c->data = data;
70 68
71 cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); 69 cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func);
72 70
73 ops = purple_cmds_get_ui_ops();
74 if (ops && ops->register_command)
75 ops->register_command(cmd, p, f, protocol_id, helpstr, c->id);
76
77 purple_signal_emit(purple_cmds_get_handle(), "cmd-added", cmd, p, f); 71 purple_signal_emit(purple_cmds_get_handle(), "cmd-added", cmd, p, f);
78 72
79 return id; 73 return id;
80 } 74 }
81 75
96 90
97 void purple_cmd_unregister(PurpleCmdId id) 91 void purple_cmd_unregister(PurpleCmdId id)
98 { 92 {
99 PurpleCmd *c; 93 PurpleCmd *c;
100 GList *l; 94 GList *l;
101 PurpleCommandsUiOps *ops;
102 95
103 l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id); 96 l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id);
104 if (!l) { 97 if (!l) {
105 return; 98 return;
106 } 99 }
107 100
108 c = l->data; 101 c = l->data;
109
110 ops = purple_cmds_get_ui_ops();
111 if (ops && ops->unregister_command) {
112 ops->unregister_command(c->cmd, c->protocol_id);
113 }
114 102
115 cmds = g_list_delete_link(cmds, l); 103 cmds = g_list_delete_link(cmds, l);
116 purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd); 104 purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd);
117 purple_cmd_free(c); 105 purple_cmd_free(c);
118 } 106 }
386 { 374 {
387 static int handle; 375 static int handle;
388 return &handle; 376 return &handle;
389 } 377 }
390 378
391 void
392 purple_cmds_set_ui_ops(PurpleCommandsUiOps *ops)
393 {
394 cmds_ui_ops = ops;
395 }
396
397 PurpleCommandsUiOps *
398 purple_cmds_get_ui_ops(void)
399 {
400 /* It is perfectly acceptable for cmds_ui_ops to be NULL; this just
401 * means that the default libpurple implementation will be used.
402 */
403 return cmds_ui_ops;
404 }
405
406 void purple_cmds_init(void) 379 void purple_cmds_init(void)
407 { 380 {
408 gpointer handle = purple_cmds_get_handle(); 381 gpointer handle = purple_cmds_get_handle();
409 382
410 purple_signal_register(handle, "cmd-added", 383 purple_signal_register(handle, "cmd-added",

mercurial