2 terminatorX - realtime audio scratching software
3 Copyright (C) 1999-2003 Alexander König
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.
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.
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
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 Description: Contains the implementation of the Options and About
22 Dialogs. (And some really ugly "WE WANT TO
27 28 Jul 1999: Now display compiletime settings in the about dialog.
32 #include "tX_global.h"
33 #include "tX_dialog.h"
38 #include "tX_glade_interface.h"
39 #include "tX_glade_support.h"
42 #include <X11/extensions/XInput.h>
47 #include "tX_mastergui.h"
51 extern char *logo_xpm[];
52 GtkWidget *opt_dialog;
55 void apply_options(GtkWidget *dialog) {
57 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "alsa_driver")))) {
58 globals.audiodevice_type=ALSA;
59 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "oss_driver")))) {
60 globals.audiodevice_type=OSS;
61 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "jack_driver")))) {
62 globals.audiodevice_type=JACK;
66 strcpy(globals.oss_device, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "oss_audio_device"))->entry)));
67 globals.oss_buff_no=(int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(dialog, "oss_buffers")));
68 globals.oss_buff_size=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "oss_buffersize")));
69 globals.oss_samplerate=atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "oss_samplerate"))->entry)));
72 strcpy(globals.alsa_device, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "alsa_audio_device"))->entry)));
73 globals.alsa_buffer_time=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "alsa_buffer_time")));
74 globals.alsa_buffer_time*=1000;
75 globals.alsa_period_time=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "alsa_period_time")));
76 globals.alsa_period_time*=1000;
77 globals.alsa_samplerate=atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "alsa_samplerate"))->entry)));
78 globals.alsa_free_hwstats=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "alsa_free_hwstats")));
84 globals.xinput_enable=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "xinput_enable")))==TRUE);
85 strcpy(globals.xinput_device, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "xinput_device"))->entry)));
86 globals.mouse_speed=gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "mouse_speed")));
87 globals.sense_cycles=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "stop_sense_cycles")));
88 globals.vtt_inertia=gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "vtt_inertia")));
91 globals.show_nag=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "startup_nagbox")))==TRUE);
92 globals.tooltips=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "mainwin_tooltips")))==TRUE);
93 globals.filename_length=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lookup_widget(dialog, "filename_length")));
94 if (globals.tooltips) gtk_tooltips_enable(gui_tooltips);
95 else gtk_tooltips_disable(gui_tooltips);
97 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_text_only")))) {
98 globals.button_type=BUTTON_TYPE_TEXT;
99 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_icon_only")))) {
100 globals.button_type=BUTTON_TYPE_ICON;
101 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_text_and_icon")))) {
102 globals.button_type=BUTTON_TYPE_BOTH;
105 globals.update_delay=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "update_delay")));
106 globals.update_idle=(int) gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "update_idle")));
107 globals.flash_response=gtk_range_get_value(GTK_RANGE(lookup_widget(dialog, "vumeter_decay")));
110 strcpy(globals.file_editor, gtk_entry_get_text(GTK_ENTRY(lookup_widget(dialog, "soundfile_editor"))));
111 strcpy(globals.lrdf_path, gtk_entry_get_text(GTK_ENTRY(lookup_widget(dialog, "ladspa_rdf_path"))));
112 globals.compress_set_files=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "compress_set_files")))==TRUE);
113 globals.prelis=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "prelisten_enabled")))==TRUE);
117 #define WID_DYN TRUE, TRUE, 0
118 #define WID_FIX FALSE, FALSE, 0
120 #define my_new_subsec(s); \
121 separator=gtk_hseparator_new(); \
122 gtk_box_pack_start(GTK_BOX(vbox), separator, WID_DYN);\
123 gtk_widget_show(separator); \
124 label=gtk_label_new(s); \
125 gtk_misc_set_alignment (GTK_MISC(label), 0 ,0.5); \
126 gtk_box_pack_start(GTK_BOX(vbox), label, WID_DYN); \
127 gtk_widget_show(label);
129 #define my_new_button(btn, s); \
130 btn=gtk_button_new_with_label(s); \
131 gtk_box_pack_start(GTK_BOX(aa), btn, WID_DYN); \
132 gtk_widget_show(btn);
135 #define begin_box(); box=gtk_hbox_new(FALSE, 5);
137 #define begin_hom_box(); box=gtk_hbox_new(TRUE, 5);
139 #define end_box(); gtk_box_pack_start(GTK_BOX(vbox), box, WID_DYN); \
140 gtk_widget_show(box);
142 #define add_widget_dyn(wid); gtk_box_pack_start(GTK_BOX(box), wid, WID_DYN);\
143 gtk_widget_show(wid);
145 #define add_widget_fix(wid); gtk_box_pack_start(GTK_BOX(box), wid, WID_FIX);\
146 gtk_widget_show(wid);
148 #define add_expl(s); label=gtk_label_new(s); \
149 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);\
150 add_widget_fix(label);
152 #define add_expl_dyn(s); label=gtk_label_new(s); \
153 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);\
154 add_widget_dyn(label);
157 static GList *alsa_devices=NULL;
159 GList *get_alsa_device_list() {
165 char buffer[PATH_MAX+1];
168 if ((file = fopen("/proc/asound/pcm", "r"))) {
169 while(fgets(buffer, PATH_MAX, file)) {
171 if (strlen(buffer)) buffer[strlen(buffer)-1]=0;
172 if(strstr(buffer, "playback")) {
173 alsa_devices=g_list_append (alsa_devices, strdup(buffer));
182 GList *get_alsa_device_list() {
189 static GList *oss_devices=NULL;
191 int oss_select_dsp_only(const struct dirent *entry){
192 return (strstr(entry->d_name, "dsp")!=0);
195 GList *get_oss_device_list() {
200 struct dirent **namelist;
202 n = scandir("/dev", &namelist, oss_select_dsp_only, alphasort);
207 for (i=0; i<n; i++) {
209 sprintf(buffer, "/dev/%s", namelist[i]->d_name);
211 oss_devices=g_list_append (oss_devices, strdup(buffer));
219 static GList *sampling_rates=NULL;
221 GList *get_sampling_rates_list() {
222 if (sampling_rates) {
223 return sampling_rates;
226 sampling_rates=g_list_append(sampling_rates, (void *) "22000");
227 sampling_rates=g_list_append(sampling_rates, (void *) "32000");
228 sampling_rates=g_list_append(sampling_rates, (void *) "44100");
229 sampling_rates=g_list_append(sampling_rates, (void *) "48000");
231 return sampling_rates;
234 static GList *xinput_devices=NULL;
236 GList *get_xinput_devices_list() {
237 if (xinput_devices) {
238 return xinput_devices;
242 Display *dpy=XOpenDisplay(NULL);
243 XDeviceInfo *xdev=XListInputDevices(dpy, &devmax);
246 for (int i=0; i<devmax; i++) {
247 xinput_devices=g_list_append(xinput_devices, strdup(xdev[i].name));
250 XFreeDeviceList(xdev);
252 return xinput_devices;
255 void init_tx_options(GtkWidget *dialog) {
256 GtkTooltips *tooltips=GTK_TOOLTIPS(lookup_widget(dialog, "tooltips"));
259 switch (globals.audiodevice_type) {
260 case ALSA: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "alsa_driver")), 1);
263 case JACK: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "jack_driver")), 1);
268 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "oss_driver")), 1);
273 gtk_widget_set_sensitive(lookup_widget(dialog, "oss_driver"), 0);
274 gtk_widget_set_sensitive(lookup_widget(dialog, "oss_audio_device"), 0);
275 gtk_widget_set_sensitive(lookup_widget(dialog, "oss_buffers"), 0);
276 gtk_widget_set_sensitive(lookup_widget(dialog, "oss_buffersize"), 0);
280 gtk_widget_set_sensitive(lookup_widget(dialog, "alsa_driver"), 0);
285 gtk_widget_set_sensitive(lookup_widget(dialog, "jack_driver"), 0);
289 GList *oss_list=get_oss_device_list();
291 gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(dialog, "oss_audio_device")), oss_list);
293 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "oss_audio_device"))->entry), globals.oss_device);
295 gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(dialog, "oss_buffers")), globals.oss_buff_no);
296 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "oss_buffersize")), globals.oss_buff_size);
297 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "oss_buffersize"), "Set the size of the kernel level audio buffers. On slower systems you might have to increase this value (if you hear \"clicks\" or drop-outs). Lower values mean lower latency though.", NULL);
298 gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(dialog, "oss_samplerate")), get_sampling_rates_list());
300 sprintf(tmp, "%i", globals.oss_samplerate);
301 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "oss_samplerate"))->entry), tmp);
305 GList *alsa_list=get_alsa_device_list();
307 gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(dialog, "alsa_audio_device")), get_alsa_device_list());
309 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "alsa_audio_device"))->entry), globals.alsa_device);
311 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "alsa_buffer_time")), globals.alsa_buffer_time/1000);
312 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "alsa_buffer_time"), "Sets the size of the ALSA ring buffer. On slower systems you might have to increase this value (if you hear \"clicks\" or drop-outs). Lower values mean lower latency though.", NULL);
313 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "alsa_period_time")), globals.alsa_period_time/1000);
314 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "alsa_period_time"), "The ALSA period time determines how much audio data will be written to the device at once. It is recommended to set this value to a half or a third of the ALSA buffer time.", NULL);
316 gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(dialog, "alsa_samplerate")), get_sampling_rates_list());
317 sprintf(tmp, "%i", globals.alsa_samplerate);
318 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "alsa_samplerate"))->entry), tmp);
320 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "alsa_free_hwstats")), globals.alsa_free_hwstats);
328 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "xinput_enable")), globals.xinput_enable);
330 gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(dialog, "xinput_device")), get_xinput_devices_list());
331 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(dialog, "xinput_device"))->entry), globals.xinput_device);
333 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "mouse_speed")), globals.mouse_speed);
334 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "mouse_speed"), "The speed of your mouse in scratch mode. Use negative values to invert motion.", NULL);
336 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "stop_sense_cycles")), globals.sense_cycles);
337 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "stop_sense_cycles"),"If there is no \"motion-event\" for x cycles, where x is the number of cycles you select here, terminatorX assumes mouse motion has stopped. For smaller buffer sizes (=> shorter cycle times) you might have to increase this value", NULL);
339 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "vtt_inertia")), globals.vtt_inertia);
340 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "vtt_inertia"),"This value defines how fast the turntables will adapt to the speed input - the higher this value, the longer it will take the turntable to actually reach the target speed.", NULL);
342 gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(dialog, "filename_length")), globals.filename_length);
344 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "startup_nagbox")), globals.show_nag);
345 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "mainwin_tooltips")), globals.tooltips);
347 switch (globals.button_type) {
348 case BUTTON_TYPE_TEXT:
349 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_text_only")), 1);
352 case BUTTON_TYPE_ICON:
353 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_icon_only")), 1);
356 case BUTTON_TYPE_BOTH:
358 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "buttons_text_and_icon")), 1);
361 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "update_delay")), globals.update_delay);
362 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "update_delay"), "How often to update the slow widgets.", NULL);
363 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "update_idle")), globals.update_idle);
364 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "update_idle"), "The update thread will idle for the selcted amount of milliseconds. If you want to have a more responsive display update increase this value - if you have performance problems reduce this value.", NULL);
365 gtk_range_set_value(GTK_RANGE(lookup_widget(dialog, "vumeter_decay")), globals.flash_response);
366 gtk_tooltips_set_tip(tooltips, lookup_widget(dialog, "vumeter_decay"), "Defines how fast the maximum values of the VU meters should be decayed.", NULL);
369 gtk_entry_set_text(GTK_ENTRY(lookup_widget(dialog, "soundfile_editor")), globals.file_editor);
370 gtk_entry_set_text(GTK_ENTRY(lookup_widget(dialog, "ladspa_rdf_path")), globals.lrdf_path);
371 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "compress_set_files")), globals.compress_set_files);
372 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "prelisten_enabled")), globals.prelis);
375 void create_options()
377 opt_dialog=create_tx_options();
378 gtk_widget_hide(lookup_widget(opt_dialog, "jack_driver"));
379 init_tx_options(opt_dialog);
380 gtk_widget_show(opt_dialog);
383 void display_options()
386 gdk_window_raise(opt_dialog->window);
392 GtkWidget *about=NULL;
397 gdk_window_raise(about->window);
405 gtk_widget_destroy(about);
412 #define add_about_wid(wid); gtk_box_pack_start(GTK_BOX(box), wid, WID_DYN); \
413 gtk_widget_show(wid);
415 #define add_about_wid_fix(wid); gtk_box_pack_start(GTK_BOX(box), wid, WID_FIX); \
416 gtk_widget_show(wid);
418 GdkFont *GPL_font=NULL;
420 void show_about(int nag)
422 GtkWidget *window, *pwid;
432 GdkPixmap *pmap=NULL;
436 gdk_window_raise(about->window);
440 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
441 gtk_window_set_wmclass(GTK_WINDOW(window), "terminatorX", "tX_about");
443 gtk_container_set_border_width(GTK_CONTAINER(window), 5);
445 // GTK_WINDOW(window)->use_uposition=TRUE;
447 gtk_widget_realize(window);
449 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
450 gtk_window_set_title(GTK_WINDOW(window), "terminatorX - About");
454 gdk_window_set_decorations(window->window, (enum GdkWMDecoration) 0);
458 style = gtk_widget_get_style( window );
460 pmap=gdk_pixmap_create_from_xpm_d(window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **)logo_xpm);
462 pwid = gtk_pixmap_new( pmap, mask );
465 GtkWidget *box=gtk_vbox_new(FALSE, 2);
466 GtkWidget *box2=gtk_hbox_new(FALSE, 2);
469 gtk_container_add(GTK_CONTAINER(window), box);
470 gtk_box_pack_start(GTK_BOX(box), pwid, WID_FIX);
471 gtk_box_pack_start(GTK_BOX(box), box2, WID_FIX);
473 label=gtk_label_new(PACKAGE" release "VERSION);
474 gtk_box_pack_start(GTK_BOX(box2), label, WID_DYN);
475 gtk_misc_set_alignment(GTK_MISC(label), 0.1, 0.5);
476 gtk_widget_show(label);
478 label=gtk_label_new("Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig");
479 gtk_box_pack_start(GTK_BOX(box2), label, WID_DYN);
480 gtk_misc_set_alignment(GTK_MISC(label), 0.9, 0.5);
481 gtk_widget_show(label);
483 gtk_widget_show(box2);
484 gtk_widget_show(box);
485 gtk_widget_show(window);
486 gtk_widget_show(pwid);
488 while (gtk_events_pending()) gtk_main_iteration();
492 box=gtk_vbox_new(FALSE, 5);
493 add_about_wid_fix(pwid);
495 sep=gtk_hseparator_new();
496 add_about_wid_fix(sep);
497 char about_prefix_umlaut[]="\nThis is "PACKAGE" Release "VERSION" - Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig";
498 char about_rest[]="\n\nSend comments, patches and scratches to: alex@lisas.de\n"
499 "terminatorX-homepage: http://www.terminatorX.cx\n\nThis binary has been compiled with the following flags: "
506 " - mpg123 support: "
507 #ifdef USE_MPG123_INPUT
512 " - \nogg123 support: "
513 #ifdef USE_OGG123_INPUT
519 " - enhanced scheduling: "
526 #ifdef WORDS_BIGENDIAN
532 " endian machine.\n";
536 strcpy(buffer, about_prefix_umlaut);
537 strcat(buffer, about_rest);
539 label=gtk_label_new(buffer);
541 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
542 add_about_wid_fix(label);
544 sep=gtk_hseparator_new();
545 add_about_wid_fix(sep);
547 label=gtk_label_new("License (GPL V2):");
548 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
549 add_about_wid_fix(label);
551 hbox=gtk_hbox_new(FALSE, 5);
554 GtkTextBuffer *tbuffer;
556 text=gtk_text_view_new();
557 tbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
558 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_NONE);
559 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), false);
560 gtk_text_buffer_get_iter_at_offset (tbuffer, &iter, 0);
562 scroll=gtk_scrolled_window_new (NULL, NULL);
563 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
564 gtk_container_add (GTK_CONTAINER (scroll), text);
565 gtk_text_buffer_create_tag (tbuffer, "courier", "family", "courier", NULL);
567 gtk_text_buffer_insert_with_tags_by_name(tbuffer, &iter, license, -1, "courier", NULL);
568 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 5);
569 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 5);
570 gtk_widget_set_usize(GTK_WIDGET(text), 640, 180);
571 gtk_widget_show(text);
573 gtk_box_pack_start(GTK_BOX(hbox), scroll, WID_DYN);
574 gtk_widget_show(scroll);
578 sep=gtk_hseparator_new();
579 add_about_wid_fix(sep);
581 btn=gtk_button_new_with_label("Close");
582 add_about_wid_fix(btn);
584 gtk_container_add(GTK_CONTAINER(window), box);
585 gtk_widget_show(box);
587 gtk_signal_connect(GTK_OBJECT(btn), "clicked", (GtkSignalFunc) destroy_about, NULL);
588 gtk_signal_connect(GTK_OBJECT(window), "delete-event", (GtkSignalFunc) destroy_about, NULL);
590 gtk_widget_show(window);
591 tX_set_icon(window, "tX About");
593 while (gtk_events_pending()) gtk_main_iteration();
598 GdkBitmap *tX_icon_mask=NULL;
599 GdkPixmap *tX_icon_pmap=NULL;
600 GtkWidget *tX_icon_widget=NULL;
602 void tX_set_icon(GtkWidget *widget, char *name)
606 style = gtk_widget_get_style( widget );
610 tX_icon_pmap=gdk_pixmap_create_from_xpm_d(widget->window, &tX_icon_mask, &style->bg[GTK_STATE_NORMAL], (gchar **) tX_icon_xpm );
611 //tX_icon_widget = gtk_pixmap_new( tX_icon_pmap, tX_icon_mask );
612 //gtk_widget_realize(tX_icon_widget);
615 gdk_window_set_icon(widget->window, NULL, tX_icon_pmap, tX_icon_mask);
616 gdk_window_set_icon_name(widget->window, name);