pidgin/pidginpluginsmenu.c

Thu, 23 Mar 2023 23:11:59 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Thu, 23 Mar 2023 23:11:59 -0500
changeset 42184
4e1bf25f5575
parent 42103
33ed4a2a7593
child 42575
580339aa47cc
permissions
-rw-r--r--

Fix several leaks in tests

All of these are specific to tests, not the library code.

For the moment, `protocol_xfer` still leaks connections (and anything they hold on to) because it is very difficult to disentangle them from the connection manager in the partially implemented state they are in.

This fixes leaks of options in the account option test (these two leaks occur for every test since they all leak the option):
```
61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 133 of 276
at 0x4848464: calloc (vg_replace_malloc.c:1340)
by 0x49F75F0: g_malloc0 (gmem.c:163)
by 0x48C3B2E: purple_account_option_new (purpleaccountoption.c:78)
by 0x4014AF: test_purple_account_option_copy_int (test_account_option.c:67)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401721: main (test_account_option.c:157)

61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 134 of 276
at 0x4848464: calloc (vg_replace_malloc.c:1340)
by 0x49F75F0: g_malloc0 (gmem.c:163)
by 0x48C3BC7: purple_account_option_copy (purpleaccountoption.c:93)
by 0x4014BF: test_purple_account_option_copy_int (test_account_option.c:68)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401721: main (test_account_option.c:157)
```
leaks in the credential manager test (times 3 for read/write/cancel tests):
```
69 (16 direct, 53 indirect) bytes in 1 blocks are definitely lost in loss record 2,427 of 3,503
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x4A58168: g_malloc (gmem.c:130)
by 0x4A6FAB5: g_slice_alloc (gslice.c:1074)
by 0x4A700EC: g_slice_alloc0 (gslice.c:1100)
by 0x4A3BECB: g_error_allocate (gerror.c:710)
by 0x4A3C93F: UnknownInlinedFun (gerror.c:724)
by 0x4A3C93F: g_error_new_valist (gerror.c:766)
by 0x4BEE558: g_task_return_new_error (gtask.c:1941)
by 0x48D82C0: purple_credential_manager_read_password_async (purplecredentialmanager.c:492)
by 0x403634: test_purple_credential_manager_no_provider_read_password_idle (test_credential_manager.c:329)
by 0x4A4ECB1: g_idle_dispatch (gmain.c:6124)
by 0x4A4FCBE: UnknownInlinedFun (gmain.c:3444)
by 0x4A4FCBE: g_main_context_dispatch (gmain.c:4162)
by 0x4AA5597: g_main_context_iterate.constprop.0 (gmain.c:4238)
by 0x4A4F28E: g_main_loop_run (gmain.c:4438)
by 0x40369F: test_purple_credential_manager_no_provider_read_password_async (test_credential_manager.c:345)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x4048F6: main (test_credential_manager.c:695)
```
a leak in the image test:
```
161 bytes in 1 blocks are definitely lost in loss record 260 of 274
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x4A55363: g_try_malloc (gmem.c:286)
by 0x4A3D630: UnknownInlinedFun (gfileutils.c:819)
by 0x4A3D630: UnknownInlinedFun (gfileutils.c:924)
by 0x4A3D630: g_file_get_contents (gfileutils.c:1027)
by 0x401890: test_image_new_from_file (test_image.c:144)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x40195D: main (test_image.c:172)
```
a leak in queued output stream test:
```
72 (40 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 219 of 396
at 0x49D51EF: g_type_create_instance (gtype.c:1909)
by 0x49BAC1F: g_object_new_internal (gobject.c:2228)
by 0x49BC247: g_object_new_with_properties (gobject.c:2391)
by 0x49BCFF0: g_object_new (gobject.c:2037)
by 0x402003: test_queued_output_stream_push_bytes_async_error (test_queued_output_stream.c:219)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x402429: main (test_queued_output_stream.c:280)
```
and protocol xfer tests (times 3 for each test that creates a test protocol object):
```
112 (48 direct, 64 indirect) bytes in 1 blocks are definitely lost in loss record 3,430 of 3,698
at 0x49D51EF: g_type_create_instance (gtype.c:1909)
by 0x49BAC1F: g_object_new_internal (gobject.c:2228)
by 0x49BC247: g_object_new_with_properties (gobject.c:2391)
by 0x49BCFF0: g_object_new (gobject.c:2037)
by 0x40291C: test_purple_protocol_xfer_send_file_func (test_protocol_xfer.c:146)
by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A7E181: g_test_run_suite (gtestutils.c:3115)
by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A766EC: g_test_run (gtestutils.c:2221)
by 0x402B64: main (test_protocol_xfer.c:195)
```
and util tests (times 3 for each call to `purple_text_strip_mnemonic` in the test):
```
5 bytes in 1 blocks are definitely lost in loss record 5 of 247
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x49F7168: g_malloc (gmem.c:130)
by 0x491975B: purple_text_strip_mnemonic (util.c:895)
by 0x4015B0: test_util_text_strip_mnemonic (test_util.c:49)
by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933)
by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038)
by 0x4A1D181: g_test_run_suite (gtestutils.c:3115)
by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234)
by 0x4A156EC: g_test_run (gtestutils.c:2221)
by 0x401901: main (test_util.c:224)
```
and these leaks in any test that initializes the test UI:
```
4,104 bytes in 1 blocks are possibly lost in loss record 3,451 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5249A8B: UnknownInlinedFun (sqlite3.c:53675)
by 0x5249A8B: allocateTempSpace (sqlite3.c:70848)
by 0x52625A6: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93857)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x529B324: sqlite3_exec (sqlite3.c:131002)
by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37)
by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)

4,368 bytes in 1 blocks are possibly lost in loss record 3,453 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5240077: UnknownInlinedFun (sqlite3.c:53634)
by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104)
by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671)
by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628)
by 0x524A510: UnknownInlinedFun (sqlite3.c:60805)
by 0x524A510: btreeGetPage.lto_priv.0 (sqlite3.c:70289)
by 0x524C2F6: UnknownInlinedFun (sqlite3.c:71257)
by 0x524C2F6: sqlite3BtreeBeginTrans.lto_priv.0 (sqlite3.c:71647)
by 0x5266B3A: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93532)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x48FD715: purple_sqlite3_get_schema_version (purplesqlite3.c:79)
by 0x48FD9DD: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:146)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)

4,368 bytes in 1 blocks are possibly lost in loss record 3,454 of 3,457
at 0x484386F: malloc (vg_replace_malloc.c:393)
by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29181)
by 0x5232797: UnknownInlinedFun (sqlite3.c:29227)
by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221)
by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546)
by 0x5240077: UnknownInlinedFun (sqlite3.c:53634)
by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104)
by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671)
by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628)
by 0x52499BC: UnknownInlinedFun (sqlite3.c:60805)
by 0x52499BC: UnknownInlinedFun (sqlite3.c:70289)
by 0x52499BC: btreeGetUnusedPage (sqlite3.c:70432)
by 0x524F504: allocateBtreePage.lto_priv.0 (sqlite3.c:74604)
by 0x5256209: btreeCreateTable.lto_priv.0 (sqlite3.c:77830)
by 0x5265EB2: UnknownInlinedFun (sqlite3.c:77849)
by 0x5265EB2: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:96382)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995)
by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056)
by 0x525CBEE: sqlite3_step (sqlite3.c:88045)
by 0x529B324: sqlite3_exec (sqlite3.c:131002)
by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37)
by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195)
by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69)
by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287)
by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181)
by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308)
by 0x402BA8: test_ui_init_history (test_ui.c:132)
by 0x402C80: test_ui_purple_init (test_ui.c:167)
by 0x4027BB: main (test_contact.c:88)
```

