static GtkWidget* find_widget(GtkWidget* parent, const gchar* name, int depth)
{
    // printf("%*.*c%s\n", depth, depth, ' ', gtk_widget_get_name(parent));
   
    GtkWidget *widget = NULL;
    if (g_strcasecmp(gtk_widget_get_name(parent), name) == 0)
    {
        return parent;
    }

    if (GTK_IS_BIN(parent))
    {
        return find_widget(gtk_bin_get_child(GTK_BIN(parent)), name, depth + 1);
    }

    if (GTK_IS_CONTAINER(parent))
    {
        GList *list = gtk_container_get_children(GTK_CONTAINER(parent));
        for (GList *node = list; node; node = node->next)
        {
            widget = find_widget(GTK_WIDGET(node->data), name, depth + 1);
            if (widget)
            {
               break;
            }
        }
        g_list_free(list);
    }

    return widget;
}
示例#2
0
文件: widget.c 项目: cgbarnwell/mvpmc
static void
raise_widget(mvp_widget_t *widget, mvp_widget_t *top)
{
	int wid;

	if (widget) {
		if (top == NULL) {
			wid = GrGetFocus();
			top = find_widget(wid);
		}

		if (top == widget)
			return;

		if (widget->below)
			widget->below->above = widget->above;
		if (widget->above)
			widget->above->below = widget->below;
		widget->below = top;
		widget->above = NULL;

		if (top) {
			top->above = widget;
		}

		GrSetFocus(widget->wid);
	}
}
示例#3
0
void menu_init(void)
{
	GtkMenuShell *shell = GTK_MENU_SHELL(geany->main_widgets->editor_menu);
	GList *children = gtk_container_get_children(GTK_CONTAINER(shell));
	GtkWidget *search2 = find_widget(shell, "search2");

	block_execute = FALSE;
	active_menu = NULL;
	input = NULL;

	popup_item = get_widget("popup_item");
	menu_connect("popup_menu", &popup_menu_info, NULL);
	g_signal_connect(get_widget("popup_evaluate"), "button-release-event",
		G_CALLBACK(on_popup_evaluate_button_release), geany->main_widgets->editor_menu);

	if (search2)
		gtk_menu_shell_insert(shell, popup_item, g_list_index(children, search2) + 1);
	else
		gtk_menu_shell_append(shell, popup_item);

	modify_dialog = dialog_connect("modify_dialog");
	modify_value_label = GTK_LABEL(get_widget("modify_value_label"));
	modify_value = get_widget("modify_value");
	modify_text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(modify_value));
	modify_ok = get_widget("modify_ok");
	utils_enter_to_clicked(modify_value, modify_ok);
}
void FileDialog::AddChildGTK(wxWindowGTK* child)
{
    // allow dialog to be resized smaller horizontally
    gtk_widget_set_size_request(
        child->m_widget, child->GetMinWidth(), child->m_height);

//    In GTK 3+, adding our container as the extra widget can cause the
//    the filter combo to grow to the same height as our container.  This
//    makes for a very odd looking filter combo.  So, we manually add our
//    container below the action bar.
#if GTK_CHECK_VERSION(3,0,0)
    GtkWidget *actionbar = find_widget(m_widget, "GtkActionBar", 0);
    if (actionbar)
    {
        GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        gtk_container_add(GTK_CONTAINER(vbox), child->m_widget);
        gtk_box_set_child_packing(GTK_BOX(vbox), child->m_widget, TRUE, TRUE, 0, GTK_PACK_START);
        gtk_widget_show(vbox);

        GtkWidget *abparent = gtk_widget_get_parent(actionbar);
        gtk_container_add(GTK_CONTAINER(abparent), vbox);
        gtk_box_set_child_packing(GTK_BOX(abparent), vbox, FALSE, FALSE, 0, GTK_PACK_END);
        gtk_box_reorder_child(GTK_BOX(abparent), actionbar, -2);
    }
#else
    gtk_file_chooser_set_extra_widget(
        GTK_FILE_CHOOSER(m_widget), child->m_widget);
#endif
}
示例#5
0
/**
 * Gets the value of a widget on the current dialog.
 * - Args 1..n: path of strings and integers.
 * - Ret 1: scalar.
 */
