Ejemplo n.º 1
0
static void
status_menu_new_status_message_dialog_run (StatusMenu *self,
                                           int option)
{
  std::string presence;
  std::string status;

  GSList *clist = NULL;
  GtkWidget *dialog = NULL;
  GtkWidget *label = NULL;
  GtkWidget *entry = NULL;
  GtkWidget *vbox = NULL;
  GtkWidget *hbox = NULL;
  GtkWidget *image = NULL;

  const char *message = NULL;

  presence = self->priv->personal_data_settings->get_string ("short-status");
  status = self->priv->personal_data_settings->get_string ("long-status");

  dialog = gtk_dialog_new_with_buttons (_("Custom Message"),
                                        self->priv->parent,
                                        (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
                                        GTK_STOCK_OK,
                                        GTK_RESPONSE_ACCEPT,
                                        NULL);
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);

  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox, false, false, 2);

  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
  gtk_window_set_icon_name (GTK_WINDOW (dialog), status_icon_name[option - NUM_STATUS_TYPES - 1]);
  image = gtk_image_new_from_icon_name (status_icon_name[option - NUM_STATUS_TYPES - 1], GTK_ICON_SIZE_MENU);
  gtk_box_pack_start (GTK_BOX (hbox), image, false, false, 2);

  label = gtk_label_new (_("Define a custom message:"));
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  gtk_box_pack_start (GTK_BOX (hbox), label, false, false, 2);
  gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 2);

  entry = gtk_entry_new ();
  gtk_entry_set_activates_default (GTK_ENTRY (entry), true);
  gtk_box_pack_start (GTK_BOX (vbox), entry, false, false, 2);

  gtk_widget_show_all (dialog);
  switch (gtk_dialog_run (GTK_DIALOG (dialog))) {

  case GTK_RESPONSE_ACCEPT:
    message = gtk_entry_get_text (GTK_ENTRY (entry));
    clist =
      self->priv->personal_data_settings->get_slist (status_types_keys[option - NUM_STATUS_TYPES - 1]);
    if (message && g_strcmp0 (message, "")) {
      clist = g_slist_append (clist, g_strdup (message));
      self->priv->personal_data_settings->set_slist (status_types_keys[option - NUM_STATUS_TYPES - 1],
                                                     clist);
      self->priv->personal_details->set_presence_info (status_types_names[option - NUM_STATUS_TYPES - 1], message);
    }
    else {
      status_menu_set_option (self, presence.c_str (), status.c_str ());
    }
    g_slist_foreach (clist, (GFunc) g_free, NULL);
    g_slist_free (clist);
    break;

  default:
    status_menu_set_option (self, presence.c_str (), status.c_str ());
    break;
  }

  gtk_widget_destroy (dialog);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
/*
 * Static methods
 */