Testing Done:
Ran tests in valgrind, and all above leaks were gone except for noted `protocol_xfer` issues, and a bunch of leaks of the `PurpleBuddy`-`PurpleContact` compatibility bindings, which will go away in their entirety eventually.

Reviewed at https://reviews.imfreedom.org/r/2385/

40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
2 * Pidgin - Internet Messenger
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Pidgin is the legal property of its developers, whose names are too numerous
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include "pidginpluginsmenu.h"
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
25 #include "pidginapplication.h"
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
26
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include <gplugin.h>
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 #include <purple.h>
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 struct _PidginPluginsMenu {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
32 GMenuModel parent;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
34 GQueue *plugins;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 };
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
37 G_DEFINE_TYPE(PidginPluginsMenu, pidgin_plugins_menu, G_TYPE_MENU_MODEL)
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 /******************************************************************************
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 * Helpers
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 *****************************************************************************/
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 static void
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
43 pidgin_plugins_menu_add_item(gpointer data, gpointer user_data) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
44 PidginPluginsMenu *menu = user_data;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
45 GPluginPlugin *plugin = data;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
46 GPluginPluginInfo *info = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
47
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
48 info = gplugin_plugin_get_info(plugin);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
49 if(PURPLE_IS_PLUGIN_INFO(info)) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
50 GActionGroup *group = NULL;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
52 group = purple_plugin_info_get_action_group(PURPLE_PLUGIN_INFO(info));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
53 if(G_IS_ACTION_GROUP(group)) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
54 GApplication *application = g_application_get_default();
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
55 const gchar *prefix;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
56
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
57 prefix = gplugin_plugin_info_get_id(info);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
58 pidgin_application_add_action_group(PIDGIN_APPLICATION(application),
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
59 prefix, group);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
60 g_object_unref(group);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
61
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
62 g_queue_push_tail(menu->plugins, g_object_ref(plugin));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
63 }
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 }
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
65
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
66 g_clear_object(&info);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 }
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 static void
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
70 pidgin_plugins_menu_refresh(PidginPluginsMenu *menu) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
71 GPluginManager *manager = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
72 GSList *loaded = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
73 gint removed = 0, added = 0;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
75 removed = g_queue_get_length(menu->plugins);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
76 g_queue_clear_full(menu->plugins, g_object_unref);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
78 manager = gplugin_manager_get_default();
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
79 loaded = gplugin_manager_find_plugins_with_state(manager,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
80 GPLUGIN_PLUGIN_STATE_LOADED);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
82 g_slist_foreach(loaded, pidgin_plugins_menu_add_item, menu);
41447
bb457ce5ad5e Fix a leak in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41414
diff changeset
83 g_slist_free_full(loaded, g_object_unref);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
85 added = g_queue_get_length(menu->plugins);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
87 /* Tell our listeners that our menu has changed. */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
88 g_menu_model_items_changed(G_MENU_MODEL(menu), 0, removed, added);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 }
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 /******************************************************************************
40896
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
92 * Callbacks
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 *****************************************************************************/
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 static void
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
95 pidgin_plugins_menu_plugin_loaded_cb(G_GNUC_UNUSED GObject *manager,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
96 G_GNUC_UNUSED GPluginPlugin *plugin,
40896
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
97 gpointer data)
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
98 {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
99 pidgin_plugins_menu_refresh(PIDGIN_PLUGINS_MENU(data));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
100 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
101
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
102 static void
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
103 pidgin_plugins_menu_plugin_unloaded_cb(G_GNUC_UNUSED GObject *manager,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
104 GPluginPlugin *plugin,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
105 gpointer data)
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
106 {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
107 GApplication *application = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
108 GPluginPluginInfo *info = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
109 const gchar *prefix;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
110
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
111 /* Remove the action group that the plugin added. */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
112 info = gplugin_plugin_get_info(plugin);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
113 if(GPLUGIN_IS_PLUGIN_INFO(info)) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
114 prefix = gplugin_plugin_info_get_id(info);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
115
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
116 if(prefix != NULL) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
117 application = g_application_get_default();
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
118 pidgin_application_add_action_group(PIDGIN_APPLICATION(application),
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
119 prefix, NULL);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
120 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
121 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
122
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
123 /* Refresh the list */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
124 pidgin_plugins_menu_refresh(PIDGIN_PLUGINS_MENU(data));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
125 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
126
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
127 /******************************************************************************
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
128 * GMenuModel Implementation
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
129 *****************************************************************************/
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
130 static gboolean
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41909
diff changeset
131 pidgin_plugins_menu_is_mutable(G_GNUC_UNUSED GMenuModel *model) {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
132 return TRUE;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
133 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
134
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
135 static gint
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
136 pidgin_plugins_menu_get_n_items(GMenuModel *model) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
137 PidginPluginsMenu *menu = PIDGIN_PLUGINS_MENU(model);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
138
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
139 return g_queue_get_length(menu->plugins);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 }
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 static void
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
143 pidgin_plugins_menu_get_item_attributes(GMenuModel *model, gint index,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
144 GHashTable **attributes)
40896
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
145 {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
146 PidginPluginsMenu *menu = PIDGIN_PLUGINS_MENU(model);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
147 GPluginPlugin *plugin = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
148 GPluginPluginInfo *info = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
149 GVariant *value = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
150
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
151 /* Create our hash table of attributes to return. */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
152 *attributes = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
153 (GDestroyNotify)g_variant_unref);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
154
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
155 /* Get the plugin the caller is interested in. */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
156 plugin = g_queue_peek_nth(menu->plugins, index);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
157 if(plugin == NULL) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
158 return;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
159 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
160
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
161 /* Grab the plugin info and set the label attribute to the name of the
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
162 * plugin and set the action name space to the plugin's id.
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
163 */
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
164 info = gplugin_plugin_get_info(plugin);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
165 value = g_variant_new_string(gplugin_plugin_info_get_name(info));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
166 g_hash_table_insert(*attributes, G_MENU_ATTRIBUTE_LABEL,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
167 g_variant_ref_sink(value));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
168
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
169 g_object_unref(info);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
170 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
171
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
172 static void
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
173 pidgin_plugins_menu_get_item_links(GMenuModel *model, gint index,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
174 GHashTable **links)
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
175 {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
176 PidginPluginsMenu *menu = PIDGIN_PLUGINS_MENU(model);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
177 PurplePluginInfo *purple_info = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
178 GPluginPlugin *plugin = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
179 GPluginPluginInfo *info = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
180 GMenuModel *actions_model = NULL;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
181
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
182 *links = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
183 g_object_unref);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
184
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
185 plugin = g_queue_peek_nth(menu->plugins, index);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
186 if(!GPLUGIN_IS_PLUGIN(plugin)) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
187 return;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
188 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
189
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
190 info = gplugin_plugin_get_info(plugin);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
191 purple_info = PURPLE_PLUGIN_INFO(info);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
192
41909
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
193 /* We need to use a section for the ACTION_NAMESPACE attribute to work, so
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
194 * create a menu, and add a new section item to it with the menu from the
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
195 * plugin, then set the ACTION_NAMESPACE attribute. Finally return the menu
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
196 * as the submenu.
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
197 */
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
198 actions_model = purple_plugin_info_get_action_menu(purple_info);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
199 if(G_IS_MENU_MODEL(actions_model)) {
41909
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
200 GMenu *menu = NULL;
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
201 GMenuItem *section = NULL;
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
202
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
203 menu = g_menu_new();
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
204 section = g_menu_item_new_section(NULL, actions_model);
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
205 g_menu_item_set_attribute(section, G_MENU_ATTRIBUTE_ACTION_NAMESPACE,
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
206 "s", gplugin_plugin_info_get_id(info));
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
207 g_menu_append_item(menu, section);
42103
33ed4a2a7593 Fix leaks in dynamic menus
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41947
diff changeset
208 g_object_unref(section);
41909
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
209
55aaac83f315 Fix actions in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 41447
diff changeset
210 g_hash_table_insert(*links, G_MENU_LINK_SUBMENU, menu);
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
211 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
212
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
213 g_object_unref(info);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214 }
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 /******************************************************************************
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 * GObject Implementation
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 *****************************************************************************/
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
219 static void
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
220 pidgin_plugins_menu_finalize(GObject *obj) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
221 PidginPluginsMenu *menu = PIDGIN_PLUGINS_MENU(obj);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
222
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
223 g_queue_free_full(menu->plugins, g_object_unref);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
224
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
225 G_OBJECT_CLASS(pidgin_plugins_menu_parent_class)->finalize(obj);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
226 }
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
227
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
228 static void
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
229 pidgin_plugins_menu_constructed(GObject *obj) {
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
230 G_OBJECT_CLASS(pidgin_plugins_menu_parent_class)->constructed(obj);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
231
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
232 pidgin_plugins_menu_refresh(PIDGIN_PLUGINS_MENU(obj));
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
233 }
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 static void
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 pidgin_plugins_menu_init(PidginPluginsMenu *menu) {
40978
2cb285cacbfd Fix warnings about changing types on assignment.
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40896
diff changeset
237 GPluginManager *manager = NULL;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
239 menu->plugins = g_queue_new();
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240
40896
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
241 /* Connect to the plugin manager's signals so we can stay up to date. */
41008
dc06703548a1 Update everything for GPlugin 0.33.0
Gary Kramlich <grim@reaperworld.com>
parents: 40978
diff changeset
242 manager = gplugin_manager_get_default();
40896
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
243
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
244 g_signal_connect_object(manager, "loaded-plugin",
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
245 G_CALLBACK(pidgin_plugins_menu_plugin_loaded_cb),
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
246 menu, 0);
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
247 g_signal_connect_object(manager, "unloaded-plugin",
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
248 G_CALLBACK(pidgin_plugins_menu_plugin_unloaded_cb),
031172d26bef Use GPluginManager directly in PidginPluginsMenu
Gary Kramlich <grim@reaperworld.com>
parents: 40888
diff changeset
249 menu, 0);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
250 };
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
251
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
252 static void
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253 pidgin_plugins_menu_class_init(PidginPluginsMenuClass *klass) {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
254 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
255 GMenuModelClass *model_class = G_MENU_MODEL_CLASS(klass);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
257 obj_class->finalize = pidgin_plugins_menu_finalize;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
258 obj_class->constructed = pidgin_plugins_menu_constructed;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
260 model_class->is_mutable = pidgin_plugins_menu_is_mutable;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
261 model_class->get_n_items = pidgin_plugins_menu_get_n_items;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
262 model_class->get_item_attributes = pidgin_plugins_menu_get_item_attributes;
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
263 model_class->get_item_links = pidgin_plugins_menu_get_item_links;
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 }
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 /******************************************************************************
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 * Public API
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 *****************************************************************************/
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
269 GMenuModel *
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 pidgin_plugins_menu_new(void) {
41414
b76bc2b4d7cc Convert plugin actions to GMenu and GAction
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
271 return g_object_new(PIDGIN_TYPE_PLUGINS_MENU, NULL);
40373
5d2a493339f2 Add the new PidginPluginsMenu which manages itself when plugins and loaded/unloaded.
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
272 }

mercurial