about-dialog.c 18.4 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* The GIMP -- an image manipulation program
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * 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 of the License, 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.
 */
18
19
20

#include "config.h"

Elliot Lee's avatar
Elliot Lee committed
21
22
#include <stdio.h>
#include <stdlib.h>
Tor Lillqvist's avatar
Tor Lillqvist committed
23
#include <string.h>
Elliot Lee's avatar
Elliot Lee committed
24
#include <time.h>
Manish Singh's avatar
Manish Singh committed
25

26
#include <gtk/gtk.h>
Manish Singh's avatar
Manish Singh committed
27
#include <gdk/gdkkeysyms.h>
Manish Singh's avatar
Manish Singh committed
28

29
#include "libgimpmath/gimpmath.h"
30
#include "libgimpbase/gimpbase.h"
31
#include "libgimpwidgets/gimpwidgets.h"
32

Michael Natterer's avatar
Michael Natterer committed
33
#include "core/core-types.h"
Sven Neumann's avatar
Sven Neumann committed
34

Michael Natterer's avatar
Michael Natterer committed
35
#include "core/gimptoolinfo.h"
36

Michael Natterer's avatar
Michael Natterer committed
37
38
#include "widgets/gimpdnd.h"

39
#include "about-dialog.h"
Michael Natterer's avatar
Michael Natterer committed
40
#include "authors.h"
41

42
#include "appenv.h"
43

44
45
#include "libgimp/gimpintl.h"

46
47
#include "pixmaps/wilber2.xpm"

48

Elliot Lee's avatar
Elliot Lee committed
49
#define ANIMATION_STEPS 16
50
#define ANIMATION_SIZE   2
Elliot Lee's avatar
Elliot Lee committed
51

52
53
54
55
56
57
58
59
60
61
62
63
static gboolean  about_dialog_load_logo   (GtkWidget      *window);
static void      about_dialog_destroy     (GtkObject      *object,
					   gpointer        data);
static void      about_dialog_unmap       (GtkWidget      *widget,
					   GdkEvent       *event,
					   gpointer        data);
static gint      about_dialog_logo_expose (GtkWidget      *widget,
					   GdkEventExpose *event,
					   gpointer        data);
static gint      about_dialog_button      (GtkWidget      *widget,
					   GdkEventButton *event,
					   gpointer        data);
Manish Singh's avatar
Manish Singh committed
64
65
66
static gint      about_dialog_key         (GtkWidget      *widget,
					   GdkEventKey    *event,
					   gpointer        data);
67
static void      about_dialog_tool_drop   (GtkWidget      *widget,
68
					   GimpViewable   *viewable,
69
70
					   gpointer        data);
static gint      about_dialog_timer       (gpointer        data);
Elliot Lee's avatar
Elliot Lee committed
71
72


73
74
75
76
77
78
static GtkWidget *about_dialog     = NULL;
static GtkWidget *logo_area        = NULL;
static GtkWidget *scroll_area      = NULL;
static GdkPixmap *logo_pixmap      = NULL;
static GdkPixmap *scroll_pixmap    = NULL;
static guchar    *dissolve_map     = NULL;
79
80
static gint       dissolve_width;
static gint       dissolve_height;
81
82
83
84
85
86
87
88
static gint       logo_width       = 0;
static gint       logo_height      = 0;
static gboolean   do_animation     = FALSE;
static gboolean   do_scrolling     = FALSE;
static gint       scroll_state     = 0;
static gint       frame            = 0;
static gint       offset           = 0;
static gint       timer            = 0;
Manish Singh's avatar
Manish Singh committed
89
static gint       hadja_state      = 0;
90
91
92
93
94
95
static gchar    **scroll_text      = authors;
static gint       nscroll_texts    = sizeof (authors) / sizeof (authors[0]);
static gint       scroll_text_widths[sizeof (authors) / sizeof (authors[0])];
static gint       cur_scroll_text  = 0;
static gint       cur_scroll_index = 0;
static gint       shuffle_array[sizeof (authors) / sizeof (authors[0])];
96

Elliot Lee's avatar
Elliot Lee committed
97

98
99
100
101
102
103
104
static gchar *drop_text[] = 
{ 
  "We are The GIMP." ,
  "Prepare to be manipulated.",
  "Resistance is futile."
};

