~ubuntu-branches/ubuntu/vivid/ekiga/vivid-proposed

« back to all changes in this revision

Viewing changes to lib/gui/codecsbox.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Kilian Krause
  • Date: 2011-07-17 00:24:50 UTC
  • mfrom: (5.1.5 upstream) (7.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20110717002450-ytg3wsrc1ptd3153
Tags: 3.3.1-1
* New upstream release.
 - Required libpt-dev 2.10 and libopal-dev 3.10
* Fix debian/watch to catch new version
* Remove libnotify0.7.patch - included upstream
* Add libboost-dev and libboost-signals-dev to Build-Depends
* debian/rules: Don't install *.la files for new internal shared libs
* Fix Vcs URIs to point to correct desktop/experimental/ekiga tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
/* Ekiga -- A VoIP and Video-Conferencing application
3
 
 * Copyright (C) 2000-2006 Damien Sandras
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 2 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
16
 
 * along with this program; if not, write to the Free Software Foundation,
17
 
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
18
 
 *
19
 
 *
20
 
 * Ekiga is licensed under the GPL license and as a special exception,
21
 
 * you have permission to link or otherwise combine this program with the
22
 
 * programs OPAL, OpenH323 and PWLIB, and distribute the combination,
23
 
 * without applying the requirements of the GNU GPL to the OPAL, OpenH323
24
 
 * and PWLIB programs, as long as you do follow the requirements of the
25
 
 * GNU GPL for all the rest of the software thus combined.
26
 
 */
27
 
 
28
 
 
29
 
/*
30
 
 *                         codecsbox.c  -  description
31
 
 *                         -------------------------------
32
 
 *   begin                : Sat Sep 2 2006
33
 
 *   copyright            : (C) 2000-2006 by Damien Sandras 
34
 
 *   description          : Contains a codecs box widget
35
 
 *
36
 
 */
37
 
 
38
 
#include "config.h"
39
 
#include "codecsbox.h"
40
 
 
41
 
#include "gmconf.h"
42
 
#include "codec-description.h"
43
 
#include <stdlib.h>
44
 
#include <string.h>
45
 
 
46
 
/* Columns for the codecs page */
47
 
enum {
48
 
 
49
 
  COLUMN_CODEC_ACTIVE,
50
 
  COLUMN_CODEC_NAME, 
51
 
  COLUMN_CODEC_CLOCKRATE,
52
 
  COLUMN_CODEC_PROTOCOLS,
53
 
  COLUMN_CODEC_CONFIG_NAME,
54
 
  COLUMN_CODEC_SELECTABLE,
55
 
  COLUMN_CODEC_AUDIO,
56
 
  COLUMN_CODEC_NUMBER
57
 
};
58
 
 
59
 
struct _CodecsBoxPrivate
60
 
{
61
 
  Ekiga::Call::StreamType type;
62
 
  GtkWidget *codecs_list;
63
 
};
64
 
 
65
 
enum { TYPE = 1 };
66
 
 
67
 
static GObjectClass *parent_class = NULL;
68
 
 
69
 
 
70
 
/* Static functions */
71
 
static void codecs_box_set_codecs (CodecsBox *self,
72
 
                                   GSList *list);
73
 
 
74
 
 
75
 
/* GTK+ Callbacks */
76
 
static void codec_toggled_cb (GtkCellRendererToggle *cell,
77
 
                              gchar *path_str,
78
 
                              gpointer data);
79
 
 
80
 
static void codec_moved_cb (GtkWidget *widget, 
81
 
                            gpointer data);
82
 
 
83
 
static GSList *codecs_box_to_gm_conf_list (CodecsBox *self);
84
 
 
85
 
 
86
 
/* Static functions and declarations */
87
 
static void codecs_box_class_init (gpointer g_class,
88
 
                                   gpointer class_data);
89
 
 
90
 
static void codecs_box_init (CodecsBox *);
91
 
 
92
 
static void codecs_box_dispose (GObject *obj);
93
 
 
94
 
static void codecs_box_finalize (GObject *obj);
95
 
 
96
 
static void codecs_box_get_property (GObject *obj,
97
 
                                     guint prop_id,
98
 
                                     GValue *value,
99
 
                                     GParamSpec *spec);
100
 
 
101
 
static void codecs_box_set_property (GObject *obj,
102
 
                                     guint prop_id,
103
 
                                     const GValue *value,
104
 
                                     GParamSpec *spec);
105
 
 
106
 
 
107
 
 
108
 
static void 
109
 
codecs_box_set_codecs (CodecsBox *self,
110
 
                       GSList *list)
111
 
{
112
 
  GtkTreeSelection *selection = NULL;
113
 
  GtkTreeModel *model = NULL;
114
 
  GtkTreeIter iter;
115
 
 
116
 
  GSList *codecs_data = NULL;
117
 
  GSList *codecs_data_iter = NULL;
118
 
 
119
 
  gchar *selected_codec = NULL;
120
 
  unsigned select_rate = 0;
121
 
  bool selected = false;
122
 
 
123
 
  g_return_if_fail (self != NULL);
124
 
 
125
 
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->codecs_list));
126
 
  codecs_data = list;
