~ubuntu-branches/ubuntu/quantal/xscreensaver/quantal

« back to all changes in this revision

Viewing changes to driver/demo-Gtk.c

  • Committer: Bazaar Package Importer
  • Author(s): Ted Gould
  • Date: 2008-08-28 16:15:25 UTC
  • mfrom: (1.1.6 upstream) (2.1.3 lenny)
  • Revision ID: james.westby@ubuntu.com-20080828161525-mxga521aoezxjq8h
Tags: 5.07-0ubuntu1
* Upgrade upstream version
* debian/control: Remove suggest xdaliclock as it is no longer
  included
* Remove 10_jwz-screensaver-randr-patch-3.patch as it has been merged
  upstream.
* Add 24_hacks_xsublim_enable.patch as it seems that xsublim was dropped
  from the build files.  There is nothing in the Changelog about it
  so I believe it was accidental.
* Updating the .desktop files from the XML files using gnome-screensaver's
  utility to do so.  Lots of text updates.  Also:
    * Added: abstractile.desktop
    * Added: cwaves.desktop
    * Added: m6502.desktop
    * Added: skytentacles.desktop
    * Removed: xteevee.desktop
* xscreensaver-gl-extra.files: Added skytentacles
* xscreensaver-data-extra.files: Added abstractile, cwaves and m6502
* xscreensaver-data.files: Remove partial abstractile, m6502 and cwaves

Show diffs side-by-side

added added

removed removed

Lines of Context:
267
267
void settings_cb (GtkButton *, gpointer user_data);
268
268
void settings_adv_cb (GtkButton *, gpointer user_data);
269
269
void settings_std_cb (GtkButton *, gpointer user_data);
 
270
void settings_reset_cb (GtkButton *, gpointer user_data);
270
271
void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *,
271
272
                              gint page_num, gpointer user_data);
272
273
void settings_cancel_cb (GtkButton *, gpointer user_data);
273
274
void settings_ok_cb (GtkButton *, gpointer user_data);
274
275
 
 
276
static void kill_gnome_screensaver (void);
 
277
static void kill_kde_screensaver (void);
 
278
 
275
279
 
276
280
/* Some random utility functions
277
281
 */
482
486
  warning_dialog_dismiss_cb (widget, user_data);
483
487
}
484
488
 
 
489
static void warning_dialog_killg_cb (GtkWidget *widget, gpointer user_data)
 
490
{
 
491
  kill_gnome_screensaver ();
 
492
  warning_dialog_dismiss_cb (widget, user_data);
 
493
}
 
494
 
 
495
static void warning_dialog_killk_cb (GtkWidget *widget, gpointer user_data)
 
496
{
 
497
  kill_kde_screensaver ();
 
498
  warning_dialog_dismiss_cb (widget, user_data);
 
499
}
 
500
 
 
501
typedef enum { D_NONE, D_LAUNCH, D_GNOME, D_KDE } dialog_button;
 
502
 
485
503
static void
486
504
warning_dialog (GtkWidget *parent, const char *message,
487
 
                Boolean restart_button_p, int center)
 
505
                dialog_button button_type, int center)
488
506
{
489
507
  char *msg = strdup (message);
490
508
  char *head;
557
575
                      label, TRUE, TRUE, 0);
558
576
 
559
577
#ifdef HAVE_GTK2
560
 
  if (restart_button_p)
 
578
  if (button_type != D_NONE)
