| 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", |