127
 
 
128
 
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->codecs_list));
129
 
 
130
 
  if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
131
 
    gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
132
 
                        COLUMN_CODEC_NAME, &selected_codec, 
133
 
                        COLUMN_CODEC_CLOCKRATE, &select_rate, -1);
134
 
  gtk_list_store_clear (GTK_LIST_STORE (model));
135
 
 
136
 
  codecs_data_iter = codecs_data;
137
 
  while (codecs_data_iter) {
138
 
 
139
 
    Ekiga::CodecDescription desc = Ekiga::CodecDescription ((char *) codecs_data_iter->data);
140
 
 
141
 
    if ((self->priv->type == Ekiga::Call::Audio && desc.audio)
142
 
        || (self->priv->type == Ekiga::Call::Video && !desc.audio)) {
143
 
      std::stringstream rate;
144
 
      std::stringstream protocols;
145
 
 
146
 
      for (std::list<std::string>::iterator it = desc.protocols.begin ();
147
 
           it != desc.protocols.end ();
148
 
           it++) {
149
 
        if (it != desc.protocols.begin ())
150
 
          protocols << ", ";
151
 
 
152
 
        protocols << *it;
153
 
      }
154
 
      rate << desc.rate / 1000 << " kHz";
155
 
 
156
 
      gtk_list_store_append (GTK_LIST_STORE (model), &iter);
157
 
      gtk_list_store_set (GTK_LIST_STORE (model), &iter,
158
 
                          COLUMN_CODEC_ACTIVE, desc.active,
159
 
                          COLUMN_CODEC_NAME, desc.name.c_str (),
160
 
                          COLUMN_CODEC_CLOCKRATE, rate.str ().c_str (),
161
 
                          COLUMN_CODEC_PROTOCOLS, protocols.str ().c_str (),
162
 
                          COLUMN_CODEC_CONFIG_NAME, desc.str ().c_str (),
163
 
                          COLUMN_CODEC_AUDIO, desc.audio,
164
 
                          COLUMN_CODEC_SELECTABLE, "true",
165
 
                          -1);
166
 
 
167
 
      if (selected_codec && desc.name == selected_codec
168
 
          && select_rate && desc.rate == select_rate) {
169
 
 
170
 
        selected = true;
171
 
        gtk_tree_selection_select_iter (selection, &iter);
172
 
      }
173
 
    }
174
 
 
175
 
    codecs_data_iter = g_slist_next (codecs_data_iter);
176
 
  }
177
 
 
178
 
  if (!selected && gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter))
179
 
    gtk_tree_selection_select_iter (selection, &iter);
180
 
}
181
 
 
182
 
 
183
 
static void
184
 
codec_toggled_cb (G_GNUC_UNUSED GtkCellRendererToggle *cell,
185
 
                  gchar *path_str,
186
 
                  gpointer data)
