static void status_menu_custom_messages_changed (gpointer /*id*/, GmConfEntry *entry, gpointer self) { std::string key = gm_conf_entry_get_key (entry); GSList *current = gm_conf_entry_get_list (entry); GSList *custom_status_array [NUM_STATUS_TYPES]; for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { if (key == status_types_keys [i]) custom_status_array [i] = current; else custom_status_array [i] = gm_conf_get_string_list (status_types_keys [i]); } status_menu_populate (STATUS_MENU (self), custom_status_array); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { g_slist_foreach (custom_status_array [i], (GFunc) g_free, NULL); g_slist_free (custom_status_array [i]); } }
static void status_menu_custom_messages_changed (G_GNUC_UNUSED GSettings *settings, gchar *_key, StatusMenu *self) { std::string key = _key; GSList *current = self->priv->personal_data_settings->get_slist (_key); GSList *custom_status_array [NUM_STATUS_TYPES]; for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { if (key == status_types_keys [i]) custom_status_array [i] = current; else custom_status_array [i] = self->priv->personal_data_settings->get_slist (status_types_keys [i]); } status_menu_populate (STATUS_MENU (self), custom_status_array); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { g_slist_foreach (custom_status_array [i], (GFunc) g_free, NULL); g_slist_free (custom_status_array [i]); } }
GtkWidget * status_menu_new (Ekiga::ServiceCore & core) { StatusMenu *self = NULL; GtkCellRenderer *renderer = NULL; GSList *custom_status_array [NUM_STATUS_TYPES]; self = (StatusMenu *) g_object_new (STATUS_MENU_TYPE, NULL); self->priv = new StatusMenuPrivate (); self->priv->personal_details = core.get<Ekiga::PersonalDetails> ("personal-details"); self->priv->personal_data_settings = boost::shared_ptr<Ekiga::Settings> (new Ekiga::Settings (PERSONAL_DATA_SCHEMA)); self->priv->parent = NULL; self->priv->list_store = gtk_list_store_new (NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->priv->list_store)); g_object_unref (self->priv->list_store); renderer = gtk_cell_renderer_pixbuf_new (); g_object_set (renderer, "yalign", 0.5, "xpad", 5, NULL); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), renderer, FALSE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (self), renderer, "pixbuf", COL_ICON, NULL); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), renderer, FALSE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (self), renderer, "text", COL_MESSAGE, NULL); g_object_set (renderer, "width", 130, "ellipsize-set", true, "ellipsize", PANGO_ELLIPSIZE_END, NULL); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) custom_status_array [i] = self->priv->personal_data_settings->get_slist (status_types_keys [i]); status_menu_populate (self, custom_status_array); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { g_slist_foreach (custom_status_array [i], (GFunc) g_free, 0); g_slist_free (custom_status_array [i]); } gtk_combo_box_set_active (GTK_COMBO_BOX (self), 0); gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (self), (GtkTreeViewRowSeparatorFunc) status_menu_row_is_separator, NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (self), 0); status_menu_set_option (self, self->priv->personal_details->get_presence (), self->priv->personal_details->get_status ()); g_signal_connect (self, "changed", G_CALLBACK (status_menu_option_changed), self); g_signal_connect (self->priv->personal_data_settings->get_g_settings (), "changed::available-custom-status", G_CALLBACK (status_menu_custom_messages_changed), self); g_signal_connect (self->priv->personal_data_settings->get_g_settings (), "changed::away-custom-status", G_CALLBACK (status_menu_custom_messages_changed), self); g_signal_connect (self->priv->personal_data_settings->get_g_settings (), "changed::busy-custom-status", G_CALLBACK (status_menu_custom_messages_changed), self); self->priv->connection = self->priv->personal_details->updated.connect (boost::bind (&on_details_updated, self)); return GTK_WIDGET (self); }
GtkWidget * status_menu_new (Ekiga::ServiceCore & core) { StatusMenu *self = NULL; sigc::connection conn; GtkCellRenderer *renderer = NULL; GSList *custom_status_array [NUM_STATUS_TYPES]; self = (StatusMenu *) g_object_new (STATUS_MENU_TYPE, NULL); self->priv = new StatusMenuPrivate (); self->priv->personal_details = core.get ("personal-details"); self->priv->parent = NULL; self->priv->list_store = gtk_list_store_new (NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->priv->list_store)); g_object_unref (self->priv->list_store); renderer = gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), renderer, FALSE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (self), renderer, "pixbuf", COL_ICON, NULL); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), renderer, FALSE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (self), renderer, "text", COL_MESSAGE, NULL); g_object_set (renderer, "width", 130, "ellipsize-set", true, "ellipsize", PANGO_ELLIPSIZE_END, NULL); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) custom_status_array [i] = gm_conf_get_string_list (status_types_keys [i]); status_menu_populate (self, custom_status_array); for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) { g_slist_foreach (custom_status_array [i], (GFunc) g_free, 0); g_slist_free (custom_status_array [i]); } gtk_combo_box_set_active (GTK_COMBO_BOX (self), 0); gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (self), (GtkTreeViewRowSeparatorFunc) status_menu_row_is_separator, NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (self), 0); status_menu_set_option (self, self->priv->personal_details->get_presence (), self->priv->personal_details->get_status ()); g_signal_connect (G_OBJECT (self), "changed", G_CALLBACK (status_menu_option_changed), self); gm_conf_notifier_add (PERSONAL_DATA_KEY "online_custom_status", status_menu_custom_messages_changed, self); gm_conf_notifier_add (PERSONAL_DATA_KEY "away_custom_status", status_menu_custom_messages_changed, self); gm_conf_notifier_add (PERSONAL_DATA_KEY "dnd_custom_status", status_menu_custom_messages_changed, self); conn = self->priv->personal_details->updated.connect (sigc::bind (sigc::ptr_fun (on_details_updated), self)); self->priv->connections.push_back (conn); return GTK_WIDGET (self); }