561
579
    {
562
580
      cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
563
581
      gtk_container_add (GTK_CONTAINER (label), cancel);
571
589
  ok = gtk_button_new_with_label ("OK");
572
590
  gtk_container_add (GTK_CONTAINER (label), ok);
573
591
 
574
 
  if (restart_button_p)
 
592
  if (button_type != D_NONE)
575
593
    {
576
594
      cancel = gtk_button_new_with_label ("Cancel");
577
595
      gtk_container_add (GTK_CONTAINER (label), cancel);
582
600
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
583
601
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
584
602
  gtk_window_set_title (GTK_WINDOW (dialog), progclass);
585
 
  STFU GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
 
603
  GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
586
604
  gtk_widget_show (ok);
587
605
  gtk_widget_grab_focus (ok);
588
606
 
589
607
  if (cancel)
590
608
    {
591
 
      STFU GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
 
609
      GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
592
610
      gtk_widget_show (cancel);
593
611
    }
594
612
  gtk_widget_show (label);
595
613
  gtk_widget_show (dialog);
596
614
 
597
 
  if (restart_button_p)
 
615
  if (button_type != D_NONE)
598
616
    {
599
 
      gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
600
 
                                 GTK_SIGNAL_FUNC (warning_dialog_restart_cb),
 
617
      GtkSignalFunc fn;
 
618
      switch (button_type) {
 
619
      case D_LAUNCH: fn = GTK_SIGNAL_FUNC (warning_dialog_restart_cb); break;
 
620
      case D_GNOME:  fn = GTK_SIGNAL_FUNC (warning_dialog_killg_cb);   break;
 
621
      case D_KDE:    fn = GTK_SIGNAL_FUNC (warning_dialog_killk_cb);   break;
 
622
      default: abort(); break;
 
623
      }
 
624
      gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", fn, 
601
625
                                 (gpointer) dialog);
602
626
      gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked",
603
627
                                 GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
644
668
        sprintf (buf, "Error:\n\n%s", err);
645
669
      else
646
670
        strcpy (buf, "Unknown error!");
647
 
      warning_dialog (s->toplevel_widget, buf, False, 100);
 
671
      warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
648
672
    }
649
673
  if (err) free (err);
650
674
 
685
709
                sprintf (buf, "Error:\n\n%s", err);
686
710
              else
687
711
                strcpy (buf, "Unknown error!");
688
 
              warning_dialog (s->toplevel_widget, buf, False, 100);
 
712
              warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
689
713
            }
690
714
        }
691
715
      else
700
724
                     "The XScreenSaver daemon doesn't seem to be running\n"
701
725
                     "on display \"%s\".  Launch it now?"),
702
726
                   d);
703
 
          warning_dialog (s->toplevel_widget, msg, True, 1);
 
727
          warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
704
728
        }
705
729
    }
706
730
 
875
899
    {
876
900
      warning_dialog (s->toplevel_widget,
877
901
                      _("Error:\n\n"
878
 
                        "No Help URL has been specified.\n"), False, 100);
 
902
                        "No Help URL has been specified.\n"), D_NONE, 100);
879
903
      return;
880
904
    }
881
905
 
1001
1025
      else
1002
1026
        strcat (buf, _("Please check your $PATH and permissions."));
1003
1027
 
1004
 
      warning_dialog (s->toplevel_widget, buf, False, 1);
 
1028
      warning_dialog (s->toplevel_widget, buf, D_NONE, 1);
1005
1029
    }
1006
1030
 
1007
1031
  force_dialog_repaint (s);
1038
1062
      if (!f || !*f)
1039
1063
        warning_dialog (s->toplevel_widget,
1040
1064
                        _("Error:\n\nCouldn't determine init file name!\n"),
1041
 
                        False, 100);
 
1065
                        D_NONE, 100);
1042
1066
      else
1043
1067
        {
1044
1068
          char *b = (char *) malloc (strlen(f) + 1024);
1045
1069
          sprintf (b, _("Error:\n\nCouldn't write %s\n"), f);
1046
 
          warning_dialog (s->toplevel_widget, b, False, 100);
 
1070
          warning_dialog (s->toplevel_widget, b, D_NONE, 100);
1047
1071
          free (b);
1048
1072
        }
1049
1073
      return -1;
1106
1130
    {
1107
1131
      warning_dialog (GTK_WIDGET (button),
1108
1132
                      _("Error:\n\nno `manualCommand' resource set."),
1109
 
                      False, 100);
 
1133
                      D_NONE, 100);