int intf_get_dialog_value(lua_State *L)
{
	gui2::twidget *w = find_widget(L, 1, true);

#ifdef GUI2_EXPERIMENTAL_LISTBOX
	if (gui2::tlist *l = dynamic_cast<gui2::tlist *>(w))
#else
	if (gui2::tlistbox *l = dynamic_cast<gui2::tlistbox *>(w))
#endif
	{
		lua_pushinteger(L, l->get_selected_row() + 1);
	} else if (gui2::tmulti_page *l = dynamic_cast<gui2::tmulti_page *>(w)) {
		lua_pushinteger(L, l->get_selected_page() + 1);
	} else if (gui2::tselectable_ *s = dynamic_cast<gui2::tselectable_ *>(w)) {
		lua_pushboolean(L, s->get_value());
	} else if (gui2::ttext_box *t = dynamic_cast<gui2::ttext_box *>(w)) {
		lua_pushstring(L, t->get_value().c_str());
	} else if (gui2::tslider *s = dynamic_cast<gui2::tslider *>(w)) {
		lua_pushinteger(L, s->get_value());
	} else if (gui2::tprogress_bar *p = dynamic_cast<gui2::tprogress_bar *>(w)) {
		lua_pushinteger(L, p->get_percentage());
	} else if (gui2::ttree_view *tv = dynamic_cast<gui2::ttree_view *>(w)) {
		std::vector<int> path = tv->selected_item()->describe_path();
		lua_createtable(L, path.size(), 0);
		for(size_t i =0; i < path.size(); ++i) {
			lua_pushinteger(L, path[i] + 1);
			lua_rawseti(L, -2, i + 1);
		}
	} else
		return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	return 1;
}
示例#6
0
/**
 * Sets a callback on a widget of the current dialog.
 * - Arg 1: function.
 * - Args 2..n: path of strings and integers.
 */
int intf_set_dialog_callback(lua_State *L)
{
	gui2::twidget *w = find_widget(L, 2, true);

	scoped_dialog::callback_map &m = scoped_dialog::current->callbacks;
	scoped_dialog::callback_map::iterator i = m.find(w);
	if (i != m.end())
	{
		lua_pushstring(L
				, dlgclbkKey);
		lua_rawget(L, LUA_REGISTRYINDEX);
		lua_pushnil(L);
		lua_rawseti(L, -2, i->second);
		lua_pop(L, 1);
		m.erase(i);
	}

	if (lua_isnil(L, 1)) return 0;

	if (gui2::tclickable_ *c = dynamic_cast<gui2::tclickable_ *>(w)) {
		static tdialog_callback_wrapper wrapper;
		c->connect_click_handler(boost::bind(
									  &tdialog_callback_wrapper::forward
									, wrapper
									, w));
	} else if (gui2::tselectable_ *s = dynamic_cast<gui2::tselectable_ *>(w)) {
		s->set_callback_state_change(&dialog_callback);
	}
#ifdef GUI2_EXPERIMENTAL_LISTBOX
	else if (gui2::tlist *l = dynamic_cast<gui2::tlist *>(w)) {
		static tdialog_callback_wrapper wrapper;
		connect_signal_notify_modified(*l
				, boost::bind(
					  &tdialog_callback_wrapper::forward
					, wrapper
					, w));
	}
#else
	else if (gui2::tlistbox *l = dynamic_cast<gui2::tlistbox *>(w)) {
		l->set_callback_value_change(&dialog_callback);
	}
#endif
	else if (gui2::ttree_view *tv = dynamic_cast<gui2::ttree_view *>(w)) {
		tv->set_selection_change_callback(&dialog_callback);
	}
	else
		return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	lua_pushstring(L
			, dlgclbkKey);
	lua_rawget(L, LUA_REGISTRYINDEX);
	int n = lua_rawlen(L, -1) + 1;
	m[w] = n;
	lua_pushvalue(L, 1);
	lua_rawseti(L, -2, n);
	lua_pop(L, 1);

	return 0;
}
示例#7
0
文件: widget.c 项目: cgbarnwell/mvpmc
mvp_widget_t*
mvpw_get_focus(void)
{
	int wid;

	wid = GrGetFocus();

	return find_widget(wid);
}
示例#8
0
	const T* find_widget(const std::string& id,
			const bool must_be_active, const bool must_exist) const
	{
		const T* widget =
			dynamic_cast<const T*>(find_widget(id, must_be_active));
		VALIDATE(!must_exist || widget, missing_widget(id));

		return widget;
	}