Manish Singh's avatar
Manish Singh committed
105
106
107
108
static gchar *hadja_text[] =
{
  "Hadjaha!",
  "Nej!",
109
#ifndef GDK_USE_UTF8_MBS
Manish Singh's avatar
Manish Singh committed
110
  "Tvrtom!"
111
112
113
#else
  "Tvärtom!"
#endif
Manish Singh's avatar
Manish Singh committed
114
};
115

116
GtkWidget *
117
about_dialog_create (void)
Elliot Lee's avatar
Elliot Lee committed
118
119
{
  GtkWidget *vbox;
120
  GtkWidget *aboutframe;
Elliot Lee's avatar
Elliot Lee committed
121
122
  GtkWidget *label;
  GtkWidget *alignment;
123
124
125
126
127
  GtkStyle  *style;
  GdkFont   *font;
  gint       max_width;
  gint       i;
  gchar     *label_text;
Elliot Lee's avatar
Elliot Lee committed
128

129
  if (! about_dialog)
Elliot Lee's avatar
Elliot Lee committed
130
131
    {
      about_dialog = gtk_window_new (GTK_WINDOW_DIALOG);
132
      gtk_window_set_wmclass (GTK_WINDOW (about_dialog), "about_dialog", "Gimp");
133
      gtk_window_set_title (GTK_WINDOW (about_dialog), _("About the GIMP"));
Elliot Lee's avatar
Elliot Lee committed
134
      gtk_window_set_policy (GTK_WINDOW (about_dialog), FALSE, FALSE, FALSE);
135
136
      gtk_window_set_position (GTK_WINDOW (about_dialog), GTK_WIN_POS_CENTER);

137
138
139
      gimp_help_connect_help_accel (about_dialog, gimp_standard_help_func,
				    "dialogs/about.html");

Elliot Lee's avatar
Elliot Lee committed
140
      gtk_signal_connect (GTK_OBJECT (about_dialog), "destroy",
141
142
			  GTK_SIGNAL_FUNC (about_dialog_destroy),
			  NULL);
Elliot Lee's avatar
Elliot Lee committed
143
      gtk_signal_connect (GTK_OBJECT (about_dialog), "unmap_event",
144
145
			  GTK_SIGNAL_FUNC (about_dialog_unmap),
			  NULL);
Elliot Lee's avatar
Elliot Lee committed
146
      gtk_signal_connect (GTK_OBJECT (about_dialog), "button_press_event",
147
148
			  GTK_SIGNAL_FUNC (about_dialog_button),
			  NULL);
Manish Singh's avatar
Manish Singh committed
149
150
151
152
      gtk_signal_connect (GTK_OBJECT (about_dialog), "key_press_event",
			  GTK_SIGNAL_FUNC (about_dialog_key),
			  NULL);
      
153
      /*  dnd stuff  */
154
155
156
157
158
159
160
161
      gimp_gtk_drag_dest_set_by_type (about_dialog,
				      GTK_DEST_DEFAULT_MOTION |
				      GTK_DEST_DEFAULT_DROP,
				      GIMP_TYPE_TOOL_INFO,
				      GDK_ACTION_COPY); 
      gimp_dnd_viewable_dest_set (about_dialog,
				  GIMP_TYPE_TOOL_INFO,
				  about_dialog_tool_drop, NULL);
162

Elliot Lee's avatar
Elliot Lee committed
163
164
165
166
167
168
      gtk_widget_set_events (about_dialog, GDK_BUTTON_PRESS_MASK);

      if (!about_dialog_load_logo (about_dialog))
	{
	  gtk_widget_destroy (about_dialog);
	  about_dialog = NULL;
169
	  return NULL;
Elliot Lee's avatar
Elliot Lee committed
170
171
172
	}

      vbox = gtk_vbox_new (FALSE, 1);
173
      gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
Elliot Lee's avatar
Elliot Lee committed
174
175
176
      gtk_container_add (GTK_CONTAINER (about_dialog), vbox);
      gtk_widget_show (vbox);

177
178
      aboutframe = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (aboutframe), GTK_SHADOW_IN);
179
      gtk_container_set_border_width (GTK_CONTAINER (aboutframe), 0);
180
181
      gtk_box_pack_start (GTK_BOX (vbox), aboutframe, TRUE, TRUE, 0);
      gtk_widget_show (aboutframe);
Elliot Lee's avatar
Elliot Lee committed
182
183
184

      logo_area = gtk_drawing_area_new ();
      gtk_signal_connect (GTK_OBJECT (logo_area), "expose_event",
185
186
187
188
			  GTK_SIGNAL_FUNC (about_dialog_logo_expose),
			  NULL);
      gtk_drawing_area_size (GTK_DRAWING_AREA (logo_area),
			     logo_width, logo_height);
Elliot Lee's avatar
Elliot Lee committed
189
      gtk_widget_set_events (logo_area, GDK_EXPOSURE_MASK);
190
      gtk_container_add (GTK_CONTAINER (aboutframe), logo_area);
Elliot Lee's avatar
Elliot Lee committed
191
192
193
194
195
      gtk_widget_show (logo_area);

      gtk_widget_realize (logo_area);
      gdk_window_set_background (logo_area->window, &logo_area->style->black);

196
197
198
199
200
201
202
      /* this is a font, provide only one single font definition */
      font = gdk_font_load (_("-*-helvetica-medium-r-normal--*-140-*-*-*-*-*-*"));
      if (font)
	{
	  style = gtk_style_new ();
	  gdk_font_unref (style->font);
	  style->font = font;
203
	  gdk_font_ref (style->font);
204
205
206
	  gtk_widget_push_style (style);
	  gtk_style_unref (style);
	}
207
208
      label_text = g_strdup_printf (_("Version %s brought to you by"),
				    GIMP_VERSION);
209
      label = gtk_label_new (label_text);
210
211
      g_free (label_text);
      label_text = NULL;
Elliot Lee's avatar
Elliot Lee committed
212
213
214
      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
      gtk_widget_show (label);

Sven Neumann's avatar
Sven Neumann committed
215
      label = gtk_label_new ("Spencer Kimball & Peter Mattis");
Elliot Lee's avatar
Elliot Lee committed
216
217
218
219
220
221
222
223
224
      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
      gtk_widget_show (label);

      gtk_widget_pop_style ();

      alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
      gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, TRUE, 0);
      gtk_widget_show (alignment);

