rshot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <AppKit/AppKit.h>
3
+
4
+ @interface AppDelegate : NSObject
5
+ {
6
+ }
7
+
8
+ - (void)applicationDidFinishLaunching:(NSNotification*)notice;
9
+ - (void)threadStart:(NSApplication*)application;
10
+
11
+ @end
@@ -0,0 +1,15 @@
1
+ #include "app_delegate.h"
2
+
3
+ @implementation AppDelegate
4
+
5
+ - (void)applicationDidFinishLaunching:(NSNotification*)notice
6
+ {
7
+ NSLog(@"applicationDidFinishLaunching");
8
+ }
9
+
10
+ - (void)threadStart:(NSApplication*)application
11
+ {
12
+ [application run];
13
+ }
14
+
15
+ @end
@@ -0,0 +1,5 @@
1
+ require "mkmf"
2
+
3
+ $DLDFLAGS << " -framework Foundation -framework AppKit -framework WebKit"
4
+ $CFLAGS << " -std=c99"
5
+ create_makefile "rshot/rshot"
data/ext/rshot/rshot.h ADDED
@@ -0,0 +1,26 @@
1
+ #include "setjmp.h"
2
+ #import <Foundation/Foundation.h>
3
+ #import <AppKit/NSBitmapImageRep.h>
4
+ #import <WebKit/WebKit.h>
5
+ #import <WebKit/WebView.h>
6
+ #import <WebKit/WebFrame.h>
7
+ #import <WebKit/WebFrameLoadDelegate.h>
8
+
9
+ extern jmp_buf RShot_finishedEnv;
10
+
11
+ @interface RShot : NSObject
12
+ {
13
+ WebView* webView;
14
+ NSString* path;
15
+ }
16
+
17
+ @property (retain) WebView* webView;
18
+ @property (retain) NSString* path;
19
+
20
+ - (void)renderUrl:(NSString*)url toFile:(NSString*)file;
21
+ - (void)webView:(WebView*)sender didFinishLoadForFrame:(WebFrame*)frame;
22
+ - (void)webView:(WebView*)sender didFailProvisionalLoadWithError:(NSError*)error forFrame:(WebFrame*)frame;
23
+ - (void)webView:(WebView*)sender didFailLoadWithError:(NSError*)error forFrame:(WebFrame*)frame;
24
+ - (void)dealloc;
25
+
26
+ @end
data/ext/rshot/rshot.m ADDED
@@ -0,0 +1,56 @@
1
+ #import "rshot.h"
2
+
3
+ @implementation RShot
4
+
5
+ @synthesize webView, path;
6
+
7
+ - (void)renderUrl:(NSString*)url toFile:(NSString*)file
8
+ {
9
+ NSRect rect = NSMakeRect(0, 0, 800, 600);
10
+ NSWindow* window = [[NSWindow alloc]
11
+ initWithContentRect: rect
12
+ styleMask: NSBorderlessWindowMask
13
+ backing: NSBackingStoreBuffered
14
+ defer: NO];
15
+
16
+ path = file;
17
+ webView = [[WebView alloc] initWithFrame: rect];
18
+ [window setContentView: webView];
19
+ [webView setFrameLoadDelegate: self];
20
+ [[webView mainFrame] loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url]]];
21
+ }
22
+
23
+ - (void)webView:(WebView*)sender didFinishLoadForFrame:(WebFrame*)frame
24
+ {
25
+ NSBitmapImageRep* bmp;
26
+ NSView* view = [[[webView mainFrame] frameView] documentView];
27
+ [[view window] setContentSize: [view bounds].size];
28
+ [view lockFocus];
29
+
30
+ bmp = [[NSBitmapImageRep alloc] initWithFocusedViewRect: [view bounds]];
31
+ [view unlockFocus];
32
+ NSLog(@"%@", path);
33
+ [[bmp representationUsingType: NSPNGFileType properties: nil] writeToFile: path atomically: YES];
34
+
35
+ [NSApp stop: self];
36
+ longjmp(RShot_finishedEnv, 0);
37
+ }
38
+
39
+ - (void)webView:(WebView*)sender didFailProvisionalLoadWithError:(NSError*)error forFrame:(WebFrame*)frame
40
+ {
41
+ NSLog(@"Error: %@", [error localizedDescription]);
42
+ }
43
+
44
+ - (void)webView:(WebView*)sender didFailLoadWithError:(NSError*)error forFrame:(WebFrame*)frame
45
+ {
46
+ NSLog(@"Error: %@", [error localizedDescription]);
47
+ }
48
+
49
+ - (void)dealloc
50
+ {
51
+ [webView release];
52
+ [path release];
53
+ [super dealloc];
54
+ }
55
+
56
+ @end
data/ext/rshot/ruby.m ADDED
@@ -0,0 +1,52 @@
1
+ #import <AppKit/AppKit.h>
2
+ #include "ruby.h"
3
+ #import "rshot.h"
4
+ #import "app_delegate.h"
5
+
6
+ jmp_buf RShot_finishedEnv;
7
+
8
+ static VALUE rb_cRShot = Qundef;
9
+ static VALUE RShot_alloc(VALUE class);
10
+ static void RShot_free(void* rshot);
11
+ static VALUE RShot_render_url(VALUE self, VALUE url, VALUE png);
12
+ static VALUE RShot_gogogo(VALUE self);
13
+ static NSAutoreleasePool* pool;
14
+ static NSThread* app_thread;
15
+ static AppDelegate* app_delegate;
16
+
17
+ void Init_rshot()
18
+ {
19
+ pool = [[NSAutoreleasePool alloc] init];
20
+ [NSApplication sharedApplication];
21
+ app_delegate = [[AppDelegate alloc] init];
22
+ [NSApp setDelegate: app_delegate];
23
+
24
+ rb_cRShot = rb_define_class("RShot", rb_cObject);
25
+ rb_define_alloc_func(rb_cRShot, RShot_alloc);
26
+ rb_define_method(rb_cRShot, "render_url", RShot_render_url, 2);
27
+ }
28
+
29
+ static void RShot_free(void* rshot)
30
+ {
31
+ [(RShot*)rshot release];
32
+ [pool drain];
33
+ }
34
+
35
+ static VALUE RShot_alloc(VALUE class)
36
+ {
37
+ RShot* rshot = [[RShot alloc] init];
38
+ return Data_Wrap_Struct(class, 0, RShot_free, rshot);
39
+ }
40
+
41
+ static VALUE RShot_render_url(VALUE self, VALUE url, VALUE png)
42
+ {
43
+ RShot* rshot;
44
+ NSString* nsurl = [NSString stringWithUTF8String: rb_string_value_cstr(&url)];
45
+ NSString* nspng = [NSString stringWithUTF8String: rb_string_value_cstr(&png)];
46
+ Data_Get_Struct(self, RShot, rshot);
47
+ [rshot renderUrl: nsurl toFile: nspng];
48
+ if(!setjmp(RShot_finishedEnv)) {
49
+ [NSApp run];
50
+ }
51
+ return Qtrue;
52
+ }
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rshot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Charlie Somerville
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-26 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email: charlie@charliesomerville.com
16
+ executables: []
17
+ extensions:
18
+ - ext/rshot/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ext/rshot/app_delegate.m
22
+ - ext/rshot/rshot.m
23
+ - ext/rshot/ruby.m
24
+ - ext/rshot/app_delegate.h
25
+ - ext/rshot/rshot.h
26
+ - ext/rshot/extconf.rb
27
+ homepage: https://github.com/charliesome/RShot
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 1.8.10
48
+ signing_key:
49
+ specification_version: 3
50
+ summary: Takes screenshots of web pages
51
+ test_files: []