示例#9
0
/**
 * Sets a widget's state to active or inactive
 * - Arg 1: boolean.
 * - Args 2..n: path of strings and integers.
 */
int intf_set_dialog_active(lua_State *L)
{
	const bool b = luaW_toboolean(L, 1);
	gui2::twidget *w = find_widget(L, 2, true);
	gui2::tcontrol *c = dynamic_cast<gui2::tcontrol *>(w);
	if (!c) return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	c->set_active(b);
	return 0;
}
示例#10
0
文件: s.c 项目: CkNoSFeRaTU/pidgin
static gboolean
toggle_buddylist(GntBindable *bindable, GList *null)
{
	GntWM *wm = GNT_WM(bindable);
	GntWidget *blist = find_widget(wm, "buddylist");
	if (blist)
		gnt_widget_destroy(blist);
	else
		purple_blist_show();
	return TRUE;
}
示例#11
0
文件: widget.c 项目: cgbarnwell/mvpmc
static void
exposure(GR_EVENT_EXPOSURE *exposure)
{
	mvp_widget_t *widget;

	if ((widget=find_widget(exposure->wid)) == NULL) {
		printf("expose on unknown wid %d\n", exposure->wid);
		return;
	}

	if (widget->callback_expose)
		widget->callback_expose(widget);
	if (widget->expose)
		widget->expose(widget);
}
示例#12
0
/**
 * Sets a canvas on a widget of the current dialog.
 * - Arg 1: integer.
 * - Arg 2: WML table.
 * - Args 3..n: path of strings and integers.
 */
int intf_set_dialog_canvas(lua_State *L)
{
	int i = luaL_checkinteger(L, 1);
	gui2::twidget *w = find_widget(L, 3, true);
	gui2::tcontrol *c = dynamic_cast<gui2::tcontrol *>(w);
	if (!c) return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	std::vector<gui2::tcanvas> &cv = c->canvas();
	if (i < 1 || unsigned(i) > cv.size())
		return luaL_argerror(L, 1, "out of bounds");

	config cfg = luaW_checkconfig(L, 2);
	cv[i - 1].set_cfg(cfg);
	return 0;
}
示例#13
0
文件: widget.c 项目: cgbarnwell/mvpmc
static void
keystroke(GR_EVENT_KEYSTROKE *key)
{
	mvp_widget_t *widget;

	if (keystroke_callback)
		keystroke_callback(key->ch);

	if ((widget=find_widget(key->wid)) == NULL)
		return;

	if (widget->callback_key)
		widget->callback_key(widget, key->ch);
	if (widget->key)
		widget->key(widget, key->ch);
}
示例#14
0
文件: widget.c 项目: cgbarnwell/mvpmc
static void
timer(GR_EVENT_TIMER *timer)
{
	mvp_widget_t *widget;

	if ((widget=find_widget(timer->wid)) == NULL)
		return;

	if (widget->tid != timer->tid)
		return;

	if (widget->callback_timer)
		widget->callback_timer(widget);
	if (widget->timer)
		widget->timer(widget);
}
示例#15
0
int intf_add_dialog_tree_node(lua_State *L)
{
	const std::string node_type = luaL_checkstring(L, 1);
	const int insert_pos = luaL_checkinteger(L, 2);
	static const std::map<std::string, string_map> data;
	gui2::twidget *w = find_widget(L, 3, false);
	gui2::ttree_view_node *twn = dynamic_cast<gui2::ttree_view_node *>(w);
	if (!twn) {
		if(gui2::ttree_view* tw = dynamic_cast<gui2::ttree_view *>(w)) {
			twn = &tw->get_root_node();
		}
		else {
			return luaL_argerror(L, lua_gettop(L), "unsupported widget");
		}
	}
	twn->add_child(node_type, data, insert_pos);
	return 0;
}
示例#16
0
/**
 * Sets the visiblity of a widget in the current dialog.
 * - Arg 1: boolean.
 * - Args 2..n: path of strings and integers.
 */
