Пример #1
0
/* Sets a position of the widget */
int
clip_GTK_WIDGETSETPOSITION(ClipMachine * cm)
{
	C_widget *cwid = _fetch_cw_arg(cm);
	gint         x = _clip_parni(cm, 2);
	gint         y = _clip_parni(cm, 3);
	CHECKOPT(2, NUMERIC_t);
	CHECKOPT(3, NUMERIC_t);
	CHECKCWID(cwid,GTK_IS_WIDGET);
	if (_clip_parinfo(cm, 2) == NUMERIC_t)
		gtk_widget_set(cwid->widget,"x",x,NULL);
	if (_clip_parinfo(cm, 3) == NUMERIC_t)
		gtk_widget_set(cwid->widget,"y",y,NULL);
	return 0;
err:
	return 1;
}
Пример #2
0
/* Sets a size of the widget */
int
clip_GTK_WIDGETSETSIZE(ClipMachine * cm)
{
	C_widget *cwid = _fetch_cw_arg(cm);
	gint     width = _clip_parni(cm, 2);
	gint    height = _clip_parni(cm, 3);

	CHECKOPT(2, NUMERIC_t);
	CHECKOPT(3, NUMERIC_t);
	CHECKCWID(cwid,GTK_IS_WIDGET);
	if (_clip_parinfo(cm, 2) == NUMERIC_t)
		gtk_widget_set(cwid->widget,"width",width,NULL);
	if (_clip_parinfo(cm, 3) == NUMERIC_t)
		gtk_widget_set(cwid->widget,"height",height,NULL);
	return 0;
err:
	return 1;
}
Пример #3
0
int
clip_GTK_TIPSQUERYSETEMITALWAYS(ClipMachine * cm)
{
	C_widget  *ctq = _fetch_cw_arg(cm);
        gboolean always = _clip_parl(cm,2);
        CHECKCWID(ctq,GTK_IS_TIPS_QUERY);
	CHECKOPT(2,LOGICAL_t);
        gtk_widget_set(ctq->widget, "emit-always", always, NULL);
	return 0;
err:
	return 1;
}
Пример #4
0
int
clip_GTK_TABLESETNCOLUMNS(ClipMachine *cm)
{
	C_widget *ctbl = _fetch_cw_arg(cm);
	guint    ncols = _clip_parni(cm,2);
	CHECKCWID(ctbl,GTK_IS_TABLE);
	CHECKOPT(2,NUMERIC_t);
	gtk_widget_set(ctbl->widget, "n-columns",ncols,NULL);
	return 0;
err:
	return 1;
}
Пример #5
0
GtkWidget *make_canvas(void)
{
	GtkWidget *canvas;
	GdkColor black = { 0, 0, 0, 0 };

	/* Canvas */

	canvas = gtk_drawing_area_new();
	gtk_widget_modify_bg(canvas, GTK_STATE_NORMAL, &black);

	g_signal_connect(G_OBJECT(canvas), "motion_notify_event",
	    G_CALLBACK(motion_notify_event), NULL);
	g_signal_connect(G_OBJECT(canvas), "button_press_event",
	    G_CALLBACK(button_press_event), NULL);
	g_signal_connect(G_OBJECT(canvas), "button_release_event",
	    G_CALLBACK(button_release_event), NULL);
	g_signal_connect(G_OBJECT(canvas), "scroll_event",
	    G_CALLBACK(scroll_event), NULL);

	GTK_WIDGET_SET_FLAGS(canvas, GTK_CAN_FOCUS);

	g_signal_connect(G_OBJECT(canvas), "key_press_event",
	    G_CALLBACK(key_press_event), NULL);

	g_signal_connect(G_OBJECT(canvas), "expose_event",
	    G_CALLBACK(expose_event), NULL);
	g_signal_connect(G_OBJECT(canvas), "enter_notify_event",
	    G_CALLBACK(enter_notify_event), NULL);
	g_signal_connect(G_OBJECT(canvas), "leave_notify_event",
	    G_CALLBACK(leave_notify_event), NULL);

	gtk_widget_set(canvas, "has-tooltip", TRUE, NULL);
	g_signal_connect(G_OBJECT(canvas), "query_tooltip",
	    G_CALLBACK(canvas_tooltip), NULL);

	gtk_widget_set_events(canvas,
	    GDK_EXPOSE | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
	    GDK_KEY_PRESS_MASK |
	    GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
	    GDK_SCROLL |
	    GDK_POINTER_MOTION_MASK);

	gtk_widget_set_double_buffered(canvas, FALSE);

	setup_canvas_drag(canvas);

	draw_ctx.widget = canvas;

	return canvas;
}
Пример #6
0
int
clip_GTK_SPINBUTTONSETCLIMBRATE(ClipMachine * ClipMachineMemory)
{
   C_widget *cspb = _fetch_cw_arg(ClipMachineMemory);

   gfloat    climb_rate = _clip_parnd(ClipMachineMemory, 2);

   CHECKCWID(cspb, GTK_IS_SPIN_BUTTON);
   CHECKOPT(2, NUMERIC_type_of_ClipVarType);
   gtk_widget_set(cspb->widget, "climb-rate", climb_rate, NULL);
   return 0;
 err:
   return 1;
}
static GtkWidget *_xgamma_add_channel_widget (GtkWidget *pInteractiveWidget, gchar *cLabel, int iChannelNumber, guint *iSignalID, double fChannelGamma)
{
	GtkWidget *pLabel = gtk_label_new (cLabel);
	gtk_table_attach_defaults (GTK_TABLE (pInteractiveWidget), pLabel, 0, 1, iChannelNumber, iChannelNumber+1);
	
	GtkWidget *pHScale = gtk_hscale_new_with_range (GAMMA_MIN, GAMMA_MAX, .02);
	gtk_scale_set_digits (GTK_SCALE (pHScale), 2);
	gtk_range_set_value (GTK_RANGE (pHScale), fChannelGamma);
	gtk_widget_set (pHScale, "width-request", 150, NULL);
	
	*iSignalID = g_signal_connect (G_OBJECT (pHScale),
		"value-changed",
		G_CALLBACK (on_scale_value_changed),
		GINT_TO_POINTER (iChannelNumber));
	gtk_table_attach_defaults (GTK_TABLE (pInteractiveWidget), pHScale, 1, 2, iChannelNumber, iChannelNumber+1);
	
	return pHScale;
}
Пример #8
0
GtkWidget*
bst_choice_dialog_createv (BstChoice *first_choice,
			   ...)
{
  BstChoice *choice;
  GtkWidget *vbox, *dialog;
  va_list args;
  
  g_return_val_if_fail (first_choice != NULL, NULL);
  
  /* text portions
   */
  vbox = gtk_widget_new (GTK_TYPE_VBOX,
			 "visible", TRUE,
			 "border_width", 5,
			 NULL);
  va_start (args, first_choice);
  choice = first_choice;
  do
    {
      guint choice_type = choice->type_and_flags & BST_CHOICE_TYPE_MASK;
      guint choice_flags = choice->type_and_flags & BST_CHOICE_FLAG_MASK;
      
      switch (choice_type)
	{
	  GtkWidget *any;
	case BST_CHOICE_TYPE_TEXT:
	  /* any = bst_scroll_text_create (BST_TEXT_VIEW_CENTER, choice->name); */
	  any = gtk_widget_new (GTK_TYPE_LABEL,
				"visible", TRUE,
				"justify", GTK_JUSTIFY_CENTER,
				"label", choice->name,
				"wrap", FALSE,
				NULL);
	  gtk_box_pack_start (GTK_BOX (vbox), any, TRUE, TRUE, 0);
	  gtk_widget_set_sensitive (any, !(choice_flags & BST_CHOICE_FLAG_INSENSITIVE));
	  break;
	case BST_CHOICE_TYPE_SEPARATOR:
	  any = gtk_widget_new (GTK_TYPE_HSEPARATOR,
				"visible", TRUE,
				"sensitive", FALSE,
				NULL);
	  gtk_box_pack_start (GTK_BOX (vbox), any, TRUE, TRUE, 0);
	  gtk_widget_set_sensitive (any, !(choice_flags & BST_CHOICE_FLAG_INSENSITIVE));
	  break;
	}
      choice = va_arg (args, BstChoice*);
    }
  while (choice);
  va_end (args);
  
  /* create dialog
   */
  dialog = gxk_dialog_new (NULL, NULL, GXK_DIALOG_POPUP_POS | GXK_DIALOG_MODAL,
			   NULL, vbox);
  gtk_widget_ref (dialog);
  gtk_object_sink (GTK_OBJECT (dialog));
  
  /* add items
   */
  va_start (args, first_choice);
  choice = first_choice;
  do
    {
      guint choice_type = choice->type_and_flags & BST_CHOICE_TYPE_MASK;
      guint choice_flags = choice->type_and_flags & BST_CHOICE_FLAG_MASK;
      
      switch (choice_type)
	{
	  GtkWidget *any;
	case BST_CHOICE_TYPE_TITLE:
	  gtk_widget_set (dialog, "title", choice->name, NULL);
	  break;
	case BST_CHOICE_TYPE_ITEM:
	  any = gxk_dialog_action_multi (GXK_DIALOG (dialog), choice->name,
					 button_choice_activate, choice->p_id,
					 choice->icon_stock_id,
					 (choice_flags & BST_CHOICE_FLAG_DEFAULT) ? GXK_DIALOG_MULTI_DEFAULT : 0);
	  if (choice_flags & BST_CHOICE_FLAG_INSENSITIVE)
	    gtk_widget_set_sensitive (any, FALSE);
	  break;
	}
      
      free_choice (choice);
      
      choice = va_arg (args, BstChoice*);
    }
  while (choice);
  va_end (args);
  
  return dialog;
}
Пример #9
0
static GtkWidget *
get_voice_test_frame(PurplePlugin *plugin)
{
	GtkWidget *vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
	GtkWidget *level = gtk_progress_bar_new();
	GtkWidget *volume = gtk_hscale_new_with_range(0, 100, 1);
	GtkWidget *threshold = gtk_hscale_new_with_range(0, 100, 1);
	GtkWidget *label;
	GtkTable *table = GTK_TABLE(gtk_table_new(2, 2, FALSE));

	GstElement *pipeline;
	GstBus *bus;
	BusCbCtx *ctx;

	g_object_set(vbox, "width-request", 500, NULL);

	gtk_table_set_row_spacings(table, PIDGIN_HIG_BOX_SPACE);
	gtk_table_set_col_spacings(table, PIDGIN_HIG_BOX_SPACE);

	label = gtk_label_new(_("Volume:"));
	g_object_set(label, "xalign", 0.0, NULL);
	gtk_table_attach(table, label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0);
	gtk_table_attach_defaults(table, volume, 1, 2, 0, 1);
	label = gtk_label_new(_("Silence threshold:"));
	g_object_set(label, "xalign", 0.0, "yalign", 1.0, NULL);
	gtk_table_attach(table, label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
	gtk_table_attach_defaults(table, threshold, 1, 2, 1, 2);

	gtk_container_add(GTK_CONTAINER(vbox), level);
	gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(table));
	gtk_widget_show_all(vbox);

	pipeline = create_pipeline();
	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
	gst_bus_add_signal_watch(bus);
	ctx = g_new(BusCbCtx, 1);
	ctx->level = GTK_PROGRESS_BAR(level);
	ctx->threshold = GTK_RANGE(threshold);
	g_signal_connect_data(bus, "message", G_CALLBACK(gst_bus_cb),
			ctx, (GClosureNotify)g_free, 0);
	gst_object_unref(bus);

	g_signal_connect(volume, "value-changed",
			(GCallback)on_volume_change_cb, pipeline);

	gtk_range_set_value(GTK_RANGE(volume),
			purple_prefs_get_int("/purple/media/audio/volume/input"));
	gtk_widget_set(volume, "draw-value", FALSE, NULL);

	gtk_range_set_value(GTK_RANGE(threshold),
			purple_prefs_get_int("/purple/media/audio/silence_threshold"));

	g_signal_connect(vbox, "destroy",
			G_CALLBACK(voice_test_frame_destroy_cb), pipeline);
	g_signal_connect(volume, "destroy",
			G_CALLBACK(volume_scale_destroy_cb), NULL);
	g_signal_connect(threshold, "format-value",
			G_CALLBACK(threshold_value_format_cb), NULL);
	g_signal_connect(threshold, "destroy",
			G_CALLBACK(threshold_scale_destroy_cb), NULL);

	return vbox;
}
Пример #10
0
int
main (int   argc,
      char *argv[])
{
  GtkWidget *window, *vbox, *hbox, *sbar, *spin, *button;
  GslConfigValue gslconfig[] = {
    { "wave_chunk_padding",     1, },
    { "dcache_block_size",      8192, },
    { "dcache_cache_memory",	5 * 1024 * 1024, },
    { NULL, },
  };
  WaveView *view, *first_view = NULL;
  guint i;
  
  g_thread_init (NULL);
  g_type_init ();
  birnet_init (&argc, &argv, NULL);
  gsl_init (gslconfig);
  bse_init_inprocess (&argc, &argv, NULL, NULL);
  gtk_init (&argc, &argv);
  gxk_init ();
  _bst_init_utils ();
  
  if (argc < 2)
    g_error ("need filenames");

  vbox = gtk_widget_new (GTK_TYPE_VBOX,
			 "visible", TRUE,
			 "border_width", 10,
			 NULL);
  gtk_box_pack_start (GTK_BOX (vbox), pack_test_widget (), TRUE, TRUE, 0);

  sbar = gtk_widget_new (GTK_TYPE_HSCROLLBAR,
			 "visible", TRUE,
			 NULL);
  gtk_box_pack_start (GTK_BOX (vbox), sbar, FALSE, TRUE, 0);

  for (i = 1; i < argc; i++)
    {
      view = g_new (WaveView, 1);
      view->handle = gsl_wave_handle_new (argv[i], 1, 44100, 440, GSL_WAVE_FORMAT_SIGNED_16, G_LITTLE_ENDIAN, 0, -1);
      if (!view->handle)
	g_error ("failed to create handle for \"%s\": stat() failed", argv[i]);
      view->qsampler = g_object_new (BST_TYPE_QSAMPLER,
				     "visible", TRUE,
				     "events", (GDK_BUTTON_PRESS_MASK |
						GDK_BUTTON_RELEASE_MASK |
						GDK_BUTTON1_MOTION_MASK),
				     NULL);
      g_object_connect (view->qsampler,
			"signal::button_press_event", qsampler_button_event, view,
			"signal::button_release_event", qsampler_button_event, view,
			"signal::motion_notify_event", qsampler_motion_event, view,
			NULL);
      qsampler_set_handle (view->qsampler, view->handle);
      bst_qsampler_set_adjustment (view->qsampler, gtk_range_get_adjustment (GTK_RANGE (sbar)));
      gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (view->qsampler), TRUE, TRUE, 2);
      view->next = wave_views;
      wave_views = view;
      if (i == 1)
	first_view = view;
    }

  spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 1e-16, 1e+16, 0.1, 10, 0)), 0, 5);
  gtk_widget_set (spin,
		  "visible", TRUE,
		  "width_request", 40,
		  NULL);
  for (view = wave_views; view; view = view->next)
    g_object_connect (GTK_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin))),
		      "signal::value_changed", adjust_zoom, view->qsampler,
		      NULL);
  gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
  
  spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 1e-16, 1e+16, 1, 10, 0)), 0, 5);
  gtk_widget_set (spin,
		  "visible", TRUE,
		  "width_request", 40,
		  NULL);
  for (view = wave_views; view; view = view->next)
    g_object_connect (GTK_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin))),
		      "signal::value_changed", adjust_vscale, view->qsampler,
		      NULL);
  gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
  
  hbox = gtk_widget_new (GTK_TYPE_HBOX,
			 "visible", TRUE,
			 "border_width", 10,
			 NULL);
  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Selection to Loop"),
					   NULL),
			     "swapped_signal::clicked", selection_to_loop, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Loop to Selection"),
					   NULL),
			     "swapped_signal::clicked", loop_to_selection, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Zoom Selection"),
					   NULL),
			     "swapped_signal::clicked", zoom_selection, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Apply Loop"),
					   NULL),
			     "swapped_signal::clicked", set_loop, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Reset Loop"),
					   NULL),
			     "swapped_signal::clicked", unset_loop, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Score"),
					   NULL),
			     "swapped_signal::clicked", score, first_view->qsampler,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  button = g_object_connect (g_object_new (GTK_TYPE_BUTTON,
					   "visible", TRUE,
					   "label", _("Find"),
					   NULL),
			     "swapped_signal::clicked", find, first_view,
			     NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);

  window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
					     "child", vbox,
					     "visible", TRUE,
					     "height_request", 450,
					     "width_request", 1400,
					     "allow_shrink", TRUE,
					     NULL),
			     "signal::destroy", gtk_main_quit, NULL,
			     NULL);
  
  button = g_object_new (GTK_TYPE_BUTTON,
			 "visible", TRUE,
			 "label", _("Mark Signal (Head)"),
			 NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
  for (view = wave_views; view; view = view->next)
     g_object_connect (GTK_OBJECT (button),
		       "swapped_signal::clicked", mark_signalh, view,
		       NULL);

  button = g_object_new (GTK_TYPE_BUTTON,
			 "visible", TRUE,
			 "label", _("Mark Signal (Tail)"),
			 NULL);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
  for (view = wave_views; view; view = view->next)
     g_object_connect (GTK_OBJECT (button),
		       "swapped_signal::clicked", mark_signalt, view,
		       NULL);
  
  
  gtk_main ();
  
  return 0;
}
Пример #11
0
Chat * win_chat_create(const gchar *id)
{
	GtkWidget *scroll;
	Chat *c;
	GtkWidget *b;
	gchar *s;
	
	c = (Chat *)g_malloc(sizeof(Chat));
	c->id = g_strdup(id);
	c->enter_sends = pref_chat_enter_sends;
	
	c->blink_state = BlinkOff;
	c->need_blinking = FALSE;

	c->notify_sent = FALSE;

	c->user = user_get(id);

	c->win = GTK_WINDOW(create_win_chat());
	g_assert(c->win != NULL);
	
	scroll = lookup_widget(GTK_WIDGET(c->win), "scroll_output");
	g_assert(scroll != NULL);
	c->input = GTK_TEXT_VIEW(lookup_widget(GTK_WIDGET(c->win), "input"));
	g_assert(c->input != NULL);

	c->output = GTK_HTML(glen_html_new());
	g_assert(c->output != NULL);
	gtk_widget_set_name(GTK_WIDGET(c->output), "output");
	
	gtk_widget_set(GTK_WIDGET(c->output), "can-focus", FALSE, NULL);

	gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(c->output));

	gtk_widget_show(GTK_WIDGET(c->output));

	c->stream = glen_html_begin(c->output);
