やっとMozillaのコード読めるようになってきたよ

しかし、なんか、今月号のCマガに全部書いてあった説。あと二日早く気付いてればなぁ…


まあ…まあいいや。

#include <stdio.h>
#include <nsIServiceManager.h>
#include <nsXPCOM.h>
#include <nsIBaseWindow.h>
#include <nsIAppShell.h>
#include <nsWidgetsCID.h>
#include <nsIWidget.h>
#include <nsRect.h>
#include <nsGUIEvent.h>
#include <gtk/gtk.h>
#include <nsIRenderingContext.h>
#include <nsFont.h>
#include <nsGfxCIID.h>
#include <nsIFontMetrics.h>
#include <nsIErrorService.h>

static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
static NS_DEFINE_CID(kFontMetricsCID, NS_FONT_METRICS_CID);
static NS_DEFINE_CID(kWindowCID, NS_WINDOW_CID);
static NS_DEFINE_CID(kLabelCID, NS_LABEL_CID );
static NS_DEFINE_CID(kESCID, NS_ERRORSERVICE_CID);

static nsEventStatus PR_CALLBACK
event_callback( nsGUIEvent *ev )
{
	switch ( ev->message ) {
	case NS_XUL_CLOSE:
		ev->widget->GetAppShell()->Exit();
		return nsEventStatus_eConsumeNoDefault;

	case NS_PAINT:
	{
		nsIRenderingContext *rc = ((nsPaintEvent*)ev)->renderingContext;
		nsRect *r = ((nsPaintEvent*)ev)->rect;
		rc->SetColor( NS_RGB(0,0,0) );
		rc->FillRect( *r );

		rc->SetColor( NS_RGB(0xff,0xff,0xff) );
		rc->DrawLine( 0, 0, 100, 100 );
		/*rc->DrawString( "Hello", 5, 100, 100 );*/
		return nsEventStatus_eConsumeNoDefault;		
	}
		
	}

	return nsEventStatus_eIgnore;
}


int main( int argc, char **argv )
{
	nsresult rv;

	gtk_set_locale();

	gtk_init(&argc, &argv);

	gtk_widget_set_default_visual(gdk_rgb_get_visual());
	gtk_widget_set_default_colormap(gdk_rgb_get_cmap());


	rv = NS_InitXPCOM2(nsnull, nsnull, nsnull);
	if ( NS_FAILED(rv) ) {
		printf("Calling NS_InitXPCOM returns [%x].\n", rv);
		return -1;
	}

	{
		nsresult rv;
		nsWidgetInitData init;
		nsCOMPtr<nsIAppShell> appShell;
		nsCOMPtr<nsIWidget> window;
		nsCOMPtr<nsIWidget> label;
		appShell = do_CreateInstance( kAppShellCID );
		nsRect r( 0, 0, 100, 100 );

		init.mWindowType = eWindowType_toplevel;

		if ( !appShell ) {
			NS_WARNING( "Failed to create appshell" );
			return 1;
		}

		rv = appShell->Create( &argc, argv );
		if ( NS_FAILED(rv) ) {
			NS_WARNING( "Failed to create appshell" );
			return 1;
		}
		
		rv = appShell->Spinup();
		if ( NS_FAILED(rv) ) {
			NS_WARNING( "Failed to create appshell" );
			return 1;
		}

		window = do_CreateInstance( kWindowCID, &rv );
		window->Create( (nsIWidget*)nsnull, r, event_callback, nsnull, appShell, nsnull,&init );

		window->Show( PR_TRUE );
		window->Move( 0, 0 );
		window->Resize( 640, 480, true );


		appShell->Run();
	}
			

	NS_ShutdownXPCOM(nsnull);
	return 0;
}

大体こんな感じにすれば、ただの生ウィンドウにRenderingContext(多分GraphicsContextのこと)使ってなんか色々できるはず。
初期化部分がちょい環境依存。これは多分仕方ない。
というわけでブラウザを作ろう編に続く、かもしれない。やる気が出れば。


そして、長いコードを貼り付けるのはあんまりよくない。けど、これが一番楽なんだよな…