Esempio n. 1
0
static void
double_pref_create_widget (GOConfNode *node, GtkWidget *grid,
			   gint row, gnm_float val, gnm_float from, gnm_float to,
			   gnm_float step, gint digits,
			   double_conf_setter_t setter,
			   double_conf_getter_t getter,
			   char const *default_label)
{
	GtkWidget *w =  gtk_spin_button_new (GTK_ADJUSTMENT (
		gtk_adjustment_new (val, from, to, step, step, 0)),
		1, digits);
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), getter ());
	g_object_set_data (G_OBJECT (w), "node", node);
	gtk_widget_set_hexpand (w, TRUE);
	gtk_grid_attach (GTK_GRID (grid), w, 1, row, 1, 1);

	g_object_set_data (G_OBJECT (w), "getter", getter);
	g_signal_connect (G_OBJECT (w), "value-changed",
		G_CALLBACK (double_pref_widget_to_conf), (gpointer) setter);
	connect_notification (node,
			      (GOConfMonitorFunc)double_pref_conf_to_widget,
			      w, grid);

	pref_create_label (node, grid, row, default_label, w);
	set_tip (node, w);
}
Esempio n. 2
0
void qm_trayIcon::set_mode(int mode)
{
    switch (mode)
    {
		case ID_play: // playing
        {
            a_playpause->setIcon(pxb_pause);
            a_playpause->setText(tr("Pause"));
            setIcon(pxb_st_playing);
            break;
        }

		case ID_paus: // paused
        {
            a_playpause->setIcon(pxb_play);
            a_playpause->setText(tr("Play"));
            setIcon(pxb_st_paused);
            break;
        }

		case ID_stop: // stopped
        {
            a_playpause->setIcon(pxb_play);
            a_playpause->setText(tr("Play"));
            setIcon(pxb_st_stopped);
            break;
        }

		case ID_nocn: // noconnection
        {
            a_playpause->setIcon(pxb_play);
            a_playpause->setText(tr("Play"));
            setIcon(pxb_st_noconn);
            set_tip(" " + tr("Not Connected") + " ");
            break;
        }

		default:
        {
            a_playpause->setIcon(pxb_play);
            a_playpause->setText(tr("Play"));
            setIcon(pxb_st_idle);
            set_tip(" " + tr("Idle") + " ");
            break;
        }
    }
}
Esempio n. 3
0
static void
enum_pref_create_widget (GOConfNode *node, GtkWidget *grid,
			 gint row, GType enum_type,
			 enum_conf_setter_t setter,
			 enum_conf_getter_t getter,
			 gchar const *default_label,
                         char const *(*label_getter)(int))
{
	unsigned int	 i;
	GtkTreeIter	 iter;
	GtkCellRenderer	*renderer;
	GEnumClass	*enum_class = G_ENUM_CLASS (g_type_class_ref (enum_type));
	GtkWidget	*combo = gtk_combo_box_new ();
	GtkListStore	*model = gtk_list_store_new (2,
		G_TYPE_STRING, G_TYPE_POINTER);
	gint             current = getter ();
	gint             current_index = -1;

	for (i = 0; i < enum_class->n_values ; i++) {
		gtk_list_store_append (model, &iter);
		gtk_list_store_set (model, &iter,
			0,	label_getter ((int) enum_class->values[i].value),
			1,	enum_class->values + i,
			-1);
		if (enum_class->values[i].value == current)
			current_index = i;
	}

	g_type_class_unref (enum_class);

	gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (model));
	g_object_unref (model);
	renderer = gtk_cell_renderer_text_new ();
	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", 0, NULL);

	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), current_index);

	gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);

	g_signal_connect (G_OBJECT (combo), "changed",
		G_CALLBACK (cb_enum_changed), (gpointer) setter);
	connect_notification (node, (GOConfMonitorFunc)enum_pref_conf_to_widget,
			      combo, grid);

	pref_create_label (node, grid, row, default_label, combo);
	set_tip (node, combo);
}
Esempio n. 4
0
static void
bool_pref_create_widget (GOConfNode *node, GtkWidget *grid,
			 gint row, gboolean_conf_setter_t setter,
			 gboolean_conf_getter_t getter,
			 char const *default_label)
{
	const char *desc = gnm_conf_get_short_desc (node);
	GtkWidget *item = gtk_check_button_new_with_label (
		(desc != NULL) ? desc : default_label);

	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), getter ());

	g_object_set_data (G_OBJECT (item), "getter", getter);
	g_signal_connect (G_OBJECT (item), "toggled",
			  G_CALLBACK (bool_pref_widget_to_conf),
			  (gpointer) setter);
	gtk_grid_attach (GTK_GRID (grid), item, 0, row, 2, 1);

	connect_notification (node, (GOConfMonitorFunc)bool_pref_conf_to_widget,
			      item, grid);
	set_tip (node, item);
}
Esempio n. 5
0
File: utils.cpp Progetto: dyne/MuSE
GtkWidget *createbbox(GtkWidget *bbox)
{
	GtkWidget *ice, *clame, *addch, *help, *vumeters;

	ice = clame = addch = help = vumeters = NULL;

	bbox=gtk_hbutton_box_new();
	gtk_button_box_set_child_size(GTK_BUTTON_BOX(bbox), 7, 10);
	gtk_hbutton_box_set_spacing_default(0);
	gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_START);
	
	ice = createpixmap(window, ice, stream_xpm, _("Let's stream!"), FALSE);
	g_signal_connect(G_OBJECT(ice), "clicked", 
			G_CALLBACK(ice_window), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), ice);

	addch = createpixmap(window, addch, newch_xpm, 
			_("Add Channel"), FALSE);
	g_signal_connect_swapped(G_OBJECT(addch), "clicked",
			G_CALLBACK(createch), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), addch);
		
	/* 
	   il talk sarebbe da mettere solo come hotkey
	   
	mic = createpixmap(window, mic, stock_mic_xpm, _("Talk"), TRUE);
	g_signal_connect(G_OBJECT(mic), "clicked",
			G_CALLBACK(gcb_set_talk), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), mic);
	*/

	linein = createpixmap(window, linein, mic_xpm, _("Line In"), TRUE);
	g_signal_connect(G_OBJECT(linein), "clicked",
			G_CALLBACK(gcb_set_linein), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), linein);

	speakout = createpixmap(window, speakout, speaker_xpm, 
			_("Speaker"), TRUE);
	g_signal_connect(G_OBJECT(speakout), "clicked",
			G_CALLBACK(gcb_set_speakout), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), speakout);
	
	vumeters = createpixmap(window, vumeters, vu_xpm, 
			_("Vumeters"), FALSE);
	g_signal_connect(G_OBJECT(vumeters), "clicked",
			G_CALLBACK(vumeters_new), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), vumeters);