//	gtk_html_write(c->output, c->stream, header, strlen(header));

/* ustaw pixbuf dla 'lampki' */
	b = lookup_widget(GTK_WIDGET(c->win), "image_typing");
	g_assert(b != NULL);
	gtk_image_set_from_pixbuf(GTK_IMAGE(b), typing_off_pixbuf);

/* callbacki do przyciskow */
	b = lookup_widget(GTK_WIDGET(c->win), "clear_btn");
	g_assert(b != NULL);
	g_signal_connect(G_OBJECT(b), "clicked",
		G_CALLBACK(clear_btn_clicked_cb), (gpointer)c);

	b = lookup_widget(GTK_WIDGET(c->win), "send_btn");
	g_assert(b != NULL);
	g_signal_connect(G_OBJECT(b), "clicked",
		G_CALLBACK(send_btn_clicked_cb), (gpointer)c);

	b = lookup_widget(GTK_WIDGET(c->win), "close_btn");
	g_assert(b != NULL);
	g_signal_connect(G_OBJECT(b), "clicked",
		G_CALLBACK(close_btn_clicked_cb), (gpointer)c);

	b = lookup_widget(GTK_WIDGET(c->win), "enter_sends_btn");
	g_assert(b != NULL);
	g_signal_connect(G_OBJECT(b), "toggled",
		G_CALLBACK(enter_sends_btn_cb), (gpointer)c);
	