static void
status_menu_populate (StatusMenu *self,
                      GSList *custom_status_array [NUM_STATUS_TYPES])
{
  gboolean has_custom_messages = false;
  GSList *custom_status = NULL;
  GSList *liter = NULL;
  GdkPixbuf *pixbuf = NULL;
  GtkTreeIter iter;

  gtk_list_store_clear (GTK_LIST_STORE (self->priv->list_store));

  for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) {

    statuses [i] = gettext (statuses [i]);
    custom_status = custom_status_array [i];
    liter = custom_status;
    pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
                                       status_icon_name[i],
                                       GTK_ICON_SIZE_MENU, (GtkIconLookupFlags) 0, NULL);

    gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
    gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                        COL_ICON, pixbuf,
                        COL_MESSAGE, statuses[i],
                        COL_MESSAGE_TYPE, i,
                        COL_SEPARATOR, false,
                        -1);

    gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
    gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                        COL_ICON, pixbuf,
                        COL_MESSAGE, _("Custom message..."),
                        COL_MESSAGE_TYPE, NUM_STATUS_CUSTOM_TYPES + (i + 1),
                        COL_SEPARATOR, false,
                        -1);

    while (liter) {

      gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
      gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                          COL_ICON, pixbuf,
                          COL_MESSAGE, (char*) (liter->data),
                          COL_MESSAGE_TYPE, NUM_STATUS_TYPES + (i + 1),
                          COL_SEPARATOR, false,
                          -1);

      liter = g_slist_next (liter);
      has_custom_messages = true;
    }

    if (i < NUM_STATUS_TYPES - 1) {
      gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
      gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                          COL_SEPARATOR, true,
                          -1);
    }

    if (pixbuf)
      g_object_unref (pixbuf);
  }

  /* Clear message */
  if (has_custom_messages) {

    pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
                                       "gtk-clear",
                                       GTK_ICON_SIZE_MENU, (GtkIconLookupFlags) 0, NULL);

    gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
    gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                        COL_SEPARATOR, true,
                        -1);

    gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
    gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                        COL_ICON, pixbuf,
                        COL_MESSAGE, _("Clear"),
                        COL_MESSAGE_TYPE, TYPE_CLEAR,
                        COL_SEPARATOR, false,
                        -1);
  }

  status_menu_set_option (self, self->priv->personal_details->get_presence (), self->priv->personal_details->get_status ());
}
Ejemplo n.º 4
0
static void
on_details_updated (StatusMenu *self)
{
  status_menu_set_option (self, self->priv->personal_details->get_presence (), self->priv->personal_details->get_status ());
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
static void
status_menu_new_status_message_dialog_run (StatusMenu *self,
        int option)
{
    gchar *presence = NULL;
    gchar *status = NULL;

    GSList *clist = NULL;
    GtkWidget *dialog = NULL;
    GtkWidget *label = NULL;
    GtkWidget *entry = NULL;
    GtkWidget *vbox = NULL;
    GtkWidget *hbox = NULL;
    GtkWidget *image = NULL;

    GdkPixbuf* icon = NULL;

    const char *message = NULL;

    presence = gm_conf_get_string (PERSONAL_DATA_KEY "short_status");
    status = gm_conf_get_string (PERSONAL_DATA_KEY "long_status");

    dialog = gtk_dialog_new_with_buttons (_("Custom Message"),
                                          self->priv->parent,
                                          (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
                                          GTK_STOCK_OK,
                                          GTK_RESPONSE_ACCEPT,
                                          NULL);
    gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);

    vbox = gtk_vbox_new (false, 0);
    gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, false, false, 2);

    hbox = gtk_hbox_new (false, 2);
    icon = gtk_widget_render_icon (GTK_WIDGET (self),
                                   stock_status [option - NUM_STATUS_TYPES - 1],
                                   GTK_ICON_SIZE_MENU, NULL);
    gtk_window_set_icon (GTK_WINDOW (dialog), icon);
    image = gtk_image_new_from_pixbuf (icon);
    g_object_unref (icon);
    gtk_box_pack_start (GTK_BOX (hbox), image, false, false, 2);

    label = gtk_label_new (_("Define a custom message:"));
    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
    gtk_box_pack_start (GTK_BOX (hbox), label, false, false, 2);
    gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 2);

    entry = gtk_entry_new ();
    gtk_entry_set_activates_default (GTK_ENTRY (entry), true);
    gtk_box_pack_start (GTK_BOX (vbox), entry, false, false, 2);

    gtk_widget_show_all (dialog);
    switch (gtk_dialog_run (GTK_DIALOG (dialog))) {

    case GTK_RESPONSE_ACCEPT:
        message = gtk_entry_get_text (GTK_ENTRY (entry));
        clist = gm_conf_get_string_list (status_types_keys[option - NUM_STATUS_TYPES - 1]);
        if (message && strcmp (message, "")) {
            clist = g_slist_append (clist, g_strdup (message));
            gm_conf_set_string_list (status_types_keys[option - NUM_STATUS_TYPES - 1], clist);
            self->priv->personal_details->set_presence_info (status_types_names[option - NUM_STATUS_TYPES - 1], message);
        }
        else {
            status_menu_set_option (self, presence ? presence : "", status ? status : "");
        }
        g_slist_foreach (clist, (GFunc) g_free, NULL);
        g_slist_free (clist);
        break;

    default:
        status_menu_set_option (self, presence ? presence : "", status ? status : "");
        break;
    }

    gtk_widget_destroy (dialog);

    g_free (presence);
    g_free (status);
}
Ejemplo n.º 7
0
/*
 * Static methods
 */
static void
status_menu_populate (StatusMenu *self,
                      GSList *custom_status_array [NUM_STATUS_TYPES])
{
    gboolean has_custom_messages = false;
    GSList *custom_status = NULL;
    GSList *liter = NULL;
    GtkTreeIter iter;
    GdkPixbuf* icon = NULL;

    gtk_list_store_clear (GTK_LIST_STORE (self->priv->list_store));

    for (int i = 0 ; i < NUM_STATUS_TYPES ; i++) {

        statuses [i] = gettext (statuses [i]);
        custom_status = custom_status_array [i];
        liter = custom_status;

        icon = gtk_widget_render_icon (GTK_WIDGET (self),
                                       stock_status [i],
                                       GTK_ICON_SIZE_MENU, NULL);

        gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
        gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                            COL_ICON, icon,
                            COL_MESSAGE, statuses[i],
                            COL_MESSAGE_TYPE, i,
                            COL_SEPARATOR, false,
                            -1);

        gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
        gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                            COL_ICON, icon,
                            COL_MESSAGE, _("Custom message..."),
                            COL_MESSAGE_TYPE, NUM_STATUS_CUSTOM_TYPES + (i + 1),
                            COL_SEPARATOR, false,
                            -1);

        while (liter) {

            gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
            gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                                COL_ICON, icon,
                                COL_MESSAGE, (char*) (liter->data),
                                COL_MESSAGE_TYPE, NUM_STATUS_TYPES + (i + 1),
                                COL_SEPARATOR, false,
                                -1);

            liter = g_slist_next (liter);
            has_custom_messages = true;
        }

        if (i < NUM_STATUS_TYPES - 1) {
            gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
            gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                                COL_SEPARATOR, true,
                                -1);
        }

        g_object_unref (icon);
    }

    /* Clear message */
    if (has_custom_messages) {

        gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
        gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                            COL_SEPARATOR, true,
                            -1);

        icon = gtk_widget_render_icon (GTK_WIDGET (self),
                                       GTK_STOCK_CLEAR,
                                       GTK_ICON_SIZE_MENU, NULL);
        gtk_list_store_append (GTK_LIST_STORE (self->priv->list_store), &iter);
        gtk_list_store_set (GTK_LIST_STORE (self->priv->list_store), &iter,
                            COL_ICON, icon,
                            COL_MESSAGE, _("Clear"),
                            COL_MESSAGE_TYPE, TYPE_CLEAR,
                            COL_SEPARATOR, false,
                            -1);
        g_object_unref (icon);
    }

    status_menu_set_option (self, self->priv->personal_details->get_presence (), self->priv->personal_details->get_status ());
}