#ifdef MUSE_EXPERIMENTAL
	tmpwid = gtk_image_new_from_stock(GTK_STOCK_INDEX, GTK_ICON_SIZE_BUTTON);
	scheduler = gtk_button_new();
	gtk_container_add(GTK_CONTAINER(scheduler), tmpwid);
	set_tip(scheduler, "Radio Scheduler");
	g_signal_connect(G_OBJECT(scheduler), "clicked",
			G_CALLBACK(rsched_new), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), scheduler);
#endif
	
	help = createpixmap(window, help, about_xpm, 
			_("Hall of Fame"), FALSE);
	g_signal_connect(G_OBJECT(help), "clicked",
			G_CALLBACK(about_win), NULL);
	gtk_container_add(GTK_CONTAINER(bbox), help);

	return bbox;

}
void
um_photo_dialog_set_user (UmPhotoDialog *um,
                          UmUser        *user)
{
        UmUserManager *manager;
        GSList *list, *l;
        UmUser *u;
        GIcon *icon;
        GEmblem *emblem;
        GList *children, *c;

        g_return_if_fail (um != NULL);

        if (um->user) {
                g_object_unref (um->user);
                um->user = NULL;
        }
        um->user = user;

        if (um->user) {
                g_object_ref (um->user);

                children = gtk_container_get_children (GTK_CONTAINER (um->photo_popup));
                g_list_foreach (children, (GFunc) clear_tip, NULL);

                manager = um_user_manager_ref_default ();
                list = um_user_manager_list_users (manager);
                g_object_unref (manager);

                icon = g_themed_icon_new ("avatar-default");
                emblem = g_emblem_new (icon);
                g_object_unref (icon);

                for (l = list; l; l = l->next) {
                        const char *filename;

                        u = l->data;
                        if (u == user)
                                continue;
                        filename = um_user_get_icon_file (u);
                        if (filename  == NULL)
                                continue;
                        for (c = children; c; c = c->next) {
                                const char *f;

                                f = g_object_get_data (G_OBJECT (c->data), "filename");
                                if (f == NULL)
                                        continue;
                                if (strcmp (f, filename) == 0) {
                                        char *tip;

                                        tip = g_strdup_printf (_("Used by %s"),
                                                               um_user_get_real_name (u));
                                        set_tip (GTK_WIDGET (c->data), tip, emblem);
                                        g_free (tip);
                                        break;
                                }
                        }
                }
                g_slist_free (list);

                g_object_unref (emblem);
        }
}
Esempio n. 7
0
File: gchan.cpp Progetto: dyne/MuSE
bool createch(void)
{
	struct gchan *object;
	GtkWidget *fixed;
	GtkWidget *frami1;
	GtkWidget *vbox, *htast, *hbot;
	GtkObject *adj, *adj1;
	GtkWidget *playmenu, *playmenuopt;
	GtkWidget *tmpwid, *tmpwid1, *dock;
	GtkWidget *progress; 
	GtkWidget *volume; 
	GtkWidget *scrollwin;
	GtkWidget *table, *rmit/*, *file, *http*/;
	GtkWidget *piddi;
	GtkTreeSelection *select;
	GtkListStore *store;
	GtkWidget *tree;
	GtkCellRenderer *renderer;
	GtkTreeViewColumn *column;
	GtkTargetEntry target_entry[3];

	gchar numchan[16];
	unsigned int pos=0;
	unsigned int idx=1;	
	dock=rmit=NULL;


	while(( object = (struct gchan *) list_get_data(listachan, idx, 0) ))
		idx++;
	
	if(idx > MAX_CHANNELS)
		return FALSE;
	
	func(_("GTK_GUI::createch(%u)"), idx);
	object = (struct gchan *) g_malloc (sizeof(struct gchan));
	
	object->idx = idx;	
	object->channel = 0; /* nothing */
	
	func(_("GTK_GUI::createch : chan[%u] is at %p"), idx, object);

	mixer->create_channel(idx-1);

	snprintf(numchan, 16, _("Channel[%u]"), object->idx);
	frami1 = gtk_frame_new(numchan);
	object->frami = frami1;
	gtk_frame_set_shadow_type(GTK_FRAME(frami1), GTK_SHADOW_ETCHED_OUT);
	
	vbox = gtk_vbox_new(FALSE, 0); 
	gtk_container_add(GTK_CONTAINER(frami1), vbox);
	
	/* at the moment pos is 0 function */
	list_add(&listachan, (void *) object, pos, idx, object->frami);
	

	htast = gtk_hbox_new(TRUE, 0); /* same dimension */
	fixed = gtk_fixed_new();
	gtk_fixed_put(GTK_FIXED(fixed), htast, 0, 0);
	gtk_box_pack_start(GTK_BOX(vbox), fixed, FALSE, FALSE, 0);

	/* addiamo il coso del tempo */
	tmpwid = gtk_entry_new_with_max_length(9);
	object->ptime = tmpwid;
	gtk_widget_set_size_request(tmpwid, 55, 22);
	gtk_entry_set_text(GTK_ENTRY(tmpwid), "00:00:00");
	gtk_entry_set_editable(GTK_ENTRY(tmpwid), FALSE);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, FALSE, 0);
	
	/* enjoy ourselves with buttons */
	
	tmpwid = createpixmap(window, tmpwid, play_xpm, 
			_("Play Channel"), TRUE);
	object->play = tmpwid;
	g_signal_connect(G_OBJECT(tmpwid), "pressed",
			G_CALLBACK(gcb_play_channel), object);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, TRUE, 0);
	
	tmpwid = createpixmap(window, tmpwid, stop_xpm, 
			_("Stop Channel"), FALSE);
	g_signal_connect(G_OBJECT(tmpwid), "pressed",
			G_CALLBACK(gcb_stop_channel), object);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, TRUE, 0);
	
	tmpwid = createpixmap(window, tmpwid, pause_xpm, 
			_("Pause Channel"), TRUE);
	object->pause = tmpwid;
	g_signal_connect(G_OBJECT(tmpwid), "clicked",
			G_CALLBACK(gcb_pause_channel), object);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, TRUE, 0);

	tmpwid = createpixmap(window, tmpwid, rewind_xpm, 
			_("Rewind Channel"), FALSE);
	g_signal_connect(G_OBJECT(tmpwid), "clicked",
			G_CALLBACK(gcb_begin_channel), object);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, TRUE, 0);
	
	tmpwid = createpixmap(window, tmpwid, forward_xpm, 
			_("Forward Channel"), FALSE);
	g_signal_connect(G_OBJECT(tmpwid), "clicked",
			G_CALLBACK(gcb_end_channel), object);
	gtk_box_pack_start(GTK_BOX(htast), tmpwid, FALSE, TRUE, 0);
	
	/* second part */
	adj = gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0);
	object->adjprog = adj;
	progress = gtk_hscale_new(GTK_ADJUSTMENT(adj));
	gtk_range_set_update_policy(GTK_RANGE(progress),GTK_UPDATE_DELAYED);
	gtk_scale_set_digits(GTK_SCALE(progress), 6);
	object->progress = progress;

	gtk_scale_set_draw_value(GTK_SCALE(progress), FALSE);
	/*
	g_signal_connect(G_OBJECT(progress), "button_press_event",
			   G_CALLBACK(gcb_event_pause_channel), object);
	g_signal_connect(G_OBJECT(progress), "button_release_event",
			G_CALLBACK(gcb_event_set_position), object);
	*/

	/* here there is a problem: the position sticks to the mouse
	   maybe there is a way to say to unfocus the widget after moving it? */
	g_signal_connect(G_OBJECT(progress), "button_release_event",
			G_CALLBACK(gcb_event_set_position), object);
	gtk_box_pack_start(GTK_BOX(vbox), progress, FALSE, FALSE, 0);

	hbot = gtk_hbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(vbox), hbot);
	
	/* volume adjustment  */
	adj1 = gtk_adjustment_new(0.0, 0.0, 1.0, 0.01, 0.01, 0.0);
	object->adjvol = adj1;
	object->volid = g_signal_connect(G_OBJECT(adj1), "value_changed",
			G_CALLBACK(gcb_set_volume), object);