/* reszta */
	b = lookup_widget(GTK_WIDGET(c->win), "input");
	g_assert(b != NULL);
	g_signal_connect(G_OBJECT(b), "key_press_event",
		G_CALLBACK(input_key_press_cb), (gpointer)c);
	g_signal_connect(G_OBJECT(b), "copy_clipboard",
		G_CALLBACK(input_copy_clipboard_cb), (gpointer)c);
	
	gtk_widget_grab_focus(b);

	g_signal_connect(G_OBJECT(c->win), "delete_event",
		G_CALLBACK(delete_win_cb), c);
//	g_signal_connect(G_OBJECT(c->win), "window_state_event",
//		G_CALLBACK(window_state_cb), c);
	g_signal_connect_after(G_OBJECT(c->win), "visibility_notify_event",
		G_CALLBACK(visibility_changed_cb), c);
	g_signal_connect(G_OBJECT(c->win), "focus_in_event",
		G_CALLBACK(focus_in_cb), c);

	/* ustaw tooltip dla 'lampki */
	b = lookup_widget(GTK_WIDGET(c->win), "eventbox_typing");
	g_assert(b != NULL);
	s = toutf("Je¶li lampka zapali siê oznacza to, ¿e Twój "
		"rozmówca w³a¶nie pisze wiadomo¶æ");
	gtk_tooltips_set_tip(tooltips, b, s, NULL);
	g_free(s);
	
	return c;
}
Пример #12
0
static void aboutbox()
{
	GtkWidget *vbox1;
	GtkWidget *label1;
	GtkWidget *about_exit;
	GtkWidget *scroll1;
	GtkWidget *table1;
	GtkWidget *label_fmt, *label_trk;
	struct xmp_fmt_info *f, *fmt;
	int i;

	if (about_window) {
		gdk_window_raise(about_window->window);
		return;
	}

	about_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_object_set_data(GTK_OBJECT(about_window),
		"about_window", about_window);
	gtk_window_set_title(GTK_WINDOW(about_window),"About the XMP Plugin");
	gtk_window_set_policy(GTK_WINDOW(about_window), FALSE, FALSE, FALSE);
	gtk_signal_connect(GTK_OBJECT(about_window), "destroy",
		GTK_SIGNAL_FUNC(gtk_widget_destroyed), &about_window);
	gtk_container_border_width(GTK_CONTAINER(about_window), 10);
	gtk_widget_realize(about_window);

	vbox1 = gtk_vbox_new(FALSE, 4);
	gtk_container_add(GTK_CONTAINER(about_window), vbox1);
	gtk_object_set_data(GTK_OBJECT(about_window), "vbox1", vbox1);
	gtk_widget_show(vbox1);
	gtk_container_border_width(GTK_CONTAINER(vbox1), 10);

	label1 = gtk_label_new(
		"Extended Module Player " VERSION "\n"
		"Written by Claudio Matsuoka and Hipolito Carraro Jr.\n"
		"\n"
		"Portions Copyright (C) 1998,2000 Olivier Lapicque,\n"
		"(C) 1998 Tammo Hinrichs, (C) 1998 Sylvain Chipaux,\n"
		"(C) 1997 Bert Jahn, (C) 1999 Tatsuyuki Satoh, (C)\n"
		"2001-2006 Russell Marks\n"
		"\n"
		"Supported module formats:"
	);
	gtk_object_set_data(GTK_OBJECT(label1), "label1", label1);
	gtk_box_pack_start(GTK_BOX(vbox1), label1, TRUE, TRUE, 0);

	scroll1 = gtk_scrolled_window_new(NULL, NULL);
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll1),
			GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
	gtk_widget_set_size_request(scroll1, 290, 100);
	gtk_object_set_data(GTK_OBJECT(scroll1), "scroll1", scroll1);
	gtk_widget_set (scroll1, "height", 100, NULL);
	gtk_box_pack_start(GTK_BOX(vbox1), scroll1, TRUE, TRUE, 0);

	xmp_get_fmt_info(&fmt);
	table1 = gtk_table_new(100, 2, FALSE);
	for (i = 0, f = fmt; f; i++, f = f->next) {
		label_fmt = gtk_label_new(f->id);
		label_trk = gtk_label_new(f->tracker);
		gtk_label_set_justify (GTK_LABEL (label_fmt), GTK_JUSTIFY_LEFT);
		gtk_label_set_justify (GTK_LABEL (label_trk), GTK_JUSTIFY_LEFT);
		gtk_table_attach_defaults (GTK_TABLE (table1),
						label_fmt, 0, 1, i, i + 1);
		gtk_table_attach_defaults (GTK_TABLE (table1),
						label_trk, 1, 2, i, i + 1);
	}

	gtk_table_resize (GTK_TABLE (table1), i + 1, 3);
	gtk_object_set_data(GTK_OBJECT(table1), "table1", table1);
	
	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll1),
								table1);

	about_exit = gtk_button_new_with_label("Ok");
	gtk_signal_connect_object(GTK_OBJECT(about_exit), "clicked",
		GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(about_window));

	gtk_object_set_data(GTK_OBJECT(about_window), "about_exit", about_exit);
	gtk_box_pack_start(GTK_BOX(vbox1), about_exit, FALSE, FALSE, 0);

	gtk_widget_show_all(about_window);
}