[ekiga/ds-gsettings3: 1/3] Ported the Call Window and the Main Window to GSettings.
- From: Damien Sandras <dsandras src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ekiga/ds-gsettings3: 1/3] Ported the Call Window and the Main Window to GSettings.
- Date: Mon, 11 Nov 2013 17:33:56 +0000 (UTC)
commit 342191aef0f85c303424c04e1cd931513679c4f7
Author: Damien Sandras <dsandras beip be>
Date: Mon Nov 11 18:06:29 2013 +0100
Ported the Call Window and the Main Window to GSettings.
lib/engine/gui/gtk-frontend/call-window.cpp | 3 +
lib/engine/gui/gtk-frontend/main_window.cpp | 268 +++++++++++++++------------
2 files changed, 149 insertions(+), 122 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/call-window.cpp b/lib/engine/gui/gtk-frontend/call-window.cpp
index efa1c16..344430f 100644
--- a/lib/engine/gui/gtk-frontend/call-window.cpp
+++ b/lib/engine/gui/gtk-frontend/call-window.cpp
@@ -2010,16 +2010,19 @@ ekiga_call_window_init_menu (EkigaCallWindow *cw)
GTK_MENU_RADIO_ENTRY("local_video", _("_Local Video"),
_("Local video image"),
NULL, '1',
+ NULL,
G_CALLBACK (display_changed_cb), cw,
true, false),
GTK_MENU_RADIO_ENTRY("remote_video", _("_Remote Video"),
_("Remote video image"),
NULL, '2',
+ NULL,
G_CALLBACK (display_changed_cb), cw,
false, false),
GTK_MENU_RADIO_ENTRY("both_incrusted", _("_Picture-in-Picture"),
_("Both video images"),
NULL, '3',
+ NULL,
G_CALLBACK (display_changed_cb), cw,
false, false),
GTK_MENU_SEPARATOR,
diff --git a/lib/engine/gui/gtk-frontend/main_window.cpp b/lib/engine/gui/gtk-frontend/main_window.cpp
index c1d297c..b1f3828 100644
--- a/lib/engine/gui/gtk-frontend/main_window.cpp
+++ b/lib/engine/gui/gtk-frontend/main_window.cpp
@@ -39,7 +39,6 @@
#include "ekiga-settings.h"
-#include "gmconf.h"
#include "main_window.h"
#include "dialpad.h"
@@ -146,10 +145,11 @@ struct _EkigaMainWindowPrivate
gulong roster_selection_connection_id;
Ekiga::scoped_connections connections;
- std::list<gpointer> notifiers;
-
- GSettings *sound_events_settings;
- GSettings *video_devices_settings;
+ /* GSettings */
+ boost::shared_ptr<Ekiga::Settings> user_interface_settings;
+ boost::shared_ptr<Ekiga::Settings> sound_events_settings;
+ boost::shared_ptr<Ekiga::Settings> video_devices_settings;
+ boost::shared_ptr<Ekiga::Settings> contacts_settings;
};
/* channel types */
@@ -208,9 +208,9 @@ static void on_chat_unread_alert (GtkWidget*,
* the good value for the radio menu.
* PRE : /
*/
-static void panel_section_changed_nt (gpointer id,
- GmConfEntry *entry,
- gpointer data);
+static void panel_section_setting_changed (GSettings *settings,
+ gchar *key,
+ gpointer data);
/* DESCRIPTION : This callback is called when the preview is changed.
@@ -242,8 +242,12 @@ static void show_widget_cb (GtkWidget * /*widget*/,
* BEHAVIOR : Update the config key accordingly.
* PRE : A valid pointer to the main window GmObject.
*/
-static void panel_section_action_clicked_cb (GtkWidget * /*widget*/,
- gpointer data);
+static void roster_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data);
+static void dialpad_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data);
+static void history_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data);
/* DESCRIPTION : This callback is called when the user toggles the
@@ -451,9 +455,11 @@ url_changed_cb (GtkEditable *e,
static void
show_dialpad_cb (G_GNUC_UNUSED GtkWidget *widget,
- G_GNUC_UNUSED gpointer data)
+ gpointer data)
{
- gm_conf_set_int (USER_INTERFACE_KEY "main_window/panel_section", DIALPAD);
+ EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (data);
+
+ mw->priv->user_interface_settings->set_int ("panel-section", DIALPAD);
}
static void
@@ -671,7 +677,7 @@ on_delayed_hide_call_window_cb (gpointer data)
GtkWidget* call_window = GTK_WIDGET (gtk_frontend->get_call_window ());
if (!mw->priv->current_call
- && !g_settings_get_boolean (mw->priv->video_devices_settings, "enable-preview"))
+ && !mw->priv->video_devices_settings->get_bool ("enable-preview"))
gtk_widget_hide (GTK_WIDGET (call_window));
}
@@ -753,85 +759,75 @@ on_chat_unread_alert (G_GNUC_UNUSED GtkWidget* widget,
EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (self);
g_return_if_fail (mw != NULL);
- if (!g_settings_get_boolean (mw->priv->sound_events_settings, "enable-new-message-sound"))
+ if (!mw->priv->sound_events_settings->get_bool ("enable-new-message-sound"))
return;
- std::string file_name_string = g_settings_get_string (mw->priv->sound_events_settings,
"new-message-sound");
+ std::string file_name_string = mw->priv->sound_events_settings->get_string ("new-message-sound");
if (!file_name_string.empty ())
- mw->priv->audiooutput_core->play_file(file_name_string);
-}
-
-
-static void
-status_icon_clicked_cb (G_GNUC_UNUSED GtkWidget* widget,
- gpointer data)
-{
- GtkWidget *window = GTK_WIDGET (data);
-
- if (!gtk_widget_get_visible (window)
- || (gdk_window_get_state (GDK_WINDOW (gtk_widget_get_window (window))) & GDK_WINDOW_STATE_ICONIFIED)) {
- gtk_widget_show (window);
- }
- else {
-
- if (gtk_window_has_toplevel_focus (GTK_WINDOW (window)))
- gtk_widget_hide (window);
- else
- gtk_window_present (GTK_WINDOW (window));
- }
+ mw->priv->audiooutput_core->play_file (file_name_string);
}
static void
-panel_section_changed_nt (G_GNUC_UNUSED gpointer id,
- GmConfEntry *entry,
- gpointer data)
+panel_section_setting_changed (GSettings *settings,
+ gchar *key,
+ gpointer data)
{
+ EkigaMainWindow* mw = EKIGA_MAIN_WINDOW (data);
+ GtkWidget* menu = NULL;
gint section = 0;
g_return_if_fail (EKIGA_IS_MAIN_WINDOW (data));
- if (gm_conf_entry_get_type (entry) == GM_CONF_INT) {
-
- EkigaMainWindow* mw = EKIGA_MAIN_WINDOW (data);
- GtkWidget* menu = NULL;
- section = gm_conf_entry_get_int (entry);
-
- /* Update notebook section */
- gtk_notebook_set_current_page (GTK_NOTEBOOK (mw->priv->main_notebook), section);
-
- /* Update menu section */
- g_signal_handlers_block_by_func (mw->priv->main_menu,
- (gpointer) radio_menu_changed_cb,
- (gpointer) USER_INTERFACE_KEY "main_window/panel_section");
- menu = gtk_menu_get_widget (mw->priv->main_menu, "dialpad");
- gtk_radio_menu_select_with_widget (menu, section);
- g_signal_handlers_unblock_by_func (mw->priv->main_menu,
- (gpointer) radio_menu_changed_cb,
- (gpointer) USER_INTERFACE_KEY "main_window/panel_section");
-
- /* Update toggle button toolbar */
- for (int i = 0 ; i < NUM_SECTIONS ; i++)
- g_signal_handlers_block_by_func (mw->priv->toggle_buttons[i],
- (gpointer) panel_section_action_clicked_cb,
- GINT_TO_POINTER (i));
- gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[section]), true);
- for (int i = 0 ; i < NUM_SECTIONS ; i++)
- g_signal_handlers_unblock_by_func (mw->priv->toggle_buttons[i],
- (gpointer) panel_section_action_clicked_cb,
- GINT_TO_POINTER (i));
-
- if (section == mw->priv->roster_view_page_number)
- on_roster_selection_changed (mw->priv->roster_view, data);
- else if (section == mw->priv->call_history_page_number)
- on_roster_selection_changed (mw->priv->call_history_view, data);
- else { // we're not on a page where that menu makes sense
-
- menu = gtk_menu_get_widget (mw->priv->main_menu, "contact");
- gtk_widget_set_sensitive (menu, FALSE);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), NULL);
- }
+ section = g_settings_get_int (settings, key);
+
+ /* Update notebook section */
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (mw->priv->main_notebook), section);
+
+ /* Update menu section */
+ g_signal_handlers_block_by_func (mw->priv->main_menu,
+ (gpointer) radio_menu_changed_cb,
+ (gpointer) "panel-section");
+ menu = gtk_menu_get_widget (mw->priv->main_menu, "dialpad");
+ gtk_radio_menu_select_with_widget (menu, section);
+ g_signal_handlers_unblock_by_func (mw->priv->main_menu,
+ (gpointer) radio_menu_changed_cb,
+ (gpointer) "panel-section");
+
+ /* Update toggle button toolbar */
+ // FIXME: I don't like 3 identical functions. But callbacks allow only
+ // one argument and GSettings things require two. g_object_set_data
+ // could be the solution.
+ g_signal_handlers_block_by_func (mw->priv->toggle_buttons[CONTACTS],
+ (gpointer) roster_panel_section_action_clicked_cb,
+ mw);
+ g_signal_handlers_block_by_func (mw->priv->toggle_buttons[DIALPAD],
+ (gpointer) dialpad_panel_section_action_clicked_cb,
+ mw);
+ g_signal_handlers_block_by_func (mw->priv->toggle_buttons[CALL],
+ (gpointer) history_panel_section_action_clicked_cb,
+ mw);
+ gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[section]), true);
+ g_signal_handlers_unblock_by_func (mw->priv->toggle_buttons[CONTACTS],
+ (gpointer) roster_panel_section_action_clicked_cb,
+ mw);
+ g_signal_handlers_unblock_by_func (mw->priv->toggle_buttons[DIALPAD],
+ (gpointer) dialpad_panel_section_action_clicked_cb,
+ mw);
+ g_signal_handlers_unblock_by_func (mw->priv->toggle_buttons[CALL],
+ (gpointer) history_panel_section_action_clicked_cb,
+ mw);
+
+ if (section == mw->priv->roster_view_page_number)
+ on_roster_selection_changed (mw->priv->roster_view, data);
+ else if (section == mw->priv->call_history_page_number)
+ on_roster_selection_changed (mw->priv->call_history_view, data);
+ else { // we're not on a page where that menu makes sense
+
+ menu = gtk_menu_get_widget (mw->priv->main_menu, "contact");
+ gtk_widget_set_sensitive (menu, FALSE);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), NULL);
}
}
@@ -893,10 +889,32 @@ show_widget_cb (GtkWidget * /*widget*/,
static void
-panel_section_action_clicked_cb (GtkWidget * /*widget*/,
- gpointer data)
+roster_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data)
+{
+ EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (data);
+
+ mw->priv->user_interface_settings->set_int ("panel-section", CONTACTS);
+}
+
+
+static void
+dialpad_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data)
+{
+ EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (data);
+
+ mw->priv->user_interface_settings->set_int ("panel-section", DIALPAD);
+}
+
+
+static void
+history_panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+ gpointer data)
{
- gm_conf_set_int (USER_INTERFACE_KEY "main_window/panel_section", GPOINTER_TO_INT (data));
+ EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (data);
+
+ mw->priv->user_interface_settings->set_int ("panel-section", CALL);
}
@@ -904,12 +922,10 @@ static void
video_preview_action_toggled_cb (GtkToggleToolButton *b,
gpointer data)
{
- if (g_settings_get_boolean (EKIGA_MAIN_WINDOW (data)->priv->video_devices_settings,
- "enable-preview")
+ if (EKIGA_MAIN_WINDOW (data)->priv->video_devices_settings->get_bool ("enable-preview")
!= gtk_toggle_tool_button_get_active (b))
- g_settings_set_boolean (EKIGA_MAIN_WINDOW (data)->priv->video_devices_settings,
- "enable-preview",
- gtk_toggle_tool_button_get_active (b));
+ EKIGA_MAIN_WINDOW (data)->priv->video_devices_settings->set_bool ("enable-preview",
+ gtk_toggle_tool_button_get_active (b));
}
@@ -1106,7 +1122,7 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
gtk_tool_item_set_expand (GTK_TOOL_ITEM (mw->priv->preview_button), false);
gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar), GTK_TOOL_ITEM (mw->priv->preview_button), -1);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->preview_button),
- gm_conf_get_bool (VIDEO_DEVICES_KEY "enable_preview"));
+ mw->priv->video_devices_settings->get_bool ("enable-preview"));
gtk_widget_set_tooltip_text (GTK_WIDGET (mw->priv->preview_button),
_("Display images from your camera device"));
g_signal_connect (mw->priv->preview_button, "toggled",
@@ -1118,7 +1134,7 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
GTK_TOOL_ITEM (item), -1);
/* The roster button */
- cps = (PanelSection) gm_conf_get_int (USER_INTERFACE_KEY "main_window/panel_section");
+ cps = (PanelSection) mw->priv->user_interface_settings->get_int ("panel-section");
image = gtk_image_new_from_icon_name ("avatar-default", GTK_ICON_SIZE_MENU);
mw->priv->toggle_buttons[CONTACTS] = gtk_radio_tool_button_new (NULL);
@@ -1128,6 +1144,8 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[CONTACTS]), (cps ==
CONTACTS));
gtk_widget_set_tooltip_text (GTK_WIDGET (mw->priv->toggle_buttons[CONTACTS]),
_("View the contacts list"));
+ g_signal_connect (mw->priv->toggle_buttons[CONTACTS], "clicked",
+ G_CALLBACK (roster_panel_section_action_clicked_cb), mw);
/* The dialpad button */
image = gtk_image_new_from_icon_name ("input-dialpad", GTK_ICON_SIZE_MENU);
@@ -1139,6 +1157,8 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[DIALPAD]), (cps ==
DIALPAD));
gtk_widget_set_tooltip_text (GTK_WIDGET (mw->priv->toggle_buttons[DIALPAD]),
_("View the dialpad"));
+ g_signal_connect (mw->priv->toggle_buttons[DIALPAD], "clicked",
+ G_CALLBACK (dialpad_panel_section_action_clicked_cb), mw);
/* The history button */
image = gtk_image_new_from_icon_name ("document-open-recent", GTK_ICON_SIZE_MENU);
@@ -1150,11 +1170,10 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[CALL]), (cps == CALL));
gtk_widget_set_tooltip_text (GTK_WIDGET (mw->priv->toggle_buttons[CALL]),
_("View the call history"));
+ g_signal_connect (mw->priv->toggle_buttons[CALL], "clicked",
+ G_CALLBACK (history_panel_section_action_clicked_cb), mw);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->toggle_buttons[cps]), true);
- for (int i = 0 ; i < NUM_SECTIONS ; i++)
- g_signal_connect (mw->priv->toggle_buttons[i], "clicked",
- G_CALLBACK (panel_section_action_clicked_cb), GINT_TO_POINTER (i));
}
static void
@@ -1183,10 +1202,9 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
assistant_window = GTK_WIDGET (gtk_frontend->get_assistant_window ());
/* Default values */
- cps = (PanelSection) gm_conf_get_int (USER_INTERFACE_KEY "main_window/panel_section");
- show_offline_contacts = gm_conf_get_bool (CONTACTS_KEY "show_offline_contacts");
- enable_preview = g_settings_get_boolean (mw->priv->video_devices_settings,
- "enable-preview");
+ cps = (PanelSection) mw->priv->user_interface_settings->get_int ("panel-section");
+ show_offline_contacts = mw->priv->contacts_settings->get_bool ("show-offline-contacts");
+ enable_preview = mw->priv->video_devices_settings->get_bool ("enable-preview");
static MenuEntry gnomemeeting_menu [] =
{
@@ -1251,37 +1269,42 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
GTK_MENU_NEW(_("_View")),
- //FIXME GSETTINGS MENU
GTK_MENU_TOGGLE_ENTRY("preview", _("_Video Preview"),
_("Display images from your camera device"),
NULL, 0,
+ mw->priv->video_devices_settings->get_g_settings (),
G_CALLBACK (toggle_menu_changed_cb),
- (gpointer) VIDEO_DEVICES_KEY "enable_preview", enable_preview, TRUE),
+ (gpointer) "enable-preview", enable_preview, TRUE),
GTK_MENU_SEPARATOR,
GTK_MENU_RADIO_ENTRY("contacts", _("Con_tacts"), _("View the contacts list"),
NULL, 0,
+ mw->priv->user_interface_settings->get_g_settings (),
G_CALLBACK (radio_menu_changed_cb),
- (gpointer) USER_INTERFACE_KEY "main_window/panel_section",
+ (gpointer) "panel-section",
(cps == CONTACTS), TRUE),
GTK_MENU_RADIO_ENTRY("dialpad", _("_Dialpad"), _("View the dialpad"),
NULL, 0,
+ mw->priv->user_interface_settings->get_g_settings (),
G_CALLBACK (radio_menu_changed_cb),
- (gpointer) USER_INTERFACE_KEY "main_window/panel_section",
+ (gpointer) "panel-section",
(cps == DIALPAD), TRUE),
GTK_MENU_RADIO_ENTRY("callhistory", _("_Call History"), _("View the call history"),
NULL, 0,
+ mw->priv->user_interface_settings->get_g_settings (),
G_CALLBACK (radio_menu_changed_cb),
- (gpointer) USER_INTERFACE_KEY "main_window/panel_section",
+ (gpointer) "panel-section",
(cps == CALL), TRUE),
GTK_MENU_SEPARATOR,
- GTK_MENU_TOGGLE_ENTRY ("showofflinecontacts", _("Show Offline _Contacts"), _("Show offline contacts"),
+ GTK_MENU_TOGGLE_ENTRY ("showofflinecontacts", _("Show Offline _Contacts"),
+ _("Show offline contacts"),
NULL, 0,
+ mw->priv->contacts_settings->get_g_settings (),
G_CALLBACK (toggle_menu_changed_cb),
- (gpointer) CONTACTS_KEY "show_offline_contacts",
+ (gpointer) "show-offline-contacts",
show_offline_contacts, TRUE),
GTK_MENU_NEW(_("_Help")),
@@ -1449,14 +1472,15 @@ ekiga_main_window_init_gui (EkigaMainWindow *mw)
gtk_widget_show_all (window_vbox);
/* Show the current panel section */
- PanelSection section = (PanelSection) gm_conf_get_int (USER_INTERFACE_KEY "main_window/panel_section");
+ PanelSection section =
+ (PanelSection) mw->priv->user_interface_settings->get_int ("panel-section");
gtk_notebook_set_current_page (GTK_NOTEBOOK (mw->priv->main_notebook), section);
}
static void
ekiga_main_window_init (EkigaMainWindow *mw)
{
- gpointer notifier;
+ gchar *signal_name = NULL;
mw->priv = new EkigaMainWindowPrivate;
@@ -1468,20 +1492,28 @@ ekiga_main_window_init (EkigaMainWindow *mw)
mw->priv->current_call = boost::shared_ptr<Ekiga::Call>();
mw->priv->calling_state = Standby;
- mw->priv->sound_events_settings = g_settings_new (SOUND_EVENTS_SCHEMA);
- mw->priv->video_devices_settings = g_settings_new (VIDEO_DEVICES_SCHEMA);
+ mw->priv->user_interface_settings =
+ boost::shared_ptr<Ekiga::Settings> (new Ekiga::Settings (USER_INTERFACE ".main-window"));
+ mw->priv->sound_events_settings =
+ boost::shared_ptr<Ekiga::Settings> (new Ekiga::Settings (SOUND_EVENTS_SCHEMA));
+ mw->priv->video_devices_settings =
+ boost::shared_ptr<Ekiga::Settings> (new Ekiga::Settings (VIDEO_DEVICES_SCHEMA));
+ mw->priv->contacts_settings =
+ boost::shared_ptr<Ekiga::Settings> (new Ekiga::Settings (CONTACTS_SCHEMA));
for (int i = 0 ; i < NUM_SECTIONS ; i++)
mw->priv->toggle_buttons[i] = NULL;
- /* GConf Notifiers */
- notifier =
- gm_conf_notifier_add (USER_INTERFACE_KEY "main_window/panel_section",
- panel_section_changed_nt, mw);
- mw->priv->notifiers.push_front (notifier);
+ /* Update the widget when the user changes the configuration */
+ signal_name = g_strdup_printf ("changed::%s", "panel-section");
+ g_signal_connect (mw->priv->user_interface_settings->get_g_settings (),
+ signal_name,
+ G_CALLBACK (panel_section_setting_changed), mw);
+ g_free (signal_name);
- g_signal_connect (mw->priv->video_devices_settings, "changed::enable-preview",
+ g_signal_connect (mw->priv->video_devices_settings->get_g_settings (),
+ "changed::enable-preview",
G_CALLBACK (video_preview_changed), mw);
}
@@ -1503,12 +1535,6 @@ ekiga_main_window_dispose (GObject* gobject)
{
EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (gobject);
- for (std::list<gpointer>::iterator iter = mw->priv->notifiers.begin ();
- iter != mw->priv->notifiers.end ();
- ++iter)
- gm_conf_notifier_remove (*iter);
- mw->priv->notifiers.clear (); // dispose might be called several times
-
if (mw->priv->roster_view) {
g_signal_handler_disconnect (mw->priv->roster_view,
@@ -1517,9 +1543,6 @@ ekiga_main_window_dispose (GObject* gobject)
mw->priv->roster_view = NULL;
}
- g_clear_object (&mw->priv->sound_events_settings);
- g_clear_object (&mw->priv->video_devices_settings);
-
G_OBJECT_CLASS (ekiga_main_window_parent_class)->dispose (gobject);
}
@@ -1645,6 +1668,7 @@ gm_main_window_new (Ekiga::ServiceCore & core)
// FIXME: what does it do inside the main window if it's all about
// FIXME: the chat window and the audio output core!?
+ // FIXME: I don't like this either (damien).
/* initialize the callback to play IM message sound */
boost::shared_ptr<GtkFrontend> gtk_frontend = mw->priv->gtk_frontend.lock ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]