1110
1134
    }
1111
1135
 
1112
1136
  free (oname);
1291
1315
                   _("Error:\n\n"
1292
1316
                     "Unparsable time format: \"%s\"\n"),
1293
1317
                   line);
1294
 
          warning_dialog (s->toplevel_widget, b, False, 100);
 
1318
          warning_dialog (s->toplevel_widget, b, D_NONE, 100);
1295
1319
        }
1296
1320
      else
1297
1321
        *store = value;
1537
1561
      char b[255];
1538
1562
      sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n",
1539
1563
               p2->image_directory);
1540
 
      warning_dialog (s->toplevel_widget, b, False, 100);
 
1564
      warning_dialog (s->toplevel_widget, b, D_NONE, 100);
1541
1565
    }
1542
1566
 
1543
1567
 
1808
1832
  char *str;
1809
1833
  int list_elt;
1810
1834
 
1811
 
  STFU g_return_if_fail (!gdk_pointer_is_grabbed ());
 
1835
  g_return_if_fail (!gdk_pointer_is_grabbed ());
1812
1836
 
1813
1837
  str = gtk_tree_path_to_string (path);
1814
1838
  list_elt = strtol (str, NULL, 10);
1996
2020
    {
1997
2021
      char b[255];
1998
2022
      sprintf (b, _("Error:\n\n" "Directory does not exist: \"%s\"\n"), path);
1999
 
      warning_dialog (GTK_WIDGET (top), b, False, 100);
 
2023
      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
2000
2024
      return;
2001
2025
    }
2002
2026
 
2026
2050
    {
2027
2051
      char b[255];
2028
2052
      sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
2029
 
      warning_dialog (GTK_WIDGET (top), b, False, 100);
 
2053
      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
2030
2054
      return;
2031
2055
    }
2032
2056
 
2057
2081
    {
2058
2082
      char b[255];
2059
2083
      sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
2060
 
      warning_dialog (GTK_WIDGET (top), b, False, 100);
 
2084
      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
2061
2085
      return;
2062
2086
    }
2063
2087
# endif
2230
2254
{
2231
2255
# ifdef HAVE_XML
2232
2256
  GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
2233
 
  char *cmd_line = get_configurator_command_line (s->cdata);
 
2257
  char *cmd_line = get_configurator_command_line (s->cdata, False);
2234
2258
  gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
2235
2259
  gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
2236
2260
  free (cmd_line);
2262
2286
}
2263
2287
 
2264
2288
G_MODULE_EXPORT void
 
2289
settings_reset_cb (GtkButton *button, gpointer user_data)
 
2290
{
 
2291
# ifdef HAVE_XML
 
2292
  state *s = global_state_kludge;  /* I hate C so much... */
 
2293
  GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
 
2294
  char *cmd_line = get_configurator_command_line (s->cdata, True);
 
2295
  gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
 
2296
  gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
 
2297
  free (cmd_line);
 
2298
  populate_popup_window (s);
 
2299
# endif /* HAVE_XML */
 
2300
}
 
2301
 
 
2302
G_MODULE_EXPORT void
2265
2303
settings_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
2266
2304
                         gint page_num, gpointer user_data)
2267
2305
{
3200
3238
  screenhack *hack;
3201
3239
  char *pretty_name;
3202
3240
  GtkFrame *frame1 = GTK_FRAME (name_to_widget (s, "preview_frame"));
3203
 
  GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "doc_frame"));
 
3241
  GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "opt_frame"));
3204
3242
  GtkEntry *cmd    = GTK_ENTRY (name_to_widget (s, "cmd_text"));
3205
3243
  GtkCombo *vis    = GTK_COMBO (name_to_widget (s, "visual_combo"));
3206
3244
  GtkWidget *list  = GTK_WIDGET (name_to_widget (s, "list"));
