Exemple #1
0
/* panel_helper_suspend */
static int _panel_helper_suspend(Panel * panel)
{
#ifdef __NetBSD__
	int sleep_state = 3;
#else
	int fd;
	char * suspend[] = { "/usr/bin/sudo", "sudo", "/usr/bin/apm", "-s",
		NULL };
	GError * error = NULL;
#endif

#ifdef __NetBSD__
	if(sysctlbyname("machdep.sleep_state", NULL, NULL, &sleep_state,
				sizeof(sleep_state)) != 0)
		return -panel_error(panel, "sysctl", 1);
#else
	if((fd = open("/sys/power/state", O_WRONLY)) >= 0)
	{
		write(fd, "mem\n", 4);
		close(fd);
		return 0;
	}
	if(g_spawn_async(NULL, suspend, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL,
				NULL, NULL, &error) != TRUE)
	{
		panel_error(panel, error->message, 1);
		g_error_free(error);
		return -1;
	}
#endif
	_panel_helper_lock(panel); /* XXX may already be suspended */
	return 0;
}
Exemple #2
0
static void _idle_load(Panel * panel, PanelPosition position)
{
	char const * plugins;
	char * p;
	char * q;
	size_t i;

	if((plugins = _panel_get_plugins(panel, position)) == NULL
			|| strlen(plugins) == 0)
		return;
	if((p = string_new(plugins)) == NULL)
	{
		panel_error(panel, error_get(), FALSE);
		return;
	}
	for(q = p, i = 0;;)
	{
		if(q[i] == '\0')
		{
			if(panel_load(panel, position, q) != 0)
				error_print(PACKAGE); /* we can ignore errors */
			break;
		}
		if(q[i++] != ',')
			continue;
		q[i - 1] = '\0';
		if(panel_load(panel, position, q) != 0)
			error_print(PACKAGE); /* we can ignore errors */
		q += i;
		i = 0;
	}
	free(p);
}
Exemple #3
0
static void _shutdown_dialog_on_response(GtkWidget * widget, gint response,
		gpointer data)
{
	Panel * panel = data;
	char * reboot[] = { "/sbin/shutdown", "shutdown", "-r", "now", NULL };
	char * shutdown[] = { "/sbin/shutdown", "shutdown",
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
		"-p",
#else
		"-h",
#endif
		"now", NULL };
	char ** argv;
	GError * error = NULL;

	gtk_widget_hide(widget);
	if(response == RES_SHUTDOWN)
		argv = shutdown;
	else if(response == RES_REBOOT)
		argv = reboot;
	else
		return;
	if(g_spawn_async(NULL, argv, NULL, G_SPAWN_FILE_AND_ARGV_ZERO, NULL,
				NULL, NULL, &error) != TRUE)
	{
		panel_error(panel, error->message, 1);
		g_error_free(error);
	}
}
Exemple #4
0
static gboolean _lock_on_idle(gpointer data)
{
	/* FIXME default to calling XActivateScreenSaver() */
	Panel * panel = data;
	char const * command = "xset s activate";
	char const * p;
	GError * error = NULL;

	panel->source = 0;
	if((p = config_get(panel->config, "lock", "command")) != NULL)
		command = p;
	if(g_spawn_command_line_async(command, &error) != TRUE)
	{
		panel_error(panel, error->message, 1);
		g_error_free(error);
	}
	return FALSE;
}
Exemple #5
0
/* panel_helper_error */
static int _panel_helper_error(Panel * panel, char const * message, int ret)
{
	return panel_error(panel, message, ret);
}
Exemple #6
0
Panel * panel_new(PanelPrefs const * prefs)
{
	Panel * panel;
	GdkRectangle rect;
	GtkIconSize iconsize;
	char const * p;
	gboolean focus;
	gboolean above;

	if((panel = object_new(sizeof(*panel))) == NULL)
		return NULL;
	panel->screen = gdk_screen_get_default();
	if(_new_config(panel) == 0)
		_new_prefs(panel->config, panel->screen, &panel->prefs, prefs);
	panel->top_helper.panel = panel;
	panel->top_helper.type = PANEL_APPLET_TYPE_NORMAL;
	panel->top_helper.icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
	panel->top_helper.config_get = _panel_helper_config_get;
	panel->top_helper.config_set = _panel_helper_config_set;
	panel->top_helper.error = _panel_helper_error;
	panel->top_helper.about_dialog = _panel_helper_about_dialog;
	panel->top_helper.lock = _panel_helper_lock;
#ifndef EMBEDDED
	panel->top_helper.logout_dialog = _panel_helper_logout_dialog;
#else
	panel->top_helper.logout_dialog = NULL;
#endif
	panel->top_helper.position_menu = _panel_helper_position_menu_top;
	panel->top_helper.preferences_dialog = _panel_helper_preferences_dialog;
	panel->top_helper.rotate_screen = _panel_helper_rotate_screen;
	panel->top_helper.shutdown_dialog = _panel_helper_shutdown_dialog;
	panel->top_helper.suspend = (_panel_can_suspend())
		? _panel_helper_suspend : NULL;
	panel->top = NULL;
	panel->bottom_helper = panel->top_helper;
	panel->bottom_helper.position_menu = _panel_helper_position_menu_bottom;
	panel->bottom = NULL;
	iconsize = GTK_ICON_SIZE_INVALID;
	if(panel->prefs.iconsize != NULL)
		iconsize = gtk_icon_size_from_name(panel->prefs.iconsize);
	if(iconsize == GTK_ICON_SIZE_INVALID)
	{
		panel->top_helper.icon_size = _new_size(panel,
				PANEL_POSITION_TOP);
		panel->bottom_helper.icon_size = _new_size(panel,
				PANEL_POSITION_BOTTOM);
	}
	else
	{
		panel->top_helper.icon_size = iconsize;
		panel->bottom_helper.icon_size = iconsize;
	}
	panel->pr_window = NULL;
	panel->ab_window = NULL;
#ifndef EMBEDDED
	panel->lo_window = NULL;
#endif
	panel->sh_window = NULL;
	if(panel->config == NULL)
	{
		panel_error(NULL, error_get(), 0); /* XXX put up a dialog box */
		panel_delete(panel);
		return NULL;
	}
	/* root window */
	panel->root = gdk_screen_get_root_window(panel->screen);
	_panel_reset(panel, &rect);
	focus = ((p = config_get(panel->config, NULL, "accept_focus")) == NULL
			|| strcmp(p, "1") == 0) ? TRUE : FALSE;
	above = ((p = config_get(panel->config, NULL, "keep_above")) == NULL
			|| strcmp(p, "1") == 0) ? TRUE : FALSE;
	panel->source = 0;
	/* top panel */
	if(config_get(panel->config, NULL, "top") != NULL)
	{
		panel->top = panel_window_new(PANEL_POSITION_TOP,
				&panel->top_helper, &rect);
		panel_window_set_accept_focus(panel->top, focus);
		panel_window_set_keep_above(panel->top, above);
	}
	/* bottom panel */
	if(config_get(panel->config, NULL, "bottom") != NULL
			|| config_get(panel->config, NULL, "top") == NULL)
	{
		panel->bottom = panel_window_new(PANEL_POSITION_BOTTOM,
				&panel->bottom_helper, &rect);
		panel_window_set_accept_focus(panel->bottom, focus);
		panel_window_set_keep_above(panel->bottom, above);
	}
	/* messages */
	desktop_message_register(PANEL_CLIENT_MESSAGE, _new_on_message, panel);
	/* manage root window events */
	gdk_window_set_events(panel->root, gdk_window_get_events(
				panel->root) | GDK_PROPERTY_CHANGE_MASK);
	gdk_window_add_filter(panel->root, _on_root_event, panel);
	/* load plug-ins when idle */
	panel->source = g_idle_add(_on_idle, panel);
	return panel;
}