about_dialog.c 18.5 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 "libgimpwidgets/gimpwidgets.h"
31

Sven Neumann's avatar
Sven Neumann committed
32 33
#include "apptypes.h"

34
#include "appenv.h"
35
#include "about_dialog.h"
36
#include "authors.h"
37
#include "gimpdnd.h"
38 39
#include "gimphelp.h"

Manish Singh's avatar
Manish Singh committed
40 41
#include "libgimp/gimpfeatures.h"

Tor Lillqvist's avatar
Tor Lillqvist committed
42
#include "libgimp/gimpenv.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 68 69 70
static void      about_dialog_tool_drop   (GtkWidget      *widget,
					   ToolType        tool,
					   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 97 98 99 100 101 102 103

/*  dnd stuff  */
static GtkTargetEntry tool_target_table[] =
{
  GIMP_TARGET_TOOL
};
static guint n_tool_targets = (sizeof (tool_target_table) /
                               sizeof (tool_target_table[0]));
Elliot Lee's avatar
Elliot Lee committed
104

105 106 107 108 109 110 111
static gchar *drop_text[] = 
{ 
  "We are The GIMP." ,
  "Prepare to be manipulated.",
  "Resistance is futile."
};

Manish Singh's avatar
Manish Singh committed
112 113 114 115
static gchar *hadja_text[] =
{
  "Hadjaha!",
  "Nej!",
116
#ifndef GDK_USE_UTF8_MBS
Manish Singh's avatar
Manish Singh committed
117
  "Tvrtom!"
118 119 120
#else
  "Tvärtom!"
#endif
Manish Singh's avatar
Manish Singh committed
121
};
122

Elliot Lee's avatar
Elliot Lee committed
123
void
124
about_dialog_create (void)
Elliot Lee's avatar
Elliot Lee committed
125 126
{
  GtkWidget *vbox;
127
  GtkWidget *aboutframe;
Elliot Lee's avatar
Elliot Lee committed
128 129
  GtkWidget *label;
  GtkWidget *alignment;
130 131 132 133 134
  GtkStyle  *style;
  GdkFont   *font;
  gint       max_width;
  gint       i;
  gchar     *label_text;
Elliot Lee's avatar
Elliot Lee committed
135 136 137 138

  if (!about_dialog)
    {
      about_dialog = gtk_window_new (GTK_WINDOW_DIALOG);
139
      gtk_window_set_wmclass (GTK_WINDOW (about_dialog), "about_dialog", "Gimp");
140
      gtk_window_set_title (GTK_WINDOW (about_dialog), _("About the GIMP"));
Elliot Lee's avatar
Elliot Lee committed
141
      gtk_window_set_policy (GTK_WINDOW (about_dialog), FALSE, FALSE, FALSE);
142 143
      gtk_window_set_position (GTK_WINDOW (about_dialog), GTK_WIN_POS_CENTER);

144 145 146
      gimp_help_connect_help_accel (about_dialog, gimp_standard_help_func,
				    "dialogs/about.html");

Elliot Lee's avatar
Elliot Lee committed
147
      gtk_signal_connect (GTK_OBJECT (about_dialog), "destroy",
148 149
			  GTK_SIGNAL_FUNC (about_dialog_destroy),
			  NULL);
Elliot Lee's avatar
Elliot Lee committed
150
      gtk_signal_connect (GTK_OBJECT (about_dialog), "unmap_event",
151 152
			  GTK_SIGNAL_FUNC (about_dialog_unmap),
			  NULL);
Elliot Lee's avatar
Elliot Lee committed
153
      gtk_signal_connect (GTK_OBJECT (about_dialog), "button_press_event",
154 155
			  GTK_SIGNAL_FUNC (about_dialog_button),
			  NULL);
Manish Singh's avatar
Manish Singh committed
156 157 158 159
      gtk_signal_connect (GTK_OBJECT (about_dialog), "key_press_event",
			  GTK_SIGNAL_FUNC (about_dialog_key),
			  NULL);
      
160 161 162 163 164 165 166 167
      /*  dnd stuff  */
      gtk_drag_dest_set (about_dialog,
			 GTK_DEST_DEFAULT_MOTION |
			 GTK_DEST_DEFAULT_DROP,
			 tool_target_table, n_tool_targets,
			 GDK_ACTION_COPY); 
      gimp_dnd_tool_dest_set (about_dialog, about_dialog_tool_drop, NULL);

Elliot Lee's avatar
Elliot Lee committed
168 169 170 171 172 173 174 175 176 177
      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;
	  return;
	}

      vbox = gtk_vbox_new (FALSE, 1);
178
      gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
Elliot Lee's avatar
Elliot Lee committed
179 180 181
      gtk_container_add (GTK_CONTAINER (about_dialog), vbox);
      gtk_widget_show (vbox);

182 183
      aboutframe = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (aboutframe), GTK_SHADOW_IN);
184
      gtk_container_set_border_width (GTK_CONTAINER (aboutframe), 0);
185 186
      gtk_box_pack_start (GTK_BOX (vbox), aboutframe, TRUE, TRUE, 0);
      gtk_widget_show (aboutframe);
Elliot Lee's avatar
Elliot Lee committed
187 188 189

      logo_area = gtk_drawing_area_new ();
      gtk_signal_connect (GTK_OBJECT (logo_area), "expose_event",
190 191 192 193
			  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
194
      gtk_widget_set_events (logo_area, GDK_EXPOSURE_MASK);
195
      gtk_container_add (GTK_CONTAINER (aboutframe), logo_area);
Elliot Lee's avatar
Elliot Lee committed
196 197 198 199 200
      gtk_widget_show (logo_area);

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

201 202 203 204 205 206 207
      /* 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;
208
	  gdk_font_ref (style->font);
209 210 211
	  gtk_widget_push_style (style);
	  gtk_style_unref (style);
	}
212 213
      label_text = g_strdup_printf (_("Version %s brought to you by"),
				    GIMP_VERSION);
214
      label = gtk_label_new (label_text);
215 216
      g_free (label_text);
      label_text = NULL;
Elliot Lee's avatar
Elliot Lee committed
217 218 219
      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
      gtk_widget_show (label);

Sven Neumann's avatar
Sven Neumann committed
220
      label = gtk_label_new ("Spencer Kimball & Peter Mattis");
Elliot Lee's avatar
Elliot Lee committed
221 222 223 224 225 226 227 228 229
      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);

230 231
      aboutframe = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (aboutframe), GTK_SHADOW_IN);
232
      gtk_container_set_border_width (GTK_CONTAINER (aboutframe), 0);
233 234
      gtk_container_add (GTK_CONTAINER (alignment), aboutframe);
      gtk_widget_show (aboutframe);
Elliot Lee's avatar
Elliot Lee committed
235 236 237 238

      max_width = 0;
      for (i = 0; i < nscroll_texts; i++)
	{
239 240
	  scroll_text_widths[i] = gdk_string_width (aboutframe->style->font,
						    scroll_text[i]);
Elliot Lee's avatar
Elliot Lee committed
241 242
	  max_width = MAX (max_width, scroll_text_widths[i]);
	}
243 244 245 246 247
      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
248 249 250 251 252
      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
253 254 255
      scroll_area = gtk_drawing_area_new ();
      gtk_drawing_area_size (GTK_DRAWING_AREA (scroll_area),
			     max_width + 10,
256 257 258 259
			     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
260 261
      gtk_widget_show (scroll_area);

262
      label = gtk_label_new (_("Please visit http://www.gimp.org/ for more info"));
263 264 265
      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
      gtk_widget_show (label);

Elliot Lee's avatar
Elliot Lee committed
266
      gtk_widget_realize (scroll_area);
267 268
      gdk_window_set_background (scroll_area->window,
				 &scroll_area->style->white);
Elliot Lee's avatar
Elliot Lee committed
269 270 271 272 273 274 275 276 277 278 279
    }

  if (!GTK_WIDGET_VISIBLE (about_dialog))
    {
      gtk_widget_show (about_dialog);

      do_animation = TRUE;
      do_scrolling = FALSE;
      scroll_state = 0;
      frame = 0;
      offset = 0;
280
      cur_scroll_text = 0;
Elliot Lee's avatar
Elliot Lee committed
281

282
      if (!double_speed && hadja_state != 7)
Elliot Lee's avatar
Elliot Lee committed
283
	{
284 285 286 287
	  for (i = 0; i < nscroll_texts; i++) 
	    {
	      shuffle_array[i] = i;
	    }
Elliot Lee's avatar
Elliot Lee committed
288

289
	  for (i = 0; i < nscroll_texts; i++) 
Elliot Lee's avatar
Elliot Lee committed
290
	    {
291 292 293 294 295 296 297 298 299 300 301
	      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
302
	    }
303
	  cur_scroll_text = rand() % nscroll_texts;
Elliot Lee's avatar
Elliot Lee committed
304 305 306 307
	}
    }
  else 
    {
308
      gdk_window_raise (about_dialog->window);
Elliot Lee's avatar
Elliot Lee committed
309 310 311
    }
}

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

  if (logo_pixmap)
    return TRUE;

327 328 329 330 331 332
  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
333 334

  if (!fp)
335
    return FALSE;
Elliot Lee's avatar
Elliot Lee committed
336 337

  fgets (buf, 1024, fp);
338 339

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

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

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

  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++)
    {
362
      count = fread (pixelrow, sizeof (guchar), logo_width * 3, fp);
Elliot Lee's avatar
Elliot Lee committed
363 364 365 366 367
      if (count != (logo_width * 3))
	{
	  gtk_widget_destroy (preview);
	  g_free (pixelrow);
	  fclose (fp);
368
	  return FALSE;
Elliot Lee's avatar
Elliot Lee committed
369 370 371 372 373 374
	}

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

  gtk_widget_realize (window);
375 376 377
  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
378
  gtk_preview_put (GTK_PREVIEW (preview),
379
		   logo_pixmap, gc,
Elliot Lee's avatar
Elliot Lee committed
380
		   0, 0, 0, 0, logo_width, logo_height);
381
  gdk_gc_destroy (gc);
Elliot Lee's avatar
Elliot Lee committed
382

383
  gtk_widget_unref (preview);
Elliot Lee's avatar
Elliot Lee committed
384 385 386 387
  g_free (pixelrow);

  fclose (fp);

388 389 390 391
  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
392 393 394 395 396 397 398 399 400 401 402 403 404

  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
405 406
about_dialog_destroy (GtkObject *object,
		      gpointer   data)
Elliot Lee's avatar
Elliot Lee committed
407 408
{
  about_dialog = NULL;
409
  about_dialog_unmap (NULL, NULL, NULL);
Elliot Lee's avatar
Elliot Lee committed
410 411 412
}

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

424
static gint
Elliot Lee's avatar
Elliot Lee committed
425
about_dialog_logo_expose (GtkWidget      *widget,
426 427
			  GdkEventExpose *event,
			  gpointer        data)
Elliot Lee's avatar
Elliot Lee committed
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 454 455 456
{
  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;
}

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

  gtk_widget_hide (about_dialog);

  return FALSE;
}

Manish Singh's avatar
Manish Singh committed
472 473 474 475 476 477 478
static gint
about_dialog_key (GtkWidget      *widget,
		  GdkEventKey    *event,
		  gpointer        data)
{
  gint i;
  
479 480 481
  if (hadja_state == 7)
    return FALSE;
    
Manish Singh's avatar
Manish Singh committed
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 522 523 524
  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,
525
						    scroll_text[i]);
Manish Singh's avatar
Manish Singh committed
526 527 528 529 530 531 532 533 534 535 536
	}
      
      scroll_state = 0;
      cur_scroll_index = 0;
      cur_scroll_text = 0;
      offset = 0;
    }
  
  return FALSE;
}

537 538 539 540 541 542 543 544 545
static void
about_dialog_tool_drop (GtkWidget *widget,
			ToolType   tool,
			gpointer   data)
{
  GdkPixmap *pixmap = NULL;
  GdkBitmap *mask   = NULL;
  gint width  = 0;
  gint height = 0;
546
  gint i;
547
  
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 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 595 596 597 598
  if (do_animation)
    return;

  if (timer)
    gtk_timeout_remove (timer);

  timer = gtk_timeout_add (75, about_dialog_timer, NULL);

  frame = 0;
  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);

  pixmap =
    gdk_pixmap_create_from_xpm_d (widget->window,
                                  &mask,
                                  NULL,
                                  wilber2_xpm);

  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);

599 600
  scroll_text = drop_text;
  nscroll_texts = sizeof (drop_text) / sizeof (drop_text[0]);
601 602 603 604 605 606 607 608 609 610 611 612 613

  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]);
    }

  scroll_state = 0;
  cur_scroll_index = 0;
  cur_scroll_text = 0;
  offset = 0;

614 615 616
  double_speed = TRUE;
}

617
static gint
Elliot Lee's avatar
Elliot Lee committed
618 619 620 621 622 623 624 625 626
about_dialog_timer (gpointer data)
{
  gint i, j, k;
  gint return_val;

  return_val = TRUE;

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

	  frame += 1;

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

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

651 652
	      return FALSE;
	    }
Elliot Lee's avatar
Elliot Lee committed
653 654 655 656 657
	}
    }

  if (do_scrolling)
    {
658 659 660 661 662 663
      if (!scroll_pixmap)
	scroll_pixmap = gdk_pixmap_new (scroll_area->window,
					scroll_area->allocation.width,
					scroll_area->allocation.height,
					-1);

Elliot Lee's avatar
Elliot Lee committed
664 665 666 667 668 669 670 671 672 673 674 675 676 677
      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;
	}

678 679
      if (offset > (scroll_text_widths[cur_scroll_text] +
		    scroll_area->allocation.width))
Elliot Lee's avatar
Elliot Lee committed
680 681 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 707 708 709 710
	{
	  scroll_state = 0;
	  cur_scroll_index += 1;
	  if (cur_scroll_index == nscroll_texts)
	    cur_scroll_index = 0;
	  
	  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)
	{
711 712
	  if (offset > ((scroll_area->allocation.width +
			 scroll_text_widths[cur_scroll_text]) / 2))
Elliot Lee's avatar
Elliot Lee committed
713 714
	    {
	      scroll_state = 1;
715 716
	      offset = (scroll_area->allocation.width +
			scroll_text_widths[cur_scroll_text]) / 2;
Elliot Lee's avatar
Elliot Lee committed
717 718 719 720 721 722
	    }
	}
    }

  return return_val;
}