1 /*****************************************************************
2 * gmerlin - a general purpose multimedia framework and applications
3 *
4 * Copyright (c) 2001 - 2011 Members of the Gmerlin project
5 * gmerlin-general@lists.sourceforge.net
6 * http://gmerlin.sourceforge.net
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * *****************************************************************/
21
22 #include "gui.h"
23 #include <gui_gtk/gtkutils.h>
24
25 struct mixer_window_s
26 {
27 GtkWidget * main_win;
28 // GtkWidget * aux_win;
29
30 int num_cards;
31 card_widget_t ** cards;
32 bg_cfg_registry_t * cfg_reg;
33
34 int x, y, width, height;
35 };
36
37 static const bg_parameter_info_t parameters[] =
38 {
39 {
40 .name = "x",
41 .long_name = "X",
42 .type = BG_PARAMETER_INT,
43 .flags = BG_PARAMETER_HIDE_DIALOG,
44 .val_default = { .val_i = 100 },
45 },
46 {
47 .name = "y",
48 .long_name = "Y",
49 .type = BG_PARAMETER_INT,
50 .flags = BG_PARAMETER_HIDE_DIALOG,
51 .val_default = { .val_i = 100 },
52 },
53 {
54 .name = "width",
55 .long_name = "Width",
56 .type = BG_PARAMETER_INT,
57 .flags = BG_PARAMETER_HIDE_DIALOG,
58 .val_default = { .val_i = 300 },
59 },
60 {
61 .name = "height",
62 .long_name = "Height",
63 .type = BG_PARAMETER_INT,
64 .flags = BG_PARAMETER_HIDE_DIALOG,
65 .val_default = { .val_i = 200 },
66 },
67 { /* End of parameters */ }
68 };
69
set_parameter(void * data,const char * name,const bg_parameter_value_t * val)70 static void set_parameter(void * data, const char * name,
71 const bg_parameter_value_t * val)
72 {
73 mixer_window_t * w;
74 w = (mixer_window_t*)data;
75
76 if(!name)
77 {
78 return;
79 }
80 if(!strcmp(name, "x"))
81 {
82 w->x = val->val_i;
83 }
84 else if(!strcmp(name, "y"))
85 {
86 w->y = val->val_i;
87 }
88 else if(!strcmp(name, "width"))
89 {
90 w->width = val->val_i;
91 }
92 else if(!strcmp(name, "height"))
93 {
94 w->height = val->val_i;
95 }
96 }
97
get_parameter(void * data,const char * name,bg_parameter_value_t * val)98 static int get_parameter(void * data, const char * name,
99 bg_parameter_value_t * val)
100 {
101 mixer_window_t * w;
102 w = (mixer_window_t*)data;
103 if(!name)
104 {
105 return 1;
106 }
107 if(!strcmp(name, "x"))
108 {
109 val->val_i = w->x;
110 return 1;
111 }
112 else if(!strcmp(name, "y"))
113 {
114 val->val_i = w->y;
115 return 1;
116 }
117 else if(!strcmp(name, "width"))
118 {
119 val->val_i = w->width;
120 return 1;
121 }
122 else if(!strcmp(name, "height"))
123 {
124 val->val_i = w->height;
125 return 1;
126 }
127 return 0;
128 }
129
130
131
delete_callback(GtkWidget * wid,GdkEventAny * evt,gpointer data)132 static gboolean delete_callback(GtkWidget * wid, GdkEventAny * evt,
133 gpointer data)
134 {
135 int i;
136 mixer_window_t * w;
137 bg_cfg_section_t * section;
138
139 w = (mixer_window_t*)data;
140 section =
141 bg_cfg_registry_find_section(w->cfg_reg, "General");
142
143 gtk_window_get_position(GTK_WINDOW(w->main_win), &w->x, &w->y);
144 gtk_window_get_size(GTK_WINDOW(w->main_win), &w->width, &w->height);
145 bg_cfg_section_get(section, parameters, get_parameter, w);
146
147 for(i = 0; i < w->num_cards; i++)
148 card_widget_get_window_coords(w->cards[i]);
149
150 gtk_main_quit();
151 return TRUE;
152 }
153
154
155
map_callback(GtkWidget * wid,gpointer data)156 static void map_callback(GtkWidget * wid, gpointer data)
157 {
158 mixer_window_t * w;
159 w = (mixer_window_t*)data;
160 gtk_window_resize(GTK_WINDOW(w->main_win), w->width, w->height);
161 gtk_window_move(GTK_WINDOW(w->main_win), w->x, w->y);
162 }
163
mixer_window_create(alsa_mixer_t * mixer,bg_cfg_registry_t * cfg_reg)164 mixer_window_t * mixer_window_create(alsa_mixer_t * mixer,
165 bg_cfg_registry_t * cfg_reg)
166 {
167 int i;
168 GtkWidget * notebook;
169 GtkWidget * label;
170 bg_cfg_section_t * section;
171 mixer_window_t * ret;
172 ret = calloc(1, sizeof(*ret));
173 ret->cfg_reg = cfg_reg;
174 ret->main_win = bg_gtk_window_new(GTK_WINDOW_TOPLEVEL);
175 gtk_window_set_title(GTK_WINDOW(ret->main_win), "Gmerlin Alsamixer");
176
177
178 g_signal_connect(G_OBJECT(ret->main_win),
179 "delete-event", G_CALLBACK(delete_callback),
180 ret);
181
182 g_signal_connect(G_OBJECT(ret->main_win),
183 "map", G_CALLBACK(map_callback),
184 ret);
185
186 ret->cards = calloc(mixer->num_cards, sizeof(*(ret->cards)));
187
188 notebook = gtk_notebook_new();
189 ret->num_cards = mixer->num_cards;
190 for(i = 0; i < mixer->num_cards; i++)
191 {
192 if(mixer->cards[i]->num_groups)
193 {
194 section =
195 bg_cfg_registry_find_section(ret->cfg_reg,
196 mixer->cards[i]->name);
197 label = gtk_label_new(mixer->cards[i]->name);
198 gtk_widget_show(label);
199
200 ret->cards[i] = card_widget_create(mixer->cards[i], section);
201 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
202 card_widget_get_widget(ret->cards[i]),
203 label);
204 }
205
206 }
207
208 gtk_widget_show(notebook);
209 gtk_container_add(GTK_CONTAINER(ret->main_win), notebook);
210
211 section =
212 bg_cfg_registry_find_section(ret->cfg_reg, "General");
213 bg_cfg_section_apply(section, parameters, set_parameter, ret);
214 return ret;
215 }
216
mixer_window_destroy(mixer_window_t * w)217 void mixer_window_destroy(mixer_window_t * w)
218 {
219 int i;
220
221 for(i = 0; i < w->num_cards; i++)
222 card_widget_destroy(w->cards[i]);
223
224 free(w);
225 }
226
mixer_window_run(mixer_window_t * w)227 void mixer_window_run(mixer_window_t * w)
228 {
229 gtk_widget_show(w->main_win);
230 gtk_main();
231 }
232