225
226
      aboutframe = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (aboutframe), GTK_SHADOW_IN);
227
      gtk_container_set_border_width (GTK_CONTAINER (aboutframe), 0);
228
229
      gtk_container_add (GTK_CONTAINER (alignment), aboutframe);
      gtk_widget_show (aboutframe);
Elliot Lee's avatar
Elliot Lee committed
230
231
232
233

      max_width = 0;
      for (i = 0; i < nscroll_texts; i++)
	{
234
235
	  scroll_text_widths[i] = gdk_string_width (aboutframe->style->font,
						    scroll_text[i]);
Elliot Lee's avatar
Elliot Lee committed
236
237
	  max_width = MAX (max_width, scroll_text_widths[i]);
	}
238
239
240
241
242
      for (i = 0; i < (sizeof (drop_text) / sizeof (drop_text[0])); i++)
	{
	  max_width = MAX (max_width, 
			   gdk_string_width (aboutframe->style->font, drop_text[i]));
	}
Manish Singh's avatar
Manish Singh committed
243
244
245
246
247
      for (i = 0; i < (sizeof (hadja_text) / sizeof (hadja_text[0])); i++)
	{
	  max_width = MAX (max_width,
			   gdk_string_width (aboutframe->style->font, hadja_text[i]));
	}
Elliot Lee's avatar
Elliot Lee committed
248
249
250
      scroll_area = gtk_drawing_area_new ();
      gtk_drawing_area_size (GTK_DRAWING_AREA (scroll_area),
			     max_width + 10,
251
252
253
254
			     aboutframe->style->font->ascent +
			     aboutframe->style->font->descent);
      gtk_widget_set_events (scroll_area, GDK_BUTTON_PRESS_MASK);
      gtk_container_add (GTK_CONTAINER (aboutframe), scroll_area);
Elliot Lee's avatar
Elliot Lee committed
255
256
      gtk_widget_show (scroll_area);

257
      label = gtk_label_new (_("Please visit http://www.gimp.org/ for more info"));