3414
3452
               _("Warning:\n\n"
3415
3453
                 "file \"%s\" has changed, reloading.\n"),
3416
3454
               f);
3417
 
      warning_dialog (s->toplevel_widget, b, False, 100);
 
3455
      warning_dialog (s->toplevel_widget, b, D_NONE, 100);
3418
3456
      free (b);
3419
3457
 
3420
3458
      load_init_file (dpy, p);
4024
4062
  return FALSE;  /* do not re-execute timer */
4025
4063
}
4026
4064
 
 
4065
static int
 
4066
settings_timer (gpointer data)
 
4067
{
 
4068
  settings_cb (0, 0);
 
4069
  return FALSE;
 
4070
}
 
4071
 
4027
4072
 
4028
4073
/* Call this when you think you might want a preview process running.
4029
4074
   It will set a timer that will actually launch that program a second
4247
4292
#endif
4248
4293
 
4249
4294
 
 
4295
static Window
 
4296
gnome_screensaver_window (Screen *screen)
 
4297
{
 
4298
  Display *dpy = DisplayOfScreen (screen);
 
4299
  Window root = RootWindowOfScreen (screen);
 
4300
  Window parent, *kids;
 
4301
  unsigned int nkids;
 
4302
  Window gnome_window = 0;
 
4303
  int i;
 
4304
 
 
4305
  if (! XQueryTree (dpy, root, &root, &parent, &kids, &nkids))
 
4306
    abort ();
 
4307
  for (i = 0; i < nkids; i++)
 
4308
    {
 
4309
      Atom type;
 
4310
      int format;
 
4311
      unsigned long nitems, bytesafter;
 
4312
      unsigned char *name;
 
4313
      if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
 
4314
                              False, XA_STRING, &type, &format, &nitems,
 
4315
                              &bytesafter, &name)
 
4316
          == Success
 
4317
          && type != None
 
4318
          && !strcmp ((char *) name, "gnome-screensaver"))
 
4319
        {
 
4320
          gnome_window = kids[i];
 
4321
          break;
 
4322
        }
 
4323
    }
 
4324
 
 
4325
  if (kids) XFree ((char *) kids);
 
4326
  return gnome_window;
 
4327
}
 
4328
 
 
4329
static Bool
 
4330
gnome_screensaver_active_p (void)
 
4331
{
 
4332
  Display *dpy = GDK_DISPLAY();
 
4333
  Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
 
4334
  return (w ? True : False);
 
4335
}
 
4336
 
 
4337
static void
 
4338
kill_gnome_screensaver (void)
 
4339
{
 
4340
  Display *dpy = GDK_DISPLAY();
 
4341
  Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
 
4342
  if (w) XKillClient (dpy, (XID) w);
 
4343
}
 
4344
 
 
4345
static Bool
 
4346
kde_screensaver_active_p (void)
 
4347
{
 
4348
  FILE *p = popen ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null",
 
4349
                   "r");
 
4350
  char buf[255];
 
4351
  fgets (buf, sizeof(buf)-1, p);
 
4352
  pclose (p);
 
4353
  if (!strcmp (buf, "true\n"))
 
4354
    return True;
 
4355
  else
 
4356
    return False;
 
4357
}
 
4358
 
 
4359
static void
 
4360
kill_kde_screensaver (void)
 
4361
{
 
4362
  system ("dcop kdesktop KScreensaverIface enable false");
 
4363
}
 
4364
 
 
4365
 
4250
4366
static void
4251
4367
the_network_is_not_the_computer (state *s)
4252
4368
{
4360
4476
 
4361
4477
 
4362
4478
  if (*msg)
4363
 
    warning_dialog (s->toplevel_widget, msg, True, 1);
 
4479
    warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
4364
4480
 
4365
4481
  if (rversion) free (rversion);
4366
4482
  if (ruser) free (ruser);
4367
4483
  if (rhost) free (rhost);
4368
4484
  free (msg);
 
4485
  msg = 0;
 
4486
 
 
4487
  /* Note: since these dialogs are not modal, they will stack up.
 
4488
     So we do this check *after* popping up the "xscreensaver is not
 
4489
     running" dialog so that these are on top.  Good enough.
 
4490
   */
 