#ifdef WITH_SPEED
	/* speed adjustment */
	object->adjspeed = gtk_adjustment_new(1.0, 0.0, 1.0, 0.1, 0.1, 0.0);
	g_signal_connect(G_OBJECT(object->adjspeed), "value_changed",
			G_CALLBACK(gcb_set_speed), object);
#endif
	
	volume = gtk_vscale_new(GTK_ADJUSTMENT(adj1));
	gtk_scale_set_draw_value(GTK_SCALE(volume), FALSE);

	tmpwid = gtk_table_new(2, 1, FALSE);
	gtk_box_pack_start(GTK_BOX(hbot), tmpwid, FALSE, FALSE, 0);
	tmpwid1 = gtk_vbox_new(FALSE, 0);
	object->vol_lab = gtk_label_new(_("VOL"));
	gtk_box_pack_start(GTK_BOX(tmpwid1), object->vol_lab, FALSE, FALSE, 0);
	
	gtk_box_pack_start(GTK_BOX(tmpwid1), volume, TRUE, TRUE, 0);
	object->vol_lab=gtk_label_new(_("100"));
	gtk_box_pack_start(GTK_BOX(tmpwid1), object->vol_lab, FALSE, FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(tmpwid), tmpwid1, 0, 1, 1, 2);

#ifdef WITH_SPEED
	/* speed widget */
	//	tmpwid1=gtk_vbox_new(FALSE, 0);
	object->speed=gtk_tx_dial_new(GTK_ADJUSTMENT(object->adjspeed));
	set_tip(object->speed, _("Speed"));
	gtk_box_pack_start(GTK_BOX(tmpwid1), object->speed, FALSE, FALSE, 0);
	object->speed_lab=gtk_label_new(_("100"));
	gtk_box_pack_start(GTK_BOX(tmpwid1), object->speed_lab, FALSE, FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(tmpwid), tmpwid1, 0, 1, 0, 1);