258
259
260
      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
      gtk_widget_show (label);

Elliot Lee's avatar
Elliot Lee committed
261
      gtk_widget_realize (scroll_area);
262
263
      gdk_window_set_background (scroll_area->window,
				 &scroll_area->style->white);
Elliot Lee's avatar
Elliot Lee committed
264
265
    }

266
  if (! GTK_WIDGET_VISIBLE (about_dialog))
Elliot Lee's avatar
Elliot Lee committed
267
268
269
    {
      gtk_widget_show (about_dialog);

270
271
272
273
274
      do_animation    = TRUE;
      do_scrolling    = FALSE;
      scroll_state    = 0;
      frame           = 0;
      offset          = 0;
275
      cur_scroll_text = 0;
Elliot Lee's avatar
Elliot Lee committed
276

277
      if (! double_speed && hadja_state != 7)
Elliot Lee's avatar
Elliot Lee committed
278
	{
279
280
281
282
	  for (i = 0; i < nscroll_texts; i++) 
	    {
	      shuffle_array[i] = i;
	    }
Elliot Lee's avatar
Elliot Lee committed
283

284
	  for (i = 0; i < nscroll_texts; i++) 
Elliot Lee's avatar
Elliot Lee committed
285
	    {
286
287
288
289
290
291
292
293
294
295
296
	      gint j;

	      j = rand() % nscroll_texts;
	      if (i != j) 
		{
		  gint t;

		  t = shuffle_array[j];
		  shuffle_array[j] = shuffle_array[i];
		  shuffle_array[i] = t;
		}
Elliot Lee's avatar
Elliot Lee committed
297
	    }
298
	  cur_scroll_text = rand() % nscroll_texts;
Elliot Lee's avatar
Elliot Lee committed
299
300
301
302
	}
    }
  else 
    {
303
      gdk_window_raise (about_dialog->window);
Elliot Lee's avatar
Elliot Lee committed
304
    }
305
306

  return about_dialog;
Elliot Lee's avatar
Elliot Lee committed
307
308
}

309
static gboolean
Elliot Lee's avatar
Elliot Lee committed
310
311
312
about_dialog_load_logo (GtkWidget *window)
{
  GtkWidget *preview;
313
314
315
316
317
318
319
  GdkGC     *gc;
  gchar      buf[1024];
  gchar     *filename;
  guchar    *pixelrow;
  FILE      *fp;
  gint       count;
  gint       i, j, k;
Elliot Lee's avatar
Elliot Lee committed
320
321
322
323

  if (logo_pixmap)
    return TRUE;

324
325
326
327
328
329
  filename = g_strconcat (gimp_data_directory (),
			  G_DIR_SEPARATOR_S,
			  "gimp_logo.ppm",
			  NULL);
  fp = fopen (filename, "rb");
  g_free (filename);
Elliot Lee's avatar
Elliot Lee committed
330
331

  if (!fp)
332
    return FALSE;
Elliot Lee's avatar
Elliot Lee committed
333
334

  fgets (buf, 1024, fp);
335
336

  if (strncmp (buf, "P6", 2) != 0)
Elliot Lee's avatar
Elliot Lee committed
337
338
    {
      fclose (fp);
339
      return FALSE;
Elliot Lee's avatar
Elliot Lee committed
340
341
342
343
344
345
346
    }

  fgets (buf, 1024, fp);
  fgets (buf, 1024, fp);
  sscanf (buf, "%d %d", &logo_width, &logo_height);

  fgets (buf, 1024, fp);
347
  if (strncmp (buf, "255", 3) != 0)
Elliot Lee's avatar
Elliot Lee committed
348
349
    {
      fclose (fp);
350
      return FALSE;
Elliot Lee's avatar
Elliot Lee committed
351
352
353
354
355
356
357
358
    }

  preview = gtk_preview_new (GTK_PREVIEW_COLOR);
  gtk_preview_size (GTK_PREVIEW (preview), logo_width, logo_height);
  pixelrow = g_new (guchar, logo_width * 3);

  for (i = 0; i < logo_height; i++)
    {
359
      count = fread (pixelrow, sizeof (guchar), logo_width * 3, fp);
Elliot Lee's avatar
Elliot Lee committed
360
361
362
363
364
      if (count != (logo_width * 3))
	{
	  gtk_widget_destroy (preview);
	  g_free (pixelrow);
	  fclose (fp);
365
	  return FALSE;
Elliot Lee's avatar
Elliot Lee committed
366
367
368
369
370
371
	}

      gtk_preview_draw_row (GTK_PREVIEW (preview), pixelrow, 0, i, logo_width);
    }

  gtk_widget_realize (window);
372
373
374
  logo_pixmap = gdk_pixmap_new (window->window, logo_width, logo_height, 
				gtk_preview_get_visual ()->depth);
  gc = gdk_gc_new (logo_pixmap);
Elliot Lee's avatar
Elliot Lee committed
375
  gtk_preview_put (GTK_PREVIEW (preview),
376
		   logo_pixmap, gc,
Elliot Lee's avatar
Elliot Lee committed
377
		   0, 0, 0, 0, logo_width, logo_height);
378
  gdk_gc_destroy (gc);
Elliot Lee's avatar
Elliot Lee committed
379

380
  gtk_widget_unref (preview);
Elliot Lee's avatar
Elliot Lee committed
381
382
383
384
  g_free (pixelrow);

  fclose (fp);

385
386
387
388
  dissolve_width =
    (logo_width / ANIMATION_SIZE) + (logo_width % ANIMATION_SIZE == 0 ? 0 : 1);
  dissolve_height =
    (logo_height / ANIMATION_SIZE) + (logo_height % ANIMATION_SIZE == 0 ? 0 : 1);
Elliot Lee's avatar
Elliot Lee committed
389
390
391
392
393
394
395
396
397
398
399
400
401

  dissolve_map = g_new (guchar, dissolve_width * dissolve_height);

  srand (time (NULL));

  for (i = 0, k = 0; i < dissolve_height; i++)
    for (j = 0; j < dissolve_width; j++, k++)
      dissolve_map[k] = rand () % ANIMATION_STEPS;

  return TRUE;
}