187
 
{
188
 
  CodecsBox *self = NULL;
189
 
 
190
 
  GtkTreeModel *model = NULL;
191
 
  GtkTreePath *path = NULL;
192
 
  GtkTreeIter iter;
193
 
 
194
 
  GSList *codecs_data = NULL;
195
 
 
196
 
  gboolean fixed = FALSE;
197
 
 
198
 
  g_return_if_fail (data != NULL);
199
 
  g_return_if_fail (IS_CODECS_BOX (data));
200
 
 
201
 
  self = CODECS_BOX (data);
202
 
 
203
 
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->codecs_list));
204
 
  path = gtk_tree_path_new_from_string (path_str);
205
 
 
206
 
  /* Update the tree model */
207
 
  gtk_tree_model_get_iter (model, &iter, path);
208
 
  gtk_tree_model_get (model, &iter, COLUMN_CODEC_ACTIVE, &fixed, -1);
209
 
  gtk_list_store_set (GTK_LIST_STORE (model), &iter,
210
 
                      COLUMN_CODEC_ACTIVE, fixed^1, -1);
211
 
  gtk_tree_path_free (path);
212
 
 
213
 
  /* Update the gmconf key */
214
 
  codecs_data = codecs_box_to_gm_conf_list (self);
215
 
  if (self->priv->type == Ekiga::Call::Audio)
216
 
    gm_conf_set_string_list ("/apps/ekiga/codecs/audio/media_list", codecs_data);
217
 
  else if (self->priv->type == Ekiga::Call::Video)
218
 
    gm_conf_set_string_list ("/apps/ekiga/codecs/video/media_list", codecs_data);
219
 
  g_slist_foreach (codecs_data, (GFunc) g_free, NULL);
220
 
  g_slist_free (codecs_data);
221
 
}
222
 
 
223
 
 
224
 
static void
225
 
codec_moved_cb (GtkWidget *widget, 
226
 
                gpointer data)
227
 
{       
228
 
  CodecsBox *self = NULL;
229
 
 
230
 
  GtkTreeIter iter;
231
 
  GtkTreeIter *iter2 = NULL;
232
 
  GtkTreeModel *model = NULL;
233
 
  GtkTreeSelection *selection = NULL;
234
 
  GtkTreePath *tree_path = NULL;
235
 
 
236
 
  GSList *codecs_data = NULL;
237
 
 
238
 
  gchar *path_str = NULL;
239
 
 
240
 
  g_return_if_fail (data != NULL);
241
 
  g_return_if_fail (IS_CODECS_BOX (data));
242
 
 
243
 
  self = CODECS_BOX (data);
244
 
 
245
 
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->codecs_list));
246
 
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->codecs_list));
247
 
  if (!gtk_tree_selection_get_selected (GTK_TREE_SELECTION (selection), 
248
 
                                        NULL, &iter))
249
 
    return;
250
 
 
251
 
  /* Update the tree view */
252
 
  iter2 = gtk_tree_iter_copy (&iter);
253
 
  path_str = gtk_tree_model_get_string_from_iter (GTK_TREE_MODEL (model), 
254
 
                                                  &iter);
255
 
  tree_path = gtk_tree_path_new_from_string (path_str);
256
 
  if (!strcmp ((gchar *) g_object_get_data (G_OBJECT (widget), "operation"), 
257
 
               "up"))
258
 
    gtk_tree_path_prev (tree_path);
259
 
  else
260
 
    gtk_tree_path_next (tree_path);
261
 
 
262
 
  gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, tree_path);
263
 
  if (gtk_list_store_iter_is_valid (GTK_LIST_STORE (model), &iter)
264
 
      && gtk_list_store_iter_is_valid (GTK_LIST_STORE (model), iter2))
265
 
    gtk_list_store_swap (GTK_LIST_STORE (model), &iter, iter2);
266
 
 
267
 
  /* Scroll to the new position */
