splash.cpp

来自「celestia源代码」· C++ 代码 · 共 187 行

CPP
187
字号
/* *  Celestia GTK+ Front-End *  Copyright (C) 2005 Pat Suwalski <pat@suwalski.net> * *  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. * *  $Id: splash.cpp,v 1.3 2006/01/09 19:02:54 suwalski Exp $ */#ifdef HAVE_CONFIG_H#include <config.h>#endif /* HAVE_CONFIG_H */#include <gtk/gtk.h>#ifdef CAIRO#include <cairo/cairo.h>#endif /* CAIRO */#include "splash.h"#include "common.h"/* Declarations */static gboolean splashExpose(GtkWidget* win, GdkEventExpose *event, SplashData* ss);/* OBJECT: Overrides ProgressNotifier to receive feedback from core */GtkSplashProgressNotifier::GtkSplashProgressNotifier(SplashData* _splash) :	splash(_splash) {};void GtkSplashProgressNotifier::update(const string& filename){	splashSetText(splash, filename.c_str());}GtkSplashProgressNotifier::~GtkSplashProgressNotifier() {};/* ENTRY: Creates a new SplashData struct, starts the splash screen */SplashData* splashStart(AppData* app, gboolean showSplash){	SplashData* ss = g_new0(SplashData, 1);	ss->app = app;	ss->notifier = new GtkSplashProgressNotifier(ss);	ss->hasARGB = FALSE;	ss->redraw = TRUE;	/* Continue the "wait" cursor until the splash is done */	gtk_window_set_auto_startup_notification(FALSE);		/* Don't do anything else if the splash is not to be shown */	if (showSplash == FALSE) return ss;	ss->splash = gtk_window_new(GTK_WINDOW_POPUP);	gtk_window_set_position(GTK_WINDOW(ss->splash), GTK_WIN_POS_CENTER);	gtk_widget_set_app_paintable(ss->splash, TRUE);	#ifdef CAIRO	/* Colormap Magic */	GdkScreen* screen = gtk_widget_get_screen(ss->splash);	GdkColormap* colormap = gdk_screen_get_rgba_colormap(screen);	if (colormap != NULL)	{		gtk_widget_set_colormap(ss->splash, colormap);		ss->hasARGB = TRUE;	}	#endif	GtkWidget* gf = gtk_fixed_new();	gtk_container_add(GTK_CONTAINER(ss->splash), gf);	GtkWidget* i = gtk_image_new_from_file("splash/splash.png");	gtk_fixed_put(GTK_FIXED(gf), i, 0, 0);	/* The information label is right-aligned and biased to the lower-right	 * of the window. It's designed to be the full width and height of the	 * opaque parts of the splash. */	ss->label = gtk_label_new(NULL);	gtk_misc_set_alignment(GTK_MISC(ss->label), 1, 1);	gtk_label_set_justify(GTK_LABEL(ss->label), GTK_JUSTIFY_RIGHT);	gtk_widget_modify_fg(ss->label, GTK_STATE_NORMAL, &ss->label->style->white);	gtk_widget_show_all(ss->splash);	/* Size allocations available after showing splash. */	gtk_widget_set_size_request(ss->label, i->allocation.width - 80,	                                       i->allocation.height / 2);	gtk_fixed_put(GTK_FIXED(gf), ss->label, 40, i->allocation.height / 2 - 40);	gtk_widget_show(ss->label);	g_signal_connect (ss->splash, "expose_event",			  G_CALLBACK (splashExpose),  			  ss);		while (gtk_events_pending()) gtk_main_iteration();	return ss;}/* ENTRY: destroys the splash screen */void splashEnd(SplashData* ss){	if (ss->splash)		gtk_widget_destroy(ss->splash);	/* Return the cursor from wait to normal */	gdk_notify_startup_complete();	delete ss->notifier;	g_free(ss);}/* ENTRY: Sets the text to be shown in the splash */void splashSetText(SplashData* ss, const char* text){	char message[255];	if (!ss->splash)		return;	sprintf(message, "Version " VERSION "\n%s", text);	gtk_label_set_text(GTK_LABEL(ss->label), message);	/* Update the GTK event queue */	while (gtk_events_pending()) gtk_main_iteration();}/* CALLBACK: Called when the splash screen is exposed */static gboolean splashExpose(GtkWidget* win, GdkEventExpose *event, SplashData* ss){	/* All of this code is only needed at the very first drawing. This	 * operation is quite expensive. */	if (ss->redraw != TRUE) return FALSE;	if (ss->hasARGB)	{		#ifdef CAIRO		/* Use cairo for true transparent windows */		cairo_t *cr = gdk_cairo_create(win->window);				cairo_rectangle(cr, event->area.x,				    event->area.y,				    event->area.width,				    event->area.height);	        cairo_clip(cr);			/* Draw a fully transparent rectangle the size of the window */		cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.0);			cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);		cairo_paint(cr);			cairo_destroy(cr);		#endif /* CAIRO */	}	else	{		/* Fall back to compositing a screenshot of whatever is below the		 * area we are drawing in. */		GdkPixbuf* bg;		int x, y, w, h;		gdk_window_get_root_origin(win->window, &x, &y);		gdk_drawable_get_size(win->window, &w, &h);		bg = gdk_pixbuf_get_from_drawable(NULL,		                                  gtk_widget_get_root_window(win),		                                  NULL, x, y, 0, 0, w, h);		gdk_draw_pixbuf(win->window, NULL, bg, 0, 0, 0, 0, w, h,		                GDK_RGB_DITHER_NONE, 0, 0);	}		/* Never redraw again */	ss->redraw = FALSE;	return FALSE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?