static void
402
403
about_dialog_destroy (GtkObject *object,
		      gpointer   data)
Elliot Lee's avatar
Elliot Lee committed
404
405
{
  about_dialog = NULL;
406
  about_dialog_unmap (NULL, NULL, NULL);
Elliot Lee's avatar
Elliot Lee committed
407
408
409
}

static void
410
411
412
about_dialog_unmap (GtkWidget *widget,
		    GdkEvent  *event,
		    gpointer   data)
Elliot Lee's avatar
Elliot Lee committed
413
414
415
416
417
418
419
420
{
  if (timer)
    {
      gtk_timeout_remove (timer);
      timer = 0;
    }
}

421
static gint
Elliot Lee's avatar
Elliot Lee committed
422
about_dialog_logo_expose (GtkWidget      *widget,
423
424
			  GdkEventExpose *event,
			  gpointer        data)
Elliot Lee's avatar
Elliot Lee committed
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
{
  if (do_animation)
    {
      if (!timer)
	{
	  about_dialog_timer (widget);
	  timer = gtk_timeout_add (75, about_dialog_timer, NULL);
	}
    }
  else
    {
      /* If we draw beyond the boundaries of the pixmap, then X
	 will generate an expose area for those areas, starting
	 an infinite cycle. We now set allow_grow = FALSE, so
	 the drawing area can never be bigger than the preview.
         Otherwise, it would be necessary to intersect event->area
         with the pixmap boundary rectangle. */

      gdk_draw_pixmap (widget->window,
		       widget->style->black_gc,
		       logo_pixmap, 
		       event->area.x, event->area.y,
		       event->area.x, event->area.y,
		       event->area.width, event->area.height);
    }

  return FALSE;
}

454
static gint
Elliot Lee's avatar
Elliot Lee committed
455
about_dialog_button (GtkWidget      *widget,
456
457
		     GdkEventButton *event,
		     gpointer        data)
Elliot Lee's avatar
Elliot Lee committed
458
459
460
461
462
463
464
465
466
467
468
{
  if (timer)
    gtk_timeout_remove (timer);
  timer = 0;
  frame = 0;

  gtk_widget_hide (about_dialog);

  return FALSE;
}

