diff options
author | mallum <mallum@b067294f-1dea-0310-9683-c47a78595994> | 2005-01-28 16:06:06 +0000 |
---|---|---|
committer | mallum <mallum@b067294f-1dea-0310-9683-c47a78595994> | 2005-01-28 16:06:06 +0000 |
commit | 280a45ae4a92177412ac4c8b31f31144499a0580 (patch) | |
tree | 95ef8d3149f2edf9b2e90bf552b629eb35e9bb65 /src | |
parent | efdeb1b636f1954e17f5dd334fdf65f44ff90c3e (diff) |
add icon, support for changing device via hack + cmd to run on startup
git-svn-id: http://svn.o-hand.com/repos/matchbox/trunk/Xoo@1047 b067294f-1dea-0310-9683-c47a78595994
Diffstat (limited to 'src')
-rw-r--r-- | src/callbacks.c | 38 | ||||
-rw-r--r-- | src/callbacks.h | 34 | ||||
-rw-r--r-- | src/fakedev.h | 6 | ||||
-rw-r--r-- | src/main.c | 97 | ||||
-rw-r--r-- | src/prefs.c | 12 | ||||
-rw-r--r-- | src/prefs.h | 1 |
6 files changed, 161 insertions, 27 deletions
diff --git a/src/callbacks.c b/src/callbacks.c index 197fc17..7a17953 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -16,6 +16,7 @@ #include "config.h" #include <signal.h> +#include <gtk/gtk.h> #include <gtk/gtkmain.h> #include <gtk/gtkmenu.h> #include <gtk/gtkmenuitem.h> @@ -23,6 +24,8 @@ #include <gtk/gtkwindow.h> #include "fakedev.h" +extern pid_t xnest_pid; + void on_send_signal_activate (GtkMenuItem *menuitem, FakeApp *app) { g_return_if_fail (app->xnest_pid != 0); kill (app->xnest_pid, SIGUSR1); @@ -74,3 +77,38 @@ gboolean on_delete_event_hide (GtkWidget *widget, GdkEvent *event, FakeApp *app) gtk_widget_hide (widget); return TRUE; } + +void +on_select_device (GtkMenuItem *menuitem, FakeApp *app) +{ + GtkWidget *dialog; + + dialog = gtk_file_chooser_dialog_new ("Open Device", + GTK_WINDOW(app->window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + char *filename; + + + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + + /****** DONT TRY THIS AT HOME KIDS. *******/ + + /* xxx FIXME, This is gross - just a very nasty hack for now xxx */ + + kill(xnest_pid, 9); + sleep(2); + execl("/bin/sh", "sh", "-c", "Xoo", "--device", filename, 0); + + g_warning("Failed load device %s\n", filename); + + g_free (filename); + } + + gtk_widget_destroy (dialog); +} diff --git a/src/callbacks.h b/src/callbacks.h index 5c5d38d..e3e4887 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -2,11 +2,29 @@ /* GTK+ callbacks */ -void on_send_signal_activate (GtkWidget *menuitem, FakeApp *app); -void on_preferences_activate (GtkMenuItem *menuitem, FakeApp *app); -void on_quit_activate (GtkMenuItem *menuitem, FakeApp *app); -void on_about_activate (GtkMenuItem *menuitem, FakeApp *app); -void on_window_destroy (GtkObject *widget, FakeApp *app); -gboolean on_popup_menu_show (GtkWidget *widget, GdkEventButton *event, FakeApp *app); -void on_show_decorations_toggle (GtkMenuItem *menuitem, FakeApp *app); -gboolean on_delete_event_hide (GtkWidget *widget, GdkEvent *event, FakeApp *app); +void +on_send_signal_activate (GtkWidget *menuitem, FakeApp *app); + +void +on_preferences_activate (GtkMenuItem *menuitem, FakeApp *app); + +void +on_quit_activate (GtkMenuItem *menuitem, FakeApp *app); + +void +on_about_activate (GtkMenuItem *menuitem, FakeApp *app); + +void +on_window_destroy (GtkObject *widget, FakeApp *app); + +gboolean +on_popup_menu_show (GtkWidget *widget, GdkEventButton *event, FakeApp *app); + +void +on_show_decorations_toggle (GtkMenuItem *menuitem, FakeApp *app); + +gboolean +on_delete_event_hide (GtkWidget *widget, GdkEvent *event, FakeApp *app); + +void +on_select_device (GtkMenuItem *menuitem, FakeApp *app); diff --git a/src/fakedev.h b/src/fakedev.h index 845016c..1339c28 100644 --- a/src/fakedev.h +++ b/src/fakedev.h @@ -42,7 +42,7 @@ struct FakeApp GtkWidget *debug_menu; GtkWidget *prefs_window; - GtkWidget *entry_display, *entry_server, *entry_options; + GtkWidget *entry_display, *entry_server, *entry_options, *entry_start; GtkWidget *about_window; int device_width; @@ -72,6 +72,10 @@ struct FakeApp pid_t xnest_pid; char *win_title; + char *start_cmd; + + int argc; + char **argv; }; struct FakeButton @@ -29,7 +29,7 @@ #define XNEST_BIN "/usr/X11R6/bin/Xnest" /* Used by the signal handler to detect which child has died */ -static pid_t xnest_pid; +pid_t xnest_pid; static gboolean key_event (GtkWidget *widget, GdkEventKey *event, FakeApp *app); @@ -57,40 +57,76 @@ fakeapp_new(void) glade = glade_xml_new (PKGDATADIR "/Xoo.glade", NULL, NULL); g_assert (glade != NULL); - glade_xml_signal_connect_data (glade, "on_send_signal_activate", (GCallback)on_send_signal_activate, app); - glade_xml_signal_connect_data (glade, "on_quit_activate", (GCallback)on_quit_activate, app); - glade_xml_signal_connect_data (glade, "on_about_activate", (GCallback)on_about_activate, app); - glade_xml_signal_connect_data (glade, "on_window_destroy", (GCallback)on_window_destroy, app); - glade_xml_signal_connect_data (glade, "on_popup_menu_show", (GCallback)on_popup_menu_show, app); - glade_xml_signal_connect_data (glade, "on_show_decorations_toggle", (GCallback)on_show_decorations_toggle, app); - glade_xml_signal_connect_data (glade, "on_delete_event_hide", (GCallback)on_delete_event_hide, app); + glade_xml_signal_connect_data (glade, "on_send_signal_activate", + (GCallback)on_send_signal_activate, app); + + glade_xml_signal_connect_data (glade, "on_quit_activate", + (GCallback)on_quit_activate, app); + + glade_xml_signal_connect_data (glade, "on_about_activate", + (GCallback)on_about_activate, app); + + glade_xml_signal_connect_data (glade, "on_window_destroy", + (GCallback)on_window_destroy, app); + + glade_xml_signal_connect_data (glade, "on_popup_menu_show", + (GCallback)on_popup_menu_show, app); + + glade_xml_signal_connect_data (glade, "on_show_decorations_toggle", + (GCallback)on_show_decorations_toggle, app); + + glade_xml_signal_connect_data (glade, "on_delete_event_hide", + (GCallback)on_delete_event_hide, app); + + glade_xml_signal_connect_data (glade, "on_select_device_activate", + (GCallback)on_select_device, app); + #if HAVE_GCONF - glade_xml_signal_connect_data (glade, "on_preferences_activate", (GCallback)on_preferences_activate, app); - glade_xml_signal_connect_data (glade, "on_prefs_apply_clicked", (GCallback)on_prefs_apply_clicked, app); - glade_xml_signal_connect_data (glade, "on_prefs_cancel_clicked", (GCallback)on_prefs_cancel_clicked, app); + glade_xml_signal_connect_data (glade, "on_preferences_activate", + (GCallback)on_preferences_activate, app); + + glade_xml_signal_connect_data (glade, "on_prefs_apply_clicked", + (GCallback)on_prefs_apply_clicked, app); + + glade_xml_signal_connect_data (glade, "on_prefs_cancel_clicked", + (GCallback)on_prefs_cancel_clicked, app); #else + gtk_widget_hide (glade_xml_get_widget (glade, "preferences")); + #endif app->window = glade_xml_get_widget (glade, "window"); app->fixed = glade_xml_get_widget (glade, "fixed"); gtk_fixed_set_has_window (GTK_FIXED (app->fixed), TRUE); + app->winnest = glade_xml_get_widget (glade, "winnest"); - g_signal_connect(app->window, "key-press-event", (GCallback)key_event, app); - g_signal_connect(app->window, "key-release-event", (GCallback)key_event, app); + + g_signal_connect(app->window, "key-press-event", + (GCallback)key_event, app); + + g_signal_connect(app->window, "key-release-event", + (GCallback)key_event, app); app->prefs_window = glade_xml_get_widget (glade, "prefswindow"); - gtk_window_set_transient_for (GTK_WINDOW (app->prefs_window), GTK_WINDOW (app->window)); + gtk_window_set_transient_for (GTK_WINDOW (app->prefs_window), + GTK_WINDOW (app->window)); + app->entry_display = glade_xml_get_widget (glade, "entry_display"); app->entry_server = glade_xml_get_widget (glade, "entry_server"); app->entry_options = glade_xml_get_widget (glade, "entry_options"); + app->entry_start = glade_xml_get_widget (glade, "entry_start"); app->debug_menu = glade_xml_get_widget (glade, "send_signal"); app->popupmenu = glade_xml_get_widget (glade, "popupmenu_menu"); app->about_window = glade_xml_get_widget (glade, "aboutwindow"); - gtk_window_set_transient_for (GTK_WINDOW (app->about_window), GTK_WINDOW (app->window)); - g_signal_connect_swapped (glade_xml_get_widget (glade, "button_about_close"), "clicked", G_CALLBACK (gtk_widget_hide), app->about_window); - + + gtk_window_set_transient_for (GTK_WINDOW (app->about_window), + GTK_WINDOW (app->window)); + + g_signal_connect_swapped (glade_xml_get_widget (glade, "button_about_close"), + "clicked", G_CALLBACK (gtk_widget_hide), + app->about_window); return app; } @@ -172,7 +208,9 @@ key_event (GtkWidget *widget, GdkEventKey *event, FakeApp *app) xevent.xkey.window = GDK_WINDOW_XWINDOW (app->winnest->window); xevent.xkey.root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gdk_drawable_get_screen (app->winnest->window))); xevent.xkey.time = event->time; + /* FIXME, the following might cause problems for non-GTK apps */ + xevent.xkey.x = 0; xevent.xkey.y = 0; xevent.xkey.x_root = 0; @@ -182,9 +220,12 @@ key_event (GtkWidget *widget, GdkEventKey *event, FakeApp *app) xevent.xkey.same_screen = TRUE; gdk_error_trap_push (); - XSendEvent (GDK_WINDOW_XDISPLAY (app->winnest->window), app->xnest_window, + XSendEvent (GDK_WINDOW_XDISPLAY + (app->winnest->window), app->xnest_window, False, NoEventMask, &xevent); + gdk_display_sync (gtk_widget_get_display (widget)); + if (gdk_error_trap_pop ()) { g_warning("X error on XSendEvent"); } @@ -242,6 +283,23 @@ fakeapp_start_server(FakeApp *app) } else { gtk_widget_set_sensitive (app->debug_menu, TRUE); } + + if (app->start_cmd) + { + pid = fork(); + switch (pid) { + case 0: + setenv("DISPLAY", app->xnest_dpy_name, 1); + execl("/bin/sh", "sh", "-c", app->start_cmd, 0); + g_warning( "Failed to Launch %s\n", app->start_cmd); + exit(1); + case -1: + g_warning("Failed to Launch %s\n", app->start_cmd); + break; + default: + break; + } + } return FALSE; } @@ -299,6 +357,9 @@ main(int argc, char **argv) app = fakeapp_new(); + app->argv = argv; + app->argc = argc; + #ifdef HAVE_GCONF /* Do this here so that command line argument override the GConf prefs */ gconf_prefs_init(app); diff --git a/src/prefs.c b/src/prefs.c index 22edad1..7e723e7 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -43,12 +43,21 @@ void gconf_prefs_init(FakeApp *app) { if (s != NULL && *s != '\0') { app->xnest_bin_options = s; } + + s = gconf_client_get_string (gconf, GCONF_START_CMD, NULL); + if (s != NULL && *s != '\0') { + app->start_cmd = s; + } + } void on_preferences_activate (GtkMenuItem *menuitem, FakeApp *app) { gtk_entry_set_text (GTK_ENTRY (app->entry_display), app->xnest_dpy_name); gtk_entry_set_text (GTK_ENTRY (app->entry_server), app->xnest_bin_path); gtk_entry_set_text (GTK_ENTRY (app->entry_options), app->xnest_bin_options ? app->xnest_bin_options : ""); + + gtk_entry_set_text (GTK_ENTRY (app->entry_start), app->start_cmd ? app->start_cmd : ""); + gtk_window_present (GTK_WINDOW (app->prefs_window)); } @@ -64,6 +73,9 @@ void on_prefs_apply_clicked (GtkWidget *widget, FakeApp *app) { s = gtk_entry_get_text (GTK_ENTRY (app->entry_options)); gconf_client_set_string (gconf, GCONF_SERVER_OPTIONS, s, NULL); + s = gtk_entry_get_text (GTK_ENTRY (app->entry_start)); + gconf_client_set_string (gconf, GCONF_START_CMD, s, NULL); + gconf_prefs_init (app); fakeapp_restart_server (app); diff --git a/src/prefs.h b/src/prefs.h index c30305a..3c30f88 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -4,6 +4,7 @@ #define GCONF_DISPLAY "/apps/Xoo/display" #define GCONF_SERVER "/apps/Xoo/xserver" #define GCONF_SERVER_OPTIONS "/apps/Xoo/xserver-options" +#define GCONF_START_CMD "/apps/Xoo/startup-command" void gconf_prefs_init(FakeApp *app); |