pidgin/pidginkeypad.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 41559
37ccc27ceeae
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/

41478
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
1 /*
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
2 * Pidgin - Internet Messenger
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
4 *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
5 * Pidgin is the legal property of its developers, whose names are too numerous
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
7 * source distribution.
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
8 *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
12 * (at your option) any later version.
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
13 *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
17 * GNU General Public License for more details.
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
18 *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
21 */
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
22
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
23 #include <glib/gi18n-lib.h>
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
24
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
25 #include "pidginkeypad.h"
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
26
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
27 struct _PidginKeypad {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
28 GtkGrid parent;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
29 };
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
30
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
31 enum {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
32 SIG_PRESSED,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
33 N_SIGNALS
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
34 };
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
35 static guint signals[N_SIGNALS] = {0, };
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
36
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
37 /******************************************************************************
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
38 * Callbacks
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
39 *****************************************************************************/
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
40 static void
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
41 pidgin_keypad_action_activate(G_GNUC_UNUSED GSimpleAction *action,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
42 GVariant *parameter,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
43 gpointer data)
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
44 {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
45 PidginKeypad *keypad = PIDGIN_KEYPAD(data);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
46 gint32 num = 0;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
47
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
48 if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_INT32)) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
49 g_critical("PidginKeypad dtmf action parameter is of incorrect type %s",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
50 g_variant_get_type_string(parameter));
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
51 return;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
52 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
53
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
54 num = g_variant_get_int32(parameter);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
55
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
56 g_signal_emit(keypad, signals[SIG_PRESSED], 0, num);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
57 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
58
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
59 static gboolean
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
60 pidgin_keypad_key_pressed_cb(G_GNUC_UNUSED GtkEventControllerKey *controller,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
61 guint keyval,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
62 G_GNUC_UNUSED guint keycode,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
63 G_GNUC_UNUSED GdkModifierType state,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
64 gpointer data)
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
65 {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
66 PidginKeypad *keypad = PIDGIN_KEYPAD(data);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
67
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
68 if(GDK_KEY_KP_0 <= keyval && keyval <= GDK_KEY_KP_9) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
69 /* Normalize to the same ASCII numbers. */
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
70 keyval = (keyval - GDK_KEY_KP_0) + GDK_KEY_0;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
71 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
72
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
73 if((GDK_KEY_0 <= keyval && keyval <= GDK_KEY_9) ||
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
74 keyval == GDK_KEY_asterisk ||
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
75 keyval == GDK_KEY_numbersign) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
76
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
77 g_signal_emit(keypad, signals[SIG_PRESSED], 0, keyval);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
78 return TRUE;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
79 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
80
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
81 return FALSE;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
82 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
83
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
84 /******************************************************************************
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
85 * GObject Implementation
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
86 *****************************************************************************/
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
87 G_DEFINE_TYPE(PidginKeypad, pidgin_keypad, GTK_TYPE_GRID)
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
88
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
89 static void
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
90 pidgin_keypad_init(PidginKeypad *keypad) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
91 GtkWidget *widget = GTK_WIDGET(keypad);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
92 GSimpleActionGroup *action_group = NULL;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
93 GActionEntry actions[] = {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
94 {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
95 .name = "dtmf",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
96 .activate = pidgin_keypad_action_activate,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
97 .parameter_type = "i",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
98 },
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
99 };
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
100
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
101 gtk_widget_init_template(widget);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
102
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
103 action_group = g_simple_action_group_new();
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
104 g_action_map_add_action_entries(G_ACTION_MAP(action_group),
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
105 actions, G_N_ELEMENTS(actions), keypad);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
106 gtk_widget_insert_action_group(widget, "keypad",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
107 G_ACTION_GROUP(action_group));
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
108 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
109
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
110 static void
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
111 pidgin_keypad_class_init(PidginKeypadClass *klass) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
112 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
113
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
114 /**
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
115 * PidginKeypad::pressed:
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
116 * @keypad: The #PidginKeypad.
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
117 * @key: The key that was pressed, [const@Gdk.KEY_0] - [const@Gdk.KEY_9],
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
118 * [const@Gdk.KEY_asterisk], or [const@Gdk.KEY_numbersign].
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
119 *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
120 * Emitted when a key is pressed (by keyboard or from clicking a button).
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
121 */
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
122 signals[SIG_PRESSED] = g_signal_new("pressed",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
123 G_TYPE_FROM_CLASS(klass),
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
124 0, 0, NULL, NULL, NULL, G_TYPE_NONE,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
125 1, G_TYPE_UINT);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
126
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
127 gtk_widget_class_set_template_from_resource(widget_class,
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
128 "/im/pidgin/Pidgin3/Keypad/keypad.ui");
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
129 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
130
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
131 /******************************************************************************
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
132 * API
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
133 *****************************************************************************/
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
134 GtkWidget *
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
135 pidgin_keypad_new(void) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
136 return g_object_new(PIDGIN_TYPE_KEYPAD, NULL);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
137 }
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
138
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
139 void
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
140 pidgin_keypad_set_key_capture_widget(PidginKeypad *keypad, GtkWidget *widget) {
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
141 GtkEventController *controller = NULL;
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
142
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
143 g_return_if_fail(PIDGIN_IS_KEYPAD(keypad));
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
144 g_return_if_fail(GTK_IS_WIDGET(widget));
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
145
41559
37ccc27ceeae Port PidginKeypad to GTK4
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41478
diff changeset
146 controller = gtk_event_controller_key_new();
41478
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
147 gtk_event_controller_set_propagation_phase(controller, GTK_PHASE_CAPTURE);
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
148 g_signal_connect(controller, "key-pressed",
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
149 G_CALLBACK(pidgin_keypad_key_pressed_cb), keypad);
41559
37ccc27ceeae Port PidginKeypad to GTK4
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41478
diff changeset
150 gtk_widget_add_controller(widget, controller);
41478
27d70d93355d Split keypad into its own widget
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
diff changeset
151 }

mercurial