268
 
  gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (self->priv->codecs_list), 
269
 
                                tree_path, NULL, FALSE, 0, 0);
270
 
 
271
 
  gtk_tree_path_free (tree_path);
272
 
  gtk_tree_iter_free (iter2);
273
 
  g_free (path_str);
274
 
 
275
 
  /* Update the gmconf key */
276
 
  codecs_data = codecs_box_to_gm_conf_list (self);
277
 
  if (self->priv->type == Ekiga::Call::Audio)
278
 
    gm_conf_set_string_list ("/apps/ekiga/codecs/audio/media_list", codecs_data);
279
 
  else if (self->priv->type == Ekiga::Call::Video)
280
 
    gm_conf_set_string_list ("/apps/ekiga/codecs/video/media_list", codecs_data);
281
 
  g_slist_foreach (codecs_data, (GFunc) g_free, NULL);
282
 
  g_slist_free (codecs_data);
283
 
}
284
 
 
285
 
 
286
 
static GSList *
287
 
codecs_box_to_gm_conf_list (CodecsBox *self)
288
 
{
289
 
  GtkTreeModel *model = NULL;
290
 
  GtkTreeIter iter;
291
 
 
292
 
  gchar *name = NULL;
293
 
  gchar *rate = NULL;
294
 
  gchar *protocols = NULL;
295
 
  gboolean active = false;
296
 
  gboolean audio = false;
297
 
 
298
 
  GSList *codecs_data = NULL;
299
 
 
300
 
  g_return_val_if_fail (self != NULL, NULL);
301
 
  g_return_val_if_fail (IS_CODECS_BOX (self), NULL);
302
 
 
303
 
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->codecs_list));
304
 
  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter)) {
305
 
 
306
 
    do {
307
 
 
308
 
      gtk_tree_model_get (model, &iter, 
309
 
                          COLUMN_CODEC_ACTIVE, &active,
310
 
                          COLUMN_CODEC_NAME, &name,
311
 
                          COLUMN_CODEC_CLOCKRATE, &rate,
312
 
                          COLUMN_CODEC_PROTOCOLS, &protocols,
313
 
                          COLUMN_CODEC_AUDIO, &audio,
314
 
                          -1);
315
 
 
316
 
      Ekiga::CodecDescription desc;
317
 
      desc = Ekiga::CodecDescription (name, atoi (rate) * 1000, audio, protocols, active);
318
 
      codecs_data = g_slist_append (codecs_data, g_strdup (desc.str ().c_str ()));
319
 
 
320
 
      g_free (name);
321
 
      g_free (protocols);
322
 
      g_free (rate);
323
 
 
324
 
    } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter));
325
 
  }
326
 
 
327
 
  return codecs_data;
328
 
}
329
 
 
330
 
 
331
 
static void 
332
 
codecs_list_changed_nt (G_GNUC_UNUSED gpointer id,
333
 
                        GmConfEntry *entry,
334
 
                        gpointer data)
335
 
{
336
 
  CodecsBox *self = CODECS_BOX (data);
337
 
 
338
 
  GSList *list = gm_conf_entry_get_list (entry);
339
 
  GSList *current_list = codecs_box_to_gm_conf_list (self);
340
 
  Ekiga::CodecList clist (list);
341
 
  Ekiga::CodecList curlist (current_list);
342
 
 
343
 
  if (clist != curlist)
344
 
    codecs_box_set_codecs (self, list);
345
 
 
346
 
  g_slist_foreach (list, (GFunc) g_free, NULL);
347
 
  g_slist_free (list);
348
 
 
349
 
  g_slist_foreach (current_list, (GFunc) g_free, NULL);
350
 
  g_slist_free (current_list);
351
 
}
352
 
 
353
 
 
354
 
static void
355
 
codecs_box_class_init (gpointer g_class,
356
 
                       gpointer /*class_data*/)
357
 
