/* $Id$ */ /*- * Copyright (c) 2003-2004 Benedikt Meurer * Copyright (c) 2004 Jasper Huijsmans * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * Parts of this file where taken from gnome-session/gsm-multiscreen.c, * which was written by Mark McLoughlin . */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_MEMORY_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include #include #include gboolean xfsm_start_application (gchar **command, gchar **environment, GdkScreen *screen, const gchar *current_directory, const gchar *client_machine, const gchar *user_id) { gboolean result; gchar *screen_name; gchar **argv; gint argc; gint size; g_return_val_if_fail (command != NULL && *command != NULL, FALSE); argv = g_new (gchar *, 21); size = 20; argc = 0; if (client_machine != NULL) { /* setting current directory on a remote machine is not supported */ current_directory = NULL; argv[argc++] = g_strdup ("xon"); argv[argc++] = g_strdup (client_machine); } if (screen != NULL) { if (client_machine != NULL) screen_name = xfce_gdk_screen_get_fullname (screen); else screen_name = gdk_screen_make_display_name (screen); argv[argc++] = g_strdup ("env"); argv[argc++] = g_strdup_printf ("DISPLAY=%s", screen_name); g_free (screen_name); } for (; *command != NULL; ++command) { if (argc == size) { size *= 2; argv = g_realloc (argv, (size + 1) * sizeof (*argv)); } argv[argc++] = xfce_expand_variables (*command, environment); } argv[argc] = NULL; result = g_spawn_async (current_directory, argv, environment, G_SPAWN_LEAVE_DESCRIPTORS_OPEN | G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); g_strfreev (argv); return result; } void xfsm_place_trash_window (GtkWindow *window, GdkScreen *screen, gint monitor) { GtkRequisition requisition; GdkRectangle geometry; gdk_screen_get_monitor_geometry (screen, monitor, &geometry); gtk_widget_size_request (GTK_WIDGET (window), &requisition); gtk_window_move (window, 0, geometry.height - requisition.height); } gboolean xfsm_strv_equal (gchar **a, gchar **b) { if ((a == NULL && b != NULL) || (a != NULL && b == NULL)) return FALSE; else if (a == NULL || b == NULL) return TRUE; while (*a != NULL && *b != NULL) { if (strcmp (*a, *b) != 0) return FALSE; ++a; ++b; } return (*a == NULL && *b == NULL); } void xfsm_window_add_border (GtkWindow *window) { GtkWidget *box1, *box2; gtk_widget_realize(GTK_WIDGET(window)); box1 = gtk_event_box_new (); gtk_widget_modify_bg (box1, GTK_STATE_NORMAL, &(GTK_WIDGET(window)->style->bg [GTK_STATE_SELECTED])); gtk_widget_show (box1); box2 = gtk_event_box_new (); gtk_widget_show (box2); gtk_container_add (GTK_CONTAINER (box1), box2); gtk_container_set_border_width (GTK_CONTAINER (box2), 6); gtk_widget_reparent (GTK_BIN (window)->child, box2); gtk_container_add (GTK_CONTAINER (window), box1); } void xfsm_window_grab_input (GtkWindow *window) { GdkWindow *xwindow = GTK_WIDGET (window)->window; gdk_pointer_grab (xwindow, TRUE, 0, NULL, NULL, GDK_CURRENT_TIME); gdk_keyboard_grab (xwindow, FALSE, GDK_CURRENT_TIME); XSetInputFocus (GDK_DISPLAY (), GDK_WINDOW_XWINDOW (xwindow), RevertToParent, CurrentTime); } XfconfChannel* xfsm_open_config (void) { return xfconf_channel_get ("xfce4-session"); }