Manish Singh's avatar
Manish Singh committed
469
470
471
472
473
474
475
static gint
about_dialog_key (GtkWidget      *widget,
		  GdkEventKey    *event,
		  gpointer        data)
{
  gint i;
  
476
477
478
  if (hadja_state == 7)
    return FALSE;
    
Manish Singh's avatar
Manish Singh committed
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
  switch (event->keyval)
    {
    case GDK_h:
    case GDK_H:
      if (hadja_state == 0 || hadja_state == 5)
	hadja_state++;
      else
	hadja_state = 1;
      break;
    case GDK_a:
    case GDK_A:
      if (hadja_state == 1 || hadja_state == 4 || hadja_state == 6)
	hadja_state++;
      else
	hadja_state = 0;
      break;
    case GDK_d:
    case GDK_D:
      if (hadja_state == 2)
	hadja_state++;
      else
	hadja_state = 0;
      break;
    case GDK_j:
    case GDK_J:
      if (hadja_state == 3)
	hadja_state++;
      else
	hadja_state = 0;
      break;
    default:
      hadja_state = 0;
    }

  if (hadja_state == 7)
    {
      scroll_text = hadja_text;
      nscroll_texts = sizeof (hadja_text) / sizeof (hadja_text[0]);
      
      for (i = 0; i < nscroll_texts; i++)
	{
	  shuffle_array[i] = i;
	  scroll_text_widths[i] = gdk_string_width (scroll_area->style->font,
522
						    scroll_text[i]);
Manish Singh's avatar
Manish Singh committed
523
524
	}
      
525
      scroll_state     = 0;
Manish Singh's avatar
Manish Singh committed
526
      cur_scroll_index = 0;
527
528
      cur_scroll_text  = 0;
      offset           = 0;
Manish Singh's avatar
Manish Singh committed
529
530
531
532
533
    }
  
  return FALSE;
}

534
static void
535
536
537
about_dialog_tool_drop (GtkWidget    *widget,
			GimpViewable *viewable,
			gpointer      data)
538
539
540
{
  GdkPixmap *pixmap = NULL;
  GdkBitmap *mask   = NULL;
541
542
543
  gint       width  = 0;
  gint       height = 0;
  gint       i;
544
  
545
546
547
548
549
550
551
552
  if (do_animation)
    return;

  if (timer)
    gtk_timeout_remove (timer);

  timer = gtk_timeout_add (75, about_dialog_timer, NULL);

553
  frame        = 0;
554
555
556
557
558
559
560
561
562
563
  do_animation = TRUE;
  do_scrolling = FALSE;

  gdk_draw_rectangle (logo_pixmap,
		      logo_area->style->white_gc,
		      TRUE,
		      0, 0,
		      logo_area->allocation.width,
		      logo_area->allocation.height);

564
565
566
567
  pixmap = gdk_pixmap_create_from_xpm_d (widget->window,
					 &mask,
					 NULL,
					 wilber2_xpm);
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594

  gdk_window_get_size (pixmap, &width, &height);

  if (logo_area->allocation.width  >= width &&
      logo_area->allocation.height >= height)
    {
      gint x, y;

      x = (logo_area->allocation.width  - width) / 2;
      y = (logo_area->allocation.height - height) / 2;

      gdk_gc_set_clip_mask (logo_area->style->black_gc, mask);
      gdk_gc_set_clip_origin (logo_area->style->black_gc, x, y);

      gdk_draw_pixmap (logo_pixmap,
                       logo_area->style->black_gc,
                       pixmap, 0, 0,
                       x, y,
                       width, height);

      gdk_gc_set_clip_mask (logo_area->style->black_gc, NULL);
      gdk_gc_set_clip_origin (logo_area->style->black_gc, 0, 0);
    }

  gdk_pixmap_unref (pixmap);
  gdk_bitmap_unref (mask);

595
596
  scroll_text = drop_text;
  nscroll_texts = sizeof (drop_text) / sizeof (drop_text[0]);
597
598
599
600
601
602
603
604

  for (i = 0; i < nscroll_texts; i++)
    {
      shuffle_array[i] = i;
      scroll_text_widths[i] = gdk_string_width (scroll_area->style->font,
						scroll_text[i]);
    }

605
  scroll_state     = 0;
606
  cur_scroll_index = 0;
607
608
  cur_scroll_text  = 0;
  offset           = 0;
609

610
611
612
  double_speed = TRUE;
}