{
358
 
  GObjectClass *gobject_class = NULL;
359
 
  GParamSpec *spec = NULL;
360
 
 
361
 
  parent_class = (GObjectClass *) g_type_class_peek_parent (g_class);
362
 
 
363
 
  gobject_class = (GObjectClass *) g_class;
364
 
  gobject_class->dispose = codecs_box_dispose;
365
 
  gobject_class->finalize = codecs_box_finalize;
366
 
  gobject_class->get_property = codecs_box_get_property;
367
 
  gobject_class->set_property = codecs_box_set_property;
368
 
 
369
 
  spec = g_param_spec_int ("type", "Type", "Type",
370
 
                           0, 1, 0, (GParamFlags) G_PARAM_READWRITE);
371
 
  g_object_class_install_property (gobject_class, TYPE, spec);
372
 
}
373
 
 
374
 
 
375
 
static void
376
 
codecs_box_init (CodecsBox *self)
377
 
{
378
 
  GtkWidget *image = NULL;
379
 
  GtkWidget *scroll_window = NULL;
380
 
  GtkWidget *button = NULL;
381
 
 
382
 
  GtkWidget *buttons_vbox = NULL;
383
 
  GtkWidget *alignment = NULL;
384
 
 
385
 
  GtkListStore *list_store = NULL;
386
 
  GtkCellRenderer *renderer = NULL;
387
 
  GtkTreeViewColumn *column = NULL;
388
 
 
389
 
  g_return_if_fail (self != NULL);
390
 
  g_return_if_fail (IS_CODECS_BOX (self));
391
 
 
392
 
  self->priv = new CodecsBoxPrivate;
393
 
  self->priv->type = Ekiga::Call::Audio;
394
 
 
395
 
  gtk_box_set_spacing (GTK_BOX (self), 6);
396
 
  gtk_box_set_homogeneous (GTK_BOX (self), FALSE);
397
 
 
398
 
  self->priv->codecs_list = gtk_tree_view_new ();
399
 
 
400
 
  list_store = gtk_list_store_new (COLUMN_CODEC_NUMBER,
401
 
                                   G_TYPE_BOOLEAN,
402
 
                                   G_TYPE_STRING,
403
 
                                   G_TYPE_STRING,
404
 
                                   G_TYPE_STRING,
405
 
                                   G_TYPE_STRING,
406
 
                                   G_TYPE_BOOLEAN,
407
 
                                   G_TYPE_BOOLEAN);
408
 
 
409
 
  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (self->priv->codecs_list), TRUE);
410
 
  gtk_tree_view_set_reorderable (GTK_TREE_VIEW (self->priv->codecs_list), TRUE);
411
 
  gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->priv->codecs_list),0);
412
 
  gtk_tree_view_set_model (GTK_TREE_VIEW (self->priv->codecs_list), 
413
 
                           GTK_TREE_MODEL (list_store));
414
 
  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self->priv->codecs_list), FALSE);
415
 
 
416
 
  /* Set all Colums */
417
 
  renderer = gtk_cell_renderer_toggle_new ();
418
 
  column = gtk_tree_view_column_new_with_attributes (NULL,
419
 
                                                     renderer,
420
 
                                                     "active", 
421
 
                                                     COLUMN_CODEC_ACTIVE,
422
 
                                                     NULL);
423
 
  gtk_tree_view_column_add_attribute (column, renderer, 
424
 
                                      "activatable", COLUMN_CODEC_SELECTABLE);
425
 
  gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 25);
426
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->codecs_list), column);
427
 
  g_signal_connect (G_OBJECT (renderer), "toggled",
428
 
                    G_CALLBACK (codec_toggled_cb),
429
 
                    (gpointer) self);
430
 
 
431
 
  renderer = gtk_cell_renderer_text_new ();
432
 
  column = gtk_tree_view_column_new_with_attributes (NULL,
433
 
                                                     renderer,
434
 
                                                     "text", 
435
 
                                                     COLUMN_CODEC_NAME,
436
 
                                                     NULL);
437
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->codecs_list), column);
438
 
  g_object_set (G_OBJECT (renderer), "weight", "bold", NULL);