int intf_set_dialog_visible(lua_State *L)
{
	typedef gui2::tcontrol::tvisible tvisible;

	tvisible::scoped_enum flag = tvisible::visible;

	switch (lua_type(L, 1)) {
		case LUA_TBOOLEAN:
			flag = bool(lua_toboolean(L, 1))
					? tvisible::visible
					: tvisible::invisible;
			break;
		case LUA_TSTRING:
			{
				const std::string& str = lua_tostring(L, 1);
				if(str == "visible") {
					flag = tvisible::visible;
				} else if(str == "hidden") {
					flag = tvisible::hidden;
				} else if(str == "invisible") {
					flag = tvisible::invisible;
				} else {
					return luaL_argerror(L, 1, "string must be one of: visible, hidden, invisible");
				}
			}
			break;
		default:
			return luaL_typerror(L, 1, "boolean or string");
	}

	gui2::twidget *w = find_widget(L, 2, true);
	gui2::tcontrol *c = dynamic_cast<gui2::tcontrol *>(w);
	if (!c) return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	c->set_visible(flag);

	if(flag == tvisible::hidden) {
		// HACK: this is needed to force the widget to be repainted immediately
		//       to get rid of its ghost image.
		scoped_dialog::current->window->invalidate_layout();
	}

	return 0;
}
示例#17
0
void NewLayerCommand::onExecute(Context* context)
{
  ActiveDocumentWriter document(context);
  Sprite* sprite(document->getSprite());
  std::string name;

  // Default name (m_name is a name specified in params)
  if (!m_name.empty())
    name = m_name;
  else
    name = get_unique_layer_name(sprite);

  // If params specify to ask the user about the name...
  if (m_ask) {
    // We open the window to ask the name
    FramePtr window(load_widget("new_layer.xml", "new_layer"));
    JWidget name_widget = find_widget(window, "name");
    name_widget->setText(name.c_str());
    jwidget_set_min_size(name_widget, 128, 0);

    window->open_window_fg();

    if (window->get_killer() != window->findChild("ok"))
      return;

    name = window->findChild("name")->getText();
  }

  Layer* layer;
  {
    UndoTransaction undoTransaction(document, "New Layer");
    layer = undoTransaction.newLayer();
    undoTransaction.commit();
  }
  layer->setName(name);
  update_screen_for_document(document);

  app_get_statusbar()->invalidate();
  app_get_statusbar()->showTip(1000, "Layer `%s' created", name.c_str());
}
示例#18
0
//-------------------------------------------------------------------------
bool py_idaview_t::Bind(PyObject *self)
{
  // Already a py_idaview_t associated to this object?
  py_idaview_t *_this = view_extract_this<py_idaview_t>(self);
  if ( _this != NULL )
    return false;

  qstring title;
  if ( !PyW_GetStringAttr(self, S_M_TITLE, &title) )
    return false;

  // Get the IDAView associated to this TWidget
  TWidget *widget = find_widget(title.c_str());
  if ( widget == NULL )
    return false;

  // Get unique py_idaview_t associated to that TWidget
  py_idaview_t *py_view;
  if ( !pycim_lookup_info.find_by_view((py_customidamemo_t**) &py_view, widget) )
  {
    py_view = new py_idaview_t();
    lookup_entry_t &e = pycim_lookup_info.new_entry(py_view);
    pycim_lookup_info.commit(e, widget);
  }

  // Finally, bind:
  //  py_idaview_t <=> IDAViewWrapper
  //  py_idaview_t  => TWidget
  bool ok = py_view->bind(self, widget);
  if ( ok )
  {
    ok = py_view->collect_pyobject_callbacks(self);
    if ( !ok )
      delete py_view;
  }
  return ok;
}
示例#19
0
static GtkWidget *
find_widget_at_pointer (GdkDevice *device)
{
  GtkWidget *widget = NULL;
  GdkWindow *pointer_window;
  gint x, y;
  FindWidgetData data;

  pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);

  if (pointer_window)
    {
      gpointer widget_ptr;

      gdk_window_get_user_data (pointer_window, &widget_ptr);
      widget = widget_ptr;
    }

  if (widget)
    {
      gdk_window_get_device_position (gtk_widget_get_window (widget),
                                      device, &x, &y, NULL);

      data.x = x;
      data.y = y;
      data.found = FALSE;
      data.first = TRUE;

      find_widget (widget, &data);
      if (data.found)
        return data.res_widget;

      return widget;
    }

  return NULL;
}
示例#20
0
/**
 * Removes an entry from a list.
 * - Arg 1: number, index of the element to delete.
 * - Arg 2: number, number of the elements to delete. (0 to delete all elements after index)
 * - Args 2..n: path of strings and integers.
 */
