summaryrefslogtreecommitdiff
path: root/frontends/cocoa/gui.m
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2016-05-05 22:28:51 +0100
committerVincent Sanders <vince@kyllikki.org>2016-05-15 13:44:34 +0100
commitd21447d096a320a08b3efb2b8768fad0dcdcfd64 (patch)
tree1a83814b7c9e94b2f13c473261f23dd3a17dee64 /frontends/cocoa/gui.m
parent2cbb337756d9af5bda4d594964d446439f602551 (diff)
downloadnetsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.gz
netsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.bz2
move frontends into sub directory
Diffstat (limited to 'frontends/cocoa/gui.m')
-rw-r--r--frontends/cocoa/gui.m335
1 files changed, 335 insertions, 0 deletions
diff --git a/frontends/cocoa/gui.m b/frontends/cocoa/gui.m
new file mode 100644
index 000000000..a634f6a9e
--- /dev/null
+++ b/frontends/cocoa/gui.m
@@ -0,0 +1,335 @@
+/*
+ * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf 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; version 2 of the License.
+ *
+ * NetSurf 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#import "utils/nsoption.h"
+#import "utils/utils.h"
+#import "utils/log.h"
+#import "desktop/mouse.h"
+#import "desktop/gui_window.h"
+#import "desktop/gui_misc.h"
+#import "desktop/browser.h"
+#import "desktop/textinput.h"
+#import "image/ico.h"
+#import "content/fetchers/resource.h"
+#import "content/hlcache.h"
+#import "content/content.h"
+
+#import "cocoa/gui.h"
+#import "cocoa/plotter.h"
+#import "cocoa/BrowserView.h"
+#import "cocoa/BrowserViewController.h"
+#import "cocoa/BrowserWindowController.h"
+#import "cocoa/FormSelectMenu.h"
+#import "cocoa/fetch.h"
+#import "cocoa/schedule.h"
+
+
+NSString * const kCookiesFileOption = @"CookiesFile";
+NSString * const kURLsFileOption = @"URLsFile";
+NSString * const kHotlistFileOption = @"Hotlist";
+NSString * const kHomepageURLOption = @"HomepageURL";
+NSString * const kOptionsFileOption = @"ClassicOptionsFile";
+NSString * const kAlwaysCancelDownload = @"AlwaysCancelDownload";
+NSString * const kAlwaysCloseMultipleTabs = @"AlwaysCloseMultipleTabs";
+
+#define UNIMPL() NSLog( @"Function '%s' unimplemented", __func__ )
+
+struct browser_window;
+
+/* exported function docuemnted in cocoa/gui.h */
+nserror cocoa_warning(const char *warning, const char *detail)
+{
+ NSRunAlertPanel( NSLocalizedString( @"Warning",
+ @"Warning title" ),
+ NSLocalizedString( @"Warning %s%s%s",
+ @"Warning message" ),
+ NSLocalizedString( @"OK", @"" ), nil, nil,
+ warning, detail != NULL ? ": " : "",
+ detail != NULL ? detail : "" );
+ return NSERROR_OK;
+}
+
+
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
+{
+ BrowserWindowController *window = nil;
+ BrowserViewController *result;
+
+ browser_window_set_scale(bw, (float)nsoption_int(scale) / 100, false);
+ if (existing != NULL) {
+ window = [(BrowserViewController *)(existing) windowController];
+ }
+
+ result = [[BrowserViewController alloc] initWithBrowser: bw];
+
+ if (!(flags & GW_CREATE_TAB) || nil == window) {
+ window = [[[BrowserWindowController alloc] init] autorelease];
+ [[window window] makeKeyAndOrderFront: nil];
+ }
+ [window addTab: result];
+
+ return (struct gui_window *)result;
+}
+
+static void gui_window_destroy(struct gui_window *g)
+{
+ BrowserViewController *vc = (BrowserViewController *)g;
+ [vc release];
+}
+
+static void gui_window_set_title(struct gui_window *g, const char *title)
+{
+ [(BrowserViewController *)g setTitle: [NSString stringWithUTF8String: title]];
+}
+
+static void gui_window_redraw_window(struct gui_window *g)
+{
+ [[(BrowserViewController *)g browserView] setNeedsDisplay: YES];
+}
+
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+{
+ const NSRect nsrect = cocoa_scaled_rect_wh(
+ browser_window_get_scale([(BrowserViewController *)g browser]),
+ rect->x0, rect->y0,
+ rect->x1 - rect->x0, rect->y1 - rect->y0 );
+ [[(BrowserViewController *)g browserView] setNeedsDisplayInRect: nsrect];
+}
+
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+{
+ NSCParameterAssert( g != NULL && sx != NULL && sy != NULL );
+
+ NSRect visible = [[(BrowserViewController *)g browserView] visibleRect];
+ *sx = cocoa_pt_to_px( NSMinX( visible ) );
+ *sy = cocoa_pt_to_px( NSMinY( visible ) );
+ return true;
+}
+
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+{
+ [[(BrowserViewController *)g browserView] scrollPoint: cocoa_point( sx, sy )];
+}
+
+/**
+ * callback from core to reformat a window.
+ */
+static void cocoa_window_reformat(struct gui_window *gw)
+{
+ if (gw != NULL) {
+ [[(BrowserViewController *)gw browserView] reformat ];
+ }
+}
+
+
+static void gui_window_get_dimensions(struct gui_window *g,
+ int *width, int *height,
+ bool scaled)
+{
+ NSCParameterAssert( width != NULL && height != NULL );
+
+ NSRect frame = [[[(BrowserViewController *)g browserView] superview] frame];
+ if (scaled) {
+ const CGFloat scale = browser_window_get_scale([(BrowserViewController *)g browser]);
+ frame.size.width /= scale;
+ frame.size.height /= scale;
+ }
+ *width = cocoa_pt_to_px( NSWidth( frame ) );
+ *height = cocoa_pt_to_px( NSHeight( frame ) );
+}
+
+static void gui_window_update_extent(struct gui_window *g)
+{
+ BrowserViewController * const window = (BrowserViewController *)g;
+ int width;
+ int height;
+ struct browser_window *browser = [window browser];
+
+ browser_window_get_extents(browser, false, &width, &height);
+
+ [[window browserView] setMinimumSize:
+ cocoa_scaled_size( browser_window_get_scale(browser), width, height )];
+}
+
+static void gui_window_set_status(struct gui_window *g, const char *text)
+{
+ [(BrowserViewController *)g setStatus: [NSString stringWithUTF8String: text]];
+}
+
+static void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
+{
+ switch (shape) {
+ case GUI_POINTER_DEFAULT:
+ case GUI_POINTER_WAIT:
+ case GUI_POINTER_PROGRESS:
+ [[NSCursor arrowCursor] set];
+ break;
+
+ case GUI_POINTER_CROSS:
+ [[NSCursor crosshairCursor] set];
+ break;
+
+ case GUI_POINTER_POINT:
+ case GUI_POINTER_MENU:
+ [[NSCursor pointingHandCursor] set];
+ break;
+
+ case GUI_POINTER_CARET:
+ [[NSCursor IBeamCursor] set];
+ break;
+
+ case GUI_POINTER_MOVE:
+ [[NSCursor closedHandCursor] set];
+ break;
+
+ default:
+ NSLog( @"Other cursor %d requested", shape );
+ [[NSCursor arrowCursor] set];
+ break;
+ }
+}
+
+static nserror gui_window_set_url(struct gui_window *g, struct nsurl *url)
+{
+ [(BrowserViewController *)g setUrl: [NSString stringWithUTF8String: nsurl_access(url)]];
+ return NSERROR_OK;
+}
+
+static void gui_window_start_throbber(struct gui_window *g)
+{
+ [(BrowserViewController *)g setIsProcessing: YES];
+ [(BrowserViewController *)g updateBackForward];
+}
+
+static void gui_window_stop_throbber(struct gui_window *g)
+{
+ [(BrowserViewController *)g setIsProcessing: NO];
+ [(BrowserViewController *)g updateBackForward];
+}
+
+static void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
+{
+ NSBitmapImageRep *bmp = NULL;
+ NSImage *image = nil;
+
+ if (icon != NULL) {
+ bmp = (NSBitmapImageRep *)content_get_bitmap( icon );
+ }
+
+ if (bmp != nil) {
+ image = [[NSImage alloc] initWithSize: NSMakeSize( 32, 32 )];
+ [image addRepresentation: bmp];
+ } else {
+ image = [[NSImage imageNamed: @"NetSurf"] copy];
+ }
+ [image setFlipped: YES];
+
+ [(BrowserViewController *)g setFavicon: image];
+ [image release];
+}
+
+static void
+gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+ const struct rect *clip)
+{
+ [[(BrowserViewController *)g browserView]
+ addCaretAt: cocoa_point( x, y )
+ height: cocoa_px_to_pt( height )];
+}
+
+static void gui_window_remove_caret(struct gui_window *g)
+{
+ [[(BrowserViewController *)g browserView] removeCaret];
+}
+
+static void gui_window_new_content(struct gui_window *g)
+{
+ [(BrowserViewController *)g contentUpdated];
+}
+
+
+static void gui_create_form_select_menu(struct gui_window *g,
+ struct form_control *control)
+{
+ BrowserViewController * const window = (BrowserViewController *)g;
+ FormSelectMenu *menu = [[FormSelectMenu alloc]
+ initWithControl: control
+ forWindow: [window browser]];
+ [menu runInView: [window browserView]];
+ [menu release];
+}
+
+static nserror gui_launch_url(nsurl *url)
+{
+ [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [NSString stringWithUTF8String: nsurl_access(url)]]];
+ return NSERROR_OK;
+}
+
+struct ssl_cert_info;
+
+static void
+gui_cert_verify(nsurl *url,
+ const struct ssl_cert_info *certs,
+ unsigned long num,
+ nserror (*cb)(bool proceed,void *pw), void *cbpw)
+{
+ cb( false, cbpw );
+}
+
+
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = cocoa_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .new_content = gui_window_new_content,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+ .create_form_select_menu = gui_create_form_select_menu,
+};
+
+struct gui_window_table *cocoa_window_table = &window_table;
+
+
+static struct gui_misc_table browser_table = {
+ .schedule = cocoa_schedule,
+ .warning = cocoa_warning,
+
+ .launch_url = gui_launch_url,
+ .cert_verify = gui_cert_verify,
+};
+
+struct gui_misc_table *cocoa_misc_table = &browser_table;