pidgin/pidgin

Split keypad into its own widget

22 months ago, Elliott Sales de Andrade
27d70d93355d
Split keypad into its own widget

Testing Done:
Temporarily added a `GtkMenuButton` with a `GtkPopover` containing this widget to the media window, so I could check the buttons. Not sure that it totally works in the final window as I didn't start a real media session.

```
diff --git a/pidgin/gtkmedia.c b/pidgin/gtkmedia.c
--- a/pidgin/gtkmedia.c
+++ b/pidgin/gtkmedia.c
@@ -261,6 +261,14 @@
}

static void
+pidgin_media_dtmf_key_pressed_debug_cb(G_GNUC_UNUSED PidginKeypad *keypad,
+ gchar num,
+ G_GNUC_UNUSED gpointer data)
+{
+ g_message("DTMF key pressed! %c", num);
+}
+
+static void
pidgin_media_init (PidginMedia *media)
{
GtkWidget *vbox;
@@ -289,6 +297,27 @@
gtk_box_pack_start(GTK_BOX(vbox), media->priv->display, TRUE, TRUE, 6);
gtk_widget_show(vbox);

+ {
+ GtkWidget *button = NULL;
+ GtkWidget *keypad = NULL;
+ GtkWidget *popover = NULL;
+
+ button = gtk_menu_button_new();
+ popover = gtk_popover_new(button);
+ gtk_menu_button_set_popover(GTK_MENU_BUTTON(button), popover);
+
+ keypad = pidgin_keypad_new();
+ pidgin_keypad_set_key_capture_widget(PIDGIN_KEYPAD(keypad),
+ GTK_WIDGET(media));
+ g_signal_connect(keypad, "pressed",
+ G_CALLBACK(pidgin_media_dtmf_key_pressed_debug_cb),
+ NULL);
+ gtk_container_add(GTK_CONTAINER(popover), keypad);
+
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
+ gtk_widget_show(button);
+ }
+
g_signal_connect(G_OBJECT(media), "delete-event",
G_CALLBACK(pidgin_media_delete_event_cb), media);

```

Reviewed at https://reviews.imfreedom.org/r/1565/
/*
* Purple - Internet Messaging Library
* Copyright (C) Pidgin Developers <devel@pidgin.im>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, see <https://www.gnu.org/licenses/>.
*/
#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
# error "only <purple.h> may be included directly"
#endif
#ifndef PURPLE_ROOMLIST_ROOM_H
#define PURPLE_ROOMLIST_ROOM_H
#include <glib.h>
#include <glib-object.h>
G_BEGIN_DECLS
#define PURPLE_TYPE_ROOMLIST_ROOM (purple_roomlist_room_get_type())
/**
* purple_roomlist_room_get_type:
*
* Gets the #GType of #PurpleRoomlistRoom.
*
* Returns: The #GType of #PurpleRoomlistRoom.
*
* Since: 3.0.0
*/
/**
* PurpleRoomlistRoom:
*
* #PurpleRoomlistRoom keeps track of all #PurpleConversation's inside
* of libpurple and allows searching of them.
*
* Since: 3.0.0
*/
G_DECLARE_DERIVABLE_TYPE(PurpleRoomlistRoom, purple_roomlist_room, PURPLE,
ROOMLIST_ROOM, GObject)
struct _PurpleRoomlistRoomClass {
/*< private >*/
GObjectClass parent;
gpointer reserved[4];
};
/**
* purple_roomlist_room_new:
* @name: The name for the room.
* @description: The description or topic of the room.
*
* Creates a new room to be added to a [class@Purple.Roomlist].
*
* Since: 3.0.0
*/
PurpleRoomlistRoom *purple_roomlist_room_new(const gchar *name, const gchar *description);
/**
* purple_roomlist_room_get_name:
* @room: The instance.
*
* Gets the name of @room.
*
* Returns: The name of @room.
*
* Since: 3.0.0
*/
const gchar *purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
/**
* purple_roomlist_room_get_description:
* @room: The instance.
*
* Gets the description of @room.
*
* Returns: The description of @room.
*
* Since: 3.0.0
*/
const gchar *purple_roomlist_room_get_description(PurpleRoomlistRoom *room);
/**
* purple_roomlist_get_category:
* @room: The instance.
*
* Gets the category of @room. It is up to the user interface on whether or not
* this will be used.
*
* Returns: The category of @room if set otherwise %NULL.
*
* Since: 3.0.0
*/
const gchar *purple_roomlist_room_get_category(PurpleRoomlistRoom *room);
/**
* purple_roomlist_room_set_category:
* @room: The instance.
* @category: (nullable): The new category.
*
* Sets the category of @room.
*
* Since: 3.0.0
*/
void purple_roomlist_room_set_category(PurpleRoomlistRoom *room, const gchar *category);
/**
* purple_roomlist_room_get_user_count:
* @room: The instance.
*
* Gets the number of users in @room.
*
* Returns: The number of users in @room if set, otherwise 0.
*
* Since: 3.0.0
*/
const guint purple_roomlist_room_get_user_count(PurpleRoomlistRoom *room);
/**
* purple_roomlist_room_set_user_count:
* @room: The instance.
* @user_count: The new user count.
*
* Sets the user count of @room to @user_count.
*
* Since: 3.0.0
*/
void purple_roomlist_room_set_user_count(PurpleRoomlistRoom *room, guint user_count);
/**
* purple_roomlist_room_add_field:
* @room: This instance.
* @field: The name of the field. This should be a static string.
* @value: The value of the field. This should be a copy of the value.
*
* Adds a new field to @room with the name of @field and value of @value.
*
* Since: 3.0.0
*/
void purple_roomlist_room_add_field(PurpleRoomlistRoom *room, const gchar *field, const gchar *value);
/**
* purple_roomlist_room_get_field:
* @room: The instance.
* @field: The name of the field to get.
*
* Gets the value of the field named @field in @room.
*
* Returns: The value of @field.
*
* Since: 3.0.0
*/
const gchar *purple_roomlist_room_get_field(PurpleRoomlistRoom *room, const gchar *field);
/**
* purple_roomlist_room_get_components:
* @room: The instance.
*
* Gets the components that can be passed to purple_serv_join_chat() to join
* the room.
*
* Returns: (transfer none): The components used to join the room.
*
* Since: 3.0.0
*/
GHashTable *purple_roomlist_room_get_components(PurpleRoomlistRoom *room);
G_END_DECLS
#endif /* PURPLE_ROOMLIST_ROOM_H */