int intf_remove_dialog_item(lua_State *L)
{
	int pos = luaL_checkinteger(L, 1) - 1;
	int number = luaL_checkinteger(L, 2);
	gui2::twidget *w = find_widget(L, 3, true);

#ifdef GUI2_EXPERIMENTAL_LISTBOX
	if (gui2::tlist *l = dynamic_cast<gui2::tlist *>(w))
#else
	if (gui2::tlistbox *l = dynamic_cast<gui2::tlistbox *>(w))
#endif
	{
		l->remove_row(pos, number);
	} else if (gui2::tmulti_page *l = dynamic_cast<gui2::tmulti_page *>(w)) {
		l->remove_page(pos, number);
	} else if (gui2::ttree_view *tv = dynamic_cast<gui2::ttree_view *>(w)) {
		remove_treeview_node(tv->get_root_node(), pos, number);
	} else if (gui2::ttree_view_node *tvn = dynamic_cast<gui2::ttree_view_node *>(w)) {
		remove_treeview_node(*tvn, pos, number);
	} else
		return luaL_argerror(L, lua_gettop(L), "unsupported widget");

	return 1;
}
示例#21
0
 TWidget *get_widget()
 {
   return find_widget(chobj->title);
 }
示例#22
0
/**
 * Sets a widget to have the focus
 * - Args 1..n: path of strings and integers.
 */
int intf_set_dialog_focus(lua_State *L)
{
	gui2::twidget *w = find_widget(L, 1, true);
	scoped_dialog::current->window->keyboard_capture(w);
	return 0;
}
示例#23
0
	const T& get_widget(const std::string& id, const bool must_be_active) const
	{
		const T* result = dynamic_cast<const T*>(find_widget(id, must_be_active));
		VALIDATE(result, missing_widget(id));
		return *result;
	}
示例#24
0
void plugin_init(G_GNUC_UNUSED GeanyData *gdata)
{
	GeanyKeyGroup *scope_key_group;
	char *gladefile = g_build_filename(PLUGINDATADIR, "scope.glade", NULL);
	GError *gerror = NULL;
	GtkWidget *menubar1 = find_widget(geany->main_widgets->window, "menubar1");
	guint item;
	const MenuKey *menu_key = debug_menu_keys;
	ToolItem *tool_item = toolbar_items;
	const ScopeCallback *scb;

	main_locale_init(LOCALEDIR, GETTEXT_PACKAGE);
	scope_key_group = plugin_set_key_group(geany_plugin, "scope", COUNT_KB, NULL);
	builder = gtk_builder_new();
	gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE);
	scp_tree_store_register_dynamic();

	if (!gtk_builder_add_from_file(builder, gladefile, &gerror))
	{
		msgwin_status_add(_("Scope: %s."), gerror->message);
		g_warning(_("Scope: %s."), gerror->message);
		g_error_free(gerror);
		g_object_unref(builder);
		builder = NULL;
	}

	g_free(gladefile);
	if (!builder)
		return;

	/* interface */
#ifndef G_OS_UNIX
	gtk_widget_hide(get_widget("terminal_show"));
