X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fdemo-Gtk.c;h=c11224d4b0ecb43fb4ae4e50c825007d83bc5492;hb=a1d41b2aa6e18bf9a49b914a99dda8232c5d7762;hp=02995e08abb0da5910e95ff36eae9a92aad799d3;hpb=ebc241816cc8e3eec7270a594bb1a607df32bcd6;p=xscreensaver diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index 02995e08..c11224d4 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -33,6 +33,7 @@ #endif /* HAVE_UNAME */ #include +#include #include /* for CARD32 */ #include /* for XA_INTEGER */ @@ -61,7 +62,7 @@ # include #endif -extern Display *gdk_display; +#include #include "version.h" #include "prefs.h" @@ -70,6 +71,9 @@ extern Display *gdk_display; #include "remote.h" /* for xscreensaver_command() */ #include "usleep.h" +#include "logo-50.xpm" +#include "logo-180.xpm" + #include "demo-Gtk-widgets.h" #include @@ -248,6 +252,9 @@ warning_dialog (GtkWidget *parent, const char *message, while (parent->parent) parent = parent->parent; + if (!GTK_WIDGET (parent)->window) /* too early to pop up transient dialogs */ + return; + head = msg; while (head) { @@ -258,16 +265,19 @@ warning_dialog (GtkWidget *parent, const char *message, sprintf (name, "label%d", i++); { -#if 0 - char buf[255]; -#endif label = gtk_label_new (head); -#if 0 - sprintf (buf, "warning_dialog.%s.font", name); - GTK_WIDGET (label)->style = gtk_style_copy (GTK_WIDGET (label)->style); - GTK_WIDGET (label)->style->font = - gdk_font_load (get_string_resource (buf, "Dialog.Label.Font")); -#endif + + if (i == 1) + { + GTK_WIDGET (label)->style = + gtk_style_copy (GTK_WIDGET (label)->style); + GTK_WIDGET (label)->style->font = + gdk_font_load (get_string_resource("warning_dialog.headingFont", + "Dialog.Font")); + gtk_widget_set_style (GTK_WIDGET (label), + GTK_WIDGET (label)->style); + } + if (center <= 0) gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), @@ -326,6 +336,7 @@ warning_dialog (GtkWidget *parent, const char *message, GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb), (gpointer) dialog); } + gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, GTK_WIDGET (parent)->window); @@ -343,7 +354,7 @@ run_cmd (GtkWidget *widget, Atom command, int arg) int status; apply_changes_and_save (widget); - status = xscreensaver_command (gdk_display, command, arg, False, &err); + status = xscreensaver_command (GDK_DISPLAY(), command, arg, False, &err); if (status < 0) { char buf [255]; @@ -367,7 +378,7 @@ run_hack (GtkWidget *widget, int which, Bool report_errors_p) else { char *s = 0; - xscreensaver_command (gdk_display, XA_DEMO, which + 1, False, &s); + xscreensaver_command (GDK_DISPLAY(), XA_DEMO, which + 1, False, &s); if (s) free (s); } } @@ -425,20 +436,110 @@ paste_menu_cb (GtkMenuItem *menuitem, gpointer user_data) void about_menu_cb (GtkMenuItem *menuitem, gpointer user_data) { - char buf [2048]; - char *s = strdup (screensaver_id + 4); - char *s2; + char msg [2048]; + char *vers = strdup (screensaver_id + 4); + char *s; + char copy[1024]; + char *desc = "For updates, check http://www.jwz.org/xscreensaver/"; - s2 = strchr (s, ','); - *s2 = 0; - s2 += 2; + s = strchr (vers, ','); + *s = 0; + s += 2; - sprintf (buf, "%s\n%s\n\n" - "For updates, check http://www.jwz.org/xscreensaver/", - s, s2); - free (s); + sprintf(copy, "Copyright \251 1991-2001 %s", s); - warning_dialog (GTK_WIDGET (menuitem), buf, False, 100); + sprintf (msg, "%s\n\n%s", copy, desc); + + /* I can't make gnome_about_new() work here -- it starts dying in + gdk_imlib_get_visual() under gnome_about_new(). If this worked, + then this might be the thing to do: + + #ifdef HAVE_CRAPPLET + { + const gchar *auth[] = { 0 }; + GtkWidget *about = gnome_about_new (progclass, vers, "", auth, desc, + "xscreensaver.xpm"); + gtk_widget_show (about); + } + #else / * GTK but not GNOME * / + ... + */ + { + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + + GtkWidget *dialog = gtk_dialog_new (); + GtkWidget *hbox, *icon, *vbox, *label1, *label2, *hb, *ok; + GtkWidget *parent = GTK_WIDGET (menuitem); + while (parent->parent) + parent = parent->parent; + + hbox = gtk_hbox_new (FALSE, 20); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), + hbox, TRUE, TRUE, 0); + + colormap = gtk_widget_get_colormap (parent); + gdkpixmap = + gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, NULL, + (gchar **) logo_180_xpm); + icon = gtk_pixmap_new (gdkpixmap, mask); + gtk_misc_set_padding (GTK_MISC (icon), 10, 10); + + gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); + + label1 = gtk_label_new (vers); + gtk_box_pack_start (GTK_BOX (vbox), label1, TRUE, TRUE, 0); + gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75); + + GTK_WIDGET (label1)->style = gtk_style_copy (GTK_WIDGET (label1)->style); + GTK_WIDGET (label1)->style->font = + gdk_font_load (get_string_resource ("about.headingFont","Dialog.Font")); + gtk_widget_set_style (GTK_WIDGET (label1), GTK_WIDGET (label1)->style); + + label2 = gtk_label_new (msg); + gtk_box_pack_start (GTK_BOX (vbox), label2, TRUE, TRUE, 0); + gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (label2), 0.0, 0.25); + + GTK_WIDGET (label2)->style = gtk_style_copy (GTK_WIDGET (label2)->style); + GTK_WIDGET (label2)->style->font = + gdk_font_load (get_string_resource ("about.bodyFont","Dialog.Font")); + gtk_widget_set_style (GTK_WIDGET (label2), GTK_WIDGET (label2)->style); + + hb = gtk_hbutton_box_new (); + + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), + hb, TRUE, TRUE, 0); + + ok = gtk_button_new_with_label ("OK"); + gtk_container_add (GTK_CONTAINER (hb), ok); + + gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 10); + gtk_window_set_title (GTK_WINDOW (dialog), progclass); + + gtk_widget_show (hbox); + gtk_widget_show (icon); + gtk_widget_show (vbox); + gtk_widget_show (label1); + gtk_widget_show (label2); + gtk_widget_show (hb); + gtk_widget_show (ok); + gtk_widget_show (dialog); + + gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb), + (gpointer) dialog); + gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, + GTK_WIDGET (parent)->window); + gdk_window_show (GTK_WIDGET (dialog)->window); + gdk_window_raise (GTK_WIDGET (dialog)->window); + } } @@ -498,7 +599,7 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data) run_cmd (GTK_WIDGET (widget), XA_RESTART, 0); #else apply_changes_and_save (GTK_WIDGET (widget)); - xscreensaver_command (gdk_display, XA_EXIT, 0, False, NULL); + xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL); sleep (1); system ("xscreensaver -nosplash &"); #endif @@ -511,7 +612,7 @@ await_xscreensaver (GtkWidget *widget) { int countdown = 5; - Display *dpy = gdk_display; + Display *dpy = GDK_DISPLAY(); /* GtkWidget *dialog = 0;*/ char *rversion = 0; @@ -842,6 +943,63 @@ hack_time_text (GtkWidget *widget, const char *line, Time *store, Bool sec_p) } +static Bool +directory_p (const char *path) +{ + struct stat st; + if (!path || !*path) + return False; + else if (stat (path, &st)) + return False; + else if (!S_ISDIR (st.st_mode)) + return False; + else + return True; +} + +static char * +normalize_directory (const char *path) +{ + int L; + char *p2, *s; + if (!path) return 0; + L = strlen (path);; + p2 = (char *) malloc (L + 2); + strcpy (p2, path); + if (p2[L-1] == '/') /* remove trailing slash */ + p2[--L] = 0; + + for (s = p2; s && *s; s++) + { + if (*s == '/' && + (!strncmp (s, "/../", 4) || /* delete "XYZ/../" */ + !strncmp (s, "/..\000", 4))) /* delete "XYZ/..$" */ + { + char *s0 = s; + while (s0 > p2 && s0[-1] != '/') + s0--; + if (s0 > p2) + { + s0--; + s += 3; + strcpy (s0, s); + s = s0-1; + } + } + else if (*s == '/' && !strncmp (s, "/./", 3)) /* delete "/./" */ + strcpy (s, s+2), s--; + else if (*s == '/' && !strncmp (s, "/.\000", 3)) /* delete "/.$" */ + *s = 0, s--; + } + + for (s = p2; s && *s; s++) /* normalize consecutive slashes */ + while (s[0] == '/' && s[1] == '/') + strcpy (s, s+1); + + return p2; +} + + void prefs_ok_cb (GtkButton *button, gpointer user_data) { @@ -881,6 +1039,25 @@ prefs_ok_cb (GtkButton *button, gpointer user_data) *(field) = value; \ } while(0) +# define PATHNAME(field, name) do { \ + char *line = gtk_entry_get_text (\ + GTK_ENTRY (name_to_widget (GTK_WIDGET(button), (name)))); \ + if (! *line) \ + ; \ + else if (!directory_p (line)) \ + { \ + char b[255]; \ + sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n", line); \ + warning_dialog (GTK_WIDGET (button), b, False, 100); \ + if ((field)) free ((field)); \ + (field) = strdup(line); \ + } \ + else { \ + if ((field)) free ((field)); \ + (field) = strdup(line); \ + } \ + } while(0) + # define CHECKBOX(field, name) \ field = gtk_toggle_button_get_active (\ GTK_TOGGLE_BUTTON (name_to_widget (GTK_WIDGET(button), (name)))) @@ -895,6 +1072,11 @@ prefs_ok_cb (GtkButton *button, gpointer user_data) MINUTES (&p2->dpms_suspend, "dpms_suspend_text"); MINUTES (&p2->dpms_off, "dpms_off_text"); + CHECKBOX (p2->grab_desktop_p, "grab_desk_button"); + CHECKBOX (p2->grab_video_p, "grab_video_button"); + CHECKBOX (p2->random_image_p, "grab_image_button"); + PATHNAME (p2->image_directory, "image_text"); + CHECKBOX (p2->verbose_p, "verbose_button"); CHECKBOX (p2->capture_stderr_p, "capture_button"); CHECKBOX (p2->splash_p, "splash_button"); @@ -907,6 +1089,7 @@ prefs_ok_cb (GtkButton *button, gpointer user_data) # undef SECONDS # undef MINUTES # undef INTEGER +# undef PATHNAME # undef CHECKBOX # define COPY(field) \ @@ -923,6 +1106,20 @@ prefs_ok_cb (GtkButton *button, gpointer user_data) COPY(dpms_suspend); COPY(dpms_off); + COPY (grab_desktop_p); + COPY (grab_video_p); + COPY (random_image_p); + + if (!p->image_directory || + !p2->image_directory || + strcmp(p->image_directory, p2->image_directory)) + changed = True; + if (p->image_directory && p->image_directory != p2->image_directory) + free (p->image_directory); + p->image_directory = normalize_directory (p2->image_directory); + if (p2->image_directory) free (p2->image_directory); + p2->image_directory = 0; + COPY(verbose_p); COPY(capture_stderr_p); COPY(splash_p); @@ -937,7 +1134,7 @@ prefs_ok_cb (GtkButton *button, gpointer user_data) if (changed) { - Display *dpy = gdk_display; + Display *dpy = GDK_DISPLAY(); sync_server_dpms_settings (dpy, p->dpms_enabled_p, p->dpms_standby / 1000, p->dpms_suspend / 1000, @@ -1080,6 +1277,103 @@ enabled_cb (GtkWidget *cb, gpointer client_data) } } + + +typedef struct { + prefs_pair *pair; + GtkFileSelection *widget; +} file_selection_data; + + + +static void +store_image_directory (GtkWidget *button, gpointer user_data) +{ + file_selection_data *fsd = (file_selection_data *) user_data; + prefs_pair *pair = fsd->pair; + GtkFileSelection *selector = fsd->widget; + GtkWidget *top = toplevel_widget; + saver_preferences *p = pair->a; + char *path = gtk_file_selection_get_filename (selector); + + if (p->image_directory && !strcmp(p->image_directory, path)) + return; /* no change */ + + if (!directory_p (path)) + { + char b[255]; + sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n", path); + warning_dialog (GTK_WIDGET (top), b, False, 100); + return; + } + + if (p->image_directory) free (p->image_directory); + p->image_directory = normalize_directory (path); + + gtk_entry_set_text (GTK_ENTRY (name_to_widget (top, "image_text")), + (p->image_directory ? p->image_directory : "")); + demo_write_init_file (GTK_WIDGET (top), p); +} + + +static void +browse_image_dir_cancel (GtkWidget *button, gpointer user_data) +{ + file_selection_data *fsd = (file_selection_data *) user_data; + gtk_widget_hide (GTK_WIDGET (fsd->widget)); +} + +static void +browse_image_dir_ok (GtkWidget *button, gpointer user_data) +{ + browse_image_dir_cancel (button, user_data); + store_image_directory (button, user_data); +} + +static void +browse_image_dir_close (GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + browse_image_dir_cancel (widget, user_data); +} + + +void +browse_image_dir_cb (GtkButton *button, gpointer user_data) +{ + /* prefs_pair *pair = (prefs_pair *) client_data; */ + prefs_pair *pair = global_prefs_pair; /* I hate C so much... */ + saver_preferences *p = pair->a; + static file_selection_data *fsd = 0; + + GtkFileSelection *selector = GTK_FILE_SELECTION( + gtk_file_selection_new ("Please select the image directory.")); + + if (!fsd) + fsd = (file_selection_data *) malloc (sizeof (*fsd)); + + fsd->widget = selector; + fsd->pair = pair; + + if (p->image_directory && *p->image_directory) + gtk_file_selection_set_filename (selector, p->image_directory); + + gtk_signal_connect (GTK_OBJECT (selector->ok_button), + "clicked", GTK_SIGNAL_FUNC (browse_image_dir_ok), + (gpointer *) fsd); + gtk_signal_connect (GTK_OBJECT (selector->cancel_button), + "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel), + (gpointer *) fsd); + gtk_signal_connect (GTK_OBJECT (selector), "delete_event", + GTK_SIGNAL_FUNC (browse_image_dir_close), + (gpointer *) fsd); + + gtk_widget_set_sensitive (GTK_WIDGET (selector->file_list), False); + + gtk_window_set_modal (GTK_WINDOW (selector), True); + gtk_widget_show (GTK_WIDGET (selector)); +} + + /* Populating the various widgets */ @@ -1117,7 +1411,7 @@ scroll_to_current_hack (GtkWidget *toplevel, prefs_pair *pair) int format; unsigned long nitems, bytesafter; CARD32 *data = 0; - Display *dpy = gdk_display; + Display *dpy = GDK_DISPLAY(); int which = 0; GtkList *list; @@ -1251,11 +1545,31 @@ populate_prefs_page (GtkWidget *top, prefs_pair *pair) gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (name_to_widget (top, "capture_button")), p->capture_stderr_p); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (name_to_widget (top, "splash_button")), + p->splash_p); gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (name_to_widget (top, "dpms_button")), p->dpms_enabled_p); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (name_to_widget (top,"grab_desk_button")), + p->grab_desktop_p); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (name_to_widget(top,"grab_video_button")), + p->grab_video_p); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (name_to_widget(top,"grab_image_button")), + p->random_image_p); + gtk_entry_set_text (GTK_ENTRY (name_to_widget (top, "image_text")), + (p->image_directory ? p->image_directory : "")); + gtk_widget_set_sensitive (GTK_WIDGET (name_to_widget (top, "image_text")), + p->random_image_p); + gtk_widget_set_sensitive ( + GTK_WIDGET (name_to_widget (top,"image_browse_button")), + p->random_image_p); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (name_to_widget (top, "install_button")), p->install_cmap_p); @@ -1271,7 +1585,7 @@ populate_prefs_page (GtkWidget *top, prefs_pair *pair) Bool found_any_writable_cells = False; Bool dpms_supported = False; - Display *dpy = gdk_display; + Display *dpy = GDK_DISPLAY(); int nscreens = ScreenCount(dpy); int i; for (i = 0; i < nscreens; i++) @@ -1284,6 +1598,10 @@ populate_prefs_page (GtkWidget *top, prefs_pair *pair) } } +#ifdef HAVE_XF86VMODE_GAMMA + found_any_writable_cells = True; /* if we can gamma fade, go for it */ +#endif + #ifdef HAVE_DPMS_EXTENSION { int op = 0, event = 0, error = 0; @@ -1411,6 +1729,12 @@ fix_text_entry_sizes (GtkWidget *toplevel) width = gdk_text_width (w->style->font, "PseudoColor___", 14); gtk_widget_set_usize (w, width, -2); + /* Now fix the size of the file entry text. + */ + w = GTK_WIDGET (name_to_widget (GTK_WIDGET (toplevel), "image_text")); + width = gdk_text_width (w->style->font, "MMMMMMMMMMMMMM", 14); + gtk_widget_set_usize (w, width, -2); + #if 0 /* Now fix the size of the list. */ @@ -1778,15 +2102,14 @@ maybe_reload_init_file (GtkWidget *widget, prefs_pair *pair) /* Setting window manager icon */ -#include "logo.xpm" - static void init_icon (GdkWindow *window) { GdkBitmap *mask = 0; GdkColor transp; GdkPixmap *pixmap = - gdk_pixmap_create_from_xpm_d (window, &mask, &transp, logo_xpm); + gdk_pixmap_create_from_xpm_d (window, &mask, &transp, + (gchar **) logo_50_xpm); if (pixmap) gdk_window_set_icon (window, 0, pixmap, mask); } @@ -1822,7 +2145,7 @@ mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks, static void the_network_is_not_the_computer (GtkWidget *parent) { - Display *dpy = gdk_display; + Display *dpy = GDK_DISPLAY(); char *rversion, *ruser, *rhost; char *luser, *lhost; char *msg = 0; @@ -2082,7 +2405,7 @@ main (int argc, char **argv) # else /* !HAVE_CRAPPLET */ fprintf (stderr, "%s: not compiled with --crapplet support\n", - real_progname[i]); + real_progname); USAGE (); exit (1); # endif /* !HAVE_CRAPPLET */ @@ -2179,7 +2502,7 @@ main (int argc, char **argv) */ XtToolkitInitialize (); app = XtCreateApplicationContext (); - dpy = gdk_display; + dpy = GDK_DISPLAY(); XtAppSetFallbackResources (app, defaults); XtDisplayInitialize (app, dpy, progname, progclass, 0, 0, &argc, argv); toplevel_shell = XtAppCreateShell (progname, progclass,