439
 
 
440
 
  renderer = gtk_cell_renderer_text_new ();
441
 
  column = gtk_tree_view_column_new_with_attributes (NULL,
442
 
                                                     renderer,
443
 
                                                     "text", 
444
 
                                                     COLUMN_CODEC_CLOCKRATE,
445
 
                                                     NULL);
446
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->codecs_list), column);
447
 
 
448
 
  renderer = gtk_cell_renderer_text_new ();
449
 
  column = gtk_tree_view_column_new_with_attributes (NULL,
450
 
                                                     renderer,
451
 
                                                     "text", 
452
 
                                                     COLUMN_CODEC_PROTOCOLS,
453
 
                                                     NULL);
454
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->codecs_list), column);
455
 
 
456
 
  scroll_window = gtk_scrolled_window_new (FALSE, FALSE);
457
 
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), 
458
 
                                  GTK_POLICY_NEVER, 
459
 
                                  GTK_POLICY_AUTOMATIC);
460
 
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll_window),
461
 
                                       GTK_SHADOW_IN);
462
 
  gtk_widget_set_size_request (scroll_window, -1, 120);
463
 
  gtk_container_add (GTK_CONTAINER (scroll_window), 
464
 
                     GTK_WIDGET (self->priv->codecs_list));
465
 
  gtk_box_pack_start (GTK_BOX (self), scroll_window, TRUE, TRUE, 0);
466
 
 
467
 
 
468
 
  /* The buttons */
469
 
  alignment = gtk_alignment_new (1, 0.5, 0, 0);
470
 
  buttons_vbox = gtk_vbox_new (TRUE, 6);
471
 
 
472
 
  gtk_container_add (GTK_CONTAINER (alignment), buttons_vbox);
473
 
 
474
 
  image = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU);
475
 
  button = gtk_button_new ();
476
 
  gtk_container_add (GTK_CONTAINER (button), image);
477
 
  gtk_widget_set_tooltip_text (button, _("Move selected codec priority upwards"));
478
 
  gtk_box_pack_start (GTK_BOX (buttons_vbox), button, FALSE, FALSE, 0);
479
 
  g_object_set_data (G_OBJECT (button), "operation", (gpointer) "up");
480
 
  g_signal_connect (G_OBJECT (button), "clicked",
481
 
                    G_CALLBACK (codec_moved_cb), 
482
 
                    (gpointer) self);
483
 
 
484
 
  image = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU);
485
 
  button = gtk_button_new ();
486
 
  gtk_container_add (GTK_CONTAINER (button), image);
487
 
  gtk_widget_set_tooltip_text (button, _("Move selected codec priority downwards"));
488
 
  gtk_box_pack_start (GTK_BOX (buttons_vbox), button, FALSE, FALSE, 0);
489
 
  g_object_set_data (G_OBJECT (button), "operation", (gpointer) "down");
490
 
  g_signal_connect (G_OBJECT (button), "clicked",
491
 
                    G_CALLBACK (codec_moved_cb), 
492
 
                    (gpointer) self);
493
 
 
494
 
  gtk_box_pack_start (GTK_BOX (self), alignment, FALSE, FALSE, 0);
495
 
 
496
 
  gtk_widget_show_all (GTK_WIDGET (self));
497
 
}
498
 
 
499
 
 
500
 
static void
501
 
codecs_box_dispose (GObject *obj)
502
 
{
503
 
  CodecsBox *self = NULL;
504
 
 
505
 
  self = CODECS_BOX (obj);
506
 
 
507
 
  self->priv->codecs_list = NULL;
508
 
 
509
 
  parent_class->dispose (obj);
510
 
}
511
 
 
512
 
 
513
 
static void
514
 
codecs_box_finalize (GObject *obj)
515
 
{
516
 
  parent_class->finalize (obj);
517
 
}
518
 
 
519
 
 
520
 
static void
521
 