613
static gint
Elliot Lee's avatar
Elliot Lee committed
614
615
616
617
618
619
620
621
622
about_dialog_timer (gpointer data)
{
  gint i, j, k;
  gint return_val;

  return_val = TRUE;

  if (do_animation)
    {
623
      if (logo_area->allocation.width != 1)
Elliot Lee's avatar
Elliot Lee committed
624
	{
625
626
	  for (i = 0, k = 0; i < dissolve_height; i++)
	    for (j = 0; j < dissolve_width; j++, k++)
Manish Singh's avatar
Manish Singh committed
627
	      if (frame == dissolve_map[k])
628
629
630
631
		{
		  gdk_draw_pixmap (logo_area->window,
				   logo_area->style->black_gc,
				   logo_pixmap,
632
633
				   j * ANIMATION_SIZE, i * ANIMATION_SIZE,
				   j * ANIMATION_SIZE, i * ANIMATION_SIZE,
634
635
636
637
638
639
640
641
642
				   ANIMATION_SIZE, ANIMATION_SIZE);
		}

	  frame += 1;

	  if (frame == ANIMATION_STEPS)
	    {
	      do_animation = FALSE;
	      do_scrolling = TRUE;
643
	      frame        = 0;
Elliot Lee's avatar
Elliot Lee committed
644

645
	      timer = gtk_timeout_add (75, about_dialog_timer, NULL);
Elliot Lee's avatar
Elliot Lee committed
646

647
648
	      return FALSE;
	    }
Elliot Lee's avatar
Elliot Lee committed
649
650
651
652
653
	}
    }

  if (do_scrolling)
    {
654
      if (! scroll_pixmap)
655
656
657
658
659
	scroll_pixmap = gdk_pixmap_new (scroll_area->window,
					scroll_area->allocation.width,
					scroll_area->allocation.height,
					-1);

Elliot Lee's avatar
Elliot Lee committed
660
661
662
663
664
665
666
667
668
669
670
671
672
673
      switch (scroll_state)
	{
	case 1:
	  scroll_state = 2;
	  timer = gtk_timeout_add (700, about_dialog_timer, NULL);
	  return_val = FALSE;
	  break;
	case 2:
	  scroll_state = 3;
	  timer = gtk_timeout_add (75, about_dialog_timer, NULL);
	  return_val = FALSE;
	  break;
	}

674
675
      if (offset > (scroll_text_widths[cur_scroll_text] +
		    scroll_area->allocation.width))
Elliot Lee's avatar
Elliot Lee committed
676
677
678
679
680
	{
	  scroll_state = 0;
	  cur_scroll_index += 1;
	  if (cur_scroll_index == nscroll_texts)
	    cur_scroll_index = 0;
681

Elliot Lee's avatar
Elliot Lee committed
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
	  cur_scroll_text = shuffle_array[cur_scroll_index];

	  offset = 0;
	}

      gdk_draw_rectangle (scroll_pixmap,
			  scroll_area->style->white_gc,
			  TRUE, 0, 0,
			  scroll_area->allocation.width,
			  scroll_area->allocation.height);
      gdk_draw_string (scroll_pixmap,
		       scroll_area->style->font,
		       scroll_area->style->black_gc,
		       scroll_area->allocation.width - offset,
		       scroll_area->style->font->ascent,
		       scroll_text[cur_scroll_text]);
      gdk_draw_pixmap (scroll_area->window,
		       scroll_area->style->black_gc,
		       scroll_pixmap, 0, 0, 0, 0,
		       scroll_area->allocation.width,
		       scroll_area->allocation.height);

      offset += 15;
      if (scroll_state == 0)
	{
707
708
	  if (offset > ((scroll_area->allocation.width +
			 scroll_text_widths[cur_scroll_text]) / 2))
Elliot Lee's avatar
Elliot Lee committed
709
710
	    {
	      scroll_state = 1;
711
712
	      offset = (scroll_area->allocation.width +
			scroll_text_widths[cur_scroll_text]) / 2;
Elliot Lee's avatar
Elliot Lee committed
713
714
715
716
717
718
	    }
	}
    }

  return return_val;
}