#endif
	debug_item = get_widget("debug_item");
	if (menubar1)
		gtk_menu_shell_insert(GTK_MENU_SHELL(menubar1), debug_item, DEBUG_MENU_ITEM_POS);
	else
		gtk_container_add(GTK_CONTAINER(geany->main_widgets->tools_menu), debug_item);

	menu_connect("debug_menu", &debug_menu_info, NULL);
	ui_add_document_sensitive(get_widget("scope_reset_markers"));
	ui_add_document_sensitive(get_widget("scope_cleanup_files"));

	for (item = 0; item < EVALUATE_KB; item++, menu_key++)
	{
		keybindings_set_item(scope_key_group, item, on_scope_key, 0, 0, menu_key->name,
			_(menu_key->label), debug_menu_items[item].widget);
	}

	geany_statusbar = GTK_STATUSBAR(gtk_widget_get_parent(geany->main_widgets->progressbar));
	debug_statusbar = get_widget("debug_statusbar");
	debug_state_label = GTK_LABEL(get_widget("debug_state_label"));
	gtk_box_pack_end(GTK_BOX(geany_statusbar), debug_statusbar, FALSE, FALSE, 0);

	debug_panel = get_widget("debug_panel");
	gtk_notebook_append_page(GTK_NOTEBOOK(geany->main_widgets->message_window_notebook),
		debug_panel, get_widget("debug_label"));

	/* startup */
	gtk216_init();
	program_init();
	prefs_init();
	conterm_init();
	inspect_init();
	register_init();
	parse_init();
	debug_init();
	views_init();
	thread_init();
	break_init();
	watch_init();
	stack_init();
	local_init();
	memory_init();
	menu_init();
	menu_set_popup_keybindings(scope_key_group, item);

	for (item = 0; tool_item->index != -1; item++, tool_item++)
	{
		GtkMenuItem *menu_item = GTK_MENU_ITEM(debug_menu_items[tool_item->index].widget);
		GtkToolItem *button = gtk_tool_button_new(NULL, gtk_menu_item_get_label(menu_item));

		gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(button),
			gtk_menu_item_get_use_underline(menu_item));
		g_signal_connect(button, "clicked", G_CALLBACK(on_toolbar_button_clicked),
			GINT_TO_POINTER(tool_item->index));
		g_signal_connect(button, "toolbar-reconfigured",
			G_CALLBACK(on_toolbar_reconfigured), tool_item);
		tool_item->widget = GTK_WIDGET(button);
		plugin_add_toolbar_item(geany_plugin, button);
	}

	toolbar_update_state(DS_INACTIVE);
	views_update_state(DS_INACTIVE);
	configure_toolbar();

	g_signal_connect(debug_panel, "switch-page", G_CALLBACK(on_view_changed), NULL);
	for (scb = scope_callbacks; scb->name; scb++)
		plugin_signal_connect(geany_plugin, NULL, scb->name, FALSE, scb->callback, NULL);
}
示例#25
0
/**
 * Sets the value of a widget on the current dialog.
 * - Arg 1: scalar.
 * - Args 2..n: path of strings and integers.
 */
int intf_set_dialog_value(lua_State *L)
{
	gui2::twidget *w = find_widget(L, 2, false);

#ifdef GUI2_EXPERIMENTAL_LISTBOX
	if (gui2::tlist *l = dynamic_cast<gui2::tlist *>(w))
#else
	if (gui2::tlistbox *l = dynamic_cast<gui2::tlistbox *>(w))
#endif
	{
		int v = luaL_checkinteger(L, 1);
		int n = l->get_item_count();
		if (1 <= v && v <= n)
			l->select_row(v - 1);
		else
			return luaL_argerror(L, 1, "out of bounds");
	}
	else if (gui2::tmulti_page *l = dynamic_cast<gui2::tmulti_page *>(w))
	{
		int v = luaL_checkinteger(L, 1);
		int n = l->get_page_count();
		if (1 <= v && v <= n)
			l->select_page(v - 1);
		else
			return luaL_argerror(L, 1, "out of bounds");
	}
	else if (gui2::tselectable_ *s = dynamic_cast<gui2::tselectable_ *>(w))
	{
		s->set_value(luaW_toboolean(L, 1));
	}
	else if (gui2::ttext_box *t = dynamic_cast<gui2::ttext_box *>(w))
	{
		const t_string& text = luaW_checktstring(L, 1);
		t->set_value(text.str());
	}
	else if (gui2::tslider *s = dynamic_cast<gui2::tslider *>(w))
	{
		const int v = luaL_checkinteger(L, 1);
		const int m = s->get_minimum_value();
		const int n = s->get_maximum_value();
		if (m <= v && v <= n)
			s->set_value(v);
		else
			return luaL_argerror(L, 1, "out of bounds");
	}
	else if (gui2::tprogress_bar *p = dynamic_cast<gui2::tprogress_bar *>(w))
	{
		const int v = luaL_checkinteger(L, 1);
		if (0 <= v && v <= 100)
			p->set_percentage(v);
		else
			return luaL_argerror(L, 1, "out of bounds");
	}
	else
	{
		t_string v = luaW_checktstring(L, 1);
		gui2::tcontrol *c = dynamic_cast<gui2::tcontrol *>(w);
		if (!c) return luaL_argerror(L, lua_gettop(L), "unsupported widget");
		c->set_label(v);
	}

	return 0;
}