codecs_box_get_property (GObject *obj,
522
 
                         guint prop_id,
523
 
                         GValue *value,
524
 
                         GParamSpec *spec)
525
 
{
526
 
  CodecsBox *self = NULL;
527
 
 
528
 
  self = CODECS_BOX (obj);
529
 
 
530
 
  switch (prop_id) {
531
 
 
532
 
  case TYPE:
533
 
    g_value_set_int (value, self->priv->type);
534
 
    break;
535
 
 
536
 
  default:
537
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, spec);
538
 
    break;
539
 
  }
540
 
}
541
 
 
542
 
 
543
 
static void
544
 
codecs_box_set_property (GObject *obj,
545
 
                         guint prop_id,
546
 
                         const GValue *value,
547
 
                         GParamSpec *spec)
548
 
{
549
 
  CodecsBox *self = NULL;
550
 
  GSList *list = NULL;
551
 
 
552
 
  self = CODECS_BOX (obj);
553
 
 
554
 
  switch (prop_id) {
555
 
 
556
 
  case TYPE:
557
 
    self->priv->type = (Ekiga::Call::StreamType) g_value_get_int (value); 
558
 
    break;
559
 
 
560
 
  default:
561
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, spec);
562
 
    break;
563
 
  }
564
 
 
565
 
  if (self->priv->type == Ekiga::Call::Audio)
566
 
    list = gm_conf_get_string_list ("/apps/ekiga/codecs/audio/media_list");
567
 
  else if (self->priv->type == Ekiga::Call::Video)
568
 
    list = gm_conf_get_string_list ("/apps/ekiga/codecs/video/media_list");
569
 
 
570
 
  codecs_box_set_codecs (self, list);
571
 
 
572
 
  g_slist_foreach (list, (GFunc) g_free, NULL);
573
 
  g_slist_free (list);
574
 
 
575
 
  if (self->priv->type == Ekiga::Call::Audio)
576
 
    gm_conf_notifier_add ("/apps/ekiga/codecs/audio/media_list", codecs_list_changed_nt, GTK_WIDGET (self));
577
 
  else
578
 
    gm_conf_notifier_add ("/apps/ekiga/codecs/video/media_list", codecs_list_changed_nt, GTK_WIDGET (self));
579
 
}
580
 
 
581
 
 
582
 
/* Global functions */
583
 
GType
584
 
codecs_box_get_type (void)
585
 
{
586
 
  static GType codecs_box_type = 0;
587
 
 
588
 
  if (codecs_box_type == 0)
589
 
    {
590
 
      static const GTypeInfo codecs_box_info =
591
 
        {
592
 
          sizeof (CodecsBoxClass),
593
 
          NULL,
594
 
          NULL,
595
 
          (GClassInitFunc) codecs_box_class_init,
596
 
          NULL,
597
 
          NULL,
598
 
          sizeof (CodecsBox),
599
 
          0,
600
 
          (GInstanceInitFunc) codecs_box_init,
601
 
          NULL
602
 
        };
603
 
 
604
 
      codecs_box_type =
605
 
        g_type_register_static (GTK_TYPE_HBOX,
606
 
                                "CodecsBox",
607
 
                                &codecs_box_info,
608
 
                                (GTypeFlags) 0);
609
 
    }
610
 
 
611
 
  return codecs_box_type;
612
 
}
613
 
 
614
 
 
615
 
GtkWidget *
616
 
codecs_box_new ()
617
 
{
618
 
  return GTK_WIDGET (CODECS_BOX (g_object_new (CODECS_BOX_TYPE, NULL)));
619
 
}
620
 
 
621
 
 
622
 
GtkWidget *
623
 
codecs_box_new_with_type (Ekiga::Call::StreamType type)
624
 
{
625
 
  GtkWidget *codecs_box = NULL;
626
 
 
627
 
  codecs_box = codecs_box_new ();
628
 
  g_object_set (G_OBJECT (codecs_box), "type", type, NULL);
629
 
 
630
 
  return codecs_box;
631
 
}