4491
 
 
4492
  if (gnome_screensaver_active_p ())
 
4493
    warning_dialog (s->toplevel_widget,
 
4494
                    _("Warning:\n\n"
 
4495
                      "The GNOME screensaver daemon appears to be running.\n"
 
4496
                      "It must be stopped for XScreenSaver to work properly.\n"
 
4497
                      "\n"
 
4498
                      "Stop the GNOME screen saver daemon now?\n"),
 
4499
                    D_GNOME, 1);
 
4500
 
 
4501
  if (kde_screensaver_active_p ())
 
4502
    warning_dialog (s->toplevel_widget,
 
4503
                    _("Warning:\n\n"
 
4504
                      "The KDE screen saver daemon appears to be running.\n"
 
4505
                      "It must be stopped for XScreenSaver to work properly.\n"
 
4506
                      "\n"
 
4507
                      "Stop the KDE screen saver daemon now?\n"),
 
4508
                    D_KDE, 1);
4369
4509
}
4370
4510
 
4371
4511
 
4435
4575
#endif /* HAVE_CRAPPLET */
4436
4576
#endif /* 0 */
4437
4577
 
4438
 
const char *usage = "[--display dpy] [--prefs]"
 
4578
const char *usage = "[--display dpy] [--prefs | --settings]"
4439
4579
# ifdef HAVE_CRAPPLET
4440
4580
                    " [--crapplet]"
4441
4581
# endif
4536
4676
  XtAppContext app;
4537
4677
  state S, *s;
4538
4678
  saver_preferences *p;
4539
 
  Bool prefs = False;
 
4679
  Bool prefs_p = False;
 
4680
  Bool settings_p = False;
4540
4681
  int i;
4541
4682
  Display *dpy;
4542
4683
  Widget toplevel_shell;
4802
4943
      if (str[0] == '-' && str[1] == '-')
4803
4944
        str++;
4804
4945
      if (!strcmp (str, "-prefs"))
4805
 
        prefs = True;
 
4946
        prefs_p = True;
 
4947
      else if (!strcmp (str, "-settings"))
 
4948
        settings_p = True;
4806
4949
      else if (crapplet_p)
4807
4950
        /* There are lots of random args that we don't care about when we're
4808
4951
           started as a crapplet, so just ignore unknown args in that case. */
4908
5051
    gtk_widget_set_sensitive (std, False);
4909
5052
    std = GTK_WIDGET (name_to_widget (s, "adv_button"));
4910
5053
    gtk_widget_hide (std);
 
5054
    std = GTK_WIDGET (name_to_widget (s, "reset_button"));
 
5055
    gtk_widget_hide (std);
4911
5056
    page = 1;
4912
5057
# endif /* !HAVE_XML */
4913
5058
 
4972
5117
 
4973
5118
 
4974
5119
  /* Handle the -prefs command-line argument. */
4975
 
  if (prefs)
 
5120
  if (prefs_p)
4976
5121
    {
4977
5122
      GtkNotebook *notebook =
4978
5123
        GTK_NOTEBOOK (name_to_widget (s, "notebook"));
5062
5207
  gtk_timeout_add (60 * 1000, check_blanked_timer, s);
5063
5208
 
5064
5209
 
 
5210
  /* Handle the --settings command-line argument. */
 
5211
  if (settings_p)
 
5212
    gtk_timeout_add (500, settings_timer, 0);
 
5213
 
 
5214
 
5065
5215
  /* Issue any warnings about the running xscreensaver daemon. */
5066
5216
  if (! s->debug_p)
5067
5217
    the_network_is_not_the_computer (s);