#endif

	scrollwin = gtk_scrolled_window_new(NULL, NULL);
	gtk_widget_set_size_request(scrollwin, 90, 140);
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), 
					GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);

	
	store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
	tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
	g_object_unref(store);
	object->tree = tree;
	//gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
	
	/* DND stuff */
	target_entry[0].target = (gchar *)DRAG_TAR_NAME_0;
	target_entry[0].flags = 0;
	target_entry[0].info = DRAG_TAR_INFO_0;

	target_entry[1].target = (gchar *)DRAG_TAR_NAME_1;
	target_entry[1].flags = 0;
	target_entry[1].info = DRAG_TAR_INFO_1;

	target_entry[2].target = (gchar *)DRAG_TAR_NAME_2;
	target_entry[2].flags = 0;
	target_entry[2].info = DRAG_TAR_INFO_2;

	gtk_drag_dest_set(
		tree, 
		(GtkDestDefaults)(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT |
		GTK_DEST_DEFAULT_DROP),
		target_entry,sizeof(target_entry) / sizeof(GtkTargetEntry),
		GDK_ACTION_MOVE);
	g_signal_connect(G_OBJECT(tree), "drag_motion",
			G_CALLBACK(DND_data_motion), object);
	gtk_drag_source_set(
		tree,
		(GdkModifierType) (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK),
		target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry),
		GDK_ACTION_MOVE);
	
	g_signal_connect(G_OBJECT(tree), "drag_begin",
			G_CALLBACK(DND_begin), object);
	g_signal_connect(G_OBJECT(tree), "drag_end",
			G_CALLBACK(DND_end), object);
	g_signal_connect(G_OBJECT(tree), "drag_data_get",
			G_CALLBACK(DND_data_get), object);
	g_signal_connect(G_OBJECT(tree), "drag_data_received",
			G_CALLBACK(DND_data_received), object);
	g_signal_connect(G_OBJECT(tree), "drag_data_delete",
			G_CALLBACK(DND_data_delete), object);
	
	/* end*/

	select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
	gtk_tree_selection_set_mode (select, GTK_SELECTION_MULTIPLE);
	/*g_signal_connect(G_OBJECT(select), "changed",
			 G_CALLBACK(gcb_set_channel), object);
*/
	g_signal_connect(G_OBJECT(tree), "button_press_event",
			G_CALLBACK(gcb_event_view_popup), object);
        renderer = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes("Nick", 
			renderer, "text", TITLE, NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);			
	gtk_container_add(GTK_CONTAINER(scrollwin), tree);
	gtk_box_pack_start(GTK_BOX(hbot), scrollwin, TRUE, TRUE, 0);
	

	/* playmode menu */
	playmenu = gtk_menu_new();
	tmpwid = gtk_menu_item_new_with_label(_("single play"));
	gtk_menu_append(GTK_MENU(playmenu), tmpwid);
	
	tmpwid=gtk_menu_item_new_with_label(_("loop"));
	gtk_menu_append(GTK_MENU(playmenu), tmpwid);
	
	tmpwid=gtk_menu_item_new_with_label(_("continuous"));
	gtk_menu_append(GTK_MENU(playmenu), tmpwid);

	playmenuopt = gtk_option_menu_new();
	gtk_option_menu_set_menu(GTK_OPTION_MENU(playmenuopt), playmenu);
	g_signal_connect(G_OBJECT(playmenuopt), "changed",
			G_CALLBACK(gcb_set_playmode), object);
	
	rmit = gtk_button_new();
	tmpwid = gtk_image_new_from_stock(GTK_STOCK_CANCEL, 
			GTK_ICON_SIZE_LARGE_TOOLBAR);
	gtk_container_add(GTK_CONTAINER(rmit), tmpwid);
	object->rmit = rmit;

	g_signal_connect(G_OBJECT(object->rmit),"clicked",
			G_CALLBACK(gcb_deletech), object);

	dock = createpixmap(window, dock, dock_xpm, 
			_("Undock Channel"), FALSE);
	object->dock = dock;
	g_signal_connect(G_OBJECT(object->dock), "clicked",
			G_CALLBACK(dockchan), object);

	piddi = gtk_hbox_new(FALSE, 0);
	object->hbox = piddi;
	gtk_box_pack_start(GTK_BOX(piddi), rmit, FALSE, FALSE, 0);
	gtk_box_pack_start(GTK_BOX(piddi), dock, FALSE, FALSE, 0);

	table = gtk_table_new(1, 4, TRUE);
	object->table = table;
	gtk_table_attach_defaults(GTK_TABLE(table), piddi, 0, 1, 0, 1);
	gtk_table_attach_defaults(GTK_TABLE(table), playmenuopt, 3, 5, 0, 1);

	gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);

	object->playmode = 0;

	/* pack_chan_insert and pos update */
	pos = pack_chan_insert(object->frami);


	return TRUE;
}
Esempio n. 8
0
static GtkWidget *
wordlist_pref_create_widget (GOConfNode *node, GtkWidget *grid,
			     gint row, wordlist_conf_setter_t setter,
			     wordlist_conf_getter_t getter,
			     char const *default_label)
{
	GtkWidget *w = gtk_grid_new ();
	GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
	GtkWidget *tv = gtk_tree_view_new ();
	GtkWidget *entry = gtk_entry_new ();
	GtkWidget *add_button = gtk_button_new_from_stock (GTK_STOCK_ADD);
	GtkWidget *remove_button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
	GtkListStore	*model = gtk_list_store_new (1, G_TYPE_STRING);
	GtkTreeSelection *selection;

	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
					     GTK_SHADOW_ETCHED_IN);
	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE);
	gtk_container_add (GTK_CONTAINER (sw), tv);

	g_object_set (w, "column-spacing", 12, "row-spacing", 6,
	              "hexpand", TRUE, "vexpand", TRUE, NULL);
	gtk_grid_attach (GTK_GRID (grid), w, 0, row, 2, 1);
	g_object_set (sw, "hexpand", TRUE, "vexpand", TRUE, NULL);
	gtk_grid_attach (GTK_GRID (w), sw, 0, 1, 1, 3);
	gtk_widget_set_hexpand (entry, TRUE);
	gtk_grid_attach (GTK_GRID (w), entry, 0, 4, 1, 1);
	gtk_widget_set_valign (remove_button, GTK_ALIGN_END);
	gtk_grid_attach (GTK_GRID (w), remove_button, 1, 3, 1, 1);
	gtk_grid_attach (GTK_GRID (w), add_button, 1, 4, 1, 1);

	gtk_tree_view_set_model (GTK_TREE_VIEW (tv),
				 GTK_TREE_MODEL (model));
	g_object_unref (model);
	gtk_tree_view_append_column (GTK_TREE_VIEW (tv),
				     gtk_tree_view_column_new_with_attributes
				     (NULL,
				      gtk_cell_renderer_text_new (),
				      "text", 0,
				      NULL));
	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tv));
	gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
	wordlist_pref_conf_to_widget (node, "", model);

	g_object_set_data (G_OBJECT (remove_button), "treeview", tv);
	g_object_set_data (G_OBJECT (add_button), "entry", entry);
	g_object_set_data (G_OBJECT (remove_button), "getter", getter);
	g_object_set_data (G_OBJECT (add_button), "getter", getter);
	g_signal_connect (G_OBJECT (remove_button), "clicked",
		G_CALLBACK (wordlist_pref_remove), setter);
	g_signal_connect (G_OBJECT (add_button), "clicked",
		G_CALLBACK (wordlist_pref_add), setter);
	g_signal_connect (G_OBJECT (selection), "changed",
		G_CALLBACK (wordlist_pref_update_remove_button), remove_button);
	wordlist_pref_update_remove_button (selection,
					    GTK_BUTTON (remove_button));

	connect_notification (node, (GOConfMonitorFunc)wordlist_pref_conf_to_widget,
			      model, grid);

	pref_create_label (node, w, 0, default_label, tv);
	set_tip (node, tv);
	return w;
}