mail-notification

Fork of Jean-Yves Lefort's mail-notification, a tray icon to notify of new mail
git clone https://code.djc.id.au/git/mail-notification/

src/mn-auth-combo-box.gob (4429B) - raw

      1 /*
      2  * Mail Notification
      3  * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along
     16  * with this program; if not, write to the Free Software Foundation, Inc.,
     17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     18  */
     19 
     20 %headertop{
     21 #include <gtk/gtk.h>
     22 %}
     23 
     24 %{
     25 #include <glib/gi18n.h>
     26 #if WITH_SASL
     27 #include <sasl/sasl.h>
     28 #include "mn-sasl.h"
     29 #endif /* WITH_SASL */
     30 #include "mn-util.h"
     31 
     32 enum
     33 {
     34   COLUMN_MECHANISM,
     35   COLUMN_LABEL,
     36   N_COLUMNS
     37 };
     38 %}
     39 
     40 class MN:Auth:Combo:Box from Gtk:Combo:Box
     41 {
     42   property STRING active_mechanism (export)
     43     set
     44     {
     45       const char *mechanism = g_value_get_string(VAL);
     46       GtkTreeModel *model;
     47       GtkTreeIter iter;
     48       gboolean valid;
     49 
     50       model = gtk_combo_box_get_model(GTK_COMBO_BOX(self));
     51 
     52       MN_TREE_MODEL_FOREACH(valid, &iter, model)
     53 	{
     54 	  char *this_mech;
     55 	  gboolean found;
     56 
     57 	  gtk_tree_model_get(model, &iter, COLUMN_MECHANISM, &this_mech, -1);
     58 	  found = (! this_mech && ! mechanism)
     59 	    || (this_mech && mechanism && ! strcmp(this_mech, mechanism));
     60 	  g_free(this_mech);
     61 
     62 	  if (found)
     63 	    {
     64 	      gtk_combo_box_set_active_iter(GTK_COMBO_BOX(self), &iter);
     65 	      break;
     66 	    }
     67 	}
     68     }
     69     get
     70     {
     71       char *mechanism = NULL;
     72       GtkTreeIter iter;
     73 
     74       if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(self), &iter))
     75 	{
     76 	  GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(self));
     77 	  gtk_tree_model_get(model, &iter, COLUMN_MECHANISM, &mechanism, -1);
     78 	}
     79 
     80       g_value_take_string(VAL, mechanism);
     81     };
     82 
     83   init (self)
     84   {
     85     GtkListStore *store;
     86     GtkCellRenderer *renderer;
     87 
     88     store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
     89     gtk_combo_box_set_model(GTK_COMBO_BOX(self), GTK_TREE_MODEL(store));
     90     g_object_unref(store);
     91 
     92     renderer = gtk_cell_renderer_text_new();
     93     gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self), renderer, TRUE);
     94     gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self), renderer,
     95 				   "text", COLUMN_LABEL,
     96 				   NULL);
     97 
     98     self_append(self, NULL, _("Autodetect"));
     99 #if WITH_SASL
    100     if (mn_sasl_init(NULL))
    101       {
    102         const char **mechanisms;
    103 
    104 	mechanisms = sasl_global_listmech();
    105 	if (mechanisms)
    106 	  {
    107 	    int i;
    108 	    for (i = 0; mechanisms[i]; i++)
    109 	      self_append(self, mechanisms[i], mechanisms[i]);
    110 	  }
    111       }
    112 #endif /* WITH_SASL */
    113 
    114     gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), self_sort_cb, NULL, NULL);
    115     gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
    116 
    117     self_set_active_mechanism(self, NULL);
    118   }
    119 
    120   private int
    121     sort_cb (GtkTreeModel *model,
    122 	     GtkTreeIter *a,
    123 	     GtkTreeIter *b,
    124 	     gpointer user_data)
    125   {
    126     char *mechanism_a;
    127     char *label_a;
    128     char *mechanism_b;
    129     char *label_b;
    130     int coll;
    131 
    132     gtk_tree_model_get(model, a,
    133 		       COLUMN_MECHANISM, &mechanism_a,
    134 		       COLUMN_LABEL, &label_a,
    135 		       -1);
    136     gtk_tree_model_get(model, b,
    137 		       COLUMN_MECHANISM, &mechanism_b,
    138 		       COLUMN_LABEL, &label_b,
    139 		       -1);
    140 
    141     /* put "autodetect" (NULL mechanism) on top of the list */
    142     if (mechanism_a && mechanism_b)
    143       coll = g_utf8_collate(label_a, label_b);
    144     else if (mechanism_a || mechanism_b)
    145       coll = mechanism_a ? 1 : -1;
    146     else
    147       coll = 0;
    148 
    149     g_free(mechanism_a);
    150     g_free(mechanism_b);
    151 
    152     return coll;
    153   }
    154 
    155   public void
    156     append (self, const char *mechanism, const char *label (check null))
    157   {
    158     GtkTreeModel *model;
    159     GtkTreeIter iter;
    160 
    161     model = gtk_combo_box_get_model(GTK_COMBO_BOX(self));
    162 
    163     gtk_list_store_append(GTK_LIST_STORE(model), &iter);
    164     gtk_list_store_set(GTK_LIST_STORE(model), &iter,
    165 		       COLUMN_MECHANISM, mechanism,
    166 		       COLUMN_LABEL, label,
    167 		       -1);
    168   }
    169 
    170   public GtkWidget *
    171     new (void)
    172   {
    173     return GTK_WIDGET(GET_NEW);
    174   }
    175 }