summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormallum <mallum@b067294f-1dea-0310-9683-c47a78595994>2005-01-28 16:06:06 +0000
committermallum <mallum@b067294f-1dea-0310-9683-c47a78595994>2005-01-28 16:06:06 +0000
commit280a45ae4a92177412ac4c8b31f31144499a0580 (patch)
tree95ef8d3149f2edf9b2e90bf552b629eb35e9bb65 /src
parentefdeb1b636f1954e17f5dd334fdf65f44ff90c3e (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.c38
-rw-r--r--src/callbacks.h34
-rw-r--r--src/fakedev.h6
-rw-r--r--src/main.c97
-rw-r--r--src/prefs.c12
-rw-r--r--src/prefs.h1
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
diff --git a/src/main.c b/src/main.c
index 88e2310..35ae6e8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);