summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
Diffstat (limited to 'frontends')
-rw-r--r--frontends/amiga/Makefile2
-rw-r--r--frontends/amiga/arexx.c2
-rw-r--r--frontends/amiga/bitmap.c23
-rw-r--r--frontends/amiga/cookies.c2
-rw-r--r--frontends/amiga/corewindow.c8
-rwxr-xr-xfrontends/amiga/dist/NetSurf.guide2
-rw-r--r--frontends/amiga/drag.c3
-rw-r--r--frontends/amiga/dt_anim.c16
-rw-r--r--frontends/amiga/dt_picture.c8
-rw-r--r--frontends/amiga/dt_sound.c17
-rw-r--r--frontends/amiga/filetype.c8
-rw-r--r--frontends/amiga/font.c14
-rw-r--r--frontends/amiga/font_bullet.c21
-rw-r--r--frontends/amiga/font_cache.c14
-rw-r--r--frontends/amiga/font_diskfont.c3
-rw-r--r--frontends/amiga/font_scan.c24
-rw-r--r--frontends/amiga/gui.c106
-rw-r--r--frontends/amiga/gui_menu.c3
-rwxr-xr-xfrontends/amiga/gui_options.c11
-rw-r--r--frontends/amiga/history.c2
-rw-r--r--frontends/amiga/history_local.c2
-rw-r--r--frontends/amiga/hotlist.c2
-rw-r--r--frontends/amiga/icon.c8
-rw-r--r--frontends/amiga/libs.c21
-rwxr-xr-xfrontends/amiga/memory.c73
-rw-r--r--frontends/amiga/menu.c4
-rwxr-xr-xfrontends/amiga/misc.c2
-rw-r--r--frontends/amiga/os3support.c21
-rw-r--r--frontends/amiga/plotters.c67
-rw-r--r--frontends/amiga/plugin_hack.c20
-rw-r--r--frontends/amiga/schedule.c19
-rw-r--r--frontends/amiga/selectmenu.c3
-rw-r--r--frontends/amiga/sslcert.c2
-rw-r--r--frontends/amiga/theme.c4
-rw-r--r--frontends/amiga/version.c2
-rw-r--r--frontends/atari/Makefile1
-rw-r--r--frontends/atari/bitmap.c32
-rw-r--r--frontends/atari/certview.c16
-rw-r--r--frontends/atari/cookies.c15
-rw-r--r--frontends/atari/ctxmenu.c7
-rw-r--r--frontends/atari/deskmenu.c66
-rw-r--r--frontends/atari/download.c14
-rw-r--r--frontends/atari/filetype.c4
-rw-r--r--frontends/atari/findfile.c18
-rw-r--r--frontends/atari/gui.c59
-rw-r--r--frontends/atari/history.c15
-rw-r--r--frontends/atari/hotlist.c21
-rw-r--r--frontends/atari/osspec.c6
-rw-r--r--frontends/atari/plot/font_freetype.c23
-rw-r--r--frontends/atari/plot/font_internal.c2
-rw-r--r--frontends/atari/plot/font_vdi.c2
-rw-r--r--frontends/atari/plot/plot.c5
-rw-r--r--frontends/atari/rootwin.c45
-rw-r--r--frontends/atari/schedule.c32
-rw-r--r--frontends/atari/search.c12
-rw-r--r--frontends/atari/settings.c34
-rw-r--r--frontends/atari/statusbar.c4
-rw-r--r--frontends/atari/toolbar.c15
-rw-r--r--frontends/atari/treeview.c6
-rw-r--r--frontends/atari/verify_ssl.c8
-rw-r--r--frontends/beos/bitmap.cpp7
-rw-r--r--frontends/beos/fetch_rsrc.cpp22
-rw-r--r--frontends/beos/font.cpp7
-rw-r--r--frontends/beos/gui.cpp39
-rw-r--r--frontends/beos/plotters.cpp4
-rw-r--r--frontends/beos/scaffolding.cpp16
-rw-r--r--frontends/beos/schedule.cpp27
-rw-r--r--frontends/beos/throbber.cpp18
-rw-r--r--frontends/beos/window.cpp28
-rw-r--r--frontends/cocoa/.clang-format4
-rw-r--r--frontends/cocoa/.gitignore1
-rw-r--r--frontends/cocoa/ArrowBox.h32
-rw-r--r--frontends/cocoa/ArrowBox.m180
-rw-r--r--frontends/cocoa/ArrowWindow.h31
-rw-r--r--frontends/cocoa/ArrowWindow.m240
-rw-r--r--frontends/cocoa/BookmarksController.h39
-rw-r--r--frontends/cocoa/BookmarksController.m221
-rw-r--r--frontends/cocoa/BrowserView.h50
-rw-r--r--frontends/cocoa/BrowserView.m738
-rw-r--r--frontends/cocoa/BrowserViewController.h73
-rw-r--r--frontends/cocoa/BrowserViewController.m357
-rw-r--r--frontends/cocoa/BrowserWindow.h22
-rw-r--r--frontends/cocoa/BrowserWindow.m29
-rw-r--r--frontends/cocoa/BrowserWindowController.h47
-rw-r--r--frontends/cocoa/BrowserWindowController.m262
-rw-r--r--frontends/cocoa/DownloadWindowController.h53
-rw-r--r--frontends/cocoa/DownloadWindowController.m414
-rw-r--r--frontends/cocoa/FormSelectMenu.h29
-rw-r--r--frontends/cocoa/FormSelectMenu.m110
-rw-r--r--frontends/cocoa/HistoryView.h30
-rw-r--r--frontends/cocoa/HistoryView.m136
-rw-r--r--frontends/cocoa/HistoryWindowController.h27
-rw-r--r--frontends/cocoa/HistoryWindowController.m49
-rw-r--r--frontends/cocoa/LocalHistoryController.h37
-rw-r--r--frontends/cocoa/LocalHistoryController.m119
-rw-r--r--frontends/cocoa/Makefile247
-rw-r--r--frontends/cocoa/Makefile.defaults28
-rw-r--r--frontends/cocoa/NetSurf.xcodeproj/project.pbxproj2101
-rw-r--r--frontends/cocoa/NetSurf.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--frontends/cocoa/NetSurfAppDelegate.h38
-rw-r--r--frontends/cocoa/NetSurfAppDelegate.m194
-rw-r--r--frontends/cocoa/NetsurfApp.h29
-rw-r--r--frontends/cocoa/NetsurfApp.m302
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front.pngbin0 -> 292 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Pressed.pngbin0 -> 292 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Rollover.pngbin0 -> 297 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front.pngbin0 -> 307 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Pressed.pngbin0 -> 310 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Rollover.pngbin0 -> 317 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabNew.pngbin0 -> 371 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabNewPressed.pngbin0 -> 380 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/AquaTabNewRollover.pngbin0 -> 380 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/overflowImage.pngbin0 -> 256 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/overflowImagePressed.pngbin0 -> 250 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/Images/pi.pngbin0 -> 564 bytes
-rw-r--r--frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.h22
-rw-r--r--frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.m126
-rw-r--r--frontends/cocoa/PSMTabBarControl/NSString_AITruncation.h12
-rw-r--r--frontends/cocoa/PSMTabBarControl/NSString_AITruncation.m34
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.h27
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.m157
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.h14
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.m43
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMRolloverButton.h28
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m180
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarCell.h115
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarCell.m536
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarControl+Private.h49
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarControl.h239
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarControl.m2035
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarController.h38
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabBarController.m648
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.h101
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.m850
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragView.h21
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragView.m60
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.h20
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.m51
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.h33
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.m109
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMTabStyle.h57
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.h29
-rw-r--r--frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.m581
-rw-r--r--frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/TXT.rtf186
-rw-r--r--frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/startpage.gifbin0 -> 11246 bytes
-rw-r--r--frontends/cocoa/PreferencesWindowController.h27
-rw-r--r--frontends/cocoa/PreferencesWindowController.m57
-rw-r--r--frontends/cocoa/Prefix.pch11
-rw-r--r--frontends/cocoa/ScrollableView.h27
-rw-r--r--frontends/cocoa/ScrollableView.m75
-rw-r--r--frontends/cocoa/SearchWindowController.h46
-rw-r--r--frontends/cocoa/SearchWindowController.m118
-rw-r--r--frontends/cocoa/Tree.h52
-rw-r--r--frontends/cocoa/Tree.m143
-rw-r--r--frontends/cocoa/TreeView.h28
-rw-r--r--frontends/cocoa/TreeView.m247
-rw-r--r--frontends/cocoa/URLFieldCell.h27
-rw-r--r--frontends/cocoa/URLFieldCell.m254
-rw-r--r--frontends/cocoa/apple_image.h38
-rw-r--r--frontends/cocoa/apple_image.m257
-rw-r--r--frontends/cocoa/arc.h22
-rw-r--r--frontends/cocoa/bitmap.h28
-rw-r--r--frontends/cocoa/bitmap.m264
-rwxr-xr-xfrontends/cocoa/compile-xib.sh20
-rw-r--r--frontends/cocoa/coordinates.h104
-rw-r--r--frontends/cocoa/desktop-tree.h87
-rw-r--r--frontends/cocoa/desktop-tree.m351
-rwxr-xr-xfrontends/cocoa/extract-strings.sh11
-rw-r--r--frontends/cocoa/fetch.h19
-rw-r--r--frontends/cocoa/fetch.m131
-rw-r--r--frontends/cocoa/font.h28
-rw-r--r--frontends/cocoa/font.m251
-rw-r--r--frontends/cocoa/gui.h35
-rw-r--r--frontends/cocoa/gui.m328
-rw-r--r--frontends/cocoa/plotter.h33
-rw-r--r--frontends/cocoa/plotter.m337
-rw-r--r--frontends/cocoa/res/BookmarksWindow.xib94
-rw-r--r--frontends/cocoa/res/Browser.xib399
-rw-r--r--frontends/cocoa/res/BrowserWindow.xib1395
-rw-r--r--frontends/cocoa/res/DownloadWindow.xib493
-rw-r--r--frontends/cocoa/res/HistoryWindow.xib338
-rw-r--r--frontends/cocoa/res/HomeTemplate.pdf106
l---------frontends/cocoa/res/Icons1
-rw-r--r--frontends/cocoa/res/LocalHistoryPanel.xib54
-rw-r--r--frontends/cocoa/res/MainMenu.xib2369
-rw-r--r--frontends/cocoa/res/NetSurf-Info.plist111
-rw-r--r--frontends/cocoa/res/NetSurf.icnsbin0 -> 203268 bytes
-rw-r--r--frontends/cocoa/res/PreferencesWindow.xib512
-rw-r--r--frontends/cocoa/res/SearchWindow.xib100
l---------frontends/cocoa/res/adblock.css1
l---------frontends/cocoa/res/ca-bundle1
-rw-r--r--frontends/cocoa/res/de.lproj/BookmarksWindow.xib.stringsbin0 -> 366 bytes
-rw-r--r--frontends/cocoa/res/de.lproj/BrowserWindow.xib.stringsbin0 -> 1892 bytes
-rw-r--r--frontends/cocoa/res/de.lproj/DownloadWindow.xib.stringsbin0 -> 536 bytes
-rw-r--r--frontends/cocoa/res/de.lproj/HistoryWindow.xib.stringsbin0 -> 172 bytes
-rw-r--r--frontends/cocoa/res/de.lproj/Localizable.strings78
-rw-r--r--frontends/cocoa/res/de.lproj/MainMenu.xib.stringsbin0 -> 11982 bytes
l---------frontends/cocoa/res/de.lproj/Messages1
-rw-r--r--frontends/cocoa/res/de.lproj/PreferencesWindow.xib.stringsbin0 -> 1206 bytes
-rw-r--r--frontends/cocoa/res/de.lproj/SearchWindow.xib.stringsbin0 -> 1148 bytes
l---------frontends/cocoa/res/de.lproj/welcome.html1
l---------frontends/cocoa/res/default.css1
-rw-r--r--frontends/cocoa/res/en.lproj/Localizable.stringsbin0 -> 3322 bytes
l---------frontends/cocoa/res/en.lproj/Messages1
l---------frontends/cocoa/res/en.lproj/licence.html1
l---------frontends/cocoa/res/en.lproj/maps.html1
l---------frontends/cocoa/res/en.lproj/welcome.html1
-rw-r--r--frontends/cocoa/res/fr.lproj/Localizable.stringsbin0 -> 3322 bytes
l---------frontends/cocoa/res/fr.lproj/Messages1
l---------frontends/cocoa/res/internal.css1
-rw-r--r--frontends/cocoa/res/it.lproj/Localizable.stringsbin0 -> 3496 bytes
l---------frontends/cocoa/res/it.lproj/Messages1
l---------frontends/cocoa/res/netsurf.png1
-rw-r--r--frontends/cocoa/res/nl.lproj/Localizable.stringsbin0 -> 3322 bytes
l---------frontends/cocoa/res/nl.lproj/Messages1
l---------frontends/cocoa/res/quirks.css1
-rw-r--r--frontends/cocoa/schedule.h19
-rw-r--r--frontends/cocoa/schedule.m91
-rw-r--r--frontends/cocoa/selection.h19
-rw-r--r--frontends/cocoa/selection.m99
-rw-r--r--frontends/framebuffer/bitmap.c21
-rw-r--r--frontends/framebuffer/clipboard.c4
-rw-r--r--frontends/framebuffer/fbtk.h6
-rw-r--r--frontends/framebuffer/fbtk/event.c4
-rw-r--r--frontends/framebuffer/fbtk/fbtk.c46
-rw-r--r--frontends/framebuffer/fbtk/scroll.c4
-rw-r--r--frontends/framebuffer/fbtk/text.c16
-rw-r--r--frontends/framebuffer/fetch.c2
-rw-r--r--frontends/framebuffer/font_freetype.c19
-rw-r--r--frontends/framebuffer/font_internal.c4
-rw-r--r--frontends/framebuffer/framebuffer.c15
-rw-r--r--frontends/framebuffer/gui.c45
-rw-r--r--frontends/framebuffer/schedule.c23
-rw-r--r--frontends/gtk/cookies.c7
-rw-r--r--frontends/gtk/corewindow.c14
-rw-r--r--frontends/gtk/download.c4
-rw-r--r--frontends/gtk/fetch.c3
-rw-r--r--frontends/gtk/gdk.c2
-rw-r--r--frontends/gtk/global_history.c7
-rw-r--r--frontends/gtk/gui.c80
-rw-r--r--frontends/gtk/hotlist.c7
-rw-r--r--frontends/gtk/layout_pango.c12
-rw-r--r--frontends/gtk/local_history.c2
-rw-r--r--frontends/gtk/login.c2
-rw-r--r--frontends/gtk/plotters.c4
-rw-r--r--frontends/gtk/preferences.c11
-rw-r--r--frontends/gtk/print.c28
-rw-r--r--frontends/gtk/res/options.gtk2.ui589
-rw-r--r--frontends/gtk/res/toolbar.gtk2.ui183
-rw-r--r--frontends/gtk/res/toolbar.gtk3.ui242
-rw-r--r--frontends/gtk/resources.c55
-rw-r--r--frontends/gtk/scaffolding.c41
-rw-r--r--frontends/gtk/schedule.c16
-rw-r--r--frontends/gtk/ssl_cert.c2
-rw-r--r--frontends/gtk/tabs.c8
-rw-r--r--frontends/gtk/throbber.c6
-rw-r--r--frontends/gtk/toolbar.c129
-rw-r--r--frontends/gtk/viewdata.c23
-rw-r--r--frontends/gtk/window.c29
-rw-r--r--frontends/monkey/browser.c2
-rw-r--r--frontends/monkey/dispatch.c2
-rw-r--r--frontends/monkey/filetype.c3
-rw-r--r--frontends/monkey/main.c11
-rw-r--r--frontends/monkey/schedule.c23
-rw-r--r--frontends/riscos/401login.c5
-rw-r--r--frontends/riscos/bitmap.c32
-rw-r--r--frontends/riscos/buffer.c36
-rw-r--r--frontends/riscos/configure.c32
-rw-r--r--frontends/riscos/configure/con_image.c5
-rw-r--r--frontends/riscos/configure/con_language.c6
-rw-r--r--frontends/riscos/configure/con_theme.c23
-rw-r--r--frontends/riscos/content-handlers/artworks.c46
-rw-r--r--frontends/riscos/content-handlers/draw.c8
-rw-r--r--frontends/riscos/content-handlers/sprite.c9
-rw-r--r--frontends/riscos/cookies.c4
-rw-r--r--frontends/riscos/corewindow.c97
-rw-r--r--frontends/riscos/dialog.c53
-rw-r--r--frontends/riscos/download.c152
-rw-r--r--frontends/riscos/filetype.c37
-rw-r--r--frontends/riscos/font.c75
-rw-r--r--frontends/riscos/global_history.c4
-rw-r--r--frontends/riscos/gui.c138
-rw-r--r--frontends/riscos/gui/button_bar.c30
-rw-r--r--frontends/riscos/gui/progress_bar.c18
-rw-r--r--frontends/riscos/gui/status_bar.c62
-rw-r--r--frontends/riscos/gui/throbber.c11
-rw-r--r--frontends/riscos/gui/url_bar.c48
-rw-r--r--frontends/riscos/help.c22
-rw-r--r--frontends/riscos/hotlist.c7
-rw-r--r--frontends/riscos/iconbar.c6
-rw-r--r--frontends/riscos/image.c20
-rw-r--r--frontends/riscos/local_history.c47
-rw-r--r--frontends/riscos/menus.c31
-rw-r--r--frontends/riscos/message.c8
-rw-r--r--frontends/riscos/mouse.c5
-rw-r--r--frontends/riscos/plotters.c104
-rw-r--r--frontends/riscos/print.c77
-rw-r--r--frontends/riscos/query.c21
-rw-r--r--frontends/riscos/save.c116
-rw-r--r--frontends/riscos/save_draw.c12
-rw-r--r--frontends/riscos/schedule.c2
-rw-r--r--frontends/riscos/sslcert.c36
-rw-r--r--frontends/riscos/textarea.c127
-rw-r--r--frontends/riscos/textselection.c40
-rw-r--r--frontends/riscos/theme.c55
-rw-r--r--frontends/riscos/theme_install.c5
-rw-r--r--frontends/riscos/toolbar.c48
-rw-r--r--frontends/riscos/ucstables.c7
-rw-r--r--frontends/riscos/uri.c6
-rw-r--r--frontends/riscos/url_complete.c66
-rw-r--r--frontends/riscos/url_protocol.c19
-rw-r--r--frontends/riscos/wimp.c135
-rw-r--r--frontends/riscos/wimp_event.c76
-rw-r--r--frontends/riscos/window.c193
-rw-r--r--frontends/windows/Makefile2
-rw-r--r--frontends/windows/about.c8
-rw-r--r--frontends/windows/bitmap.c34
-rw-r--r--frontends/windows/corewindow.c10
-rw-r--r--frontends/windows/download.c8
-rw-r--r--frontends/windows/drawable.c30
-rw-r--r--frontends/windows/filetype.c2
-rw-r--r--frontends/windows/findfile.c4
-rw-r--r--frontends/windows/font.c9
-rw-r--r--frontends/windows/gui.c4
-rw-r--r--frontends/windows/main.c16
-rw-r--r--frontends/windows/plot.c63
-rw-r--r--frontends/windows/prefs.c3
-rw-r--r--frontends/windows/schedule.c38
-rw-r--r--frontends/windows/ssl_cert.c11
-rw-r--r--frontends/windows/windbg.h14
-rw-r--r--frontends/windows/window.c113
331 files changed, 25680 insertions, 2262 deletions
diff --git a/frontends/amiga/Makefile b/frontends/amiga/Makefile
index f57b4ef8a..5089b4a46 100644
--- a/frontends/amiga/Makefile
+++ b/frontends/amiga/Makefile
@@ -5,7 +5,7 @@
CFLAGS += -std=c99 -Dnsamiga
ifneq ($(SUBTARGET),os3)
- CFLAGS += -O2 -finline-functions -U__STRICT_ANSI__ -D__USE_INLINE__ -D__USE_BASETYPE__
+ CFLAGS += -O2 -mstrict-align -finline-functions -U__STRICT_ANSI__ -D__USE_INLINE__ -D__USE_BASETYPE__
else
CFLAGS += -O2 -DPATH_MAX=1024 -D__m68k__ -m68020
endif
diff --git a/frontends/amiga/arexx.c b/frontends/amiga/arexx.c
index 7bb2f5882..9484ee92b 100644
--- a/frontends/amiga/arexx.c
+++ b/frontends/amiga/arexx.c
@@ -173,7 +173,7 @@ void ami_arexx_execute(char *script)
if((lock = Lock(script, ACCESS_READ))) {
DevNameFromLock(lock, full_script_path, 1024, DN_FULLPATH);
- LOG("Executing script: %s", full_script_path);
+ NSLOG(netsurf, INFO, "Executing script: %s", full_script_path);
ami_arexx_command(full_script_path, NULL);
UnLock(lock);
}
diff --git a/frontends/amiga/bitmap.c b/frontends/amiga/bitmap.c
index 533b416fa..0fde677ae 100644
--- a/frontends/amiga/bitmap.c
+++ b/frontends/amiga/bitmap.c
@@ -161,7 +161,10 @@ static void amiga_bitmap_unmap_buffer(void *p)
struct bitmap *bm = p;
if((nsoption_bool(use_extmem) == true) && (bm->pixdata != NULL)) {
- LOG("Unmapping ExtMem object %p for bitmap %p", bm->iextmem, bm);
+ NSLOG(netsurf, INFO,
+ "Unmapping ExtMem object %p for bitmap %p",
+ bm->iextmem,
+ bm);
bm->iextmem->Unmap(bm->pixdata, bm->size);
bm->pixdata = NULL;
}
@@ -176,7 +179,10 @@ unsigned char *amiga_bitmap_get_buffer(void *bitmap)
#ifdef __amigaos4__
if(nsoption_bool(use_extmem) == true) {
if(bm->pixdata == NULL) {
- LOG("Mapping ExtMem object %p for bitmap %p", bm->iextmem, bm);
+ NSLOG(netsurf, INFO,
+ "Mapping ExtMem object %p for bitmap %p",
+ bm->iextmem,
+ bm);
bm->pixdata = bm->iextmem->Map(NULL, bm->size, 0LL, 0);
}
@@ -596,8 +602,12 @@ static inline struct BitMap *ami_bitmap_get_generic(struct bitmap *bitmap,
TAG_DONE);
if (err != COMPERR_Success) {
- LOG("Composite error %ld - falling back", err);
- /* If it failed, do it again the way which works in software */
+ NSLOG(netsurf, INFO,
+ "Composite error %ld - falling back",
+ err);
+ /* If it failed, do it again the way
+ * which works in software
+ */
#else
{
#endif
@@ -611,7 +621,8 @@ static inline struct BitMap *ami_bitmap_get_generic(struct bitmap *bitmap,
COMPTAG_FriendBitMap, scrn->RastPort.BitMap,
TAG_DONE);
/* If it still fails... it's non-fatal */
- LOG("Fallback returned error %ld", err);
+ NSLOG(netsurf, INFO,
+ "Fallback returned error %ld", err);
}
} else /* Do it the old-fashioned way. This is pretty slow, even on OS4.1 */
#endif
@@ -723,7 +734,7 @@ void ami_bitmap_fini(void)
static nserror bitmap_render(struct bitmap *bitmap, struct hlcache_handle *content)
{
#ifdef __amigaos4__
- LOG("Entering bitmap_render");
+ NSLOG(netsurf, INFO, "Entering bitmap_render");
int plot_width;
int plot_height;
diff --git a/frontends/amiga/cookies.c b/frontends/amiga/cookies.c
index fd71a9c2a..45e883fde 100644
--- a/frontends/amiga/cookies.c
+++ b/frontends/amiga/cookies.c
@@ -364,7 +364,7 @@ nserror ami_cookies_present(void)
res = ami_cookies_create_window(ncwin);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
ami_utf8_free(ncwin->core.wintitle);
free(ncwin);
return res;
diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c
index 1a94dd3b2..42ee866ea 100644
--- a/frontends/amiga/corewindow.c
+++ b/frontends/amiga/corewindow.c
@@ -315,7 +315,7 @@ static void ami_cw_redraw_queue(struct ami_corewindow *ami_cw, bool draw)
if(IsMinListEmpty(ami_cw->deferred_rects)) return;
if(draw == false) {
- LOG("Ignoring deferred box redraw queue");
+ NSLOG(netsurf, INFO, "Ignoring deferred box redraw queue");
} // else should probably show busy pointer
node = (struct nsObject *)GetHead((struct List *)ami_cw->deferred_rects);
@@ -378,7 +378,8 @@ ami_cw_redraw(struct ami_corewindow *ami_cw, const struct rect *restrict r)
nsobj = AddObject(ami_cw->deferred_rects, AMINS_RECT);
nsobj->objstruct = deferred_rect;
} else {
- LOG("Ignoring duplicate or subset of queued box redraw");
+ NSLOG(netsurf, INFO,
+ "Ignoring duplicate or subset of queued box redraw");
}
ami_schedule(1, ami_cw_redraw_cb, ami_cw);
}
@@ -525,7 +526,8 @@ HOOKF(void, ami_cw_idcmp_hook, Object *, object, struct IntuiMessage *)
break;
default:
- LOG("IDCMP hook unhandled event: %ld", msg->Class);
+ NSLOG(netsurf, INFO,
+ "IDCMP hook unhandled event: %ld", msg->Class);
break;
}
}
diff --git a/frontends/amiga/dist/NetSurf.guide b/frontends/amiga/dist/NetSurf.guide
index d628a1c3b..0bdd90076 100755
--- a/frontends/amiga/dist/NetSurf.guide
+++ b/frontends/amiga/dist/NetSurf.guide
@@ -144,7 +144,7 @@ There are a couple of Amiga-specific options which can only be changed directly
@{b}redraw_tile_size_x@{ub}/@{b}redraw_tile_size_y@{ub} Specify the size of the off-screen bitmap. Higher will speed up redraws at the expense of memory. 0 disables tiling (will use a bitmap at least the size of the screen NetSurf is running on)
@{b}web_search_width@{ub} Defaults to 0. Larger values will increase the size of the web search gadget next to the URL bar.
@{b}mask_alpha@{ub} Threshold to use when determining which alpha values to convert to full transparency (0 - 255, where 255 will convert even opaque pixels to transparent). Defaults to 0. This is only used in palette-mapped modes where alpha blending is not currently supported.
-@{b}tab_new_session{ub} If NetSurf is already running, this will cause any passed URLs to open in a new tab rather than a new window.
+@{b}tab_new_session@{ub} If NetSurf is already running, this will cause any passed URLs to open in a new tab rather than a new window.
@{b}use_extmem@{ub} Defaults to 1 (enabled). Setting to 0 will prevent NetSurf using Extended Memory to store uncompressed images - this may have a performance benefit and no disadvantage for <2GB configurations. OS4.1FEU1 only.
@{b}download_notify_progress@{ub} Defaults to 0 (disabled). Display download progress in a Ringhio notification. Requires Enhancer Pack (Ringhio 53.65+), behaviour without it is undefined.
@{b}url_file@{ub} Path to URL database file
diff --git a/frontends/amiga/drag.c b/frontends/amiga/drag.c
index a8d3aa9f9..ec0ee3c6a 100644
--- a/frontends/amiga/drag.c
+++ b/frontends/amiga/drag.c
@@ -188,7 +188,8 @@ void ami_drag_save(struct Window *win)
break;
default:
- LOG("Unsupported drag save operation %d", drag_save);
+ NSLOG(netsurf, INFO,
+ "Unsupported drag save operation %d", drag_save);
break;
}
diff --git a/frontends/amiga/dt_anim.c b/frontends/amiga/dt_anim.c
index 2f998d299..bd049206c 100644
--- a/frontends/amiga/dt_anim.c
+++ b/frontends/amiga/dt_anim.c
@@ -162,7 +162,7 @@ nserror amiga_dt_anim_create(const content_handler *handler,
bool amiga_dt_anim_convert(struct content *c)
{
- LOG("amiga_dt_anim_convert");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_convert");
amiga_dt_anim_content *plugin = (amiga_dt_anim_content *) c;
union content_msg_data msg_data;
@@ -190,7 +190,7 @@ bool amiga_dt_anim_convert(struct content *c)
plugin->bitmap = amiga_bitmap_create(width, height, bm_flags);
if (!plugin->bitmap) {
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -246,7 +246,7 @@ void amiga_dt_anim_destroy(struct content *c)
{
amiga_dt_anim_content *plugin = (amiga_dt_anim_content *) c;
- LOG("amiga_dt_anim_destroy");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_destroy");
if (plugin->bitmap != NULL)
amiga_bitmap_destroy(plugin->bitmap);
@@ -263,7 +263,7 @@ bool amiga_dt_anim_redraw(struct content *c,
amiga_dt_anim_content *plugin = (amiga_dt_anim_content *) c;
bitmap_flags_t flags = BITMAPF_NONE;
- LOG("amiga_dt_anim_redraw");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_redraw");
if (data->repeat_x)
flags |= BITMAPF_REPEAT_X;
@@ -290,20 +290,20 @@ bool amiga_dt_anim_redraw(struct content *c,
void amiga_dt_anim_open(struct content *c, struct browser_window *bw,
struct content *page, struct object_params *params)
{
- LOG("amiga_dt_anim_open");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_open");
return;
}
void amiga_dt_anim_close(struct content *c)
{
- LOG("amiga_dt_anim_close");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_close");
return;
}
void amiga_dt_anim_reformat(struct content *c, int width, int height)
{
- LOG("amiga_dt_anim_reformat");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_reformat");
return;
}
@@ -312,7 +312,7 @@ nserror amiga_dt_anim_clone(const struct content *old, struct content **newc)
amiga_dt_anim_content *plugin;
nserror error;
- LOG("amiga_dt_anim_clone");
+ NSLOG(netsurf, INFO, "amiga_dt_anim_clone");
plugin = calloc(1, sizeof(amiga_dt_anim_content));
if (plugin == NULL)
diff --git a/frontends/amiga/dt_picture.c b/frontends/amiga/dt_picture.c
index e7f1c9724..88ce1c834 100644
--- a/frontends/amiga/dt_picture.c
+++ b/frontends/amiga/dt_picture.c
@@ -174,7 +174,7 @@ static char *amiga_dt_picture_datatype(struct content *c)
static struct bitmap *amiga_dt_picture_cache_convert(struct content *c)
{
- LOG("amiga_dt_picture_cache_convert");
+ NSLOG(netsurf, INFO, "amiga_dt_picture_cache_convert");
union content_msg_data msg_data;
UBYTE *bm_buffer;
@@ -187,7 +187,7 @@ static struct bitmap *amiga_dt_picture_cache_convert(struct content *c)
bitmap = amiga_bitmap_create(c->width, c->height, BITMAP_NEW);
if (!bitmap) {
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return NULL;
}
@@ -210,7 +210,7 @@ static struct bitmap *amiga_dt_picture_cache_convert(struct content *c)
bool amiga_dt_picture_convert(struct content *c)
{
- LOG("amiga_dt_picture_convert");
+ NSLOG(netsurf, INFO, "amiga_dt_picture_convert");
int width, height;
char *title;
@@ -256,7 +256,7 @@ nserror amiga_dt_picture_clone(const struct content *old, struct content **newc)
struct content *adt;
nserror error;
- LOG("amiga_dt_picture_clone");
+ NSLOG(netsurf, INFO, "amiga_dt_picture_clone");
adt = calloc(1, sizeof(struct content));
if (adt == NULL)
diff --git a/frontends/amiga/dt_sound.c b/frontends/amiga/dt_sound.c
index eda60edc1..e0f48da83 100644
--- a/frontends/amiga/dt_sound.c
+++ b/frontends/amiga/dt_sound.c
@@ -76,7 +76,7 @@ static const content_handler amiga_dt_sound_content_handler = {
static void amiga_dt_sound_play(Object *dto)
{
- LOG("Playing...");
+ NSLOG(netsurf, INFO, "Playing...");
IDoMethod(dto, DTM_TRIGGER, NULL, STM_PLAY, NULL);
}
@@ -126,7 +126,7 @@ nserror amiga_dt_sound_create(const content_handler *handler,
amiga_dt_sound_content *plugin;
nserror error;
- LOG("amiga_dt_sound_create");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_create");
plugin = calloc(1, sizeof(amiga_dt_sound_content));
if (plugin == NULL)
@@ -146,7 +146,7 @@ nserror amiga_dt_sound_create(const content_handler *handler,
bool amiga_dt_sound_convert(struct content *c)
{
- LOG("amiga_dt_sound_convert");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_convert");
amiga_dt_sound_content *plugin = (amiga_dt_sound_content *) c;
int width = 50, height = 50;
@@ -180,7 +180,7 @@ void amiga_dt_sound_destroy(struct content *c)
{
amiga_dt_sound_content *plugin = (amiga_dt_sound_content *) c;
- LOG("amiga_dt_sound_destroy");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_destroy");
DisposeDTObject(plugin->dto);
@@ -199,7 +199,7 @@ bool amiga_dt_sound_redraw(struct content *c,
};
struct rect rect;
- LOG("amiga_dt_sound_redraw");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_redraw");
rect.x0 = data->x;
rect.y0 = data->y;
@@ -226,7 +226,7 @@ void amiga_dt_sound_open(struct content *c, struct browser_window *bw,
amiga_dt_sound_content *plugin = (amiga_dt_sound_content *) c;
struct object_param *param;
- LOG("amiga_dt_sound_open");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_open");
plugin->immediate = false;
@@ -234,7 +234,8 @@ void amiga_dt_sound_open(struct content *c, struct browser_window *bw,
{
do
{
- LOG("%s = %s", param->name, param->value);
+ NSLOG(netsurf, INFO, "%s = %s", param->name,
+ param->value);
if((strcmp(param->name, "autoplay") == 0) &&
(strcmp(param->value, "true") == 0)) plugin->immediate = true;
if((strcmp(param->name, "autoStart") == 0) &&
@@ -255,7 +256,7 @@ nserror amiga_dt_sound_clone(const struct content *old, struct content **newc)
amiga_dt_sound_content *plugin;
nserror error;
- LOG("amiga_dt_sound_clone");
+ NSLOG(netsurf, INFO, "amiga_dt_sound_clone");
plugin = calloc(1, sizeof(amiga_dt_sound_content));
if (plugin == NULL)
diff --git a/frontends/amiga/filetype.c b/frontends/amiga/filetype.c
index a0449d848..0e535de07 100644
--- a/frontends/amiga/filetype.c
+++ b/frontends/amiga/filetype.c
@@ -185,7 +185,7 @@ nserror ami_mime_init(const char *mimefile)
struct nsObject *node;
struct ami_mime_entry *mimeentry;
- LOG("mimetypes file: %s", mimefile);
+ NSLOG(netsurf, INFO, "mimetypes file: %s", mimefile);
if(ami_mime_list == NULL)
ami_mime_list = NewObjList();
@@ -642,6 +642,10 @@ void ami_mime_dump(void)
struct ami_mime_entry *mimeentry;
while((mimeentry = ami_mime_entry_locate(NULL, AMI_MIME_MIMETYPE, &node))) {
- LOG("%s DT=\"%s\" TYPE=\"%s\" CMD=\"%s\"", mimeentry->mimetype ? lwc_string_data(mimeentry->mimetype) : "", mimeentry->datatype ? lwc_string_data(mimeentry->datatype) : "", mimeentry->filetype ? lwc_string_data(mimeentry->filetype) : "", mimeentry->plugincmd ? lwc_string_data(mimeentry->plugincmd) : "");
+ NSLOG(netsurf, INFO, "%s DT=\"%s\" TYPE=\"%s\" CMD=\"%s\"",
+ mimeentry->mimetype ? lwc_string_data(mimeentry->mimetype) : "",
+ mimeentry->datatype ? lwc_string_data(mimeentry->datatype) : "",
+ mimeentry->filetype ? lwc_string_data(mimeentry->filetype) : "",
+ mimeentry->plugincmd ? lwc_string_data(mimeentry->plugincmd) : "");
};
}
diff --git a/frontends/amiga/font.c b/frontends/amiga/font.c
index 22a0f4a4a..e69ff55f0 100644
--- a/frontends/amiga/font.c
+++ b/frontends/amiga/font.c
@@ -37,7 +37,7 @@ static ULONG ami_xdpi = 72;
ULONG ami_font_dpi_get_devicedpi(void)
{
- return ami_devicedpi;
+ return (ami_xdpi << 16) | ami_devicedpi;
}
ULONG ami_font_dpi_get_xdpi(void)
@@ -51,7 +51,8 @@ void ami_font_setdevicedpi(int id)
struct DisplayInfo dinfo;
if(nsoption_bool(bitmap_fonts) == true) {
- LOG("WARNING: Using diskfont.library for text. Forcing DPI to 72.");
+ NSLOG(netsurf, INFO,
+ "WARNING: Using diskfont.library for text. Forcing DPI to 72.");
nsoption_set_int(screen_ydpi, 72);
}
@@ -79,7 +80,14 @@ void ami_font_setdevicedpi(int id)
xdpi = (yres * ydpi) / xres;
- LOG("XDPI = %ld, YDPI = %ld (DisplayInfo resolution %d x %d, corrected %d x %d)", xdpi, ydpi, dinfo.Resolution.x, dinfo.Resolution.y, xres, yres);
+ NSLOG(netsurf, INFO,
+ "XDPI = %ld, YDPI = %ld (DisplayInfo resolution %d x %d, corrected %d x %d)",
+ xdpi,
+ ydpi,
+ dinfo.Resolution.x,
+ dinfo.Resolution.y,
+ xres,
+ yres);
}
}
}
diff --git a/frontends/amiga/font_bullet.c b/frontends/amiga/font_bullet.c
index fd41c29a2..c8ad34c04 100644
--- a/frontends/amiga/font_bullet.c
+++ b/frontends/amiga/font_bullet.c
@@ -361,7 +361,7 @@ static struct ami_font_cache_node *ami_font_open(const char *font, bool critical
if(!nodedata->font)
{
- LOG("Requested font not found: %s", font);
+ NSLOG(netsurf, INFO, "Requested font not found: %s", font);
if(critical == true) amiga_warn_user("CompError", font);
free(nodedata);
return NULL;
@@ -369,21 +369,28 @@ static struct ami_font_cache_node *ami_font_open(const char *font, bool critical
nodedata->bold = (char *)GetTagData(OT_BName, 0, nodedata->font->olf_OTagList);
if(nodedata->bold)
- LOG("Bold font defined for %s is %s", font, nodedata->bold);
+ NSLOG(netsurf, INFO, "Bold font defined for %s is %s", font,
+ nodedata->bold);
else
- LOG("Warning: No designed bold font defined for %s", font);
+ NSLOG(netsurf, INFO,
+ "Warning: No designed bold font defined for %s", font);
nodedata->italic = (char *)GetTagData(OT_IName, 0, nodedata->font->olf_OTagList);
if(nodedata->italic)
- LOG("Italic font defined for %s is %s", font, nodedata->italic);
+ NSLOG(netsurf, INFO, "Italic font defined for %s is %s",
+ font, nodedata->italic);
else
- LOG("Warning: No designed italic font defined for %s", font);
+ NSLOG(netsurf, INFO,
+ "Warning: No designed italic font defined for %s", font);
nodedata->bolditalic = (char *)GetTagData(OT_BIName, 0, nodedata->font->olf_OTagList);
if(nodedata->bolditalic)
- LOG("Bold-italic font defined for %s is %s", font, nodedata->bolditalic);
+ NSLOG(netsurf, INFO, "Bold-italic font defined for %s is %s",
+ font, nodedata->bolditalic);
else
- LOG("Warning: No designed bold-italic font defined for %s", font);
+ NSLOG(netsurf, INFO,
+ "Warning: No designed bold-italic font defined for %s",
+ font);
ami_font_cache_insert(nodedata, font);
return nodedata;
diff --git a/frontends/amiga/font_cache.c b/frontends/amiga/font_cache.c
index 3d8330979..86e2381c0 100644
--- a/frontends/amiga/font_cache.c
+++ b/frontends/amiga/font_cache.c
@@ -69,7 +69,10 @@ static void ami_font_cache_cleanup(struct SkipList *skiplist)
SubTime(&curtime, &node->lastused);
if(curtime.Seconds > 300)
{
- LOG("Freeing font %p not used for %ld seconds", node->skip_node.sn_Key, curtime.Seconds);
+ NSLOG(netsurf, INFO,
+ "Freeing font %p not used for %ld seconds",
+ node->skip_node.sn_Key,
+ curtime.Seconds);
ami_font_bullet_close(node);
RemoveSkipNode(skiplist, node->skip_node.sn_Key);
}
@@ -98,7 +101,10 @@ static void ami_font_cache_cleanup(struct MinList *ami_font_cache_list)
SubTime(&curtime, &fnode->lastused);
if(curtime.Seconds > 300)
{
- LOG("Freeing %s not used for %ld seconds", node->dtz_Node.ln_Name, curtime.Seconds);
+ NSLOG(netsurf, INFO,
+ "Freeing %s not used for %ld seconds",
+ node->dtz_Node.ln_Name,
+ curtime.Seconds);
DelObject(node);
}
} while((node=nnode));
@@ -146,7 +152,7 @@ struct ami_font_cache_node *ami_font_cache_locate(const char *font)
return nodedata;
}
- LOG("Font cache miss: %s (%lx)", font, hash);
+ NSLOG(netsurf, INFO, "Font cache miss: %s (%lx)", font, hash);
return NULL;
}
@@ -180,7 +186,7 @@ void ami_font_cache_insert(struct ami_font_cache_node *nodedata, const char *fon
void ami_font_cache_fini(void)
{
- LOG("Cleaning up font cache");
+ NSLOG(netsurf, INFO, "Cleaning up font cache");
ami_schedule(-1, (void *)ami_font_cache_cleanup, ami_font_cache_list);
#ifdef __amigaos4__
ami_font_cache_del_skiplist(ami_font_cache_list);
diff --git a/frontends/amiga/font_diskfont.c b/frontends/amiga/font_diskfont.c
index 7abc4379b..2da3f0038 100644
--- a/frontends/amiga/font_diskfont.c
+++ b/frontends/amiga/font_diskfont.c
@@ -55,7 +55,6 @@ static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_st
(fstyle->size == prev_fstyle->size) &&
(fstyle->flags == prev_fstyle->flags) &&
(fstyle->weight == prev_fstyle->weight)) {
- LOG("(using current font)");
return prev_font;
}
@@ -99,7 +98,7 @@ static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_st
snprintf(font, MAX_FONT_NAME_SIZE, "%s.font", fontname);
tattr.ta_Name = font;
tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE;
- LOG("font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
+ NSLOG(netsurf, INFO, "font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
if(prev_font != NULL) CloseFont(prev_font);
diff --git a/frontends/amiga/font_scan.c b/frontends/amiga/font_scan.c
index 932179e3e..cb37f97fa 100644
--- a/frontends/amiga/font_scan.c
+++ b/frontends/amiga/font_scan.c
@@ -255,7 +255,8 @@ static ULONG ami_font_scan_font(const char *fontname, lwc_string **glypharray)
#ifdef __amigaos4__
if(EObtainInfo(AMI_OFONT_ENGINE, OT_UnicodeRanges, &unicoderanges, TAG_END) == 0) {
if(unicoderanges & UCR_SURROGATES) {
- LOG("%s supports UTF-16 surrogates", fontname);
+ NSLOG(netsurf, INFO, "%s supports UTF-16 surrogates",
+ fontname);
if (nsoption_charp(font_surrogate) == NULL) {
nsoption_set_charp(font_surrogate, (char *)strdup(fontname));
}
@@ -292,10 +293,11 @@ static ULONG ami_font_scan_fonts(struct MinList *list,
do {
nnode = (struct nsObject *)GetSucc((struct Node *)node);
ami_font_scan_gui_update(win, node->dtz_Node.ln_Name, font_num, total);
- LOG("Scanning %s", node->dtz_Node.ln_Name);
+ NSLOG(netsurf, INFO, "Scanning %s", node->dtz_Node.ln_Name);
found = ami_font_scan_font(node->dtz_Node.ln_Name, glypharray);
total += found;
- LOG("Found %ld new glyphs (total = %ld)", found, total);
+ NSLOG(netsurf, INFO, "Found %ld new glyphs (total = %ld)",
+ found, total);
font_num++;
} while((node = nnode));
@@ -344,7 +346,9 @@ static ULONG ami_font_scan_list(struct MinList *list)
if(node) {
node->dtz_Node.ln_Name = strdup(af[i].af_Attr.ta_Name);
found++;
- LOG("Added %s", af[i].af_Attr.ta_Name);
+ NSLOG(netsurf, INFO,
+ "Added %s",
+ af[i].af_Attr.ta_Name);
}
}
}
@@ -382,7 +386,8 @@ static ULONG ami_font_scan_load(const char *filename, lwc_string **glypharray)
rargs = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
if((fh = FOpen(filename, MODE_OLDFILE, 0))) {
- LOG("Loading font glyph cache from %s", filename);
+ NSLOG(netsurf, INFO, "Loading font glyph cache from %s",
+ filename);
while(FGets(fh, (STRPTR)&buffer, 256) != 0)
{
@@ -423,7 +428,8 @@ void ami_font_scan_save(const char *filename, lwc_string **glypharray)
BPTR fh = 0;
if((fh = FOpen(filename, MODE_NEWFILE, 0))) {
- LOG("Writing font glyph cache to %s", filename);
+ NSLOG(netsurf, INFO, "Writing font glyph cache to %s",
+ filename);
FPrintf(fh, "; This file is auto-generated. To re-create the cache, delete this file.\n");
FPrintf(fh, "; This file is parsed using ReadArgs() with the following template:\n");
FPrintf(fh, "; CODE/A,FONT/A\n;\n");
@@ -482,7 +488,7 @@ void ami_font_scan_init(const char *filename, bool force_scan, bool save,
found = ami_font_scan_load(filename, glypharray);
if(found == 0) {
- LOG("Creating new font glyph cache");
+ NSLOG(netsurf, INFO, "Creating new font glyph cache");
if((list = NewObjList())) {
/* add preferred fonts list */
@@ -504,7 +510,7 @@ void ami_font_scan_init(const char *filename, bool force_scan, bool save,
if(nsoption_bool(font_unicode_only) == false)
entries += ami_font_scan_list(list);
- LOG("Found %ld fonts", entries);
+ NSLOG(netsurf, INFO, "Found %ld fonts", entries);
win = ami_font_scan_gui_open(entries);
found = ami_font_scan_fonts(list, win, glypharray);
@@ -517,6 +523,6 @@ void ami_font_scan_init(const char *filename, bool force_scan, bool save,
}
}
- LOG("Initialised with %ld glyphs", found);
+ NSLOG(netsurf, INFO, "Initialised with %ld glyphs", found);
}
diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c
index 44bba2d90..e337ede0c 100644
--- a/frontends/amiga/gui.c
+++ b/frontends/amiga/gui.c
@@ -342,7 +342,9 @@ bool ami_gui_map_filename(char **remapped, const char *restrict path,
}
if(found == false) *remapped = strdup(file);
- else LOG("Remapped %s to %s in path %s using %s", file, *remapped, path, map);
+ else NSLOG(netsurf, INFO,
+ "Remapped %s to %s in path %s using %s", file,
+ *remapped, path, map);
free(mapfile);
@@ -365,7 +367,7 @@ static bool ami_gui_check_resource(char *fullpath, const char *file)
found = true;
}
- if(found) LOG("Found %s", fullpath);
+ if(found) NSLOG(netsurf, INFO, "Found %s", fullpath);
free(remapped);
return found;
@@ -842,7 +844,7 @@ static void ami_openscreen(void)
}
if(screen_signal == -1) screen_signal = AllocSignal(-1);
- LOG("Screen signal %d", screen_signal);
+ NSLOG(netsurf, INFO, "Screen signal %d", screen_signal);
scrn = OpenScreenTags(NULL,
/**\todo specify screen depth */
SA_DisplayID, id,
@@ -918,19 +920,22 @@ static struct RDArgs *ami_gui_commandline(int *restrict argc, char ** argv,
if((args = ReadArgs(template, rarray, NULL))) {
if(rarray[A_URL]) {
- LOG("URL %s specified on command line",
- (char *)rarray[A_URL]);
+ NSLOG(netsurf, INFO,
+ "URL %s specified on command line",
+ (char *)rarray[A_URL]);
temp_homepage_url = strdup((char *)rarray[A_URL]); /**\todo allow IDNs */
}
if(rarray[A_USERSDIR]) {
- LOG("USERSDIR %s specified on command line",
- (char *)rarray[A_USERSDIR]);
+ NSLOG(netsurf, INFO,
+ "USERSDIR %s specified on command line",
+ (char *)rarray[A_USERSDIR]);
users_dir = ASPrintf("%s", rarray[A_USERSDIR]);
}
if(rarray[A_FORCE]) {
- LOG("FORCE specified on command line");
+ NSLOG(netsurf, INFO,
+ "FORCE specified on command line");
cli_force = true;
}
@@ -950,7 +955,7 @@ static struct RDArgs *ami_gui_commandline(int *restrict argc, char ** argv,
*/
}
} else {
- LOG("ReadArgs failed to parse command line");
+ NSLOG(netsurf, INFO, "ReadArgs failed to parse command line");
}
FreeArgs(args);
@@ -1220,12 +1225,10 @@ static void ami_update_buttons(struct gui_window_2 *gwin)
}
}
-#ifdef __amigaos4__
GetAttr(GA_Disabled, gwin->objects[GID_BACK], (uint32 *)&s_back);
GetAttr(GA_Disabled, gwin->objects[GID_FORWARD], (uint32 *)&s_forward);
GetAttr(GA_Disabled, gwin->objects[GID_RELOAD], (uint32 *)&s_reload);
GetAttr(GA_Disabled, gwin->objects[GID_STOP], (uint32 *)&s_stop);
-#endif
if(BOOL_MISMATCH(s_back, back))
SetGadgetAttrs((struct Gadget *)gwin->objects[GID_BACK],
@@ -1245,9 +1248,9 @@ static void ami_update_buttons(struct gui_window_2 *gwin)
if(ClickTabBase->lib_Version < 53) {
if(gwin->tabs <= 1) tabclose = TRUE;
-#ifdef __amigaos4__
+
GetAttr(GA_Disabled, gwin->objects[GID_CLOSETAB], (uint32 *)&s_tabclose);
-#endif
+
if(BOOL_MISMATCH(s_tabclose, tabclose))
SetGadgetAttrs((struct Gadget *)gwin->objects[GID_CLOSETAB],
gwin->win, NULL, GA_Disabled, tabclose, TAG_DONE);
@@ -2522,10 +2525,9 @@ static BOOL ami_gui_event(void *w)
#ifdef __amigaos4__
case WMHI_ICONIFY:
{
- struct bitmap *bm;
-
- bm = urldb_get_thumbnail(browser_window_get_url(gwin->gw->bw));
- if(!bm) bm = content_get_bitmap(browser_window_get_content(gwin->gw->bw));
+ struct bitmap *bm = NULL;
+ browser_window_history_get_thumbnail(gwin->gw->bw,
+ &bm);
gwin->dobj = amiga_icon_from_bitmap(bm);
amiga_icon_superimpose_favicon_internal(gwin->gw->favicon,
gwin->dobj);
@@ -2790,7 +2792,9 @@ static void ami_handle_applib(void)
{
struct ApplicationCustomMsg *applibcustmsg =
(struct ApplicationCustomMsg *)applibmsg;
- LOG("Ringhio BackMsg received: %s", applibcustmsg->customMsg);
+ NSLOG(netsurf, INFO,
+ "Ringhio BackMsg received: %s",
+ applibcustmsg->customMsg);
ami_download_parse_backmsg(applibcustmsg->customMsg);
}
@@ -2826,7 +2830,7 @@ void ami_get_msg(void)
NULL, (unsigned int *)&signalmask) != -1) {
signal = signalmask;
} else {
- LOG("waitselect() returned error");
+ NSLOG(netsurf, INFO, "waitselect() returned error");
/* \todo Fix Ctrl-C handling.
* WaitSelect() from bsdsocket.library returns -1 if the task was
* signalled with a Ctrl-C. waitselect() from newlib.library does not.
@@ -3035,11 +3039,13 @@ static void ami_gui_close_screen(struct Screen *scrn, BOOL locked_screen, BOOL d
if(donotwait == TRUE) return;
ULONG scrnsig = 1 << screen_signal;
- LOG("Waiting for visitor windows to close... (signal)");
+ NSLOG(netsurf, INFO,
+ "Waiting for visitor windows to close... (signal)");
Wait(scrnsig);
while (CloseScreen(scrn) == FALSE) {
- LOG("Waiting for visitor windows to close... (polling)");
+ NSLOG(netsurf, INFO,
+ "Waiting for visitor windows to close... (polling)");
Delay(50);
}
@@ -3081,11 +3087,11 @@ static void gui_quit(void)
ami_font_fini();
ami_help_free();
- LOG("Freeing menu items");
+ NSLOG(netsurf, INFO, "Freeing menu items");
ami_ctxmenu_free();
ami_menu_free_glyphs();
- LOG("Freeing mouse pointers");
+ NSLOG(netsurf, INFO, "Freeing mouse pointers");
ami_mouse_pointers_free();
ami_file_req_free();
@@ -3099,7 +3105,7 @@ static void gui_quit(void)
ami_clipboard_free();
ami_gui_resources_free();
- LOG("Closing screen");
+ NSLOG(netsurf, INFO, "Closing screen");
ami_gui_close_screen(scrn, locked_screen, FALSE);
if(nsscreentitle) FreeVec(nsscreentitle);
}
@@ -3109,7 +3115,7 @@ char *ami_gui_get_cache_favicon_name(nsurl *url, bool only_if_avail)
STRPTR filename = NULL;
if ((filename = ASPrintf("%s/%x", current_user_faviconcache, nsurl_hash(url)))) {
- LOG("favicon cache location: %s", filename);
+ NSLOG(netsurf, INFO, "favicon cache location: %s", filename);
if (only_if_avail == true) {
BPTR lock = 0;
@@ -3723,7 +3729,8 @@ static nserror amiga_window_invalidate_area(struct gui_window *g,
nsobj = AddObject(g->deferred_rects, AMINS_RECT);
nsobj->objstruct = deferred_rect;
} else {
- LOG("Ignoring duplicate or subset of queued box redraw");
+ NSLOG(netsurf, INFO,
+ "Ignoring duplicate or subset of queued box redraw");
}
}
ami_schedule_redraw(g->shared, false);
@@ -3853,7 +3860,8 @@ HOOKF(void, ami_scroller_hook, Object *, object, struct IntuiMessage *)
break;
default:
- LOG("IDCMP hook unhandled event: %ld", msg->Class);
+ NSLOG(netsurf, INFO,
+ "IDCMP hook unhandled event: %ld", msg->Class);
break;
}
// ReplyMsg((struct Message *)msg);
@@ -3912,7 +3920,7 @@ gui_window_create(struct browser_window *bw,
ULONG defer_layout = TRUE;
ULONG idcmp_sizeverify = IDCMP_SIZEVERIFY;
- LOG("Creating window");
+ NSLOG(netsurf, INFO, "Creating window");
if (!scrn) ami_openscreenfirst();
@@ -4051,12 +4059,14 @@ gui_window_create(struct browser_window *bw,
ULONG addtabclosegadget = TAG_IGNORE;
ULONG iconifygadget = FALSE;
+#ifdef __amigaos4__
if (nsoption_charp(pubscreen_name) &&
(locked_screen == TRUE) &&
(strcmp(nsoption_charp(pubscreen_name), "Workbench") == 0))
iconifygadget = TRUE;
+#endif
- LOG("Creating menu");
+ NSLOG(netsurf, INFO, "Creating menu");
struct Menu *menu = ami_gui_menu_create(g->shared);
NewList(&g->shared->tab_list);
@@ -4178,7 +4188,7 @@ gui_window_create(struct browser_window *bw,
BitMapEnd;
}
- LOG("Creating window object");
+ NSLOG(netsurf, INFO, "Creating window object");
g->shared->objects[OID_MAIN] = WindowObj,
WA_ScreenTitle, ami_gui_get_screen_title(),
@@ -4456,11 +4466,11 @@ gui_window_create(struct browser_window *bw,
EndWindow;
}
- LOG("Opening window");
+ NSLOG(netsurf, INFO, "Opening window");
g->shared->win = (struct Window *)RA_OpenWindow(g->shared->objects[OID_MAIN]);
- LOG("Window opened, adding border gadgets");
+ NSLOG(netsurf, INFO, "Window opened, adding border gadgets");
if(!g->shared->win)
{
@@ -4796,7 +4806,7 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
if(draw == true) {
ami_set_pointer(g->shared, GUI_POINTER_WAIT, false);
} else {
- LOG("Ignoring deferred box redraw queue");
+ NSLOG(netsurf, INFO, "Ignoring deferred box redraw queue");
}
node = (struct nsObject *)GetHead((struct List *)g->deferred_rects);
@@ -4841,7 +4851,8 @@ bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_rects,
(new_rect->y0 <= rect->y0) &&
(new_rect->x1 >= rect->x1) &&
(new_rect->y1 >= rect->y1)) {
- LOG("Removing queued redraw that is a subset of new box redraw");
+ NSLOG(netsurf, INFO,
+ "Removing queued redraw that is a subset of new box redraw");
ami_memory_itempool_free(mempool, node->objstruct, sizeof(struct rect));
DelObjectNoFree(node);
/* Don't return - we might find more */
@@ -4956,22 +4967,20 @@ void ami_get_hscroll_pos(struct gui_window_2 *gwin, ULONG *xs)
if(gwin->objects[GID_HSCROLL])
{
GetAttr(SCROLLER_Top, (Object *)gwin->objects[GID_HSCROLL], xs);
+ *xs /= gwin->gw->scale;
} else {
*xs = 0;
}
-
- *xs /= gwin->gw->scale;
}
void ami_get_vscroll_pos(struct gui_window_2 *gwin, ULONG *ys)
{
if(gwin->objects[GID_VSCROLL]) {
GetAttr(SCROLLER_Top, gwin->objects[GID_VSCROLL], ys);
+ *ys /= gwin->gw->scale;
} else {
*ys = 0;
}
-
- *ys /= gwin->gw->scale;
}
static bool gui_window_get_scroll(struct gui_window *g, int *restrict sx, int *restrict sy)
@@ -5414,20 +5423,20 @@ Object *ami_gui_splash_open(void)
EndWindow;
if(win_obj == NULL) {
- LOG("Splash window object not created");
+ NSLOG(netsurf, INFO, "Splash window object not created");
return NULL;
}
- LOG("Attempting to open splash window...");
+ NSLOG(netsurf, INFO, "Attempting to open splash window...");
win = RA_OpenWindow(win_obj);
if(win == NULL) {
- LOG("Splash window did not open");
+ NSLOG(netsurf, INFO, "Splash window did not open");
return NULL;
}
if(bm_obj == NULL) {
- LOG("BitMap object not created");
+ NSLOG(netsurf, INFO, "BitMap object not created");
return NULL;
}
@@ -5489,14 +5498,14 @@ void ami_gui_splash_close(Object *win_obj)
{
if(win_obj == NULL) return;
- LOG("Closing splash window");
+ NSLOG(netsurf, INFO, "Closing splash window");
DisposeObject(win_obj);
}
static void gui_file_gadget_open(struct gui_window *g, struct hlcache_handle *hl,
struct form_control *gadget)
{
- LOG("File open dialog request for %p/%p", g, gadget);
+ NSLOG(netsurf, INFO, "File open dialog request for %p/%p", g, gadget);
if(AslRequestTags(filereq,
ASLFR_Window, g->shared->win,
@@ -5531,7 +5540,7 @@ static char *ami_gui_get_user_dir(STRPTR current_user)
user = GetVar("user", temp, 1024, GVF_GLOBAL_ONLY);
current_user = ASPrintf("%s", (user == -1) ? "Default" : temp);
}
- LOG("User: %s", current_user);
+ NSLOG(netsurf, INFO, "User: %s", current_user);
if(users_dir == NULL) {
users_dir = ASPrintf("%s", USERS_DIR);
@@ -5583,7 +5592,7 @@ static char *ami_gui_get_user_dir(STRPTR current_user)
FreeVec(users_dir);
FreeVec(current_user);
- LOG("User dir: %s", current_user_dir);
+ NSLOG(netsurf, INFO, "User dir: %s", current_user_dir);
if((lock = CreateDirTree(current_user_dir)))
UnLock(lock);
@@ -5810,7 +5819,7 @@ int main(int argc, char** argv)
AddPart(script, nsoption_charp(arexx_startup), 1024);
ami_arexx_execute(script);
- LOG("Entering main loop");
+ NSLOG(netsurf, INFO, "Entering main loop");
while (!ami_quit) {
ami_get_msg();
@@ -5829,6 +5838,9 @@ int main(int argc, char** argv)
free(current_user_dir);
FreeVec(current_user_faviconcache);
+ /* finalise logging */
+ nslog_finalise();
+
#ifndef __amigaos4__
/* OS3 low memory handler */
ami_memory_fini(memhandler);
diff --git a/frontends/amiga/gui_menu.c b/frontends/amiga/gui_menu.c
index 6ee0800f8..756f5e66c 100644
--- a/frontends/amiga/gui_menu.c
+++ b/frontends/amiga/gui_menu.c
@@ -584,7 +584,8 @@ ULONG ami_gui_menu_number(int item)
break;
default:
- LOG("WARNING: Unrecognised menu item %d", item);
+ NSLOG(netsurf, INFO,
+ "WARNING: Unrecognised menu item %d", item);
menu_num = 0;
break;
}
diff --git a/frontends/amiga/gui_options.c b/frontends/amiga/gui_options.c
index 48228407f..cc3a915df 100755
--- a/frontends/amiga/gui_options.c
+++ b/frontends/amiga/gui_options.c
@@ -270,9 +270,8 @@ static void ami_gui_opts_array_to_list(struct List *list, const char *array[], i
node = AllocChooserNode(CNA_Text, array[i], TAG_DONE);
break;
case NSA_LIST_RADIO:
- /* Note: RBNA_Labels is RBNA_Label in OS4
- * Also note: These labels don't work (FIXME) */
- node = AllocRadioButtonNode(RBNA_Labels, array[i], TAG_DONE);
+ /* Note: RBNA_Labels is RBNA_Label in OS4 */
+ node = AllocRadioButtonNode(0, RBNA_Labels, array[i], TAG_DONE);
break;
default:
break;
@@ -1107,8 +1106,8 @@ void ami_gui_opts_open(void)
GA_ID, GID_OPTS_DPI_Y,
GA_RelVerify, TRUE,
INTEGER_Number, nsoption_int(screen_ydpi),
- INTEGER_Minimum, 60,
- INTEGER_Maximum, 150,
+ INTEGER_Minimum, 20,
+ INTEGER_Maximum, 200,
INTEGER_Arrows, TRUE,
GA_Disabled, nsoption_bool(bitmap_fonts),
IntegerEnd,
@@ -1748,7 +1747,7 @@ static void ami_gui_opts_use(bool save)
switch(data)
{
case 0:
- nsoption_set_charp(pubscreen_name, strdup("\0"));
+ nsoption_set_charp(pubscreen_name, NULL);
break;
case 1:
diff --git a/frontends/amiga/history.c b/frontends/amiga/history.c
index 7fc1ec333..e724f3e70 100644
--- a/frontends/amiga/history.c
+++ b/frontends/amiga/history.c
@@ -438,7 +438,7 @@ nserror ami_history_global_present(void)
res = ami_history_global_create_window(ncwin);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
ami_utf8_free(ncwin->core.wintitle);
free(ncwin);
return res;
diff --git a/frontends/amiga/history_local.c b/frontends/amiga/history_local.c
index c293f5909..0ae9cc040 100644
--- a/frontends/amiga/history_local.c
+++ b/frontends/amiga/history_local.c
@@ -261,7 +261,7 @@ nserror ami_history_local_present(struct gui_window *gw)
res = ami_history_local_create_window(ncwin);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
ami_utf8_free(ncwin->core.wintitle);
free(ncwin);
return res;
diff --git a/frontends/amiga/hotlist.c b/frontends/amiga/hotlist.c
index c0a6b6f58..c7efe9148 100644
--- a/frontends/amiga/hotlist.c
+++ b/frontends/amiga/hotlist.c
@@ -563,7 +563,7 @@ nserror ami_hotlist_present(void)
res = ami_hotlist_create_window(ncwin);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
ami_utf8_free(ncwin->core.wintitle);
free(ncwin);
return res;
diff --git a/frontends/amiga/icon.c b/frontends/amiga/icon.c
index 9de040d37..582d355b6 100644
--- a/frontends/amiga/icon.c
+++ b/frontends/amiga/icon.c
@@ -155,7 +155,7 @@ bool amiga_icon_convert(struct content *c)
if(filename == NULL)
{
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -167,7 +167,7 @@ bool amiga_icon_convert(struct content *c)
if(dobj == NULL)
{
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -187,14 +187,14 @@ bool amiga_icon_convert(struct content *c)
icon_c->bitmap = amiga_bitmap_create(width, height, BITMAP_NEW);
if (!icon_c->bitmap) {
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
if(dobj) FreeDiskObject(dobj);
return false;
}
imagebuf = (ULONG *) amiga_bitmap_get_buffer(icon_c->bitmap);
if (!imagebuf) {
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
if(dobj) FreeDiskObject(dobj);
return false;
}
diff --git a/frontends/amiga/libs.c b/frontends/amiga/libs.c
index 30694542c..305818076 100644
--- a/frontends/amiga/libs.c
+++ b/frontends/amiga/libs.c
@@ -23,6 +23,7 @@
#include "utils/utils.h"
#include "utils/log.h"
+#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/utility.h>
@@ -56,11 +57,11 @@
#ifdef __amigaos4__
#define AMINS_LIB_OPEN(LIB, LIBVER, PREFIX, INTERFACE, INTVER, FAIL) \
- LOG("Opening %s v%d", LIB, LIBVER); \
+ NSLOG(netsurf, INFO, "Opening %s v%d", LIB, LIBVER); \
if((PREFIX##Base = (struct PREFIX##Base *)OpenLibrary(LIB, LIBVER))) { \
I##PREFIX = (struct PREFIX##IFace *)GetInterface((struct Library *)PREFIX##Base, INTERFACE, INTVER, NULL); \
if(I##PREFIX == NULL) { \
- LOG("Failed to get %s interface v%d of %s", INTERFACE, INTVER, LIB); \
+ NSLOG(netsurf, INFO, "Failed to get %s interface v%d of %s", INTERFACE, INTVER, LIB); \
AMINS_LIB_CLOSE(PREFIX) \
if(FAIL == true) { \
STRPTR error = ASPrintf("Unable to open interface %s v%d\nof %s v%ld (fatal error - not an OS4 lib?)", INTERFACE, INTVER, LIB, LIBVER); \
@@ -70,7 +71,7 @@
} \
} \
} else { \
- LOG("Failed to open %s v%d", LIB, LIBVER); \
+ NSLOG(netsurf, INFO, "Failed to open %s v%d", LIB, LIBVER); \
if(FAIL == true) { \
STRPTR error = ASPrintf("Unable to open %s v%ld (fatal error)", LIB, LIBVER); \
ami_misc_fatal_error(error); \
@@ -90,13 +91,13 @@
struct PREFIX##IFace *I##PREFIX = NULL;
#define AMINS_CLASS_OPEN(CLASS, CLASSVER, PREFIX, CLASSGET, NEEDINTERFACE) \
- LOG("Opening %s v%d", CLASS, CLASSVER); \
+ NSLOG(netsurf, INFO, "Opening %s v%d", CLASS, CLASSVER); \
if((PREFIX##Base = OpenClass(CLASS, CLASSVER, &PREFIX##Class))) { \
if(NEEDINTERFACE == true) { \
- LOG(" + interface"); \
+ NSLOG(netsurf, INFO, " + interface"); \
I##PREFIX = (struct PREFIX##IFace *)GetInterface((struct Library *)PREFIX##Base, "main", 1, NULL); \
if(I##PREFIX == NULL) { \
- LOG("Failed to get main interface v1 of %s", CLASS); \
+ NSLOG(netsurf, INFO, "Failed to get main interface v1 of %s", CLASS); \
} \
} \
} \
@@ -118,10 +119,10 @@
#else
#define AMINS_LIB_OPEN(LIB, LIBVER, PREFIX, INTERFACE, INTVER, FAIL) \
- LOG("Opening %s v%d", LIB, LIBVER); \
+ NSLOG(netsurf, INFO, "Opening %s v%d", LIB, LIBVER); \
if((PREFIX##Base = (struct PREFIX##Base *)OpenLibrary(LIB, LIBVER))) { \
} else { \
- LOG("Failed to open %s v%d", LIB, LIBVER); \
+ NSLOG(netsurf, INFO, "Failed to open %s v%d", LIB, LIBVER); \
if(FAIL == true) { \
STRPTR error = ASPrintf("Unable to open %s v%d (fatal error)", LIB, LIBVER); \
ami_misc_fatal_error(error); \
@@ -137,7 +138,7 @@
struct PREFIX##Base *PREFIX##Base = NULL;
#define AMINS_CLASS_OPEN(CLASS, CLASSVER, PREFIX, CLASSGET, NEEDINTERFACE) \
- LOG("Opening %s v%d", CLASS, CLASSVER); \
+ NSLOG(netsurf, INFO, "Opening %s v%d", CLASS, CLASSVER); \
if((PREFIX##Base = OpenLibrary(CLASS, CLASSVER))) { \
PREFIX##Class = CLASSGET##_GetClass(); \
} \
@@ -219,6 +220,7 @@ bool ami_libs_open(void)
AMINS_LIB_OPEN("asl.library", 37, Asl, "main", 1, true)
AMINS_LIB_OPEN("datatypes.library", 39, DataTypes, "main", 1, true)
AMINS_LIB_OPEN("diskfont.library", 40, Diskfont, "main", 1, true)
+ AMINS_LIB_OPEN("dos.library", 37, DOS, "main", 1, true)
AMINS_LIB_OPEN("gadtools.library", 37, GadTools, "main", 1, true)
AMINS_LIB_OPEN("graphics.library", 40, Graphics, "main", 1, true)
AMINS_LIB_OPEN("icon.library", 44, Icon, "main", 1, true)
@@ -321,6 +323,7 @@ void ami_libs_close(void)
AMINS_LIB_CLOSE(Asl)
AMINS_LIB_CLOSE(DataTypes)
AMINS_LIB_CLOSE(Diskfont)
+ AMINS_LIB_CLOSE(DOS)
AMINS_LIB_CLOSE(GadTools)
AMINS_LIB_CLOSE(Graphics)
AMINS_LIB_CLOSE(Icon)
diff --git a/frontends/amiga/memory.c b/frontends/amiga/memory.c
index d371d2585..35ca9697f 100755
--- a/frontends/amiga/memory.c
+++ b/frontends/amiga/memory.c
@@ -50,23 +50,38 @@ void *ami_memory_clear_alloc(size_t size, UBYTE value)
static int ami_memory_slab_usage_cb(const struct __slab_usage_information * sui)
{
if(sui->sui_slab_index <= 1) {
- LOG("clib2 slab usage:");
- LOG(" The size of all slabs, in bytes: %ld", sui->sui_slab_size);
- LOG(" Number of allocations which are not managed by slabs: %ld",
- sui->sui_num_single_allocations);
- LOG(" Total number of bytes allocated for memory not managed by slabs: %ld",
- sui->sui_total_single_allocation_size);
- LOG(" Number of slabs currently in play: %ld", sui->sui_num_slabs);
- LOG(" Number of currently unused slabs: %ld", sui->sui_num_empty_slabs);
- LOG(" Number of slabs in use which are completely filled with data: %ld",
- sui->sui_num_full_slabs);
- LOG(" Total number of bytes allocated for all slabs: %ld",
- sui->sui_total_slab_allocation_size);
+ NSLOG(netsurf, INFO, "clib2 slab usage:");
+ NSLOG(netsurf, INFO,
+ " The size of all slabs, in bytes: %ld",
+ sui->sui_slab_size);
+ NSLOG(netsurf, INFO,
+ " Number of allocations which are not managed by slabs: %ld",
+ sui->sui_num_single_allocations);
+ NSLOG(netsurf, INFO,
+ " Total number of bytes allocated for memory not managed by slabs: %ld",
+ sui->sui_total_single_allocation_size);
+ NSLOG(netsurf, INFO,
+ " Number of slabs currently in play: %ld",
+ sui->sui_num_slabs);
+ NSLOG(netsurf, INFO,
+ " Number of currently unused slabs: %ld",
+ sui->sui_num_empty_slabs);
+ NSLOG(netsurf, INFO,
+ " Number of slabs in use which are completely filled with data: %ld",
+ sui->sui_num_full_slabs);
+ NSLOG(netsurf, INFO,
+ " Total number of bytes allocated for all slabs: %ld",
+ sui->sui_total_slab_allocation_size);
}
- LOG("Slab %d", sui->sui_slab_index);
- LOG(" Memory chunk size managed by this slab: %ld", sui->sui_chunk_size);
- LOG(" Number of memory chunks that fit in this slab: %ld", sui->sui_num_chunks);
- LOG(" Number of memory chunks used in this slab: %ld", sui->sui_num_chunks_used);
+ NSLOG(netsurf, INFO, "Slab %d", sui->sui_slab_index);
+ NSLOG(netsurf, INFO, " Memory chunk size managed by this slab: %ld",
+ sui->sui_chunk_size);
+ NSLOG(netsurf, INFO,
+ " Number of memory chunks that fit in this slab: %ld",
+ sui->sui_num_chunks);
+ NSLOG(netsurf, INFO,
+ " Number of memory chunks used in this slab: %ld",
+ sui->sui_num_chunks_used);
return 0;
}
@@ -74,16 +89,20 @@ static int ami_memory_slab_usage_cb(const struct __slab_usage_information * sui)
static int ami_memory_slab_alloc_cb(const struct __slab_allocation_information *sai)
{
if(sai->sai_allocation_index <= 1) {
- LOG("clib2 allocation usage:");
- LOG(" Number of allocations which are not managed by slabs: %ld",
- sai->sai_num_single_allocations);
- LOG(" Total number of bytes allocated for memory not managed by slabs: %ld",
- sai->sai_total_single_allocation_size);
+ NSLOG(netsurf, INFO, "clib2 allocation usage:");
+ NSLOG(netsurf, INFO,
+ " Number of allocations which are not managed by slabs: %ld",
+ sai->sai_num_single_allocations);
+ NSLOG(netsurf, INFO,
+ " Total number of bytes allocated for memory not managed by slabs: %ld",
+ sai->sai_total_single_allocation_size);
}
- LOG("Alloc %d", sai->sai_allocation_index);
- LOG(" Size of this allocation, as requested: %ld", sai->sai_allocation_size);
- LOG(" Total size of this allocation, including management data: %ld",
- sai->sai_total_allocation_size);
+ NSLOG(netsurf, INFO, "Alloc %d", sai->sai_allocation_index);
+ NSLOG(netsurf, INFO, " Size of this allocation, as requested: %ld",
+ sai->sai_allocation_size);
+ NSLOG(netsurf, INFO,
+ " Total size of this allocation, including management data: %ld",
+ sai->sai_total_allocation_size);
return 0;
}
@@ -111,13 +130,13 @@ void ami_memory_slab_dump(BPTR fh)
static void ami_memory_low_mem_handler(void *p)
{
if(low_mem_status == PURGE_STEP1) {
- LOG("Purging llcache");
+ NSLOG(netsurf, INFO, "Purging llcache");
llcache_clean(true);
low_mem_status = PURGE_DONE_STEP1;
}
if(low_mem_status == PURGE_STEP2) {
- LOG("Purging unused slabs");
+ NSLOG(netsurf, INFO, "Purging unused slabs");
__free_unused_slabs();
low_mem_status = PURGE_DONE_STEP2;
}
diff --git a/frontends/amiga/menu.c b/frontends/amiga/menu.c
index 65265c34d..1f3f981ea 100644
--- a/frontends/amiga/menu.c
+++ b/frontends/amiga/menu.c
@@ -263,7 +263,9 @@ static int ami_menu_layout_mc_recursive(Object *menu_parent, struct ami_menu_dat
TAG_DONE);
}
- //LOG("Adding item %p ID %d (%s) to parent %p", menu_item, j, md[j]->menulab, menu_parent);
+ NSLOG(netsurf, DEEPDEBUG,
+ "Adding item %p ID %d (%s) to parent %p",
+ menu_item, j, md[j]->menulab, menu_parent);
IDoMethod(menu_parent, OM_ADDMEMBER, menu_item);
continue;
} else if (md[j]->menutype > level) {
diff --git a/frontends/amiga/misc.c b/frontends/amiga/misc.c
index 5ca4f906a..532d2f182 100755
--- a/frontends/amiga/misc.c
+++ b/frontends/amiga/misc.c
@@ -46,7 +46,7 @@ static LONG ami_misc_req(const char *message, uint32 type)
{
LONG ret = 0;
- LOG("%s", message);
+ NSLOG(netsurf, INFO, "%s", message);
#ifdef __amigaos4__
ret = TimedDosRequesterTags(
TDR_TitleString, messages_get("NetSurf"),
diff --git a/frontends/amiga/os3support.c b/frontends/amiga/os3support.c
index 6dc95795f..645496b73 100644
--- a/frontends/amiga/os3support.c
+++ b/frontends/amiga/os3support.c
@@ -216,13 +216,13 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
fh = Open(fontpath, MODE_OLDFILE);
if(fh == 0) {
- LOG("Unable to open FONT %s", fontpath);
+ NSLOG(netsurf, INFO, "Unable to open FONT %s", fontpath);
FreeVec(fontpath);
return NULL;
}
if(Read(fh, &fch, sizeof(struct FontContentsHeader)) != sizeof(struct FontContentsHeader)) {
- LOG("Unable to read FONT %s", fontpath);
+ NSLOG(netsurf, INFO, "Unable to read FONT %s", fontpath);
FreeVec(fontpath);
Close(fh);
return NULL;
@@ -231,7 +231,7 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
Close(fh);
if(fch.fch_FileID != OFCH_ID) {
- LOG("%s is not an outline font!", fontpath);
+ NSLOG(netsurf, INFO, "%s is not an outline font!", fontpath);
FreeVec(fontpath);
return NULL;
}
@@ -242,7 +242,7 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
if(p) *p = '.';
if(fh == 0) {
- LOG("Unable to open OTAG %s", otagpath);
+ NSLOG(netsurf, INFO, "Unable to open OTAG %s", otagpath);
FreeVec(otagpath);
return NULL;
}
@@ -250,7 +250,7 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
size = GetFileSize(fh);
buffer = (UBYTE *)malloc(size);
if(buffer == NULL) {
- LOG("Unable to allocate memory");
+ NSLOG(netsurf, INFO, "Unable to allocate memory");
Close(fh);
FreeVec(otagpath);
return NULL;
@@ -262,7 +262,7 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
/* The first tag is supposed to be OT_FileIdent and should equal 'size' */
struct TagItem *tag = (struct TagItem *)buffer;
if((tag->ti_Tag != OT_FileIdent) || (tag->ti_Data != (ULONG)size)) {
- LOG("Invalid OTAG file");
+ NSLOG(netsurf, INFO, "Invalid OTAG file");
free(buffer);
FreeVec(otagpath);
return NULL;
@@ -277,10 +277,10 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
/* Find OT_Engine and open the font engine */
if(ti = FindTagItem(OT_Engine, buffer)) {
- LOG("Using font engine %s", ti->ti_Data);
+ NSLOG(netsurf, INFO, "Using font engine %s", ti->ti_Data);
fname = ASPrintf("%s.library", ti->ti_Data);
} else {
- LOG("Cannot find OT_Engine tag");
+ NSLOG(netsurf, INFO, "Cannot find OT_Engine tag");
free(buffer);
FreeVec(otagpath);
return NULL;
@@ -289,7 +289,7 @@ struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG fl
BulletBase = (struct BulletBase *)OpenLibrary(fname, 0L);
if(BulletBase == NULL) {
- LOG("Unable to open font engine %s", fname);
+ NSLOG(netsurf, INFO, "Unable to open font engine %s", fname);
free(buffer);
FreeVec(fname);
FreeVec(otagpath);
@@ -405,9 +405,10 @@ ULONG RefreshSetGadgetAttrsA(struct Gadget *g, struct Window *w, struct Requeste
ULONG retval;
BOOL changedisabled = FALSE;
BOOL disabled;
+ struct TagItem *ti;
if (w) {
- if (FindTagItem(GA_Disabled,tags)) {
+ if ((ti = FindTagItem(GA_Disabled,tags)) && (ti->ti_Data != FALSE)) {
changedisabled = TRUE;
disabled = g->Flags & GFLG_DISABLED;
}
diff --git a/frontends/amiga/plotters.c b/frontends/amiga/plotters.c
index e31d470a6..b8485430f 100644
--- a/frontends/amiga/plotters.c
+++ b/frontends/amiga/plotters.c
@@ -53,15 +53,6 @@
#include "amiga/rtg.h"
#include "amiga/utf8.h"
-/* set AMI_PLOTTER_DEBUG to 0 for no debugging, 1 for debugging */
-//#define AMI_PLOTTER_DEBUG 1
-
-#ifdef AMI_PLOTTER_DEBUG
-#define PLOT_LOG(x...) LOG(x)
-#else
-#define PLOT_LOG(x...) ((void) 0)
-#endif
-
HOOKF(void, ami_bitmap_tile_hook, struct RastPort *, rp, struct BackFillMessage *);
struct bfbitmap {
@@ -119,9 +110,6 @@ static bool palette_mapped = true; /* palette-mapped state for the screen */
*/
#define AREA_SIZE 25000
-/* Define the below to get additional debug */
-#undef AMI_PLOTTER_DEBUG
-
struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit, bool alloc_pen_list)
{
/* init shared bitmaps */
@@ -131,7 +119,7 @@ struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit
struct gui_globals *gg = malloc(sizeof(struct gui_globals));
if(force32bit == false) depth = GetBitMapAttr(scrn->RastPort.BitMap, BMA_DEPTH);
- LOG("Screen depth = %d", depth);
+ NSLOG(netsurf, INFO, "Screen depth = %d", depth);
#ifdef __amigaos4__
if(depth < 16) {
@@ -241,7 +229,8 @@ struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit
gg->open_num = -1;
init_layers_count++;
- LOG("Layer initialised (total: %d)", init_layers_count);
+ NSLOG(netsurf, INFO, "Layer initialised (total: %d)",
+ init_layers_count);
return gg;
}
@@ -250,13 +239,15 @@ void ami_plot_ra_free(struct gui_globals *gg)
{
init_layers_count--;
+ if(init_layers_count < 0) return;
+
if((init_layers_count == 0) && (pool_pens != NULL)) {
ami_memory_itempool_delete(pool_pens);
pool_pens = NULL;
}
if(gg->rp) {
- DeleteLayer(0,gg->rp->Layer);
+ if(gg->rp->Layer != NULL) DeleteLayer(0, gg->rp->Layer);
free(gg->rp->TmpRas);
free(gg->rp->AreaInfo);
free(gg->rp);
@@ -328,7 +319,8 @@ static ULONG ami_plot_obtain_pen(struct MinList *shared_pens, ULONG colr)
(colr & 0x00ff0000) << 8,
NULL);
- if(pen == -1) LOG("WARNING: Cannot allocate pen for ABGR:%lx", colr);
+ if(pen == -1) NSLOG(netsurf, INFO,
+ "WARNING: Cannot allocate pen for ABGR:%lx", colr);
if((shared_pens != NULL) && (pool_pens != NULL)) {
if((node = (struct ami_plot_pen *)ami_memory_itempool_alloc(pool_pens, sizeof(struct ami_plot_pen)))) {
@@ -436,7 +428,7 @@ static void ami_arc_gfxlib(struct RastPort *rp, int x, int y, int radius, int an
static nserror
ami_bitmap(struct gui_globals *glob, int x, int y, int width, int height, struct bitmap *bitmap)
{
- PLOT_LOG("[ami_plotter] Entered ami_bitmap()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_bitmap()");
struct BitMap *tbm;
@@ -456,7 +448,7 @@ ami_bitmap(struct gui_globals *glob, int x, int y, int width, int height, struct
return NSERROR_OK;
}
- PLOT_LOG("[ami_plotter] ami_bitmap() got native bitmap");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] ami_bitmap() got native bitmap");
#ifdef __amigaos4__
if (__builtin_expect((GfxBase->LibNode.lib_Version >= 53) &&
@@ -615,7 +607,7 @@ ami_clip(const struct redraw_context *ctx, const struct rect *clip)
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
struct Region *reg = NULL;
- PLOT_LOG("[ami_plotter] Entered ami_clip()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_clip()");
if (glob->rp->Layer) {
reg = NewRegion();
@@ -659,7 +651,7 @@ ami_arc(const struct redraw_context *ctx,
const plot_style_t *style,
int x, int y, int radius, int angle1, int angle2)
{
- PLOT_LOG("[ami_plotter] Entered ami_arc()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_arc()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -691,7 +683,7 @@ ami_disc(const struct redraw_context *ctx,
const plot_style_t *style,
int x, int y, int radius)
{
- PLOT_LOG("[ami_plotter] Entered ami_disc()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_disc()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -726,7 +718,7 @@ ami_line(const struct redraw_context *ctx,
const plot_style_t *style,
const struct rect *line)
{
- PLOT_LOG("[ami_plotter] Entered ami_line()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_line()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -778,7 +770,7 @@ ami_rectangle(const struct redraw_context *ctx,
const plot_style_t *style,
const struct rect *rect)
{
- PLOT_LOG("[ami_plotter] Entered ami_rectangle()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_rectangle()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -842,24 +834,24 @@ ami_polygon(const struct redraw_context *ctx,
const int *p,
unsigned int n)
{
- PLOT_LOG("[ami_plotter] Entered ami_polygon()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_polygon()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
ami_plot_setapen(glob, glob->rp, style->fill_colour);
if (AreaMove(glob->rp,p[0],p[1]) == -1) {
- LOG("AreaMove: vector list full");
+ NSLOG(netsurf, INFO, "AreaMove: vector list full");
}
for (uint32 k = 1; k < n; k++) {
if (AreaDraw(glob->rp,p[k*2],p[(k*2)+1]) == -1) {
- LOG("AreaDraw: vector list full");
+ NSLOG(netsurf, INFO, "AreaDraw: vector list full");
}
}
if (AreaEnd(glob->rp) == -1) {
- LOG("AreaEnd: error");
+ NSLOG(netsurf, INFO, "AreaEnd: error");
}
return NSERROR_OK;
@@ -891,7 +883,7 @@ ami_path(const struct redraw_context *ctx,
unsigned int i;
struct bez_point start_p = {0, 0}, cur_p = {0, 0}, p_a, p_b, p_c, p_r;
- PLOT_LOG("[ami_plotter] Entered ami_path()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_path()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -900,7 +892,7 @@ ami_path(const struct redraw_context *ctx,
}
if (p[0] != PLOTTER_PATH_MOVE) {
- LOG("Path does not start with move");
+ NSLOG(netsurf, INFO, "Path does not start with move");
return NSERROR_INVALID;
}
@@ -922,7 +914,8 @@ ami_path(const struct redraw_context *ctx,
if (p[i] == PLOTTER_PATH_MOVE) {
if (pstyle->fill_colour != NS_TRANSPARENT) {
if (AreaMove(glob->rp, p[i+1], p[i+2]) == -1) {
- LOG("AreaMove: vector list full");
+ NSLOG(netsurf, INFO,
+ "AreaMove: vector list full");
}
} else {
Move(glob->rp, p[i+1], p[i+2]);
@@ -936,7 +929,7 @@ ami_path(const struct redraw_context *ctx,
} else if (p[i] == PLOTTER_PATH_CLOSE) {
if (pstyle->fill_colour != NS_TRANSPARENT) {
if (AreaEnd(glob->rp) == -1) {
- LOG("AreaEnd: error");
+ NSLOG(netsurf, INFO, "AreaEnd: error");
}
} else {
Draw(glob->rp, start_p.x, start_p.y);
@@ -945,7 +938,8 @@ ami_path(const struct redraw_context *ctx,
} else if (p[i] == PLOTTER_PATH_LINE) {
if (pstyle->fill_colour != NS_TRANSPARENT) {
if (AreaDraw(glob->rp, p[i+1], p[i+2]) == -1) {
- LOG("AreaDraw: vector list full");
+ NSLOG(netsurf, INFO,
+ "AreaDraw: vector list full");
}
} else {
Draw(glob->rp, p[i+1], p[i+2]);
@@ -965,7 +959,8 @@ ami_path(const struct redraw_context *ctx,
ami_bezier(&cur_p, &p_a, &p_b, &p_c, t, &p_r);
if (pstyle->fill_colour != NS_TRANSPARENT) {
if (AreaDraw(glob->rp, p_r.x, p_r.y) == -1) {
- LOG("AreaDraw: vector list full");
+ NSLOG(netsurf, INFO,
+ "AreaDraw: vector list full");
}
} else {
Draw(glob->rp, p_r.x, p_r.y);
@@ -975,7 +970,7 @@ ami_path(const struct redraw_context *ctx,
cur_p.y = p_c.y;
i += 7;
} else {
- LOG("bad path command %f", p[i]);
+ NSLOG(netsurf, INFO, "bad path command %f", p[i]);
/* End path for safety if using Area commands */
if (pstyle->fill_colour != NS_TRANSPARENT) {
AreaEnd(glob->rp);
@@ -1032,7 +1027,7 @@ ami_bitmap_tile(const struct redraw_context *ctx,
bool repeat_x = (flags & BITMAPF_REPEAT_X);
bool repeat_y = (flags & BITMAPF_REPEAT_Y);
- PLOT_LOG("[ami_plotter] Entered ami_bitmap_tile()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_bitmap_tile()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
@@ -1149,7 +1144,7 @@ ami_text(const struct redraw_context *ctx,
const char *text,
size_t length)
{
- PLOT_LOG("[ami_plotter] Entered ami_text()");
+ NSLOG(plot, DEEPDEBUG, "[ami_plotter] Entered ami_text()");
struct gui_globals *glob = (struct gui_globals *)ctx->priv;
diff --git a/frontends/amiga/plugin_hack.c b/frontends/amiga/plugin_hack.c
index 2327f9190..4fd1f03f7 100644
--- a/frontends/amiga/plugin_hack.c
+++ b/frontends/amiga/plugin_hack.c
@@ -82,7 +82,8 @@ nserror amiga_plugin_hack_init(void)
if(node)
{
- LOG("plugin_hack registered %s", lwc_string_data(type));
+ NSLOG(netsurf, INFO, "plugin_hack registered %s",
+ lwc_string_data(type));
error = content_factory_register_handler(
lwc_string_data(type),
@@ -123,7 +124,7 @@ nserror amiga_plugin_hack_create(const content_handler *handler,
bool amiga_plugin_hack_convert(struct content *c)
{
- LOG("amiga_plugin_hack_convert");
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_convert");
content_set_ready(c);
content_set_done(c);
@@ -137,7 +138,7 @@ void amiga_plugin_hack_destroy(struct content *c)
{
amiga_plugin_hack_content *plugin = (amiga_plugin_hack_content *) c;
- LOG("amiga_plugin_hack_destroy %p", plugin);
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_destroy %p", plugin);
return;
}
@@ -155,7 +156,7 @@ bool amiga_plugin_hack_redraw(struct content *c,
struct rect rect;
nserror res;
- LOG("amiga_plugin_hack_redraw");
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_redraw");
rect.x0 = data->x;
rect.y0 = data->y;
@@ -187,7 +188,8 @@ bool amiga_plugin_hack_redraw(struct content *c,
void amiga_plugin_hack_open(struct content *c, struct browser_window *bw,
struct content *page, struct object_params *params)
{
- LOG("amiga_plugin_hack_open %s", nsurl_access(content_get_url(c)));
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_open %s",
+ nsurl_access(content_get_url(c)));
if(c)
{
@@ -201,13 +203,13 @@ void amiga_plugin_hack_open(struct content *c, struct browser_window *bw,
void amiga_plugin_hack_close(struct content *c)
{
- LOG("amiga_plugin_hack_close");
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_close");
return;
}
void amiga_plugin_hack_reformat(struct content *c, int width, int height)
{
- LOG("amiga_plugin_hack_reformat");
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_reformat");
c->width = width;
c->height = height;
@@ -220,7 +222,7 @@ nserror amiga_plugin_hack_clone(const struct content *old, struct content **newc
amiga_plugin_hack_content *plugin;
nserror error;
- LOG("amiga_plugin_hack_clone");
+ NSLOG(netsurf, INFO, "amiga_plugin_hack_clone");
plugin = calloc(1, sizeof(amiga_plugin_hack_content));
if (plugin == NULL)
@@ -267,7 +269,7 @@ void amiga_plugin_hack_execute(struct hlcache_handle *c)
if(full_cmd)
{
#ifdef __amigaos4__
- LOG("Attempting to execute %s", full_cmd);
+ NSLOG(netsurf, INFO, "Attempting to execute %s", full_cmd);
in = Open("NIL:", MODE_OLDFILE);
out = Open("NIL:", MODE_NEWFILE);
diff --git a/frontends/amiga/schedule.c b/frontends/amiga/schedule.c
index bfafe9c88..043edc7fe 100644
--- a/frontends/amiga/schedule.c
+++ b/frontends/amiga/schedule.c
@@ -218,22 +218,25 @@ static void ami_schedule_dump(void)
GetSysTime(&tv);
Amiga2Date(tv.Seconds, &clockdata);
- LOG("Current time = %d-%d-%d %d:%d:%d.%d", clockdata.mday, clockdata.month, clockdata.year,
- clockdata.hour, clockdata.min, clockdata.sec, tv.Microseconds);
- LOG("Events remaining in queue:");
+ NSLOG(netsurf, INFO, "Current time = %d-%d-%d %d:%d:%d.%d",
+ clockdata.mday, clockdata.month, clockdata.year,
+ clockdata.hour, clockdata.min, clockdata.sec, tv.Microseconds);
+ NSLOG(netsurf, INFO, "Events remaining in queue:");
iterator = pblHeapIterator(schedule_list);
while ((nscb = pblIteratorNext(iterator)) != -1)
{
Amiga2Date(nscb->tv.Seconds, &clockdata);
- LOG("nscb: %p, at %d-%d-%d %d:%d:%d.%d, callback: %p, %p",
- nscb, clockdata.mday, clockdata.month, clockdata.year, clockdata.hour, clockdata.min, clockdata.sec,
- nscb->tv.Microseconds, nscb->callback, nscb->p);
+ NSLOG(netsurf, INFO,
+ "nscb: %p, at %d-%d-%d %d:%d:%d.%d, callback: %p, %p",
+ nscb, clockdata.mday, clockdata.month, clockdata.year,
+ clockdata.hour, clockdata.min, clockdata.sec,
+ nscb->tv.Microseconds, nscb->callback, nscb->p);
if(CheckIO((struct IORequest *)nscb) == NULL) {
- LOG("-> ACTIVE");
+ NSLOG(netsurf, INFO, "-> ACTIVE");
} else {
- LOG("-> COMPLETE");
+ NSLOG(netsurf, INFO, "-> COMPLETE");
}
};
diff --git a/frontends/amiga/selectmenu.c b/frontends/amiga/selectmenu.c
index f3a11b67a..8a8614136 100644
--- a/frontends/amiga/selectmenu.c
+++ b/frontends/amiga/selectmenu.c
@@ -58,7 +58,8 @@ BOOL ami_selectmenu_is_safe(void)
BOOL popupmenu_lib_ok = FALSE;
if((PopupMenuBase = OpenLibrary("popupmenu.library", 53))) {
- LOG("popupmenu.library v%d.%d", PopupMenuBase->lib_Version, PopupMenuBase->lib_Revision);
+ NSLOG(netsurf, INFO, "popupmenu.library v%d.%d",
+ PopupMenuBase->lib_Version, PopupMenuBase->lib_Revision);
if(LIB_IS_AT_LEAST((struct Library *)PopupMenuBase, 53, 11))
popupmenu_lib_ok = TRUE;
CloseLibrary(PopupMenuBase);
diff --git a/frontends/amiga/sslcert.c b/frontends/amiga/sslcert.c
index eeb34108a..136b918fc 100644
--- a/frontends/amiga/sslcert.c
+++ b/frontends/amiga/sslcert.c
@@ -317,7 +317,7 @@ nserror ami_cert_verify(struct nsurl *url,
res = ami_crtvrfy_create_window(ncwin);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
ami_utf8_free(ncwin->core.wintitle);
ami_utf8_free(ncwin->sslerr);
ami_utf8_free(ncwin->sslaccept);
diff --git a/frontends/amiga/theme.c b/frontends/amiga/theme.c
index 5e4be0710..63982c879 100644
--- a/frontends/amiga/theme.c
+++ b/frontends/amiga/theme.c
@@ -54,7 +54,8 @@
static struct BitMap *throbber = NULL;
static struct bitmap *throbber_nsbm = NULL;
-static int throbber_frames, throbber_update_interval;
+static int throbber_frames = 1;
+static int throbber_update_interval;
static Object *mouseptrobj[AMI_LASTPOINTER+1];
static struct BitMap *mouseptrbm[AMI_LASTPOINTER+1];
@@ -176,6 +177,7 @@ void ami_theme_throbber_setup(void)
ami_get_theme_filename(throbberfile,"theme_throbber",false);
throbber_frames=atoi(messages_get("theme_throbber_frames"));
+ if(throbber_frames == 0) throbber_frames = 1;
throbber_update_interval = atoi(messages_get("theme_throbber_delay"));
if(throbber_update_interval == 0) throbber_update_interval = 250;
diff --git a/frontends/amiga/version.c b/frontends/amiga/version.c
index c3cd9e2b5..61fbd7176 100644
--- a/frontends/amiga/version.c
+++ b/frontends/amiga/version.c
@@ -25,7 +25,7 @@
* problems created by "0" not being a valid AmigaOS revision number.
*/
#define NETSURF_VERSION_MAJOR "3"
-#define NETSURF_VERSION_MINOR_EXTERNAL "7"
+#define NETSURF_VERSION_MINOR_EXTERNAL "8"
#if defined(CI_BUILD)
#define NETSURF_VERSION_MINOR CI_BUILD
#else
diff --git a/frontends/atari/Makefile b/frontends/atari/Makefile
index b4fb16ec1..a2f27e2f2 100644
--- a/frontends/atari/Makefile
+++ b/frontends/atari/Makefile
@@ -47,6 +47,7 @@ CFLAGS += -U__STRICT_ANSI__ -std=c99 -Dsmall -Dnsatari \
-D_BSD_SOURCE \
-D_XOPEN_SOURCE=600 \
-D_POSIX_C_SOURCE=200112L \
+ -DNSLOG_LEVEL_0x0010=NSLOG_LEVEL_INFO \
$(shell $(PKG_CONFIG) --cflags openssl ) \
$(shell $(PKG_CONFIG) --cflags libcurl )
diff --git a/frontends/atari/bitmap.c b/frontends/atari/bitmap.c
index cbb719586..ae42da837 100644
--- a/frontends/atari/bitmap.c
+++ b/frontends/atari/bitmap.c
@@ -81,7 +81,9 @@ static void *atari_bitmap_create_ex( int w, int h, short bpp, int rowstride, uns
{
struct bitmap * bitmap;
- LOG("width %d (rowstride: %d, bpp: %d), height %d, state %u", w, rowstride, bpp, h, state);
+ NSLOG(netsurf, INFO,
+ "width %d (rowstride: %d, bpp: %d), height %d, state %u", w,
+ rowstride, bpp, h, state);
if( rowstride == 0) {
rowstride = bpp * w;
@@ -107,10 +109,10 @@ static void *atari_bitmap_create_ex( int w, int h, short bpp, int rowstride, uns
} else {
free(bitmap);
bitmap=NULL;
- LOG("Out of memory!");
+ NSLOG(netsurf, INFO, "Out of memory!");
}
}
- LOG("bitmap %p", bitmap);
+ NSLOG(netsurf, INFO, "bitmap %p", bitmap);
return bitmap;
}
@@ -194,7 +196,7 @@ static unsigned char *bitmap_get_buffer(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return NULL;
}
@@ -218,7 +220,7 @@ size_t atari_bitmap_get_rowstride(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
return bm->rowstride;
@@ -231,7 +233,7 @@ void atari_bitmap_destroy(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return;
}
@@ -272,11 +274,12 @@ static void bitmap_set_opaque(void *bitmap, bool opaque)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return;
}
- LOG("setting bitmap %p to %s", bm, opaque ? "opaque" : "transparent");
+ NSLOG(netsurf, INFO, "setting bitmap %p to %s", bm,
+ opaque ? "opaque" : "transparent");
bm->opaque = opaque;
}
@@ -293,7 +296,7 @@ static bool bitmap_test_opaque(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return false;
}
@@ -305,11 +308,12 @@ static bool bitmap_test_opaque(void *bitmap)
while (tst-- > 0) {
if (bm->pixdata[(tst << 2) + 3] != 0xff) {
- LOG("bitmap %p has transparency", bm);
+ NSLOG(netsurf, INFO,
+ "bitmap %p has transparency", bm);
return false;
}
}
- LOG("bitmap %p is opaque", bm);
+ NSLOG(netsurf, INFO, "bitmap %p is opaque", bm);
return true;
}
@@ -320,7 +324,7 @@ bool atari_bitmap_get_opaque(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return false;
}
@@ -334,7 +338,7 @@ int atari_bitmap_get_width(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
@@ -348,7 +352,7 @@ int atari_bitmap_get_height(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
return(bm->height);
diff --git a/frontends/atari/certview.c b/frontends/atari/certview.c
index 6950d31f8..80d18a059 100644
--- a/frontends/atari/certview.c
+++ b/frontends/atari/certview.c
@@ -81,7 +81,7 @@ static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw,
assert(ssl_d);
- LOG("cw %p", cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
return(sslcert_viewer_init(cb_t, cw, ssl_d));
}
@@ -97,7 +97,7 @@ static void atari_sslcert_viewer_finish(struct core_window *cw)
/* This will also free the session data: */
sslcert_viewer_fini(cvwin->ssl_session_data);
- LOG("cw %p", cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
}
static void atari_sslcert_viewer_draw(struct core_window *cw, int x,
@@ -123,7 +123,7 @@ static void atari_sslcert_viewer_keypress(struct core_window *cw, uint32_t ucs4)
cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
- LOG("ucs4: %"PRIu32, ucs4);
+ NSLOG(netsurf, INFO, "ucs4: %"PRIu32, ucs4);
sslcert_viewer_keypress(cvwin->ssl_session_data, ucs4);
}
@@ -150,14 +150,14 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
short retval = 0;
OBJECT *toolbar;
- LOG("win %p", win);
+ NSLOG(netsurf, INFO, "win %p", win);
if(ev_out->emo_events & MU_MESAG){
switch (msg[0]) {
case WM_TOOLBAR:
toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
- LOG("CERTVIEWER WM_TOOLBAR");
+ NSLOG(netsurf, INFO, "CERTVIEWER WM_TOOLBAR");
tv = (struct core_window*) gemtk_wm_get_user_data(win);
assert(tv);
cvwin = (struct atari_sslcert_viewer_s *)
@@ -238,7 +238,7 @@ static void atari_sslcert_viewer_init(struct atari_sslcert_viewer_s * cvwin,
if (cvwin->tv == NULL) {
/* handle it properly, clean up previous allocs */
- LOG("Failed to allocate treeview");
+ NSLOG(netsurf, INFO, "Failed to allocate treeview");
return;
}
@@ -280,7 +280,7 @@ static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin)
assert(cvwin->init);
assert(cvwin->window);
- LOG("cvwin %p", cvwin);
+ NSLOG(netsurf, INFO, "cvwin %p", cvwin);
if (atari_treeview_is_open(cvwin->tv))
atari_treeview_close(cvwin->tv);
@@ -289,5 +289,5 @@ static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin)
cvwin->window = NULL;
atari_treeview_delete(cvwin->tv);
free(cvwin);
- LOG("done");
+ NSLOG(netsurf, INFO, "done");
}
diff --git a/frontends/atari/cookies.c b/frontends/atari/cookies.c
index 9045009fc..df2de0d4c 100644
--- a/frontends/atari/cookies.c
+++ b/frontends/atari/cookies.c
@@ -63,7 +63,7 @@ static nserror
atari_cookie_manager_init_phase2(struct core_window *cw,
struct core_window_callback_table *cb_t)
{
- LOG("cw %p",cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
return(cookie_manager_init(cb_t, cw));
}
@@ -71,7 +71,7 @@ atari_cookie_manager_init_phase2(struct core_window *cw,
static void
atari_cookie_manager_finish(struct core_window *cw)
{
- LOG("cw %p",cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
cookie_manager_fini();
}
@@ -89,7 +89,7 @@ atari_cookie_manager_draw(struct core_window *cw,
static void
atari_cookie_manager_keypress(struct core_window *cw, uint32_t ucs4)
{
- LOG("ucs4: %"PRIu32, ucs4);
+ NSLOG(netsurf, INFO, "ucs4: %"PRIu32, ucs4);
cookie_manager_keypress(ucs4);
}
@@ -108,13 +108,13 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
{
short retval = 0;
- LOG("win %p", win);
+ NSLOG(netsurf, INFO, "win %p", win);
if (ev_out->emo_events & MU_MESAG) {
switch (msg[0]) {
case WM_TOOLBAR:
- LOG("WM_TOOLBAR");
+ NSLOG(netsurf, INFO, "WM_TOOLBAR");
break;
case WM_CLOSED:
@@ -158,7 +158,8 @@ void atari_cookie_manager_init(void)
if (atari_cookie_manager.tv == NULL) {
/* handle it properly, clean up previous allocs */
- LOG("Failed to allocate treeview");
+ NSLOG(netsurf, INFO,
+ "Failed to allocate treeview");
return;
}
@@ -209,7 +210,7 @@ void atari_cookie_manager_destroy(void)
atari_treeview_delete(atari_cookie_manager.tv);
atari_cookie_manager.init = false;
}
- LOG("done");
+ NSLOG(netsurf, INFO, "done");
}
diff --git a/frontends/atari/ctxmenu.c b/frontends/atari/ctxmenu.c
index e25d8e522..ef4f01ae2 100644
--- a/frontends/atari/ctxmenu.c
+++ b/frontends/atari/ctxmenu.c
@@ -288,7 +288,9 @@ void context_popup(struct gui_window * gw, short x, short y)
/* the GEMDOS cmdline contains the length of the commandline
in the first byte: */
cmdline[0] = (unsigned char)strlen(tempfile);
- LOG("Creating temporay source file: %s\n", tempfile);
+ NSLOG(netsurf, INFO,
+ "Creating temporay source file: %s\n",
+ tempfile);
fp_tmpfile = fopen(tempfile, "w");
if (fp_tmpfile != NULL){
fwrite(data, size, 1, fp_tmpfile);
@@ -306,7 +308,8 @@ void context_popup(struct gui_window * gw, short x, short y)
}
} else {
- LOG("Invalid content!");
+ NSLOG(netsurf, INFO,
+ "Invalid content!");
}
} else {
form_alert(0, "[1][Set option \"atari_editor\".][OK]");
diff --git a/frontends/atari/deskmenu.c b/frontends/atari/deskmenu.c
index addba2764..ded68ca5b 100644
--- a/frontends/atari/deskmenu.c
+++ b/frontends/atari/deskmenu.c
@@ -181,7 +181,7 @@ static void __CDECL menu_about(short item, short title, void *data)
nserror error;
char buf[PATH_MAX];
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "abort menu");
strcpy((char*)&buf, "file://");
strncat((char*)&buf, (char*)"./doc/README.TXT",
PATH_MAX - (strlen("file://")+1) );
@@ -208,7 +208,7 @@ static void __CDECL menu_new_win(short item, short title, void *data)
nserror error;
const char *addr;
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if (nsoption_charp(homepage_url) != NULL) {
addr = nsoption_charp(homepage_url);
@@ -236,7 +236,7 @@ static void __CDECL menu_open_url(short item, short title, void *data)
{
struct gui_window * gw;
struct browser_window * bw ;
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
gw = input_window;
if( gw == NULL ) {
@@ -251,7 +251,7 @@ static void __CDECL menu_open_url(short item, short title, void *data)
static void __CDECL menu_open_file(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
const char * filename = file_select(messages_get("OpenFile"), "");
if( filename != NULL ){
@@ -280,7 +280,7 @@ static void __CDECL menu_open_file(short item, short title, void *data)
static void __CDECL menu_close_win(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
gui_window_destroy( input_window );
@@ -288,7 +288,7 @@ static void __CDECL menu_close_win(short item, short title, void *data)
static void __CDECL menu_save_page(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
static bool init = true;
bool is_folder=false;
const char * path;
@@ -319,7 +319,7 @@ static void __CDECL menu_quit(short item, short title, void *data)
{
short buff[8];
memset( &buff, 0, sizeof(short)*8 );
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
gemtk_wm_send_msg(NULL, AP_TERM, 0, 0, 0, 0);
}
@@ -331,21 +331,21 @@ static void __CDECL menu_cut(short item, short title, void *data)
static void __CDECL menu_copy(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window != NULL )
browser_window_key_press( input_window->browser->bw, NS_KEY_COPY_SELECTION);
}
static void __CDECL menu_paste(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window != NULL )
browser_window_key_press( input_window->browser->bw, NS_KEY_PASTE);
}
static void __CDECL menu_find(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if (input_window != NULL) {
if (input_window->search) {
window_close_search(input_window->root);
@@ -358,13 +358,13 @@ static void __CDECL menu_find(short item, short title, void *data)
static void __CDECL menu_choices(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
open_settings();
}
static void __CDECL menu_stop(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
@@ -378,7 +378,7 @@ static void __CDECL menu_reload(short item, short title, void *data)
if(input_window == NULL)
return;
toolbar_reload_click(input_window->root->toolbar);
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
}
@@ -408,7 +408,7 @@ static void __CDECL menu_dec_scale(short item, short title, void *data)
static void __CDECL menu_toolbars(short item, short title, void *data)
{
static int state = 0;
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window != null && input_window->root->toolbar != null ){
state = !state;
// TODO: implement toolbar hide
@@ -418,7 +418,7 @@ static void __CDECL menu_toolbars(short item, short title, void *data)
static void __CDECL menu_savewin(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if (input_window && input_window->browser) {
GRECT rect;
wind_get_grect(gemtk_wm_get_handle(input_window->root->win), WF_CURRXYWH,
@@ -438,7 +438,7 @@ static void __CDECL menu_savewin(short item, short title, void *data)
static void __CDECL menu_debug_render(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
html_redraw_debug = !html_redraw_debug;
if( input_window != NULL ) {
if ( input_window->browser != NULL
@@ -469,7 +469,7 @@ static void __CDECL menu_bg_images(short item, short title, void *data)
static void __CDECL menu_back(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
toolbar_back_click(input_window->root->toolbar);
@@ -477,7 +477,7 @@ static void __CDECL menu_back(short item, short title, void *data)
static void __CDECL menu_forward(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
toolbar_forward_click(input_window->root->toolbar);
@@ -485,7 +485,7 @@ static void __CDECL menu_forward(short item, short title, void *data)
static void __CDECL menu_home(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
toolbar_home_click(input_window->root->toolbar);
@@ -493,20 +493,20 @@ static void __CDECL menu_home(short item, short title, void *data)
static void __CDECL menu_lhistory(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if( input_window == NULL )
return;
}
static void __CDECL menu_ghistory(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
atari_global_history_open();
}
static void __CDECL menu_add_bookmark(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
if (input_window) {
if( browser_window_has_content(input_window->browser->bw) ){
atari_hotlist_add_page(
@@ -519,26 +519,26 @@ static void __CDECL menu_add_bookmark(short item, short title, void *data)
static void __CDECL menu_bookmarks(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
atari_hotlist_open();
}
static void __CDECL menu_cookies(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
atari_cookie_manager_open();
}
static void __CDECL menu_vlog(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
verbose_log = !verbose_log;
menu_icheck(h_gem_menu, MAINMENU_M_VLOG, (verbose_log) ? 1 : 0);
}
static void __CDECL menu_help_content(short item, short title, void *data)
{
- LOG("%s", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s", __FUNCTION__);
}
/*
@@ -580,14 +580,16 @@ static void register_menu_str( struct s_menu_item_evnt * mi )
while (i > 2) {
if ((strncmp(" ", &str[i], 2) == 0) && (strlen(&str[i]) > 2)) {
// "Standard" Keyboard Shortcut Element found:
- LOG("Standard Keyboard Shortcut: \"%s\"\n", &str[i]);
+ NSLOG(netsurf, INFO,
+ "Standard Keyboard Shortcut: \"%s\"\n", &str[i]);
x = i+2;
is_std_shortcut = true;
break;
}
if( str[i] == '['){
- LOG("Keyboard Shortcut: \"%s\"\n", &str[i]);
+ NSLOG(netsurf, INFO, "Keyboard Shortcut: \"%s\"\n",
+ &str[i]);
// "Custom" Keyboard Shortcut Element found (identified by [):
x = i;
break;
@@ -662,8 +664,12 @@ static void register_menu_str( struct s_menu_item_evnt * mi )
}
}
- LOG("Registered keyboard shortcut for \"%s\" => mod: %d, ""keycode: %ld, ascii: %c\n",
- str, accel->mod, accel->keycode, accel->ascii);
+ NSLOG(netsurf, INFO,
+ "Registered keyboard shortcut for \"%s\" => mod: %d, ""keycode: %ld, ascii: %c\n",
+ str,
+ accel->mod,
+ accel->keycode,
+ accel->ascii);
}
}
diff --git a/frontends/atari/download.c b/frontends/atari/download.c
index d756e6694..7a1c7d2b7 100644
--- a/frontends/atari/download.c
+++ b/frontends/atari/download.c
@@ -194,7 +194,7 @@ static void on_close(struct gui_download_window * dw)
static void gui_download_window_destroy( struct gui_download_window * gdw)
{
- LOG("gdw %p", gdw);
+ NSLOG(netsurf, INFO, "gdw %p", gdw);
if (gdw->status == NSATARI_DOWNLOAD_WORKING) {
download_context_abort(gdw->ctx);
@@ -253,7 +253,8 @@ gui_download_window_create(download_context *ctx, struct gui_window *parent)
char alert[200];
- LOG("Creating download window for gui window: %p", parent);
+ NSLOG(netsurf, INFO, "Creating download window for gui window: %p",
+ parent);
/* TODO: Implement real form and use messages file strings! */
@@ -330,7 +331,8 @@ gui_download_window_create(download_context *ctx, struct gui_window *parent)
gemtk_wm_set_toolbar_redraw_func(gdw->guiwin, toolbar_redraw_cb);
strncpy((char*)&gdw->lbl_file, filename, MAX_SLEN_LBL_FILE-1);
- LOG("created download: %s (total size: %d)", gdw->destination, gdw->size_total);
+ NSLOG(netsurf, INFO, "created download: %s (total size: %d)",
+ gdw->destination, gdw->size_total);
GRECT work, curr;
work.g_x = 0;
@@ -357,7 +359,7 @@ static nserror gui_download_window_data(struct gui_download_window *dw,
uint32_t tnow = clck / (CLOCKS_PER_SEC>>3);
uint32_t sdiff = (clck / (CLOCKS_PER_SEC)) - dw->start;
- LOG("dw %p",dw);
+ NSLOG(netsurf, INFO, "dw %p", dw);
if (dw->abort == true){
dw->status = NSATARI_DOWNLOAD_CANCELED;
@@ -405,7 +407,7 @@ static nserror gui_download_window_data(struct gui_download_window *dw,
static void gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
- LOG("%s", error_msg);
+ NSLOG(netsurf, INFO, "%s", error_msg);
strncpy((char*)&dw->lbl_file, error_msg, MAX_SLEN_LBL_FILE-1);
dw->status = NSATARI_DOWNLOAD_ERROR;
@@ -416,7 +418,7 @@ static void gui_download_window_error(struct gui_download_window *dw,
static void gui_download_window_done(struct gui_download_window *dw)
{
- LOG("dw %p", dw);
+ NSLOG(netsurf, INFO, "dw %p", dw);
// TODO: change abort to close
dw->status = NSATARI_DOWNLOAD_COMPLETE;
diff --git a/frontends/atari/filetype.c b/frontends/atari/filetype.c
index d27076e9c..706347137 100644
--- a/frontends/atari/filetype.c
+++ b/frontends/atari/filetype.c
@@ -36,7 +36,7 @@ const char *fetch_filetype(const char *unix_path)
char * res = (char*)"text/html";
l = strlen(unix_path);
- LOG("unix path: %s", unix_path);
+ NSLOG(netsurf, INFO, "unix path: %s", unix_path);
/* This line is added for devlopment versions running from the root dir: */
if( strchr( unix_path, (int)'.' ) ){
@@ -85,6 +85,6 @@ const char *fetch_filetype(const char *unix_path)
}
}
- LOG("mime type: %s", res);
+ NSLOG(netsurf, INFO, "mime type: %s", res);
return( res );
}
diff --git a/frontends/atari/findfile.c b/frontends/atari/findfile.c
index 45ca6d916..8784727bc 100644
--- a/frontends/atari/findfile.c
+++ b/frontends/atari/findfile.c
@@ -31,7 +31,7 @@ char * local_file_to_url( const char * filename )
#define BACKSLASH 0x5C
char * url;
- LOG("in: %s", filename);
+ NSLOG(netsurf, INFO, "in: %s", filename);
if( strlen(filename) <= 2){
return( NULL );
@@ -55,7 +55,7 @@ char * local_file_to_url( const char * filename )
free(fname_local);
- LOG("out: %s", url);
+ NSLOG(netsurf, INFO, "out: %s", url);
return( url );
#undef BACKSLASH
@@ -81,10 +81,10 @@ char * atari_find_resource(char *buf, const char *filename, const char *def)
{
char *cdir = NULL;
char t[PATH_MAX];
- LOG("%s (def: %s)", filename, def);
+ NSLOG(netsurf, INFO, "%s (def: %s)", filename, def);
strcpy(t, NETSURF_GEM_RESPATH);
strcat(t, filename);
- LOG("checking %s", (char *)&t);
+ NSLOG(netsurf, INFO, "checking %s", (char *)&t);
if (gemdos_realpath(t, buf) != NULL) {
if (access(buf, R_OK) == 0) {
return buf;
@@ -92,7 +92,7 @@ char * atari_find_resource(char *buf, const char *filename, const char *def)
}
strcpy(t, "./");
strcat(t, filename);
- LOG("checking %s", (char *)&t);
+ NSLOG(netsurf, INFO, "checking %s", (char *)&t);
if (gemdos_realpath(t, buf) != NULL) {
if (access(buf, R_OK) == 0) {
return buf;
@@ -104,7 +104,7 @@ char * atari_find_resource(char *buf, const char *filename, const char *def)
strcpy(t, cdir);
strcat(t, "/.netsurf/");
strcat(t, filename);
- LOG("checking %s", (char *)&t);
+ NSLOG(netsurf, INFO, "checking %s", (char *)&t);
if (gemdos_realpath(t, buf) != NULL) {
if (access(buf, R_OK) == 0)
return buf;
@@ -116,19 +116,19 @@ char * atari_find_resource(char *buf, const char *filename, const char *def)
if (gemdos_realpath(cdir, buf) != NULL) {
strcat(buf, "/");
strcat(buf, filename);
- LOG("checking %s", (char *)&t);
+ NSLOG(netsurf, INFO, "checking %s", (char *)&t);
if (access(buf, R_OK) == 0)
return buf;
}
}
if (def[0] == '~') {
snprintf(t, PATH_MAX, "%s%s", getenv("HOME"), def + 1);
- LOG("checking %s", (char *)&t);
+ NSLOG(netsurf, INFO, "checking %s", (char *)&t);
if (gemdos_realpath(t, buf) == NULL) {
strcpy(buf, t);
}
} else {
- LOG("checking %s", (char *)def);
+ NSLOG(netsurf, INFO, "checking %s", (char *)def);
if (gemdos_realpath(def, buf) == NULL) {
strcpy(buf, def);
}
diff --git a/frontends/atari/gui.c b/frontends/atari/gui.c
index 4876d3106..6ee63b301 100644
--- a/frontends/atari/gui.c
+++ b/frontends/atari/gui.c
@@ -139,11 +139,11 @@ static void atari_poll(void)
evnt_multi_fast(&aes_event_in, aes_msg_out, &aes_event_out);
if(gemtk_wm_dispatch_event(&aes_event_in, &aes_event_out, aes_msg_out) == 0) {
if( (aes_event_out.emo_events & MU_MESAG) != 0 ) {
- LOG("WM: %d\n", aes_msg_out[0]);
+ NSLOG(netsurf, INFO, "WM: %d\n", aes_msg_out[0]);
switch(aes_msg_out[0]) {
case MN_SELECTED:
- LOG("Menu Item: %d\n", aes_msg_out[4]);
+ NSLOG(netsurf, INFO, "Menu Item: %d\n", aes_msg_out[4]);
deskmenu_dispatch_item(aes_msg_out[3], aes_msg_out[4]);
break;
@@ -195,13 +195,14 @@ gui_window_create(struct browser_window *bw,
gui_window_create_flags flags)
{
struct gui_window *gw=NULL;
- LOG("gw: %p, BW: %p, existing %p, flags: %d\n", gw, bw, existing, (int)flags);
+ NSLOG(netsurf, INFO, "gw: %p, BW: %p, existing %p, flags: %d\n", gw, bw,
+ existing, (int)flags);
gw = calloc(1, sizeof(struct gui_window));
if (gw == NULL)
return NULL;
- LOG("new window: %p, bw: %p\n", gw, bw);
+ NSLOG(netsurf, INFO, "new window: %p, bw: %p\n", gw, bw);
window_create(gw, bw, existing, WIDGET_STATUSBAR|WIDGET_TOOLBAR|WIDGET_RESIZE\
|WIDGET_SCROLL);
if (gw->root->win) {
@@ -253,7 +254,7 @@ void gui_window_destroy(struct gui_window *gw)
if (gw == NULL)
return;
- LOG("%s\n", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s\n", __FUNCTION__);
if (input_window == gw) {
gui_set_input_gui_window(NULL);
@@ -444,7 +445,8 @@ gui_window_set_scroll(struct gui_window *gw, const struct rect *rect)
return NSERROR_BAD_PARAMETER;
}
- LOG("scroll (gui_window: %p) %d, %d\n", gw, rect->x0, rect->y0);
+ NSLOG(netsurf, INFO, "scroll (gui_window: %p) %d, %d\n", gw, rect->x0,
+ rect->y0);
window_scroll_by(gw->root, rect->x0, rect->y0);
return NSERROR_OK;
@@ -771,7 +773,8 @@ static void gui_401login_open(nsurl *url, const char *realm,
char * out = NULL;
bres = login_form_do( url, (char*)realm, &out);
if (bres) {
- LOG("url: %s, realm: %s, auth: %s\n", nsurl_access(url), realm, out);
+ NSLOG(netsurf, INFO, "url: %s, realm: %s, auth: %s\n",
+ nsurl_access(url), realm, out);
urldb_set_auth_details(url, realm, out);
}
if (out != NULL) {
@@ -789,7 +792,7 @@ gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
void *cbpw)
{
struct sslcert_session_data *data;
- LOG("url %s", nsurl_access(url));
+ NSLOG(netsurf, INFO, "url %s", nsurl_access(url));
// TODO: localize string
int b = form_alert(1, "[2][SSL Verify failed, continue?][Continue|Abort|Details...]");
@@ -812,7 +815,8 @@ gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
void gui_set_input_gui_window(struct gui_window *gw)
{
- LOG("Setting input window from: %p to %p\n", input_window, gw);
+ NSLOG(netsurf, INFO, "Setting input window from: %p to %p\n",
+ input_window, gw);
input_window = gw;
}
@@ -823,7 +827,7 @@ struct gui_window * gui_get_input_window(void)
static void gui_quit(void)
{
- LOG("quitting");
+ NSLOG(netsurf, INFO, "quitting");
struct gui_window *gw = window_list;
struct gui_window *tmp = window_list;
@@ -852,9 +856,9 @@ static void gui_quit(void)
rsrc_free();
- LOG("Shutting down plotter");
+ NSLOG(netsurf, INFO, "Shutting down plotter");
plot_finalise();
- LOG("done");
+ NSLOG(netsurf, INFO, "done");
}
/**
@@ -866,7 +870,7 @@ process_cmdline(int argc, char** argv)
int opt;
bool set_default_dimensions = true;
- LOG("argc %d, argv %p", argc, argv);
+ NSLOG(netsurf, INFO, "argc %d, argv %p", argc, argv);
if ((nsoption_int(window_width) != 0) && (nsoption_int(window_height) != 0)) {
@@ -959,7 +963,7 @@ static nserror set_defaults(struct nsoption_s *defaults)
/* Set defaults for absent option strings */
nsoption_setnull_charp(cookie_file, strdup("cookies"));
if (nsoption_charp(cookie_file) == NULL) {
- LOG("Failed initialising string options");
+ NSLOG(netsurf, INFO, "Failed initialising string options");
return NSERROR_BAD_PARAMETER;
}
return NSERROR_OK;
@@ -976,7 +980,7 @@ static void gui_init(int argc, char** argv)
OBJECT * cursors;
atari_find_resource(buf, "netsurf.rsc", "./res/netsurf.rsc");
- LOG("Using RSC file: %s ", (char *)&buf);
+ NSLOG(netsurf, INFO, "Using RSC file: %s ", (char *)&buf);
if (rsrc_load(buf)==0) {
char msg[1024];
@@ -1012,15 +1016,16 @@ static void gui_init(int argc, char** argv)
create_cursor(MFORM_EX_FLAG_USERFORM, CURSOR_HELP,
cursors, &gem_cursors.help);
- LOG("Enabling core select menu");
+ NSLOG(netsurf, INFO, "Enabling core select menu");
nsoption_set_bool(core_select_menu, true);
- LOG("Loading url.db from: %s", nsoption_charp(url_file));
+ NSLOG(netsurf, INFO, "Loading url.db from: %s", nsoption_charp(url_file));
if( strlen(nsoption_charp(url_file)) ) {
urldb_load(nsoption_charp(url_file));
}
- LOG("Loading cookies from: %s", nsoption_charp(cookie_file));
+ NSLOG(netsurf, INFO, "Loading cookies from: %s",
+ nsoption_charp(cookie_file));
if( strlen(nsoption_charp(cookie_file)) ) {
urldb_load_cookies(nsoption_charp(cookie_file));
}
@@ -1028,10 +1033,10 @@ static void gui_init(int argc, char** argv)
if (process_cmdline(argc,argv) != true)
die("unable to process command line.\n");
- LOG("Initializing NKC...");
+ NSLOG(netsurf, INFO, "Initializing NKC...");
nkc_init();
- LOG("Initializing plotters...");
+ NSLOG(netsurf, INFO, "Initializing plotters...");
struct redraw_context ctx = {
.interactive = true,
.background_images = true,
@@ -1172,18 +1177,18 @@ int main(int argc, char** argv)
ret = messages_add_from_file(messages);
/* common initialisation */
- LOG("Initialising core...");
+ NSLOG(netsurf, INFO, "Initialising core...");
ret = netsurf_init(store);
if (ret != NSERROR_OK) {
die("NetSurf failed to initialise");
}
- LOG("Initializing GUI...");
+ NSLOG(netsurf, INFO, "Initializing GUI...");
gui_init(argc, argv);
graf_mouse( ARROW , NULL);
- LOG("Creating initial browser window...");
+ NSLOG(netsurf, INFO, "Creating initial browser window...");
addr = option_homepage_url;
if (strncmp(addr, "file://", 7) && strncmp(addr, "http://", 7)) {
if (stat(addr, &stat_buf) == 0) {
@@ -1205,7 +1210,7 @@ int main(int argc, char** argv)
if (ret != NSERROR_OK) {
atari_warn_user(messages_get_errorcode(ret), 0);
} else {
- LOG("Entering Atari event mainloop...");
+ NSLOG(netsurf, INFO, "Entering Atari event mainloop...");
while (!atari_quit) {
atari_poll();
}
@@ -1219,7 +1224,11 @@ int main(int argc, char** argv)
fclose(stdout);
fclose(stderr);
#endif
- LOG("exit_gem");
+ NSLOG(netsurf, INFO, "exit_gem");
+
+ /* finalise logging */
+ nslog_finalise();
+
exit_gem();
return 0;
diff --git a/frontends/atari/history.c b/frontends/atari/history.c
index 56aafd056..ec602684f 100644
--- a/frontends/atari/history.c
+++ b/frontends/atari/history.c
@@ -39,13 +39,13 @@ static nserror
atari_global_history_init_phase2(struct core_window *cw,
struct core_window_callback_table *cb_t)
{
- LOG("cw %p", cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
return(global_history_init(cb_t, cw));
}
static void atari_global_history_finish(struct core_window *cw)
{
- LOG("cw %p", cw);
+ NSLOG(netsurf, INFO, "cw %p", cw);
global_history_fini();
}
@@ -58,7 +58,7 @@ static void atari_global_history_draw(struct core_window *cw, int x,
static void atari_global_history_keypress(struct core_window *cw, uint32_t ucs4)
{
- LOG("ucs4: %"PRIu32, ucs4);
+ NSLOG(netsurf, INFO, "ucs4: %"PRIu32, ucs4);
global_history_keypress(ucs4);
}
@@ -67,7 +67,7 @@ atari_global_history_mouse_action(struct core_window *cw,
browser_mouse_state mouse,
int x, int y)
{
- LOG("x: %d, y: %d\n", x, y);
+ NSLOG(netsurf, INFO, "x: %d, y: %d\n", x, y);
global_history_mouse_action(mouse, x, y);
}
@@ -82,7 +82,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
{
short retval = 0;
- LOG("win %p", win);
+ NSLOG(netsurf, INFO, "win %p", win);
if (ev_out->emo_events & MU_MESAG) {
switch (msg[0]) {
@@ -134,7 +134,8 @@ void atari_global_history_init(void)
if (atari_global_history.tv == NULL) {
/* handle it properly, clean up previous allocs */
- LOG("Failed to allocate treeview");
+ NSLOG(netsurf, INFO,
+ "Failed to allocate treeview");
return;
}
}
@@ -181,7 +182,7 @@ void atari_global_history_destroy(void)
atari_treeview_delete(atari_global_history.tv);
atari_global_history.init = false;
}
- LOG("done");
+ NSLOG(netsurf, INFO, "done");
}
void atari_global_history_redraw(void)
diff --git a/frontends/atari/hotlist.c b/frontends/atari/hotlist.c
index 659b3a562..3a54c98eb 100644
--- a/frontends/atari/hotlist.c
+++ b/frontends/atari/hotlist.c
@@ -72,13 +72,13 @@ static struct atari_treeview_callbacks atari_hotlist_treeview_callbacks = {
static nserror atari_hotlist_init_phase2(struct core_window *cw,
struct core_window_callback_table *cb_t)
{
- LOG("cw:%p", cw);
+ NSLOG(netsurf, INFO, "cw:%p", cw);
return hotlist_manager_init(cb_t, cw);
}
static void atari_hotlist_finish(struct core_window *cw)
{
- LOG("cw:%p", cw);
+ NSLOG(netsurf, INFO, "cw:%p", cw);
hotlist_fini();
}
@@ -93,7 +93,7 @@ static void atari_hotlist_keypress(struct core_window *cw, uint32_t ucs4)
{
//GUIWIN *gemtk_win;
//GRECT area;
- LOG("ucs4: %"PRIu32 , ucs4);
+ NSLOG(netsurf, INFO, "ucs4: %"PRIu32, ucs4);
hotlist_keypress(ucs4);
//gemtk_win = atari_treeview_get_gemtk_window(cw);
//atari_treeview_get_grect(cw, TREEVIEW_AREA_CONTENT, &area);
@@ -104,7 +104,7 @@ static void atari_hotlist_mouse_action(struct core_window *cw,
browser_mouse_state mouse,
int x, int y)
{
- LOG("x: %d, y: %d\n", x, y);
+ NSLOG(netsurf, INFO, "x: %d, y: %d\n", x, y);
hotlist_mouse_action(mouse, x, y);
}
@@ -123,7 +123,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
GRECT tb_area;
GUIWIN * gemtk_win;
- LOG("gw:%p", win);
+ NSLOG(netsurf, INFO, "gw:%p", win);
tv = (struct atari_treeview_window*) gemtk_wm_get_user_data(win);
cw = (struct core_window *)tv;
@@ -132,7 +132,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
switch (msg[0]) {
case WM_TOOLBAR:
- LOG("WM_TOOLBAR");
+ NSLOG(netsurf, INFO, "WM_TOOLBAR");
toolbar = gemtk_obj_get_tree(TOOLBAR_HOTLIST);
@@ -198,7 +198,7 @@ void atari_hotlist_init(void)
strncpy( (char*)&hl.path, nsoption_charp(hotlist_file), PATH_MAX-1 );
}
- LOG("Hotlist: %s", (char *)&hl.path);
+ NSLOG(netsurf, INFO, "Hotlist: %s", (char *)&hl.path);
hotlist_init(hl.path, hl.path);
if( hl.window == NULL ){
@@ -224,7 +224,8 @@ void atari_hotlist_init(void)
if (hl.tv == NULL) {
/* handle it properly, clean up previous allocs */
- LOG("Failed to allocate treeview");
+ NSLOG(netsurf, INFO,
+ "Failed to allocate treeview");
return;
}
@@ -276,7 +277,7 @@ void atari_hotlist_destroy(void)
atari_treeview_delete(hl.tv);
hl.init = false;
}
- LOG("done");
+ NSLOG(netsurf, INFO, "done");
}
void atari_hotlist_redraw(void)
@@ -299,7 +300,7 @@ void atari_hotlist_add_page( const char * url, const char * title )
return;
if (hotlist_has_url(nsurl)) {
- LOG("URL already added as Bookmark");
+ NSLOG(netsurf, INFO, "URL already added as Bookmark");
nsurl_unref(nsurl);
return;
}
diff --git a/frontends/atari/osspec.c b/frontends/atari/osspec.c
index f64402e8d..ca042f164 100644
--- a/frontends/atari/osspec.c
+++ b/frontends/atari/osspec.c
@@ -119,14 +119,14 @@ char *gemdos_realpath(const char * path, char * rpath)
return(rpath);
}
- LOG("realpath in: %s\n", path);
+ NSLOG(netsurf, INFO, "realpath in: %s\n", path);
r = realpath(path, work);
if (r != NULL) {
unx2dos((const char *)r, rpath);
- LOG("realpath out: %s\n", rpath);
+ NSLOG(netsurf, INFO, "realpath out: %s\n", rpath);
return(rpath);
} else {
- LOG("realpath out: NULL!\n");
+ NSLOG(netsurf, INFO, "realpath out: NULL!\n");
}
return (NULL);
}
diff --git a/frontends/atari/plot/font_freetype.c b/frontends/atari/plot/font_freetype.c
index 17d3c3bfd..1688e978b 100644
--- a/frontends/atari/plot/font_freetype.c
+++ b/frontends/atari/plot/font_freetype.c
@@ -154,11 +154,12 @@ static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Po
error = FT_New_Face(library, ft_face->fontfile, ft_face->index, face);
if (error) {
- LOG("Could not find font (code %d)\n", error);
+ NSLOG(netsurf, INFO, "Could not find font (code %d)\n", error);
} else {
error = FT_Select_Charmap(*face, FT_ENCODING_UNICODE);
if (error) {
- LOG("Could not select charmap (code %d)\n", error);
+ NSLOG(netsurf, INFO,
+ "Could not select charmap (code %d)\n", error);
} else {
for (cidx = 0; cidx < (*face)->num_charmaps; cidx++) {
if ((*face)->charmap == (*face)->charmaps[cidx]) {
@@ -168,7 +169,7 @@ static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Po
}
}
}
- LOG("Loaded face from %s\n", ft_face->fontfile);
+ NSLOG(netsurf, INFO, "Loaded face from %s\n", ft_face->fontfile);
return error;
}
@@ -190,7 +191,9 @@ ft_new_face(const char *option, const char *resname, const char *fontfile)
}
error = FTC_Manager_LookupFace(ft_cmanager, (FTC_FaceID)newf, &aface);
if (error) {
- LOG("Could not find font face %s (code %d)\n", fontfile, error);
+ NSLOG(netsurf, INFO,
+ "Could not find font face %s (code %d)\n", fontfile,
+ error);
free(newf);
newf = font_faces[FONT_FACE_DEFAULT]; /* use default */
}
@@ -292,7 +295,8 @@ static bool ft_font_init(void)
/* freetype library initialise */
error = FT_Init_FreeType( &library );
if (error) {
- LOG("Freetype could not initialised (code %d)\n", error);
+ NSLOG(netsurf, INFO,
+ "Freetype could not initialised (code %d)\n", error);
return false;
}
@@ -311,7 +315,9 @@ static bool ft_font_init(void)
NULL,
&ft_cmanager);
if (error) {
- LOG("Freetype could not initialise cache manager (code %d)\n", error);
+ NSLOG(netsurf, INFO,
+ "Freetype could not initialise cache manager (code %d)\n",
+ error);
FT_Done_FreeType(library);
return false;
}
@@ -330,7 +336,8 @@ static bool ft_font_init(void)
FONT_PKG_PATH FONT_FILE_SANS
);
if (font_faces[FONT_FACE_SANS_SERIF] == NULL) {
- LOG("Could not find default font (code %d)\n", error);
+ NSLOG(netsurf, INFO,
+ "Could not find default font (code %d)\n", error);
FTC_Manager_Done(ft_cmanager);
FT_Done_FreeType(library);
return false;
@@ -688,7 +695,7 @@ int ctor_font_plotter_freetype( FONT_PLOTTER self )
self->draw_glyph = draw_glyph8;
}
- LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s: %s\n", (char *)__FILE__, __FUNCTION__);
if( !init ) {
ft_font_init();
fontbmp = atari_bitmap_create(48, 48, 0);
diff --git a/frontends/atari/plot/font_internal.c b/frontends/atari/plot/font_internal.c
index 3575bc3e1..709697f74 100644
--- a/frontends/atari/plot/font_internal.c
+++ b/frontends/atari/plot/font_internal.c
@@ -96,7 +96,7 @@ int ctor_font_plotter_internal( FONT_PLOTTER self )
self->str_split = str_split;
self->pixel_pos = pixel_pos;
self->text = text;
- LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s: %s\n", (char *)__FILE__, __FUNCTION__);
if( !init ) {
vdih = self->vdi_handle;
fontbmp = atari_bitmap_create(48, 48, 0);
diff --git a/frontends/atari/plot/font_vdi.c b/frontends/atari/plot/font_vdi.c
index ef5499207..7cd82ddc9 100644
--- a/frontends/atari/plot/font_vdi.c
+++ b/frontends/atari/plot/font_vdi.c
@@ -70,7 +70,7 @@ int ctor_font_plotter_vdi( FONT_PLOTTER self )
self->str_split = str_split;
self->pixel_pos = pixel_pos;
self->text = text;
- LOG("%s: %s\n", (char *)__FILE__, __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s: %s\n", (char *)__FILE__, __FUNCTION__);
if( !init ) {
vdih = self->vdi_handle;
}
diff --git a/frontends/atari/plot/plot.c b/frontends/atari/plot/plot.c
index 2324f82d9..14c670352 100644
--- a/frontends/atari/plot/plot.c
+++ b/frontends/atari/plot/plot.c
@@ -1628,7 +1628,7 @@ int plot_init(const struct redraw_context *ctx, char *fdrvrname)
short work_out[57];
atari_plot_vdi_handle=graf_handle(&dummy, &dummy, &dummy, &dummy);
v_opnvwk(work_in, &atari_plot_vdi_handle, work_out);
- LOG("Plot VDI handle: %d", atari_plot_vdi_handle);
+ NSLOG(netsurf, INFO, "Plot VDI handle: %d", atari_plot_vdi_handle);
}
read_vdi_sysinfo(atari_plot_vdi_handle, &vdi_sysinfo);
if(verbose_log) {
@@ -1640,7 +1640,8 @@ int plot_init(const struct redraw_context *ctx, char *fdrvrname)
atari_font_flags, &err);
if (err) {
const char * desc = plot_err_str(err);
- LOG("Unable to load font plotter %s -> %s", fdrvrname, desc );
+ NSLOG(netsurf, INFO, "Unable to load font plotter %s -> %s",
+ fdrvrname, desc);
die("font plotter");
}
diff --git a/frontends/atari/rootwin.c b/frontends/atari/rootwin.c
index 0b77cbba5..6576eac77 100644
--- a/frontends/atari/rootwin.c
+++ b/frontends/atari/rootwin.c
@@ -105,7 +105,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
switch (msg[0]) {
case WM_REDRAW:
- LOG("WM_REDRAW");
+ NSLOG(netsurf, INFO, "WM_REDRAW");
on_redraw(data->rootwin, msg);
break;
@@ -113,7 +113,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
case WM_SIZED:
case WM_MOVED:
case WM_FULLED:
- LOG("WM_SIZED");
+ NSLOG(netsurf, INFO, "WM_SIZED");
on_resized(data->rootwin);
break;
@@ -132,7 +132,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
case WM_TOPPED:
case WM_NEWTOP:
case WM_UNICONIFY:
- LOG("WM_TOPPED");
+ NSLOG(netsurf, INFO, "WM_TOPPED");
gui_set_input_gui_window(data->rootwin->active_gui_window);
//window_restore_active_gui_window(data->rootwin);
// TODO: use something like "restore_active_gui_window_state()"
@@ -143,7 +143,8 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
// TODO: this needs to iterate through all gui windows and
// check if the rootwin is this window...
if (data->rootwin->active_gui_window != NULL) {
- LOG("WM_CLOSED initiated destroy for bw %p", data->rootwin->active_gui_window->browser->bw);
+ NSLOG(netsurf, INFO, "WM_CLOSED initiated destroy for bw %p",
+ data->rootwin->active_gui_window->browser->bw);
browser_window_destroy(
data->rootwin->active_gui_window->browser->bw);
}
@@ -166,13 +167,16 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
// handle key
uint16_t nkc = gem_to_norm( (short)ev_out->emo_kmeta,
(short)ev_out->emo_kreturn);
- LOG("rootwin MU_KEYBD input, nkc: %x\n", nkc);
+ NSLOG(netsurf, INFO, "rootwin MU_KEYBD input, nkc: %x\n", nkc);
retval = on_window_key_input(data->rootwin, nkc);
// printf("on_window_key_input: %d\n", retval);
}
if ((ev_out->emo_events & MU_BUTTON) != 0) {
- LOG("rootwin MU_BUTTON input, x: %d, y: %d\n", ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_x);
+ NSLOG(netsurf, INFO,
+ "rootwin MU_BUTTON input, x: %d, y: %d\n",
+ ev_out->emo_mouse.p_x,
+ ev_out->emo_mouse.p_x);
window_get_grect(data->rootwin, BROWSER_AREA_CONTENT,
&area);
if (POINT_WITHIN(ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_y,
@@ -312,13 +316,13 @@ void window_unref_gui_window(ROOTWIN *rootwin, struct gui_window *gw)
struct gui_window *w;
input_window = NULL;
- LOG("window: %p, gui_window: %p", rootwin, gw);
+ NSLOG(netsurf, INFO, "window: %p, gui_window: %p", rootwin, gw);
w = window_list;
// find the next active tab:
while( w != NULL ) {
if(w->root == rootwin && w != gw) {
- LOG("activating next tab %p", w);
+ NSLOG(netsurf, INFO, "activating next tab %p", w);
gui_set_input_gui_window(w);
break;
}
@@ -338,7 +342,7 @@ int window_destroy(ROOTWIN *rootwin)
assert(rootwin != NULL);
- LOG("%p", rootwin);
+ NSLOG(netsurf, INFO, "%p", rootwin);
if (gemtk_wm_get_user_data(rootwin->win) != NULL) {
free(gemtk_wm_get_user_data(rootwin->win));
@@ -404,7 +408,7 @@ void window_restore_active_gui_window(ROOTWIN *rootwin)
GRECT tb_area;
struct gui_window *gw;
- LOG("rootwin %p", rootwin);
+ NSLOG(netsurf, INFO, "rootwin %p", rootwin);
assert(rootwin->active_gui_window);
@@ -499,7 +503,7 @@ void window_set_focus(struct s_gui_win_root *rootwin,
assert(rootwin != NULL);
if (rootwin->focus.type != type || rootwin->focus.element != element) {
- LOG("Set focus: %p (%d)\n", element, type);
+ NSLOG(netsurf, INFO, "Set focus: %p (%d)\n", element, type);
rootwin->focus.type = type;
rootwin->focus.element = element;
switch( type ) {
@@ -563,11 +567,11 @@ void window_set_active_gui_window(ROOTWIN *rootwin, struct gui_window *gw)
{
struct gui_window *old_gw = rootwin->active_gui_window;
- LOG("gw %p",gw);
+ NSLOG(netsurf, INFO, "gw %p", gw);
if (rootwin->active_gui_window != NULL) {
if(rootwin->active_gui_window == gw) {
- LOG("nothing to do...");
+ NSLOG(netsurf, INFO, "nothing to do...");
return;
}
}
@@ -576,7 +580,7 @@ void window_set_active_gui_window(ROOTWIN *rootwin, struct gui_window *gw)
rootwin->active_gui_window = gw;
if (old_gw != NULL) {
- LOG("restoring window...");
+ NSLOG(netsurf, INFO, "restoring window...");
window_restore_active_gui_window(rootwin);
}
}
@@ -651,7 +655,7 @@ void window_open_search(ROOTWIN *rootwin, bool reformat)
GRECT area;
OBJECT *obj;
- LOG("rootwin %p", rootwin);
+ NSLOG(netsurf, INFO, "rootwin %p", rootwin);
gw = rootwin->active_gui_window;
bw = gw->browser->bw;
@@ -1478,7 +1482,13 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8])
buff[size] = 0;
- LOG("file: %s, ext: %s, size: %ld dropped at: %d,%d\n", (char *)buff, (char *)&ext, size, mx, my);
+ NSLOG(netsurf, INFO,
+ "file: %s, ext: %s, size: %ld dropped at: %d,%d\n",
+ (char *)buff,
+ (char *)&ext,
+ size,
+ mx,
+ my);
gui_window_get_scroll(gw, &sx, &sy);
@@ -1500,7 +1510,8 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8])
if (ret != NSERROR_OK) {
free(buff);
/* A bad encoding should never happen */
- LOG("utf8_from_local_encoding failed");
+ NSLOG(netsurf, INFO,
+ "utf8_from_local_encoding failed");
assert(ret != NSERROR_BAD_ENCODING);
/* no memory */
goto error;
diff --git a/frontends/atari/schedule.c b/frontends/atari/schedule.c
index 48980426d..9a7836b1f 100644
--- a/frontends/atari/schedule.c
+++ b/frontends/atari/schedule.c
@@ -23,15 +23,10 @@
#include "utils/sys_time.h"
#include "utils/errors.h"
+#include "utils/log.h"
#include "atari/schedule.h"
-#ifdef DEBUG_SCHEDULER
-#include "utils/log.h"
-#else
-#define LOG(x...)
-#endif
-
#define MS_NOW() ((clock() * 1000) / CLOCKS_PER_SEC)
/* linked list of scheduled callbacks */
@@ -71,7 +66,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
return NSERROR_OK;
}
- LOG("removing %p, %p", callback, p);
+ NSLOG(schedule, DEBUG, "removing %p, %p", callback, p);
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -80,7 +75,9 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
if ((cur_nscb->callback == callback) &&
(cur_nscb->p == p)) {
/* item to remove */
- LOG("callback entry %p removing %p(%p)", cur_nscb, cur_nscb->callback, cur_nscb->p);
+ NSLOG(schedule, DEBUG,
+ "callback entry %p removing %p(%p)", cur_nscb,
+ cur_nscb->callback, cur_nscb->p);
/* remove callback */
unlnk_nscb = cur_nscb;
@@ -118,7 +115,8 @@ nserror atari_schedule(int ival, void (*callback)(void *p), void *p)
nscb->timeout = MS_NOW() + ival;
- LOG("adding callback %p for %p(%p) at %d ms", nscb, callback, p, nscb->timeout);
+ NSLOG(schedule, DEBUG, "adding callback %p for %p(%p) at %d ms", nscb,
+ callback, p, nscb->timeout);
nscb->callback = callback;
nscb->p = p;
@@ -164,7 +162,9 @@ int schedule_run(void)
prev_nscb->next = unlnk_nscb->next;
}
- LOG("callback entry %p running %p(%p)", unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p);
+ NSLOG(schedule, DEBUG,
+ "callback entry %p running %p(%p)", unlnk_nscb,
+ unlnk_nscb->callback, unlnk_nscb->p);
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
@@ -173,7 +173,7 @@ int schedule_run(void)
/* need to deal with callback modifying the list. */
if (schedule_list == NULL) {
- LOG("schedule_list == NULL");
+ NSLOG(schedule, DEBUG, "schedule_list == NULL");
return -1; /* no more callbacks scheduled */
}
@@ -198,7 +198,8 @@ int schedule_run(void)
/* make rettime relative to now and convert to ms */
nexttime = nexttime - now;
- LOG("returning time to next event as %ldms", nexttime);
+ NSLOG(schedule, DEBUG, "returning time to next event as %ldms",
+ nexttime);
/*return next event time in milliseconds (24days max wait) */
return nexttime;
@@ -210,14 +211,15 @@ void list_schedule(void)
{
struct nscallback *cur_nscb;
- LOG("schedule list at ms clock %ld", MS_NOW());
+ NSLOG(schedule, DEBUG, "schedule list at ms clock %ld", MS_NOW());
cur_nscb = schedule_list;
while (cur_nscb != NULL) {
- LOG("Schedule %p at %ld", cur_nscb, cur_nscb->timeout);
+ NSLOG(schedule, DEBUG, "Schedule %p at %ld", cur_nscb,
+ cur_nscb->timeout);
cur_nscb = cur_nscb->next;
}
- LOG("Maxmium callbacks scheduled: %d", max_scheduled);
+ NSLOG(schedule, DEBUG, "Maxmium callbacks scheduled: %d", max_scheduled);
}
diff --git a/frontends/atari/search.c b/frontends/atari/search.c
index 4da7f16a3..8df4ad676 100644
--- a/frontends/atari/search.c
+++ b/frontends/atari/search.c
@@ -67,7 +67,7 @@ struct gui_search_table *atari_search_table = &search_table;
*/
void nsatari_search_set_status(bool found, void *p)
{
- LOG("%p set status: %d\n", p, found);
+ NSLOG(netsurf, INFO, "%p set status: %d\n", p, found);
// TODO: maybe update GUI
}
@@ -80,7 +80,7 @@ void nsatari_search_set_status(bool found, void *p)
void nsatari_search_set_hourglass(bool active, void *p)
{
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
- LOG("active: %d, session: %p", active, p);
+ NSLOG(netsurf, INFO, "active: %d, session: %p", active, p);
if (active) {
gui_window_set_pointer(s->g, GUI_POINTER_PROGRESS);
} else {
@@ -99,7 +99,7 @@ void nsatari_search_set_hourglass(bool active, void *p)
*/
void nsatari_search_add_recent(const char *string, void *p)
{
- LOG("%p add recent: %s\n", p, string);
+ NSLOG(netsurf, INFO, "%p add recent: %s\n", p, string);
}
@@ -115,7 +115,7 @@ void nsatari_search_set_forward_state(bool active, void *p)
GRECT area;
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
/* deactivate back cb */
- LOG("%p: set forward state: %d\n", p, active);
+ NSLOG(netsurf, INFO, "%p: set forward state: %d\n", p, active);
gw = s->g;
@@ -142,7 +142,7 @@ void nsatari_search_set_back_state(bool active, void *p)
GRECT area;
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
/* deactivate back cb */
- LOG("%p: set back state: %d\n", p, active);
+ NSLOG(netsurf, INFO, "%p: set back state: %d\n", p, active);
s->state.back_avail = active;
gw = s->g;
@@ -224,7 +224,7 @@ void nsatari_search_restore_form( struct s_search_form_session *s, OBJECT *obj)
void nsatari_search_session_destroy(struct s_search_form_session *s)
{
if (s != NULL) {
- LOG("session %p", s);
+ NSLOG(netsurf, INFO, "session %p", s);
browser_window_search_clear(s->g->browser->bw);
free(s);
}
diff --git a/frontends/atari/settings.c b/frontends/atari/settings.c
index ed1fb2e45..7084bacf7 100644
--- a/frontends/atari/settings.c
+++ b/frontends/atari/settings.c
@@ -172,7 +172,7 @@ static char **read_locales(void)
atari_warn_user("Failed to load locales: %s",buf);
return(NULL);
} else {
- LOG("Reading locales from: %s...", buf);
+ NSLOG(netsurf, INFO, "Reading locales from: %s...", buf);
}
/* Count items: */
@@ -257,15 +257,15 @@ static void display_settings(void)
/* "Cache" tab: */
tmp_option_memory_cache_size = nsoption_int(memory_cache_size) / (1024*1024);
- snprintf( spare, 255, "%d", tmp_option_memory_cache_size );
+ snprintf( spare, 255, "%u", tmp_option_memory_cache_size );
set_text( SETTINGS_STR_MAX_MEM_CACHE, spare, 4 );
tmp_option_disc_cache_size = nsoption_int(disc_cache_size) / (1024*1024);
- snprintf( spare, 255, "%d", tmp_option_disc_cache_size );
+ snprintf( spare, 255, "%u", tmp_option_disc_cache_size );
set_text( SETTINGS_STR_MAX_DISC_CACHE, spare, 4 );
tmp_option_disc_cache_age = nsoption_int(disc_cache_age);
- snprintf( spare, 255, "%02d", tmp_option_disc_cache_age );
+ snprintf( spare, 255, "%02u", tmp_option_disc_cache_age );
set_text( SETTINGS_EDIT_CACHE_AGE, spare, 3 );
/* "Paths" tab: */
@@ -303,7 +303,7 @@ static void display_settings(void)
// TODO: activate this option?
tmp_option_min_reflow_period = nsoption_int(min_reflow_period);
- snprintf( spare, 255, "%04d", tmp_option_min_reflow_period );
+ snprintf( spare, 255, "%04u", tmp_option_min_reflow_period );
set_text( SETTINGS_EDIT_MIN_REFLOW_PERIOD, spare,
INPUT_MIN_REFLOW_PERIOD_MAX_LEN );
@@ -597,7 +597,7 @@ static void form_event(int index, int external)
tmp_option_memory_cache_size = 1;
if( tmp_option_memory_cache_size > 999 )
tmp_option_memory_cache_size = 999;
- snprintf( spare, 255, "%02d", tmp_option_memory_cache_size );
+ snprintf( spare, 255, "%02u", tmp_option_memory_cache_size );
set_text( SETTINGS_STR_MAX_MEM_CACHE, spare, 5 );
is_button = true;
OBJ_REDRAW(SETTINGS_STR_MAX_MEM_CACHE);
@@ -614,7 +614,7 @@ static void form_event(int index, int external)
tmp_option_disc_cache_size = 1;
if( tmp_option_disc_cache_size > 9999 )
tmp_option_disc_cache_size = 9999;
- snprintf( spare, 255, "%02d", tmp_option_disc_cache_size );
+ snprintf( spare, 255, "%02u", tmp_option_disc_cache_size );
set_text( SETTINGS_STR_MAX_DISC_CACHE, spare, 5 );
is_button = true;
OBJ_REDRAW(SETTINGS_STR_MAX_DISC_CACHE);
@@ -630,7 +630,7 @@ static void form_event(int index, int external)
if( tmp_option_disc_cache_age > 99 )
tmp_option_disc_cache_age = 0;
- snprintf( spare, 255, "%02d", tmp_option_disc_cache_age );
+ snprintf( spare, 255, "%02u", tmp_option_disc_cache_age );
set_text( SETTINGS_EDIT_CACHE_AGE, spare, 2 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_CACHE_AGE);
@@ -645,7 +645,7 @@ static void form_event(int index, int external)
if( tmp_option_max_cached_fetch_handles > 31 )
tmp_option_max_cached_fetch_handles = 31;
- snprintf( spare, 255, "%02d", tmp_option_max_cached_fetch_handles );
+ snprintf( spare, 255, "%02u", tmp_option_max_cached_fetch_handles );
set_text( SETTINGS_EDIT_MAX_CACHED_CONNECTIONS, spare, 2 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_MAX_CACHED_CONNECTIONS);
@@ -660,7 +660,7 @@ static void form_event(int index, int external)
if( tmp_option_max_fetchers > 31 )
tmp_option_max_fetchers = 31;
- snprintf( spare, 255, "%02d", tmp_option_max_fetchers );
+ snprintf( spare, 255, "%02u", tmp_option_max_fetchers );
set_text( SETTINGS_EDIT_MAX_FETCHERS, spare, 2 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_MAX_FETCHERS);
@@ -675,7 +675,7 @@ static void form_event(int index, int external)
if( tmp_option_max_fetchers_per_host > 31 )
tmp_option_max_fetchers_per_host = 31;
- snprintf( spare, 255, "%02d", tmp_option_max_fetchers_per_host );
+ snprintf( spare, 255, "%02u", tmp_option_max_fetchers_per_host );
set_text( SETTINGS_EDIT_MAX_FETCHERS_PER_HOST, spare, 2 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_MAX_FETCHERS_PER_HOST);
@@ -691,7 +691,7 @@ static void form_event(int index, int external)
if( tmp_option_expire_url > 99 )
tmp_option_expire_url = 0;
- snprintf( spare, 255, "%02d", tmp_option_expire_url );
+ snprintf( spare, 255, "%02u", tmp_option_expire_url );
set_text( SETTINGS_EDIT_HISTORY_AGE, spare, 2 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_HISTORY_AGE);
@@ -726,7 +726,7 @@ static void form_event(int index, int external)
if( tmp_option_font_min_size < 10 )
tmp_option_font_min_size = 10;
- snprintf( spare, 255, "%03d", tmp_option_font_min_size );
+ snprintf( spare, 255, "%03u", tmp_option_font_min_size );
set_text( SETTINGS_EDIT_MIN_FONT_SIZE, spare, 3 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_MIN_FONT_SIZE);
@@ -744,7 +744,7 @@ static void form_event(int index, int external)
if( tmp_option_font_size < 50 )
tmp_option_font_size = 50;
- snprintf( spare, 255, "%03d", tmp_option_font_size );
+ snprintf( spare, 255, "%03u", tmp_option_font_size );
set_text( SETTINGS_EDIT_DEF_FONT_SIZE, spare, 3 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_DEF_FONT_SIZE);
@@ -760,7 +760,7 @@ static void form_event(int index, int external)
if( tmp_option_min_reflow_period > 9999 )
tmp_option_min_reflow_period = 10;
- snprintf( spare, 255, "%04d", tmp_option_min_reflow_period );
+ snprintf( spare, 255, "%04u", tmp_option_min_reflow_period );
set_text( SETTINGS_EDIT_MIN_REFLOW_PERIOD, spare, 4 );
is_button = true;
OBJ_REDRAW(SETTINGS_EDIT_MIN_REFLOW_PERIOD);
@@ -980,12 +980,12 @@ void open_settings(void)
void close_settings(void)
{
- LOG("closing");
+ NSLOG(netsurf, INFO, "closing");
gemtk_wm_remove(settings_guiwin);
settings_guiwin = NULL;
wind_close(h_aes_win);
wind_delete(h_aes_win);
h_aes_win = 0;
- LOG("Done");
+ NSLOG(netsurf, INFO, "Done");
}
diff --git a/frontends/atari/statusbar.c b/frontends/atari/statusbar.c
index 3a216f9a8..fe2008c82 100644
--- a/frontends/atari/statusbar.c
+++ b/frontends/atari/statusbar.c
@@ -166,7 +166,7 @@ CMP_STATUSBAR sb_create( struct gui_window * gw )
void sb_destroy( CMP_STATUSBAR s )
{
- LOG("%s\n", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s\n", __FUNCTION__);
if( s ) {
if( s->comp ){
mt_CompDelete( &app, s->comp );
@@ -206,7 +206,7 @@ CMP_STATUSBAR sb_create( struct gui_window * gw )
void sb_destroy( CMP_STATUSBAR s )
{
- LOG("%s\n", __FUNCTION__);
+ NSLOG(netsurf, INFO, "%s\n", __FUNCTION__);
if( s ) {
free( s );
}
diff --git a/frontends/atari/toolbar.c b/frontends/atari/toolbar.c
index 1b9371763..fdfedcbee 100644
--- a/frontends/atari/toolbar.c
+++ b/frontends/atari/toolbar.c
@@ -269,7 +269,7 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
int i;
struct s_toolbar *t;
- LOG("owner %p", owner);
+ NSLOG(netsurf, INFO, "owner %p", owner);
assert(init == true);
@@ -327,8 +327,9 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
t->throbber.max_index = THROBBER_MAX_INDEX;
t->throbber.running = false;
- LOG("created toolbar: %p, root: %p, textarea: %p, throbber: %p",
- t, owner, t->url.textarea, &t->throbber);
+ NSLOG(netsurf, INFO,
+ "created toolbar: %p, root: %p, textarea: %p, throbber: %p", t,
+ owner, t->url.textarea, &t->throbber);
return( t );
}
@@ -458,7 +459,7 @@ toolbar_update_buttons(struct s_toolbar *tb,
struct browser_window *bw,
short button)
{
- LOG("tb %p", tb);
+ NSLOG(netsurf, INFO, "tb %p", tb);
struct s_tb_button * bt;
bool enable = false;
@@ -582,7 +583,7 @@ void toolbar_set_dimensions(struct s_toolbar *tb, GRECT *area)
void toolbar_set_url(struct s_toolbar *tb, const char *text)
{
- LOG("tb %p", tb);
+ NSLOG(netsurf, INFO, "tb %p", tb);
textarea_set_text(tb->url.textarea, text);
@@ -668,7 +669,7 @@ bool toolbar_text_input(struct s_toolbar *tb, char *text)
{
bool handled = true;
- LOG("tb %p", tb);
+ NSLOG(netsurf, INFO, "tb %p", tb);
return(handled);
}
@@ -757,7 +758,7 @@ void toolbar_mouse_input(struct s_toolbar *tb, short obj, short button)
short mx, my, mb, kstat;
struct gui_window * gw;
- LOG("tb %p", tb);
+ NSLOG(netsurf, INFO, "tb %p", tb);
if (obj==TOOLBAR_AREA_URL) {
diff --git a/frontends/atari/treeview.c b/frontends/atari/treeview.c
index abc1fa780..23db41309 100644
--- a/frontends/atari/treeview.c
+++ b/frontends/atari/treeview.c
@@ -362,8 +362,8 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
on_keybd_event(cw, ev_out, msg);
}
if ((ev_out->emo_events & MU_BUTTON) != 0 ) {
- LOG("Treeview click at: %d,%d\n",
- ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_y);
+ NSLOG(netsurf, INFO, "Treeview click at: %d,%d\n",
+ ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_y);
on_mbutton_event(cw, ev_out, msg);
}
@@ -541,7 +541,7 @@ atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks,
tv = calloc(1, sizeof(struct atari_treeview_window));
if (tv == NULL) {
- LOG("calloc failed");
+ NSLOG(netsurf, INFO, "calloc failed");
atari_warn_user(messages_get_errorcode(NSERROR_NOMEM), 0);
return NULL;
}
diff --git a/frontends/atari/verify_ssl.c b/frontends/atari/verify_ssl.c
index 33136eebd..b099fe488 100644
--- a/frontends/atari/verify_ssl.c
+++ b/frontends/atari/verify_ssl.c
@@ -80,7 +80,9 @@ static void __CDECL cert_info_draw( WINDOW * win, short buf[8], void * data)
if( line == NULL )
return;
- LOG("Cert info draw, win: %p, data: %p, scrollx: %d", win, data, dp->scrollx );
+ NSLOG(netsurf, INFO,
+ "Cert info draw, win: %p, data: %p, scrollx: %d", win, data,
+ dp->scrollx);
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h );
/*using static values here, as RsrcUserDraw has mem leaks & a very small stack */
@@ -158,7 +160,7 @@ static void do_popup( WINDOW *win, int index, int mode, void *data)
char * items[dp->num_certs];
short x, y;
unsigned int i;
- LOG("do_popup: num certs: %d", dp->num_certs);
+ NSLOG(netsurf, INFO, "do_popup: num certs: %d", dp->num_certs);
for( i = 0; i<dp->num_certs; i++) {
items[i] = malloc( 48 );
strncpy(items[i], (char*)&dp->cert_infos_n[i].issuer, 46 );
@@ -246,7 +248,7 @@ verify_ssl_form_do(const char * url,
break;
case VERIFY_BT_SCROLL_R:
- LOG("scroll r!");
+ NSLOG(netsurf, INFO, "scroll r!");
cont = true;
dp.scrollx += 1;
if( dp.scrollx > (dp.cols - (272 / 8 )) )
diff --git a/frontends/beos/bitmap.cpp b/frontends/beos/bitmap.cpp
index 68d8442ab..c4b008755 100644
--- a/frontends/beos/bitmap.cpp
+++ b/frontends/beos/bitmap.cpp
@@ -377,7 +377,7 @@ nsbeos_bitmap_get_pretile_x(struct bitmap* bitmap)
if (!bitmap->pretile_x) {
int width = bitmap->primary->Bounds().Width() + 1;
int xmult = (MIN_PRETILE_WIDTH + width - 1)/width;
- LOG("Pretiling %p for X*%d", bitmap, xmult);
+ NSLOG(netsurf, INFO, "Pretiling %p for X*%d", bitmap, xmult);
bitmap->pretile_x = nsbeos_bitmap_generate_pretile(bitmap->primary, xmult, 1);
}
return bitmap->pretile_x;
@@ -396,7 +396,7 @@ nsbeos_bitmap_get_pretile_y(struct bitmap* bitmap)
if (!bitmap->pretile_y) {
int height = bitmap->primary->Bounds().Height() + 1;
int ymult = (MIN_PRETILE_HEIGHT + height - 1)/height;
- LOG("Pretiling %p for Y*%d", bitmap, ymult);
+ NSLOG(netsurf, INFO, "Pretiling %p for Y*%d", bitmap, ymult);
bitmap->pretile_y = nsbeos_bitmap_generate_pretile(bitmap->primary, 1, ymult);
}
return bitmap->pretile_y;
@@ -416,7 +416,8 @@ nsbeos_bitmap_get_pretile_xy(struct bitmap* bitmap)
int height = bitmap->primary->Bounds().Height() + 1;
int xmult = (MIN_PRETILE_WIDTH + width - 1)/width;
int ymult = (MIN_PRETILE_HEIGHT + height - 1)/height;
- LOG("Pretiling %p for X*%d Y*%d", bitmap, xmult, ymult);
+ NSLOG(netsurf, INFO, "Pretiling %p for X*%d Y*%d", bitmap,
+ xmult, ymult);
bitmap->pretile_xy = nsbeos_bitmap_generate_pretile(bitmap->primary, xmult, ymult);
}
return bitmap->pretile_xy;
diff --git a/frontends/beos/fetch_rsrc.cpp b/frontends/beos/fetch_rsrc.cpp
index e77f4c96e..ae3648354 100644
--- a/frontends/beos/fetch_rsrc.cpp
+++ b/frontends/beos/fetch_rsrc.cpp
@@ -71,13 +71,15 @@ BResources *gAppResources = NULL;
static bool fetch_rsrc_initialise(lwc_string *scheme)
{
- LOG("fetch_rsrc_initialise called for %s", lwc_string_data(scheme));
+ NSLOG(netsurf, INFO, "fetch_rsrc_initialise called for %s",
+ lwc_string_data(scheme));
return true;
}
static void fetch_rsrc_finalise(lwc_string *scheme)
{
- LOG("fetch_rsrc_finalise called for %s", lwc_string_data(scheme));
+ NSLOG(netsurf, INFO, "fetch_rsrc_finalise called for %s",
+ lwc_string_data(scheme));
}
static bool fetch_rsrc_can_fetch(const nsurl *url)
@@ -162,7 +164,7 @@ static bool fetch_rsrc_process(struct fetch_rsrc_context *c)
* rsrc://[TYPE][@NUM]/name[,mime]
*/
- LOG("*** Processing %s", c->url);
+ NSLOG(netsurf, INFO, "*** Processing %s", c->url);
if (strlen(c->url) < 7) {
/* 7 is the minimum possible length (rsrc://) */
@@ -199,11 +201,13 @@ static bool fetch_rsrc_process(struct fetch_rsrc_context *c)
uint8 c1, c2, c3, c4;
if (sscanf(params, "%c%c%c%c", &c1, &c2, &c3, &c4) > 3) {
type = c1 << 24 | c2 << 16 | c3 << 8 | c4;
- LOG("fetch_rsrc: type:%4.4s\n", (char *)&type);
+ NSLOG(netsurf, INFO, "fetch_rsrc: type:%4.4s\n",
+ (char *)&type);
}
}
- LOG("fetch_rsrc: 0x%08lx, %ld, '%s'\n", type, id, c->name);
+ NSLOG(netsurf, INFO, "fetch_rsrc: 0x%08lx, %ld, '%s'\n", type, id,
+ c->name);
bool found;
if (id)
@@ -278,7 +282,10 @@ static void fetch_rsrc_poll(lwc_string *scheme)
char header[64];
fetch_set_http_code(c->parent_fetch, 200);
- LOG("setting rsrc: MIME type to %s, length to %zd", c->mimetype, c->datalen);
+ NSLOG(netsurf, INFO,
+ "setting rsrc: MIME type to %s, length to %zd",
+ c->mimetype,
+ c->datalen);
/* Any callback can result in the fetch being aborted.
* Therefore, we _must_ check for this after _every_
* call to fetch_rsrc_send_callback().
@@ -308,7 +315,8 @@ static void fetch_rsrc_poll(lwc_string *scheme)
fetch_rsrc_send_callback(&msg, c);
}
} else {
- LOG("Processing of %s failed!", c->url);
+ NSLOG(netsurf, INFO, "Processing of %s failed!",
+ c->url);
/* Ensure that we're unlocked here. If we aren't,
* then fetch_rsrc_process() is broken.
diff --git a/frontends/beos/font.cpp b/frontends/beos/font.cpp
index 407918f0c..81113032d 100644
--- a/frontends/beos/font.cpp
+++ b/frontends/beos/font.cpp
@@ -204,8 +204,8 @@ static nserror beos_font_position(const plot_font_style_t *fstyle,
const char *string, size_t length,
int x, size_t *char_offset, int *actual_x)
{
- //LOG("(, '%s', %d, %d, , )", string, length, x);
- //fprintf(stderr, "%s(, '%s', %d, %d, , )\n", __FUNCTION__, string, length, x);
+ NSLOG(netsurf, DEEPDEBUG, "(, '%s', %d, %d, , )", string, length, x);
+
int index;
BFont font;
@@ -261,8 +261,7 @@ static nserror beos_font_split(const plot_font_style_t *fstyle,
const char *string, size_t length,
int x, size_t *char_offset, int *actual_x)
{
- //fprintf(stderr, "%s(, '%s', %d, %d, , )\n", __FUNCTION__, string, length, x);
- //LOG("(, '%s', %d, %d, , )", string, length, x);
+ NSLOG(netsurf, DEEPDEBUG, "(, '%s', %d, %d, , )", string, length, x);
int index = 0;
BFont font;
diff --git a/frontends/beos/gui.cpp b/frontends/beos/gui.cpp
index d3321b58d..19f8eac49 100644
--- a/frontends/beos/gui.cpp
+++ b/frontends/beos/gui.cpp
@@ -112,7 +112,7 @@ static int sEventPipe[2];
/* exported function defined in beos/gui.h */
nserror beos_warn_user(const char *warning, const char *detail)
{
- LOG("warn_user: %s (%s)", warning, detail);
+ NSLOG(netsurf, INFO, "warn_user: %s (%s)", warning, detail);
BAlert *alert;
BString text(warning);
if (detail)
@@ -354,14 +354,15 @@ static void check_homedir(void)
if (err < B_OK) {
/* we really can't continue without a home directory. */
- LOG("Can't find user settings directory - nowhere to store state!");
+ NSLOG(netsurf, INFO,
+ "Can't find user settings directory - nowhere to store state!");
die("NetSurf needs to find the user settings directory in order to run.\n");
}
path.Append("NetSurf");
err = create_directory(path.Path(), 0644);
if (err < B_OK) {
- LOG("Unable to create %s", path.Path());
+ NSLOG(netsurf, INFO, "Unable to create %s", path.Path());
die("NetSurf could not create its settings directory.\n");
}
}
@@ -387,7 +388,7 @@ static nsurl *gui_get_resource_url(const char *path)
path = "favicon.png";
u << path;
- LOG("(%s) -> '%s'\n", path, u.String());
+ NSLOG(netsurf, INFO, "(%s) -> '%s'\n", path, u.String());
nsurl_create(u.String(), &url);
return url;
}
@@ -588,7 +589,7 @@ static void gui_init(int argc, char** argv)
die("Unable to load throbber image.\n");
find_resource(buf, "Choices", "%/Choices");
- LOG("Using '%s' as Preferences file", buf);
+ NSLOG(netsurf, INFO, "Using '%s' as Preferences file", buf);
options_file_location = strdup(buf);
nsoption_read(buf, NULL);
@@ -631,12 +632,12 @@ static void gui_init(int argc, char** argv)
if (nsoption_charp(cookie_file) == NULL) {
find_resource(buf, "Cookies", "%/Cookies");
- LOG("Using '%s' as Cookies file", buf);
+ NSLOG(netsurf, INFO, "Using '%s' as Cookies file", buf);
nsoption_set_charp(cookie_file, strdup(buf));
}
if (nsoption_charp(cookie_jar) == NULL) {
find_resource(buf, "Cookies", "%/Cookies");
- LOG("Using '%s' as Cookie Jar file", buf);
+ NSLOG(netsurf, INFO, "Using '%s' as Cookie Jar file", buf);
nsoption_set_charp(cookie_jar, strdup(buf));
}
if ((nsoption_charp(cookie_file) == NULL) ||
@@ -645,13 +646,13 @@ static void gui_init(int argc, char** argv)
if (nsoption_charp(url_file) == NULL) {
find_resource(buf, "URLs", "%/URLs");
- LOG("Using '%s' as URL file", buf);
+ NSLOG(netsurf, INFO, "Using '%s' as URL file", buf);
nsoption_set_charp(url_file, strdup(buf));
}
if (nsoption_charp(ca_path) == NULL) {
find_resource(buf, "certs", "/etc/ssl/certs");
- LOG("Using '%s' as certificate path", buf);
+ NSLOG(netsurf, INFO, "Using '%s' as certificate path", buf);
nsoption_set_charp(ca_path, strdup(buf));
}
@@ -763,17 +764,21 @@ void nsbeos_gui_poll(void)
timeout.tv_sec = (long)(next_schedule / 1000000LL);
timeout.tv_usec = (long)(next_schedule % 1000000LL);
- //LOG("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule);
+ NSLOG(netsurf, DEEPDEBUG,
+ "gui_poll: select(%d, ..., %Ldus",
+ max_fd, next_schedule);
fd_count = select(max_fd, &read_fd_set, &write_fd_set, &exc_fd_set,
&timeout);
- //LOG("select: %d\n", fd_count);
+ NSLOG(netsurf, DEEPDEBUG, "select: %d\n", fd_count);
if (fd_count > 0 && FD_ISSET(sEventPipe[0], &read_fd_set)) {
BMessage *message;
int len = read(sEventPipe[0], &message, sizeof(void *));
- //LOG("gui_poll: BMessage ? %d read", len);
+ NSLOG(netsurf, DEEPDEBUG, "gui_poll: BMessage ? %d read", len);
if (len == sizeof(void *)) {
- //LOG("gui_poll: BMessage.what %-4.4s\n", &(message->what));
+ NSLOG(netsurf, DEEPDEBUG,
+ "gui_poll: BMessage.what %-4.4s\n",
+ &(message->what));
nsbeos_dispatch_event(message);
}
}
@@ -1038,7 +1043,7 @@ int main(int argc, char** argv)
char path[12];
sprintf(path,"%.2s/Messages", getenv("LC_MESSAGES"));
- LOG("Loading messages from resource %s\n", path);
+ NSLOG(netsurf, INFO, "Loading messages from resource %s\n", path);
const uint8_t* res = (const uint8_t*)resources.LoadResource('data', path, &size);
if (size > 0 && res != NULL) {
@@ -1061,6 +1066,12 @@ int main(int argc, char** argv)
netsurf_exit();
+ /* finalise options */
+ nsoption_finalise(nsoptions, nsoptions_default);
+
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/beos/plotters.cpp b/frontends/beos/plotters.cpp
index c77e6353e..c4903e045 100644
--- a/frontends/beos/plotters.cpp
+++ b/frontends/beos/plotters.cpp
@@ -538,7 +538,7 @@ nsbeos_plot_path(const struct redraw_context *ctx,
}
if (p[0] != PLOTTER_PATH_MOVE) {
- LOG("path doesn't start with a move");
+ NSLOG(netsurf, INFO, "path doesn't start with a move");
return NSERROR_INVALID;
}
@@ -563,7 +563,7 @@ nsbeos_plot_path(const struct redraw_context *ctx,
shape.BezierTo(pt);
i += 7;
} else {
- LOG("bad path command %f", p[i]);
+ NSLOG(netsurf, INFO, "bad path command %f", p[i]);
return NSERROR_INVALID;
}
}
diff --git a/frontends/beos/scaffolding.cpp b/frontends/beos/scaffolding.cpp
index 7efdb5962..e6fb6e5a1 100644
--- a/frontends/beos/scaffolding.cpp
+++ b/frontends/beos/scaffolding.cpp
@@ -796,7 +796,7 @@ int32 nsbeos_replicant_main_thread(void *_arg)
static void nsbeos_window_destroy_event(NSBrowserWindow *window, nsbeos_scaffolding *g, BMessage *event)
{
- LOG("Being Destroyed = %d", g->being_destroyed);
+ NSLOG(netsurf, INFO, "Being Destroyed = %d", g->being_destroyed);
if (--open_windows == 0)
nsbeos_done = true;
@@ -854,7 +854,9 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
bw = nsbeos_get_browser_for_gui(scaffold->top_level);
bool reloadAll = false;
- LOG("nsbeos_scaffolding_dispatch_event() what = 0x%08lx", message->what);
+ NSLOG(netsurf, INFO,
+ "nsbeos_scaffolding_dispatch_event() what = 0x%08lx",
+ message->what);
switch (message->what) {
case B_QUIT_REQUESTED:
nsbeos_scaffolding_destroy(scaffold);
@@ -997,7 +999,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
browser_window_key_press(bw, NS_KEY_PASTE);
break;
case B_SELECT_ALL:
- LOG("Selecting all text");
+ NSLOG(netsurf, INFO, "Selecting all text");
browser_window_key_press(bw, NS_KEY_SELECT_ALL);
break;
case B_NETPOSITIVE_BACK:
@@ -1359,7 +1361,8 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
void nsbeos_scaffolding_destroy(nsbeos_scaffolding *scaffold)
{
- LOG("Being Destroyed = %d", scaffold->being_destroyed);
+ NSLOG(netsurf, INFO, "Being Destroyed = %d",
+ scaffold->being_destroyed);
if (scaffold->being_destroyed) return;
scaffold->being_destroyed = 1;
nsbeos_window_destroy_event(scaffold->window, scaffold, NULL);
@@ -1444,7 +1447,7 @@ static void recursively_set_menu_items_target(BMenu *menu, BHandler *handler)
void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
{
- LOG("Attaching view to scaffolding %p", g);
+ NSLOG(netsurf, INFO, "Attaching view to scaffolding %p", g);
// this is a replicant,... and it went bad
if (!g->window) {
@@ -1722,7 +1725,8 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
{
struct beos_scaffolding *g = (struct beos_scaffolding *)malloc(sizeof(*g));
- LOG("Constructing a scaffold of %p for gui_window %p", g, toplevel);
+ NSLOG(netsurf, INFO,
+ "Constructing a scaffold of %p for gui_window %p", g, toplevel);
g->top_level = toplevel;
g->being_destroyed = 0;
diff --git a/frontends/beos/schedule.cpp b/frontends/beos/schedule.cpp
index e96e56d81..7877a838b 100644
--- a/frontends/beos/schedule.cpp
+++ b/frontends/beos/schedule.cpp
@@ -28,11 +28,7 @@ extern "C" {
#include "netsurf/content_type.h"
#include "netsurf/browser_window.h"
-#ifdef DEBUG_BEOS_SCHEDULE
#include "utils/log.h"
-#else
-#define LOG(x...)
-#endif
}
/** Killable callback closure embodiment. */
@@ -58,7 +54,10 @@ nsbeos_schedule_kill_callback(void *_target, void *_match)
_nsbeos_callback_t *match = (_nsbeos_callback_t *)_match;
if ((target->callback == match->callback) &&
(target->context == match->context)) {
- LOG("Found match for %p(%p), killing.", target->callback, target->context);
+ NSLOG(schedule, DEBUG,
+ "Found match for %p(%p), killing.",
+ target->callback,
+ target->context);
target->callback = NULL;
target->context = NULL;
target->callback_killed = true;
@@ -69,7 +68,9 @@ nsbeos_schedule_kill_callback(void *_target, void *_match)
static void
schedule_remove(void (*callback)(void *p), void *p)
{
- LOG("schedule_remove() for %p(%p)", cb->callback, cb->context);
+ NSLOG(schedule, DEBUG,
+ "schedule_remove() for %p(%p)",
+ callback, p);
if (callbacks == NULL)
return;
_nsbeos_callback_t cb_match;
@@ -81,7 +82,7 @@ schedule_remove(void (*callback)(void *p), void *p)
nserror beos_schedule(int t, void (*callback)(void *p), void *p)
{
- LOG("t:%d cb:%p p:%p", t, cb->callback, cb->context);
+ NSLOG(schedule, DEBUG, "t:%d cb:%p p:%p", t, callback, p);
if (callbacks == NULL) {
callbacks = new BList;
@@ -111,7 +112,7 @@ nserror beos_schedule(int t, void (*callback)(void *p), void *p)
bool
schedule_run(void)
{
- LOG("schedule_run()");
+ NSLOG(schedule, DEBUG, "schedule_run()");
earliest_callback_timeout = B_INFINITE_TIMEOUT;
if (callbacks == NULL)
@@ -120,7 +121,9 @@ schedule_run(void)
bigtime_t now = system_time();
int32 i;
- LOG("Checking %ld callbacks to for deadline.", this_run->CountItems());
+ NSLOG(schedule, DEBUG,
+ "Checking %ld callbacks to for deadline.",
+ callbacks->CountItems());
/* Run all the callbacks which made it this far. */
for (i = 0; i < callbacks->CountItems(); ) {
@@ -132,7 +135,11 @@ schedule_run(void)
i++;
continue;
}
- LOG("Running callbacks %p(%p).", cb->callback, cb->context);
+ NSLOG(schedule, DEBUG,
+ "Running callbacks %p(%p).",
+ cb->callback,
+ cb->context);
+
if (!cb->callback_killed)
cb->callback(cb->context);
callbacks->RemoveItem(cb);
diff --git a/frontends/beos/throbber.cpp b/frontends/beos/throbber.cpp
index fe40b3edc..315afef83 100644
--- a/frontends/beos/throbber.cpp
+++ b/frontends/beos/throbber.cpp
@@ -50,18 +50,21 @@ bool nsbeos_throbber_initialise_from_png(const int frames, ...)
if (frames < 2) {
/* we need at least two frames - one for idle, one for active */
- LOG("Insufficent number of frames in throbber animation!");
- LOG("(called with %d frames, where 2 is a minimum.)", frames);
+ NSLOG(netsurf, INFO,
+ "Insufficent number of frames in throbber animation!");
+ NSLOG(netsurf, INFO,
+ "(called with %d frames, where 2 is a minimum.)",
+ frames);
return false;
}
BResources *res = get_app_resources();
if (res == NULL) {
- LOG("Can't find resources for throbber!");
+ NSLOG(netsurf, INFO, "Can't find resources for throbber!");
return false;
}
- throb = (struct nsbeos_throbber *)malloc(sizeof(throb));
+ throb = (struct nsbeos_throbber *)malloc(sizeof(*throb));
throb->nframes = frames;
throb->framedata = (BBitmap **)malloc(sizeof(BBitmap *) * throb->nframes);
@@ -74,14 +77,17 @@ bool nsbeos_throbber_initialise_from_png(const int frames, ...)
data = res->LoadResource('data', fn, &size);
throb->framedata[i] = NULL;
if (!data) {
- LOG("Error when loading resource %s", fn);
+ NSLOG(netsurf, INFO, "Error when loading resource %s",
+ fn);
errors_when_loading = true;
continue;
}
BMemoryIO mem(data, size);
throb->framedata[i] = BTranslationUtils::GetBitmap(&mem);
if (throb->framedata[i] == NULL) {
- LOG("Error when loading %s: GetBitmap() returned NULL", fn);
+ NSLOG(netsurf, INFO,
+ "Error when loading %s: GetBitmap() returned NULL",
+ fn);
errors_when_loading = true;
}
}
diff --git a/frontends/beos/window.cpp b/frontends/beos/window.cpp
index 8acb20a37..f4229207b 100644
--- a/frontends/beos/window.cpp
+++ b/frontends/beos/window.cpp
@@ -354,7 +354,8 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
return 0;
}
- LOG("Creating gui window %p for browser window %p", g, bw);
+ NSLOG(netsurf, INFO, "Creating gui window %p for browser window %p",
+ g, bw);
g->bw = bw;
g->mouse.state = 0;
@@ -436,25 +437,27 @@ void nsbeos_dispatch_event(BMessage *message)
continue;
if (gui && gui != z) {
- LOG("discarding event for destroyed gui_window");
+ NSLOG(netsurf, INFO,
+ "discarding event for destroyed gui_window");
delete message;
return;
}
if (scaffold && (!y || scaffold != y->scaffold)) {
- LOG("discarding event for destroyed scaffolding");
+ NSLOG(netsurf, INFO,
+ "discarding event for destroyed scaffolding");
delete message;
return;
}
// messages for top-level
if (scaffold) {
- LOG("dispatching to top-level");
+ NSLOG(netsurf, INFO, "dispatching to top-level");
nsbeos_scaffolding_dispatch_event(scaffold, message);
delete message;
return;
}
- //LOG("processing message");
+ NSLOG(netsurf, DEEPDEBUG, "processing message");
switch (message->what) {
case B_QUIT_REQUESTED:
// from the BApplication
@@ -763,7 +766,8 @@ void nsbeos_window_keypress_event(BView *view, gui_window *g, BMessage *event)
if (!numbytes)
numbytes = strlen(bytes);
- LOG("mods 0x%08lx key %ld raw %ld byte[0] %d", mods, key, raw_char, buff[0]);
+ NSLOG(netsurf, INFO, "mods 0x%08lx key %ld raw %ld byte[0] %d", mods,
+ key, raw_char, buff[0]);
char byte;
if (numbytes == 1) {
@@ -930,10 +934,10 @@ static void gui_window_destroy(struct gui_window *g)
g->next->prev = g->prev;
- LOG("Destroying gui_window %p", g);
+ NSLOG(netsurf, INFO, "Destroying gui_window %p", g);
assert(g != NULL);
assert(g->bw != NULL);
- LOG(" Scaffolding: %p", g->scaffold);
+ NSLOG(netsurf, INFO, " Scaffolding: %p", g->scaffold);
if (g->view == NULL)
return;
@@ -1000,8 +1004,6 @@ beos_window_invalidate_area(struct gui_window *g, const struct rect *rect)
return NSERROR_OK;
}
- nsbeos_current_gc_set(g->view);
-
if (rect != NULL) {
//XXX +1 ??
g->view->Invalidate(BRect(rect->x0, rect->y0,
@@ -1010,7 +1012,6 @@ beos_window_invalidate_area(struct gui_window *g, const struct rect *rect)
g->view->Invalidate();
}
- nsbeos_current_gc_set(NULL);
g->view->UnlockLooper();
return NSERROR_OK;
@@ -1093,8 +1094,9 @@ static void gui_window_update_extent(struct gui_window *g)
x_max -= g->view->Bounds().Width() + 1;
y_max -= g->view->Bounds().Height() + 1;
- LOG("x_max = %d y_max = %d x_prop = %f y_prop = %f\n",
- x_max, y_max, x_prop, y_prop);
+ NSLOG(netsurf, INFO,
+ "x_max = %d y_max = %d x_prop = %f y_prop = %f\n", x_max,
+ y_max, x_prop, y_prop);
if (g->view->ScrollBar(B_HORIZONTAL)) {
g->view->ScrollBar(B_HORIZONTAL)->SetRange(0, x_max);
diff --git a/frontends/cocoa/.clang-format b/frontends/cocoa/.clang-format
new file mode 100644
index 000000000..4beec6630
--- /dev/null
+++ b/frontends/cocoa/.clang-format
@@ -0,0 +1,4 @@
+---
+BasedOnStyle: WebKit
+PointerAlignment: Right
+SortIncludes: false
diff --git a/frontends/cocoa/.gitignore b/frontends/cocoa/.gitignore
new file mode 100644
index 000000000..99c6c7d4f
--- /dev/null
+++ b/frontends/cocoa/.gitignore
@@ -0,0 +1 @@
+**/*.xc*/xcuserdata/
diff --git a/frontends/cocoa/ArrowBox.h b/frontends/cocoa/ArrowBox.h
new file mode 100644
index 000000000..c3f7a44cc
--- /dev/null
+++ b/frontends/cocoa/ArrowBox.h
@@ -0,0 +1,32 @@
+/* Copyright (c) 1011 Sven Weidauer
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#import <Cocoa/Cocoa.h>
+
+typedef enum {
+ ArrowNone,
+ ArrowTopEdge,
+ ArrowBottomEdge,
+ ArrowLeftEdge,
+ ArrowRightEdge
+} ArrowEdge;
+
+@interface ArrowBox : NSView {
+ CGFloat arrowPosition;
+ CGFloat arrowSize;
+ ArrowEdge arrowEdge;
+ CGFloat cornerRadius;
+ BOOL updateShadow;
+}
+
+@property (readwrite, assign, nonatomic) CGFloat arrowPosition;
+@property (readwrite, assign, nonatomic) CGFloat arrowSize;
+@property (readwrite, assign, nonatomic) ArrowEdge arrowEdge;
+@property (readwrite, assign, nonatomic) CGFloat cornerRadius;
+
+@end
diff --git a/frontends/cocoa/ArrowBox.m b/frontends/cocoa/ArrowBox.m
new file mode 100644
index 000000000..6d6911d9b
--- /dev/null
+++ b/frontends/cocoa/ArrowBox.m
@@ -0,0 +1,180 @@
+/* Copyright 2011 Sven Weidauer
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#import "ArrowBox.h"
+
+#import "desktop/system_colour.h"
+#import "cocoa/plotter.h"
+
+@interface ArrowBox ()
+
+@property (nonatomic) NSColor *backgroundColor;
+
+@end
+
+@implementation ArrowBox
+
+@synthesize arrowPosition;
+@synthesize arrowSize;
+@synthesize arrowEdge;
+@synthesize cornerRadius;
+
+- (NSColor *)backgroundColor {
+ if (!_backgroundColor) {
+ colour fill_colour;
+ nserror res = ns_system_colour_char("Window", &fill_colour);
+ NSAssert(res == NSERROR_OK, @"Expect to find the window colour");
+ _backgroundColor = cocoa_convert_colour(fill_colour);
+ }
+
+ return _backgroundColor;
+}
+
+- (void)setArrowEdge:(ArrowEdge)newEdge
+{
+ if (arrowEdge == newEdge) {
+ return;
+ }
+
+ arrowEdge = newEdge;
+
+ [self setNeedsDisplay:YES];
+ updateShadow = YES;
+}
+
+- (void)setArrowSize:(CGFloat)newSize
+{
+ arrowSize = newSize;
+ [self setNeedsDisplay:YES];
+ updateShadow = YES;
+}
+
+- (void)setCornerRadius:(CGFloat)newRadius
+{
+ cornerRadius = newRadius;
+ [self setNeedsDisplay:YES];
+ updateShadow = YES;
+}
+
+- (void)setArrowPosition:(CGFloat)newPosition
+{
+ arrowPosition = newPosition;
+
+ [self setNeedsDisplay:YES];
+ updateShadow = YES;
+}
+
+- (id)initWithFrame:(NSRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self) {
+ arrowPosition = 50;
+ cornerRadius = 10;
+ arrowSize = 15;
+ }
+ return self;
+}
+
+- (void)drawRect:(NSRect)dirtyRect
+{
+ [[NSColor clearColor] set];
+ [NSBezierPath fillRect:dirtyRect];
+
+ NSBezierPath *path = [NSBezierPath bezierPath];
+
+ NSRect bounds = [self.window convertRectToScreen:NSInsetRect([self bounds], 2, 2)];
+ bounds.origin.x = floor(bounds.origin.x);
+ bounds.origin.y = floor(bounds.origin.y);
+ bounds.size.width = floor(bounds.size.width);
+ bounds.size.height = floor(bounds.size.height);
+ bounds = [self.window convertRectFromScreen:bounds];
+
+ const CGFloat right = bounds.size.width - arrowSize;
+ const CGFloat top = bounds.size.height - arrowSize;
+ const CGFloat left = arrowSize;
+ const CGFloat bottom = arrowSize;
+
+ [path setLineJoinStyle:NSRoundLineJoinStyle];
+
+ [path moveToPoint:NSMakePoint(right - cornerRadius, top)];
+
+ if (arrowEdge == ArrowTopEdge) {
+ [path lineToPoint:NSMakePoint(arrowPosition + arrowSize, top)];
+ [path lineToPoint:NSMakePoint(arrowPosition, top + arrowSize)];
+ [path lineToPoint:NSMakePoint(arrowPosition - arrowSize, top)];
+ }
+
+ [path appendBezierPathWithArcFromPoint:NSMakePoint(left, top)
+ toPoint:NSMakePoint(left, top - cornerRadius)
+ radius:cornerRadius];
+
+ if (arrowEdge == ArrowLeftEdge) {
+ [path lineToPoint:NSMakePoint(left, bottom + arrowPosition + arrowSize)];
+ [path lineToPoint:NSMakePoint(left - arrowSize, bottom + arrowPosition)];
+ [path lineToPoint:NSMakePoint(left, bottom + arrowPosition - arrowSize)];
+ }
+
+ [path appendBezierPathWithArcFromPoint:NSMakePoint(left, bottom)
+ toPoint:NSMakePoint(left + cornerRadius, bottom)
+ radius:cornerRadius];
+
+ if (arrowEdge == ArrowBottomEdge) {
+ [path lineToPoint:NSMakePoint(arrowPosition - arrowSize, bottom)];
+ [path lineToPoint:NSMakePoint(arrowPosition, bottom - arrowSize)];
+ [path lineToPoint:NSMakePoint(arrowPosition + arrowSize, bottom)];
+ }
+
+ [path appendBezierPathWithArcFromPoint:NSMakePoint(right, bottom)
+ toPoint:NSMakePoint(right, bottom + cornerRadius)
+ radius:cornerRadius];
+
+ if (arrowEdge == ArrowRightEdge) {
+ [path lineToPoint:NSMakePoint(right, bottom + arrowPosition - arrowSize)];
+ [path lineToPoint:NSMakePoint(right + arrowSize, bottom + arrowPosition)];
+ [path lineToPoint:NSMakePoint(right, bottom + arrowPosition + arrowSize)];
+ }
+
+ [path appendBezierPathWithArcFromPoint:NSMakePoint(right, top)
+ toPoint:NSMakePoint(right - cornerRadius, top)
+ radius:cornerRadius];
+ [path closePath];
+
+ [[NSColor colorWithDeviceWhite:1.0 alpha:0.4] set];
+ [self.backgroundColor setFill];
+
+ NSAffineTransform *transform = [NSAffineTransform transform];
+ [transform translateXBy:bounds.origin.x yBy:bounds.origin.y];
+ [transform concat];
+
+ [path setLineWidth:2.0];
+ [path fill];
+ [path stroke];
+
+ if (updateShadow) {
+ [[self window] invalidateShadow];
+ [[self window] update];
+ updateShadow = NO;
+ }
+}
+
+@end
diff --git a/frontends/cocoa/ArrowWindow.h b/frontends/cocoa/ArrowWindow.h
new file mode 100644
index 000000000..94b49fbb6
--- /dev/null
+++ b/frontends/cocoa/ArrowWindow.h
@@ -0,0 +1,31 @@
+/* Copyright (c) 1011 Sven Weidauer
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#import <Cocoa/Cocoa.h>
+
+#import "ArrowBox.h"
+
+@interface ArrowWindow : NSWindow {
+ ArrowBox *box;
+ NSView *content;
+ BOOL acceptsKey;
+ NSWindow *attachedWindow;
+}
+
+@property (readwrite, assign, nonatomic) BOOL acceptsKey;
+
+@property (readwrite, assign, nonatomic) CGFloat arrowPosition;
+@property (readwrite, assign, nonatomic) CGFloat arrowSize;
+@property (readwrite, assign, nonatomic) ArrowEdge arrowEdge;
+@property (readwrite, assign, nonatomic) CGFloat cornerRadius;
+
+- (void)moveToPoint:(NSPoint)screenPoint;
+- (void)attachToView:(NSView *)view;
+- (void)detach;
+
+@end
diff --git a/frontends/cocoa/ArrowWindow.m b/frontends/cocoa/ArrowWindow.m
new file mode 100644
index 000000000..720e55e29
--- /dev/null
+++ b/frontends/cocoa/ArrowWindow.m
@@ -0,0 +1,240 @@
+/* Copyright 2011 Sven Weidauer
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#import "ArrowWindow.h"
+#import "ArrowBox.h"
+
+@implementation ArrowWindow
+
+@synthesize acceptsKey;
+
+- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag
+{
+ if ((self = [super initWithContentRect:contentRect styleMask:NSWindowStyleMaskBorderless backing:bufferingType defer:flag]) == nil) {
+ return nil;
+ }
+
+ [self setBackgroundColor:[NSColor clearColor]];
+ [self setOpaque:NO];
+ [self setHasShadow:YES];
+
+ return self;
+}
+
+- (void)setContentView:(NSView *)aView
+{
+ if (aView == content)
+ return;
+
+ [content removeFromSuperview];
+ content = aView;
+
+ if (content == nil)
+ return;
+
+ if (box == nil) {
+ box = [[ArrowBox alloc] initWithFrame:NSZeroRect];
+ [box setArrowEdge:ArrowTopEdge];
+ [super setContentView:box];
+ }
+
+ [box addSubview:content];
+
+ NSRect frame = [self contentRectForFrameRect:[self frame]];
+ frame.origin = [self convertRectFromScreen:(CGRect){.origin = frame.origin }].origin;
+ frame = [box convertRect:frame fromView:nil];
+
+ [content setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+ [content setFrame:frame];
+}
+
+- (void)setContentSize:(NSSize)aSize
+{
+ NSRect frame = [content frame];
+ frame.size = aSize;
+
+ frame = [box convertRect:frame toView:nil];
+ frame.origin = [self convertRectToScreen:(CGRect){.origin = frame.origin }].origin;
+ frame = [self frameRectForContentRect:frame];
+
+ [self setFrame:frame display:YES];
+}
+
+static const CGFloat padding = 0;
+
+- (NSRect)contentRectForFrameRect:(NSRect)frameRect
+{
+ const CGFloat arrowSize = [box arrowSize];
+ const CGFloat offset = 2 * (padding + arrowSize);
+
+ return NSInsetRect(frameRect, offset, offset);
+}
+
+- (NSRect)frameRectForContentRect:(NSRect)contentRect
+{
+ const CGFloat arrowSize = [box arrowSize];
+ const CGFloat offset = -2 * (padding + arrowSize);
+
+ return NSInsetRect(contentRect, offset, offset);
+}
+
++ (NSRect)frameRectForContentRect:(NSRect)cRect styleMask:(NSWindowStyleMask)aStyle
+{
+ const CGFloat DefaultArrowSize = 15;
+ const CGFloat offset = -2 * (padding + DefaultArrowSize);
+
+ return NSInsetRect(cRect, offset, offset);
+}
+
+- (BOOL)canBecomeKeyWindow
+{
+ return acceptsKey;
+}
+
+- (void)moveToPoint:(NSPoint)screenPoint
+{
+ switch ([box arrowEdge]) {
+ case ArrowNone:
+ screenPoint.x -= [box arrowSize];
+ screenPoint.y += [box arrowSize];
+ break;
+
+ case ArrowTopEdge:
+ screenPoint.x -= [box arrowPosition];
+ break;
+
+ case ArrowBottomEdge:
+ screenPoint.x -= [box arrowPosition];
+ screenPoint.y += NSHeight([self frame]);
+ break;
+
+ case ArrowLeftEdge:
+ screenPoint.y += NSHeight([self frame]) - [box arrowPosition] - [box arrowSize];
+ break;
+
+ case ArrowRightEdge:
+ screenPoint.x -= NSWidth([self frame]);
+ screenPoint.y += NSHeight([self frame]) - [box arrowPosition] - [box arrowSize];
+ break;
+ }
+
+ [self setFrameTopLeftPoint:screenPoint];
+}
+
+static NSRect ScreenRectForView(NSView *view)
+{
+ NSRect viewRect = [view bounds]; // in View coordinate system
+ viewRect = [view convertRect:viewRect toView:nil]; // translate to window coordinates
+ viewRect.origin = [[view window] convertRectToScreen:(CGRect){.origin = viewRect.origin }].origin; // translate to screen coordinates
+ return viewRect;
+}
+
+- (void)attachToView:(NSView *)view
+{
+ if (nil != attachedWindow)
+ [self detach];
+
+ NSRect viewRect = ScreenRectForView(view);
+ NSPoint arrowPoint;
+
+ switch ([box arrowEdge]) {
+ case ArrowLeftEdge:
+ arrowPoint = NSMakePoint(NSMaxX(viewRect),
+ NSMidY(viewRect));
+ break;
+
+ case ArrowBottomEdge:
+ arrowPoint = NSMakePoint(NSMidX(viewRect),
+ NSMaxY(viewRect));
+ break;
+
+ case ArrowRightEdge:
+ arrowPoint = NSMakePoint(NSMinX(viewRect),
+ NSMidY(viewRect));
+ break;
+
+ case ArrowNone:
+ case ArrowTopEdge:
+ default:
+ arrowPoint = NSMakePoint(NSMidX(viewRect),
+ NSMinY(viewRect));
+ break;
+ }
+ attachedWindow = [view window];
+ [self moveToPoint:arrowPoint];
+ [attachedWindow addChildWindow:self ordered:NSWindowAbove];
+}
+
+- (void)detach
+{
+ [attachedWindow removeChildWindow:self];
+ [self close];
+ attachedWindow = nil;
+}
+
+//MARK: -
+//MARK: Properties
+
+- (void)setArrowPosition:(CGFloat)newPosition
+{
+ [box setArrowPosition:newPosition];
+}
+
+- (CGFloat)arrowPosition
+{
+ return [box arrowPosition];
+}
+
+- (void)setArrowSize:(CGFloat)newSize
+{
+ NSRect contentRect = [self contentRectForFrameRect:[self frame]];
+ [box setArrowSize:newSize];
+ [self setFrame:[self frameRectForContentRect:contentRect] display:[self isVisible]];
+}
+
+- (CGFloat)arrowSize
+{
+ return [box arrowSize];
+}
+
+- (void)setArrowEdge:(ArrowEdge)newEdge
+{
+ [box setArrowEdge:newEdge];
+}
+
+- (ArrowEdge)arrowEdge
+{
+ return [box arrowEdge];
+}
+
+- (void)setCornerRadius:(CGFloat)newRadius
+{
+ [box setCornerRadius:newRadius];
+}
+
+- (CGFloat)cornerRadius
+{
+ return [box cornerRadius];
+}
+
+@end
diff --git a/frontends/cocoa/BookmarksController.h b/frontends/cocoa/BookmarksController.h
new file mode 100644
index 000000000..476d86c29
--- /dev/null
+++ b/frontends/cocoa/BookmarksController.h
@@ -0,0 +1,39 @@
+/*
+ * 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>
+
+@class Tree;
+@class TreeView;
+
+@interface BookmarksController : NSWindowController {
+ Tree *tree;
+ NSMapTable *nodeForMenu;
+}
+
+@property (readwrite, assign, nonatomic) IBOutlet NSMenu *defaultMenu;
+@property (readwrite, assign, nonatomic) IBOutlet TreeView *view;
+
+- (IBAction)openBookmarkURL:(id)sender;
+- (IBAction)addBookmark:(id)sender;
+
+- (IBAction)editSelected:(id)sender;
+- (IBAction)deleteSelected:(id)sender;
+- (IBAction)addFolder:(id)sender;
+
+@end
diff --git a/frontends/cocoa/BookmarksController.m b/frontends/cocoa/BookmarksController.m
new file mode 100644
index 000000000..f2358cd53
--- /dev/null
+++ b/frontends/cocoa/BookmarksController.m
@@ -0,0 +1,221 @@
+/*
+ * 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 <stddef.h>
+
+#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsurl.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/keypress.h"
+#import "desktop/hotlist.h"
+
+#import "cocoa/desktop-tree.h"
+#import "cocoa/BookmarksController.h"
+#import "cocoa/Tree.h"
+#import "cocoa/TreeView.h"
+#import "cocoa/NetsurfApp.h"
+#import "cocoa/BrowserViewController.h"
+#import "cocoa/gui.h"
+
+@interface BookmarksController ()
+- (void)noteAppWillTerminate:(NSNotification *)note;
+- (void)save;
+@end
+
+@implementation BookmarksController
+
+@synthesize defaultMenu;
+@synthesize view;
+
+static const char *cocoa_hotlist_path(void)
+{
+ NSString *path = [[NSUserDefaults standardUserDefaults]
+ stringForKey:kHotlistFileOption];
+ return [path UTF8String];
+}
+
+- (id)init
+{
+ if ((self = [super initWithWindowNibName:@"BookmarksWindow"]) == nil) {
+ return nil;
+ }
+ tree_hotlist_path = cocoa_hotlist_path();
+ tree = [[Tree alloc] initWithFlags:TREE_HOTLIST];
+ nodeForMenu = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks,
+ NSNonOwnedPointerMapValueCallBacks,
+ 0);
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(noteAppWillTerminate:)
+ name:NSApplicationWillTerminateNotification
+ object:NSApp];
+
+ return self;
+}
+
+- (void)noteAppWillTerminate:(NSNotification *)note
+{
+ [self save];
+}
+
+- (void)save
+{
+ hotlist_export(cocoa_hotlist_path(), NULL);
+}
+
+- (void)dealloc
+{
+ [self setView:nil];
+ NSFreeMapTable(nodeForMenu);
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)menuNeedsUpdate:(NSMenu *)menu
+{
+#if 0
+ for (NSMenuItem *item in [menu itemArray]) {
+ if ([item hasSubmenu]) NSMapRemove( nodeForMenu, [item submenu] );
+ [menu removeItem: item];
+ }
+
+ bool hasSeparator = true;
+ struct node *node = (struct node *)NSMapGet( nodeForMenu, menu );
+ if (node == NULL) {
+ for (NSMenuItem *item in [defaultMenu itemArray]) {
+ [menu addItem: [[item copy] autorelease]];
+ }
+ hasSeparator = false;
+ }
+
+ for (struct node *child = tree_node_get_child( node );
+ child != NULL;
+ child = tree_node_get_next( child )) {
+
+ if (tree_node_is_deleted( child )) continue;
+
+ if (!hasSeparator) {
+ [menu addItem: [NSMenuItem separatorItem]];
+ hasSeparator = true;
+ }
+
+ NSString *title = [NSString stringWithUTF8String: tree_url_node_get_title( child )];
+
+ NSMenuItem *item = [menu addItemWithTitle: title action: NULL keyEquivalent: @""];
+ if (tree_node_is_folder( child )) {
+ NSMenu *subMenu = [[[NSMenu alloc] initWithTitle: title] autorelease];
+ NSMapInsert( nodeForMenu, subMenu, child );
+ [subMenu setDelegate: self];
+ [menu setSubmenu: subMenu forItem: item];
+ } else {
+ [item setRepresentedObject: [NSString stringWithUTF8String: tree_url_node_get_url( child )]];
+ [item setTarget: self];
+ [item setAction: @selector( openBookmarkURL: )];
+ }
+ }
+#endif
+}
+
+- (IBAction)openBookmarkURL:(id)sender
+{
+ const char *urltxt = [[sender representedObject] UTF8String];
+ NSParameterAssert(urltxt != NULL);
+
+ nsurl *url;
+ nserror error;
+
+ error = nsurl_create(urltxt, &url);
+ if (error == NSERROR_OK) {
+ BrowserViewController *tab = [(NetSurfApp *)NSApp frontTab];
+ if (tab != nil) {
+ error = browser_window_navigate([tab browser],
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ } else {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ }
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)addBookmark:(id)sender
+{
+ struct browser_window *bw = [[(NetSurfApp *)NSApp frontTab] browser];
+ if (bw != NULL) {
+ hotlist_add_url(browser_window_get_url(bw));
+ }
+}
+
+- (BOOL)validateUserInterfaceItem:(id)item
+{
+ SEL action = [item action];
+
+ if (action == @selector(addBookmark:)) {
+ return [(NetSurfApp *)NSApp frontTab] != nil;
+ }
+
+ return YES;
+}
+
+- (void)windowDidLoad
+{
+ hotlist_expand(false);
+ hotlist_contract(true);
+
+ [view setTree:tree];
+}
+
++ (void)initialize
+{
+ [[NSUserDefaults standardUserDefaults]
+ registerDefaults:
+ [NSDictionary
+ dictionaryWithObjectsAndKeys:cocoa_get_user_path(@"Bookmarks.html"),
+ kHotlistFileOption,
+ nil]];
+}
+
+- (IBAction)editSelected:(id)sender
+{
+ hotlist_edit_selection();
+}
+
+- (IBAction)deleteSelected:(id)sender
+{
+ hotlist_keypress(NS_KEY_DELETE_LEFT);
+}
+
+- (IBAction)addFolder:(id)sender
+{
+ hotlist_add_folder(NULL, false, 0);
+}
+
+@end
diff --git a/frontends/cocoa/BrowserView.h b/frontends/cocoa/BrowserView.h
new file mode 100644
index 000000000..cf1b0dc02
--- /dev/null
+++ b/frontends/cocoa/BrowserView.h
@@ -0,0 +1,50 @@
+/*
+ * 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 "cocoa/ScrollableView.h"
+
+@class LocalHistoryController;
+
+@interface BrowserView : ScrollableView <NSTextInput> {
+ struct browser_window *browser;
+
+ BOOL caretVisible;
+ BOOL hasCaret;
+ NSTimer *caretTimer;
+
+ BOOL isDragging;
+ NSPoint dragStart;
+
+ BOOL historyVisible;
+ LocalHistoryController *history;
+
+ NSString *markedText;
+}
+
+@property (readwrite, assign, nonatomic) struct browser_window *browser;
+@property (readwrite, retain, nonatomic) NSTimer *caretTimer;
+@property (readwrite, assign, nonatomic, getter=isHistoryVisible) BOOL historyVisible;
+
+- (void)removeCaret;
+- (void)addCaretAtX: (int)caretX Y: (int)caretY height: (int)caretHeight;
+
+- (void)updateHistory;
+
+@end
diff --git a/frontends/cocoa/BrowserView.m b/frontends/cocoa/BrowserView.m
new file mode 100644
index 000000000..110214d74
--- /dev/null
+++ b/frontends/cocoa/BrowserView.m
@@ -0,0 +1,738 @@
+/*
+ * 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 "utils/nsoption.h"
+#import "utils/messages.h"
+#import "utils/nsurl.h"
+#import "utils/utils.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/plotters.h"
+#import "netsurf/content.h"
+#import "netsurf/keypress.h"
+
+#import "cocoa/gui.h"
+#import "cocoa/BrowserView.h"
+#import "cocoa/HistoryView.h"
+#import "cocoa/font.h"
+#import "cocoa/coordinates.h"
+#import "cocoa/plotter.h"
+#import "cocoa/LocalHistoryController.h"
+#import "cocoa/BrowserWindowController.h"
+
+@interface BrowserView ()
+
+@property (readwrite, copy, nonatomic) NSString *markedText;
+
+@property (readwrite, nonatomic) NSRect caretRect;
+
+- (void)scrollHorizontal:(CGFloat)amount;
+- (void)scrollVertical:(CGFloat)amount;
+- (CGFloat)pageScroll;
+
+- (void)popUpContextMenuForEvent:(NSEvent *)event;
+
+- (IBAction)cmOpenURLInTab:(id)sender;
+- (IBAction)cmOpenURLInWindow:(id)sender;
+- (IBAction)cmDownloadURL:(id)sender;
+
+- (IBAction)cmLinkCopy:(id)sender;
+- (IBAction)cmImageCopy:(id)sender;
+
+@end
+
+@implementation BrowserView
+
+@synthesize browser;
+@synthesize caretTimer;
+@synthesize markedText;
+
+static const CGFloat CaretWidth = 1.0;
+static const NSTimeInterval CaretBlinkTime = 0.8;
+
+- (instancetype)initWithFrame:(NSRect)frame
+{
+ if ((self = [super initWithFrame:frame]) == nil) {
+ return nil;
+ }
+
+ [self registerForDraggedTypes:[NSArray arrayWithObjects:NSURLPboardType, @"public.url", nil]];
+
+ return self;
+}
+
+- (void)dealloc
+{
+ [self setCaretTimer:nil];
+ [self setMarkedText:nil];
+}
+
+- (void)setCaretTimer:(NSTimer *)newTimer
+{
+ if (newTimer != caretTimer) {
+ [caretTimer invalidate];
+ caretTimer = newTimer;
+ }
+}
+
+- (void)updateHistory
+{
+ [history redraw];
+}
+
+- (void)removeCaret
+{
+ hasCaret = NO;
+ [self setNeedsDisplayInRect: self.caretRect];
+
+ [self setCaretTimer:nil];
+}
+
+- (void)addCaretAtX: (int)caretX Y: (int)caretY height: (int)caretHeight
+{
+ if (hasCaret) {
+ [self setNeedsDisplayInRect:self.caretRect];
+ }
+
+ self.caretRect = cocoa_rect_wh(caretX, caretY, CaretWidth, caretHeight);
+
+ hasCaret = YES;
+ caretVisible = YES;
+
+ if (nil == caretTimer) {
+ [self setCaretTimer:[NSTimer scheduledTimerWithTimeInterval:CaretBlinkTime target:self selector:@selector(caretBlink:) userInfo:nil repeats:YES]];
+ } else {
+ [caretTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:CaretBlinkTime]];
+ }
+
+ [self setNeedsDisplayInRect:self.caretRect];
+}
+
+- (void)caretBlink:(NSTimer *)timer
+{
+ if (hasCaret) {
+ caretVisible = !caretVisible;
+ [self setNeedsDisplayInRect: self.caretRect];
+ }
+}
+
+- (void)drawRect:(NSRect)dirtyRect
+{
+ @autoreleasepool {
+
+ struct redraw_context ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &cocoa_plotters
+ };
+
+ const NSRect *rects = NULL;
+ NSInteger count = 0;
+ [self getRectsBeingDrawn:&rects count:&count];
+
+ for (NSInteger i = 0; i < count; i++) {
+ const struct rect clip = {
+ .x0 = cocoa_pt_to_px(NSMinX(rects[i])),
+ .y0 = cocoa_pt_to_px(NSMinY(rects[i])),
+ .x1 = cocoa_pt_to_px(NSMaxX(rects[i])),
+ .y1 = cocoa_pt_to_px(NSMaxY(rects[i]))
+ };
+
+ browser_window_redraw(browser, 0, 0, &clip, &ctx);
+ }
+
+ if (hasCaret && caretVisible && [self needsToDrawRect:self.caretRect]) {
+ [[NSColor blackColor] set];
+ [NSBezierPath fillRect: self.caretRect];
+ }
+ }
+}
+
+- (BOOL)isFlipped
+{
+ return YES;
+}
+
+- (void)viewDidMoveToWindow
+{
+ NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
+ options:NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect
+ owner:self
+ userInfo:nil];
+ [self addTrackingArea:area];
+}
+
+static browser_mouse_state cocoa_mouse_flags_for_event(NSEvent *evt)
+{
+ browser_mouse_state result = 0;
+ NSUInteger flags = [evt modifierFlags];
+
+ if (flags & NSEventModifierFlagShift)
+ result |= BROWSER_MOUSE_MOD_1;
+ if (flags & NSEventModifierFlagOption)
+ result |= BROWSER_MOUSE_MOD_2;
+
+ return result;
+}
+
+- (NSPoint)convertMousePoint:(NSEvent *)event
+{
+ NSPoint location = [self convertPoint:[event locationInWindow] fromView:nil];
+ float bscale = browser_window_get_scale(browser);
+
+ location.x /= bscale;
+ location.y /= bscale;
+
+ location.x = cocoa_pt_to_px(location.x);
+ location.y = cocoa_pt_to_px(location.y);
+ return location;
+}
+
+- (void)mouseDown:(NSEvent *)theEvent
+{
+ if ([theEvent modifierFlags] & NSEventModifierFlagControl) {
+ [self popUpContextMenuForEvent:theEvent];
+ return;
+ }
+
+ dragStart = [self convertMousePoint:theEvent];
+
+ browser_window_mouse_click(browser,
+ BROWSER_MOUSE_PRESS_1 | cocoa_mouse_flags_for_event(theEvent),
+ dragStart.x,
+ dragStart.y);
+}
+
+- (void)rightMouseDown:(NSEvent *)theEvent
+{
+ [self popUpContextMenuForEvent:theEvent];
+}
+
+- (void)mouseUp:(NSEvent *)theEvent
+{
+ if (historyVisible) {
+ [self setHistoryVisible:NO];
+ return;
+ }
+
+ NSPoint location = [self convertMousePoint:theEvent];
+
+ browser_mouse_state modifierFlags = cocoa_mouse_flags_for_event(theEvent);
+
+ if (isDragging) {
+ isDragging = NO;
+ browser_window_mouse_track(browser, (browser_mouse_state)0, location.x, location.y);
+ } else {
+ modifierFlags |= BROWSER_MOUSE_CLICK_1;
+ if ([theEvent clickCount] == 2)
+ modifierFlags |= BROWSER_MOUSE_DOUBLE_CLICK;
+ browser_window_mouse_click(browser, modifierFlags, location.x, location.y);
+ }
+}
+
+#define squared(x) ((x) * (x))
+#define MinDragDistance (5.0)
+
+- (void)mouseDragged:(NSEvent *)theEvent
+{
+ NSPoint location = [self convertMousePoint:theEvent];
+ browser_mouse_state modifierFlags = cocoa_mouse_flags_for_event(theEvent);
+
+ if (!isDragging) {
+ const CGFloat distance = squared(dragStart.x - location.x) + squared(dragStart.y - location.y);
+
+ if (distance >= squared(MinDragDistance)) {
+ isDragging = YES;
+ browser_window_mouse_click(browser,
+ BROWSER_MOUSE_DRAG_1 | modifierFlags,
+ dragStart.x,
+ dragStart.y);
+ }
+ }
+
+ if (isDragging) {
+ browser_window_mouse_track(browser,
+ BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON | modifierFlags,
+ location.x,
+ location.y);
+ }
+}
+
+- (void)mouseMoved:(NSEvent *)theEvent
+{
+ if (historyVisible)
+ return;
+
+ NSPoint location = [self convertMousePoint:theEvent];
+
+ browser_window_mouse_track(browser,
+ cocoa_mouse_flags_for_event(theEvent),
+ location.x,
+ location.y);
+}
+
+- (void)mouseExited:(NSEvent *)theEvent
+{
+ [[NSCursor arrowCursor] set];
+}
+
+- (void)keyDown:(NSEvent *)theEvent
+{
+ if (!historyVisible) {
+ [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+ } else {
+ [history keyDown:theEvent];
+ }
+}
+
+- (void)insertText:(id)string
+{
+ for (NSUInteger i = 0, length = [string length]; i < length; i++) {
+ unichar ch = [string characterAtIndex:i];
+ if (!browser_window_key_press(browser, ch)) {
+ if (ch == ' ')
+ [self scrollPageDown:self];
+ break;
+ }
+ }
+ [self setMarkedText:nil];
+}
+
+- (void)moveLeft:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_LEFT))
+ return;
+ [self scrollHorizontal:-[[self enclosingScrollView] horizontalLineScroll]];
+}
+
+- (void)moveRight:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_RIGHT))
+ return;
+ [self scrollHorizontal:[[self enclosingScrollView] horizontalLineScroll]];
+}
+
+- (void)moveUp:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_UP))
+ return;
+ [self scrollVertical:-[[self enclosingScrollView] lineScroll]];
+}
+
+- (void)moveDown:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_DOWN))
+ return;
+ [self scrollVertical:[[self enclosingScrollView] lineScroll]];
+}
+
+- (void)deleteBackward:(id)sender
+{
+ if (!browser_window_key_press(browser, NS_KEY_DELETE_LEFT)) {
+ [NSApp sendAction:@selector(goBack:) to:nil from:self];
+ }
+}
+
+- (void)deleteForward:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_DELETE_RIGHT);
+}
+
+- (void)cancelOperation:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_ESCAPE);
+}
+
+- (void)scrollPageUp:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_PAGE_UP)) {
+ return;
+ }
+ [self scrollVertical:-[self pageScroll]];
+}
+
+- (void)scrollPageDown:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_PAGE_DOWN)) {
+ return;
+ }
+ [self scrollVertical:[self pageScroll]];
+}
+
+- (void)insertTab:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_TAB);
+}
+
+- (void)insertBacktab:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_SHIFT_TAB);
+}
+
+- (void)moveToBeginningOfLine:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_LINE_START);
+}
+
+- (void)moveToEndOfLine:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_LINE_END);
+}
+
+- (void)moveToBeginningOfDocument:(id)sender
+{
+ if (browser_window_key_press(browser, NS_KEY_TEXT_START))
+ return;
+}
+
+- (void)scrollToBeginningOfDocument:(id)sender
+{
+ NSPoint origin = [self visibleRect].origin;
+ origin.y = 0;
+ [self scrollPoint:origin];
+}
+
+- (void)moveToEndOfDocument:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_TEXT_END);
+}
+
+- (void)scrollToEndOfDocument:(id)sender
+{
+ NSPoint origin = [self visibleRect].origin;
+ origin.y = NSHeight([self frame]);
+ [self scrollPoint:origin];
+}
+
+- (void)insertNewline:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_NL);
+}
+
+- (void)selectAll:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_SELECT_ALL);
+}
+
+- (void)copy:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_COPY_SELECTION);
+}
+
+- (void)cut:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_CUT_SELECTION);
+}
+
+- (void)paste:(id)sender
+{
+ browser_window_key_press(browser, NS_KEY_PASTE);
+}
+
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- (void)adjustFrame
+{
+ browser_window_schedule_reformat(browser);
+
+ [super adjustFrame];
+}
+
+- (BOOL)isHistoryVisible
+{
+ return historyVisible;
+}
+
+- (void)setHistoryVisible:(BOOL)newVisible
+{
+ if (newVisible == historyVisible)
+ return;
+ historyVisible = newVisible;
+
+ if (historyVisible) {
+ if (nil == history) {
+ history = [[LocalHistoryController alloc] initWithBrowser:self];
+ }
+ [history attachToView:[(BrowserWindowController *)[[self window] windowController] historyButton]];
+ } else {
+ [history detach];
+ }
+}
+
+- (void)scrollHorizontal:(CGFloat)amount
+{
+ NSPoint currentPoint = [self visibleRect].origin;
+ currentPoint.x += amount;
+ [self scrollPoint:currentPoint];
+}
+
+- (void)scrollVertical:(CGFloat)amount
+{
+ NSPoint currentPoint = [self visibleRect].origin;
+ currentPoint.y += amount;
+ [self scrollPoint:currentPoint];
+}
+
+- (CGFloat)pageScroll
+{
+ return NSHeight([[self superview] frame]) - [[self enclosingScrollView] pageScroll];
+}
+
+- (void)popUpContextMenuForEvent:(NSEvent *)event
+{
+ NSMenu *popupMenu = [[NSMenu alloc] initWithTitle:@""];
+ NSPoint point = [self convertMousePoint:event];
+
+ struct browser_window_features cont;
+
+ browser_window_get_features(browser, point.x, point.y, &cont);
+
+ if (cont.object != NULL) {
+ NSString *imageURL = [NSString stringWithUTF8String:nsurl_access(hlcache_handle_get_url(cont.object))];
+
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Open image in new tab", @"Context menu")
+ action:@selector(cmOpenURLInTab:)
+ keyEquivalent:@""] setRepresentedObject:imageURL];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Open image in new window", @"Context menu")
+ action:@selector(cmOpenURLInWindow:)
+ keyEquivalent:@""] setRepresentedObject:imageURL];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Save image as", @"Context menu")
+ action:@selector(cmDownloadURL:)
+ keyEquivalent:@""] setRepresentedObject:imageURL];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Copy image", @"Context menu")
+ action:@selector(cmImageCopy:)
+ keyEquivalent:@""] setRepresentedObject:(__bridge id)content_get_bitmap(cont.object)];
+
+ [popupMenu addItem:[NSMenuItem separatorItem]];
+ }
+
+ if (cont.link != NULL) {
+ NSString *target = [NSString stringWithUTF8String:nsurl_access(cont.link)];
+
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Open link in new tab", @"Context menu")
+ action:@selector(cmOpenURLInTab:)
+ keyEquivalent:@""] setRepresentedObject:target];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Open link in new window", @"Context menu")
+ action:@selector(cmOpenURLInWindow:)
+ keyEquivalent:@""] setRepresentedObject:target];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Save link target", @"Context menu")
+ action:@selector(cmDownloadURL:)
+ keyEquivalent:@""] setRepresentedObject:target];
+ [[popupMenu addItemWithTitle:NSLocalizedString(@"Copy link", @"Context menu")
+ action:@selector(cmLinkCopy:)
+ keyEquivalent:@""] setRepresentedObject:target];
+
+ [popupMenu addItem:[NSMenuItem separatorItem]];
+ }
+
+ [popupMenu addItemWithTitle:NSLocalizedString(@"Back", @"Context menu")
+ action:@selector(goBack:)
+ keyEquivalent:@""];
+ [popupMenu addItemWithTitle:NSLocalizedString(@"Reload", @"Context menu")
+ action:@selector(reloadPage:)
+ keyEquivalent:@""];
+ [popupMenu addItemWithTitle:NSLocalizedString(@"Forward", @"Context menu")
+ action:@selector(goForward:)
+ keyEquivalent:@""];
+ [popupMenu addItemWithTitle:NSLocalizedString(@"View Source", @"Context menu")
+ action:@selector(viewSource:)
+ keyEquivalent:@""];
+
+ [NSMenu popUpContextMenu:popupMenu withEvent:event forView:self];
+}
+
+- (IBAction)cmOpenURLInTab:(id)sender
+{
+ nsurl *url;
+ nserror error;
+
+ error = nsurl_create([[sender representedObject] UTF8String], &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY | BW_CREATE_TAB | BW_CREATE_CLONE,
+ url,
+ NULL,
+ browser,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)cmOpenURLInWindow:(id)sender
+{
+ nsurl *url;
+ nserror error;
+
+ error = nsurl_create([[sender representedObject] UTF8String], &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY | BW_CREATE_CLONE,
+ url,
+ NULL,
+ browser,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)cmDownloadURL:(id)sender
+{
+ nsurl *url;
+
+ if (nsurl_create([[sender representedObject] UTF8String], &url) == NSERROR_OK) {
+ browser_window_navigate(browser,
+ url,
+ NULL,
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+}
+
+- (IBAction)cmImageCopy:(id)sender
+{
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+ [pb declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:nil];
+ [pb setData:[[sender representedObject] TIFFRepresentation] forType:NSTIFFPboardType];
+}
+
+- (IBAction)cmLinkCopy:(id)sender
+{
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+ [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
+ [pb setString:[sender representedObject] forType:NSStringPboardType];
+}
+
+// MARK: -
+// MARK: Accepting dragged URLs
+
+- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
+{
+ if ((NSDragOperationCopy | NSDragOperationGeneric) & [sender draggingSourceOperationMask]) {
+ return NSDragOperationCopy;
+ }
+
+ return NSDragOperationNone;
+}
+
+- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender
+{
+ return YES;
+}
+
+- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
+{
+ nsurl *url;
+ nserror error;
+
+ NSPasteboard *pb = [sender draggingPasteboard];
+
+ NSString *type = [pb availableTypeFromArray:[NSArray arrayWithObjects:@"public.url", NSURLPboardType, nil]];
+
+ NSString *urlstr = nil;
+
+ if ([type isEqualToString:NSURLPboardType]) {
+ urlstr = [[NSURL URLFromPasteboard:pb] absoluteString];
+ } else {
+ urlstr = [pb stringForType:type];
+ }
+
+ error = nsurl_create([urlstr UTF8String], &url);
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ } else {
+ browser_window_navigate(browser,
+ url,
+ NULL,
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+
+ return YES;
+}
+
+// MARK: -
+// MARK: NSTextInput protocol implementation
+
+- (void)setMarkedText:(id)aString selectedRange:(NSRange)selRange
+{
+ markedText = [aString isEqualToString:@""] ? nil : [aString copy];
+}
+
+- (void)unmarkText
+{
+ [self setMarkedText:nil];
+}
+
+- (BOOL)hasMarkedText
+{
+ return markedText != nil;
+}
+
+- (NSInteger)conversationIdentifier
+{
+ return (NSInteger)self;
+}
+
+- (NSAttributedString *)attributedSubstringFromRange:(NSRange)theRange
+{
+ return [[NSAttributedString alloc] initWithString:@""];
+}
+
+- (NSRange)markedRange
+{
+ return NSMakeRange(NSNotFound, 0);
+}
+
+- (NSRange)selectedRange
+{
+ return NSMakeRange(NSNotFound, 0);
+}
+
+- (NSRect)firstRectForCharacterRange:(NSRange)theRange
+{
+ return NSZeroRect;
+}
+
+- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint
+{
+ return 0;
+}
+
+- (NSArray *)validAttributesForMarkedText
+{
+ return [NSArray array];
+}
+
+- (void)doCommandBySelector:(SEL)sel
+{
+ [super doCommandBySelector:sel];
+}
+
+@end
diff --git a/frontends/cocoa/BrowserViewController.h b/frontends/cocoa/BrowserViewController.h
new file mode 100644
index 000000000..f499c05b3
--- /dev/null
+++ b/frontends/cocoa/BrowserViewController.h
@@ -0,0 +1,73 @@
+/*
+ * 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>
+
+struct browser_window;
+@class BrowserView;
+@class BrowserWindowController;
+
+@interface BrowserViewController : NSViewController {
+ struct browser_window *browser;
+ NSString *url;
+ BrowserWindowController *windowController;
+ NSString *title;
+ NSString *status;
+ BOOL isProcessing;
+ NSImage *favicon;
+ BOOL canGoBack;
+ BOOL canGoForward;
+}
+
+@property (readwrite, assign, nonatomic) struct browser_window *browser;
+@property (readwrite, copy, nonatomic) NSString *url;
+@property (readwrite, assign, nonatomic) IBOutlet BrowserView *browserView;
+@property (readwrite, retain, nonatomic) BrowserWindowController *windowController;
+@property (readwrite, copy) NSString *title;
+@property (readwrite, copy, nonatomic) NSString *status;
+@property (readwrite, assign, nonatomic) BOOL isProcessing;
+@property (readwrite, copy, nonatomic) NSImage *favicon;
+@property (readwrite, assign, nonatomic) BOOL canGoBack;
+@property (readwrite, assign, nonatomic) BOOL canGoForward;
+
+- (id)initWithBrowser:(struct browser_window *)bw;
+
+- (void)contentUpdated;
+- (void)updateBackForward;
+
+- (IBAction)navigate:(id)sender;
+
+- (IBAction)backForwardSelected:(id)sender;
+
+- (IBAction)goHome:(id)sender;
+
+- (IBAction)goBack:(id)sender;
+- (IBAction)goForward:(id)sender;
+- (IBAction)reloadPage:(id)sender;
+- (IBAction)stopLoading:(id)sender;
+
+- (IBAction)zoomIn:(id)sender;
+- (IBAction)zoomOut:(id)sender;
+- (IBAction)zoomOriginal:(id)sender;
+
+- (IBAction)viewSource:(id)sender;
+
+- (void)buildBackMenu:(NSMenu *)menu;
+- (void)buildForwardMenu:(NSMenu *)menu;
+
+@end
diff --git a/frontends/cocoa/BrowserViewController.m b/frontends/cocoa/BrowserViewController.m
new file mode 100644
index 000000000..9848654f8
--- /dev/null
+++ b/frontends/cocoa/BrowserViewController.m
@@ -0,0 +1,357 @@
+/*
+ * 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 "utils/nsoption.h"
+#import "utils/corestrings.h"
+#import "utils/filename.h"
+#import "utils/file.h"
+#import "utils/messages.h"
+#import "utils/nsurl.h"
+#import "netsurf/content.h"
+#import "netsurf/browser_window.h"
+#import "desktop/browser_history.h"
+
+#import "cocoa/gui.h"
+#import "cocoa/BrowserViewController.h"
+#import "cocoa/BrowserView.h"
+#import "cocoa/BrowserWindowController.h"
+#import "cocoa/fetch.h"
+
+@implementation BrowserViewController
+
+@synthesize browser;
+@synthesize url;
+@synthesize browserView;
+@synthesize windowController;
+@synthesize title;
+@synthesize status;
+@synthesize isProcessing;
+@synthesize favicon;
+@synthesize canGoBack;
+@synthesize canGoForward;
+
+- (instancetype)initWithBrowser:(struct browser_window *)bw
+{
+ if ((self = [super initWithNibName:@"Browser" bundle:nil]) == nil) {
+ return nil;
+ }
+
+ browser = bw;
+
+ return self;
+}
+
+- (IBAction)navigate:(id)sender
+{
+ nsurl *urlns;
+ nserror error;
+
+ error = nsurl_create([url UTF8String], &urlns);
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ } else {
+ browser_window_navigate(browser,
+ urlns,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(urlns);
+ }
+}
+
+- (void)awakeFromNib
+{
+ [browserView setBrowser:browser];
+}
+
+- (IBAction)zoomIn:(id)sender
+{
+ browser_window_set_scale(browser,
+ browser_window_get_scale(browser) * 1.1,
+ true);
+}
+
+- (IBAction)zoomOut:(id)sender
+{
+ browser_window_set_scale(browser,
+ browser_window_get_scale(browser) * 0.9,
+ true);
+}
+
+- (IBAction)zoomOriginal:(id)sender
+{
+ browser_window_set_scale(browser,
+ (float)nsoption_int(scale) / 100.0,
+ true);
+}
+
+- (IBAction)backForwardSelected:(id)sender
+{
+ if ([sender selectedSegment] == 0) {
+ [self goBack:sender];
+ } else {
+ [self goForward:sender];
+ }
+}
+
+- (IBAction)goBack:(id)sender
+{
+ if (browser && browser_window_history_back_available(browser)) {
+ browser_window_history_back(browser, false);
+ [self updateBackForward];
+ }
+}
+
+- (IBAction)goForward:(id)sender
+{
+ if (browser && browser_window_history_forward_available(browser)) {
+ browser_window_history_forward(browser, false);
+ [self updateBackForward];
+ }
+}
+
+- (IBAction)goHome:(id)sender
+{
+ nsurl *urlns;
+ nserror error;
+
+ error = nsurl_create(nsoption_charp(homepage_url), &urlns);
+ if (error == NSERROR_OK) {
+ error = browser_window_navigate(browser,
+ urlns,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(urlns);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)reloadPage:(id)sender
+{
+ browser_window_reload(browser, true);
+}
+
+- (IBAction)stopLoading:(id)sender
+{
+ browser_window_stop(browser);
+}
+
+- (IBAction)viewSource:(id)sender
+{
+ struct hlcache_handle *content;
+ size_t size;
+ const char *source;
+ char *path = NULL;
+
+ if (browser == NULL) {
+ return;
+ }
+ content = browser_window_get_content(browser);
+ if (content == NULL) {
+ return;
+ }
+ source = content_get_source_data(content, &size);
+ if (source == NULL) {
+ return;
+ }
+
+ /* try to load local files directly. */
+ netsurf_nsurl_to_path(hlcache_handle_get_url(content), &path);
+
+ if (path == NULL) {
+ /* We cannot release the requested filename until after it
+ * has finished being used. As we can't easily find out when
+ * this is, we simply don't bother releasing it and simply
+ * allow it to be re-used next time NetSurf is started. The
+ * memory overhead from doing this is under 1 byte per
+ * filename. */
+ const char *filename = filename_request();
+ const char *extension = "txt";
+ fprintf(stderr, "filename '%p'\n", filename);
+ if (filename == NULL)
+ return;
+ lwc_string *str = content_get_mime_type(content);
+ if (str) {
+ NSString *mime = [NSString stringWithUTF8String:lwc_string_data(str)];
+ NSString *uti = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (__bridge CFStringRef)mime, NULL);
+ NSString *ext = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)uti, kUTTagClassFilenameExtension);
+ extension = [ext UTF8String];
+ lwc_string_unref(str);
+ }
+
+ NSURL *dataUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%s.%s", filename, extension]
+ relativeToURL:[NSURL fileURLWithPath:@TEMP_FILENAME_PREFIX]];
+
+ NSData *data = [NSData dataWithBytes:source length:size];
+ [data writeToURL:dataUrl atomically:NO];
+ path = (char *)[[dataUrl path] UTF8String];
+ }
+
+ if (path) {
+ NSString *p = [NSString stringWithUTF8String:path];
+ NSWorkspace *ws = [NSWorkspace sharedWorkspace];
+ [ws openFile:p withApplication:@"Xcode"];
+ }
+}
+
+static inline bool
+compare_float(float a, float b)
+{
+ const float epsilon = 0.00001;
+
+ if (a == b) {
+ return true;
+ }
+
+ return fabs((a - b) / b) <= epsilon;
+}
+
+- (BOOL)validateUserInterfaceItem:(id)item
+{
+ SEL action = [item action];
+
+ if (action == @selector(copy:)) {
+ return browser_window_get_editor_flags(browser) & BW_EDITOR_CAN_COPY;
+ }
+
+ if (action == @selector(cut:)) {
+ return browser_window_get_editor_flags(browser) & BW_EDITOR_CAN_CUT;
+ }
+
+ if (action == @selector(paste:)) {
+ return browser_window_get_editor_flags(browser) & BW_EDITOR_CAN_PASTE;
+ }
+
+ if (action == @selector(stopLoading:)) {
+ return browser_window_stop_available(browser);
+ }
+
+ if (action == @selector(zoomOriginal:)) {
+ return !compare_float(browser_window_get_scale(browser), (float)nsoption_int(scale) / 100.0);
+ }
+
+ if (action == @selector(goBack:)) {
+ return canGoBack;
+ }
+
+ if (action == @selector(goForward:)) {
+ return canGoForward;
+ }
+
+ return YES;
+}
+
+- (void)updateBackForward
+{
+ [browserView updateHistory];
+ [self setCanGoBack:browser != NULL && browser_window_history_back_available(browser)];
+ [self setCanGoForward:browser != NULL && browser_window_history_forward_available(browser)];
+}
+
+- (void)contentUpdated
+{
+ [browserView updateHistory];
+}
+
+struct history_add_menu_item_data {
+ NSInteger index;
+ void *menu;
+ void *target;
+};
+
+static NSMenu *get_menu(const struct history_add_menu_item_data *data)
+{
+ return (__bridge NSMenu *)data->menu;
+}
+
+static id get_target(const struct history_add_menu_item_data *data)
+{
+ return (__bridge id)data->target;
+}
+
+static bool
+history_add_menu_item_cb(const struct browser_window *bw,
+ int x0, int y0, int x1, int y1,
+ const struct history_entry *page,
+ void *user_data)
+{
+ struct history_add_menu_item_data *data = user_data;
+
+ NSMenuItem *item = nil;
+ if (data->index < [get_menu(data) numberOfItems]) {
+ item = [get_menu(data) itemAtIndex:data->index];
+ } else {
+ item = [[NSMenuItem alloc] initWithTitle:@""
+ action:@selector(historyItemSelected:)
+ keyEquivalent:@""];
+ [get_menu(data) addItem:item];
+ }
+ ++data->index;
+
+ [item setTarget:get_target(data)];
+ [item setTitle:[NSString stringWithUTF8String:browser_window_history_entry_get_title(page)]];
+ [item setRepresentedObject:[NSValue valueWithPointer:page]];
+
+ return true;
+}
+
+- (IBAction)historyItemSelected:(id)sender
+{
+ struct history_entry *entry = [[sender representedObject] pointerValue];
+ browser_window_history_go(browser, entry, false);
+ [self updateBackForward];
+}
+
+- (void)buildBackMenu:(NSMenu *)menu
+{
+ struct history_add_menu_item_data data = {
+ .index = 0,
+ .menu = (__bridge void *)menu,
+ .target = (__bridge void *)self
+ };
+ browser_window_history_enumerate_back(browser,
+ history_add_menu_item_cb,
+ &data);
+ while (data.index < [menu numberOfItems]) {
+ [menu removeItemAtIndex:data.index];
+ }
+}
+
+- (void)buildForwardMenu:(NSMenu *)menu
+{
+ struct history_add_menu_item_data data = {
+ .index = 0,
+ .menu = (__bridge void *)menu,
+ .target = (__bridge void *)self
+ };
+ browser_window_history_enumerate_forward(browser,
+ history_add_menu_item_cb,
+ &data);
+ while (data.index < [menu numberOfItems]) {
+ [menu removeItemAtIndex:data.index];
+ }
+}
+
+@end
diff --git a/frontends/cocoa/BrowserWindow.h b/frontends/cocoa/BrowserWindow.h
new file mode 100644
index 000000000..b0810c79f
--- /dev/null
+++ b/frontends/cocoa/BrowserWindow.h
@@ -0,0 +1,22 @@
+/*
+ * 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>
+
+@interface BrowserWindow : NSWindow
+@end
diff --git a/frontends/cocoa/BrowserWindow.m b/frontends/cocoa/BrowserWindow.m
new file mode 100644
index 000000000..c50e66a87
--- /dev/null
+++ b/frontends/cocoa/BrowserWindow.m
@@ -0,0 +1,29 @@
+/*
+ * 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/BrowserWindow.h"
+#import "cocoa/BrowserWindowController.h"
+
+@implementation BrowserWindow
+
+- (void)performClose:(id)sender
+{
+ [self.windowController closeCurrentTab:sender];
+}
+
+@end
diff --git a/frontends/cocoa/BrowserWindowController.h b/frontends/cocoa/BrowserWindowController.h
new file mode 100644
index 000000000..4cbe02f21
--- /dev/null
+++ b/frontends/cocoa/BrowserWindowController.h
@@ -0,0 +1,47 @@
+/*
+ * 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>
+
+@class PSMTabBarControl;
+@class BrowserViewController;
+@class URLFieldCell;
+
+@interface BrowserWindowController : NSWindowController
+
+@property (readwrite, assign, nonatomic) IBOutlet PSMTabBarControl *tabBar;
+@property (readwrite, assign, nonatomic) IBOutlet NSTabView *tabView;
+@property (readwrite, assign, nonatomic) IBOutlet URLFieldCell *urlField;
+@property (readwrite, assign, nonatomic) IBOutlet NSObjectController *activeBrowserController;
+@property (readwrite, assign, nonatomic) IBOutlet NSSegmentedControl *navigationControl;
+@property (readwrite, assign, nonatomic) IBOutlet NSButton *historyButton;
+@property (readwrite, assign, nonatomic) IBOutlet NSMenu *historyBackMenu;
+@property (readwrite, assign, nonatomic) IBOutlet NSMenu *historyForwardMenu;
+
+@property (readwrite, assign, nonatomic) BrowserViewController *activeBrowser;
+
+@property (readwrite, assign, nonatomic) BOOL canGoBack;
+@property (readwrite, assign, nonatomic) BOOL canGoForward;
+
+- (IBAction)newTab:(id)sender;
+- (IBAction)closeCurrentTab:(id)sender;
+
+- (void)addTab:(BrowserViewController *)browser;
+- (void)removeTab:(BrowserViewController *)browser;
+
+@end
diff --git a/frontends/cocoa/BrowserWindowController.m b/frontends/cocoa/BrowserWindowController.m
new file mode 100644
index 000000000..f44e4fb5b
--- /dev/null
+++ b/frontends/cocoa/BrowserWindowController.m
@@ -0,0 +1,262 @@
+/*
+ * 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 "netsurf/browser_window.h"
+#import "utils/nsoption.h"
+#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsurl.h"
+
+#import "cocoa/BrowserWindowController.h"
+
+#import "cocoa/BrowserViewController.h"
+#import "cocoa/PSMTabBarControl/PSMTabBarControl.h"
+#import "cocoa/PSMTabBarControl/PSMRolloverButton.h"
+#import "cocoa/URLFieldCell.h"
+#import "cocoa/gui.h"
+#import "cocoa/NetsurfApp.h"
+
+@interface BrowserWindowController ()
+
+- (void)canCloseAlertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo;
+
+@end
+
+@implementation BrowserWindowController
+
+@synthesize tabBar;
+@synthesize tabView;
+@synthesize urlField;
+@synthesize navigationControl;
+@synthesize historyButton;
+@synthesize historyBackMenu;
+@synthesize historyForwardMenu;
+
+@synthesize activeBrowser;
+@synthesize activeBrowserController;
+
+- (id)init
+{
+ if (nil == (self = [super initWithWindowNibName:@"BrowserWindow"]))
+ return nil;
+
+ return self;
+}
+
+- (void)awakeFromNib
+{
+ [tabBar setShowAddTabButton:YES];
+ [tabBar setTearOffStyle:PSMTabBarTearOffMiniwindow];
+ [tabBar setCanCloseOnlyTab:YES];
+ [tabBar setHideForSingleTab:YES];
+
+ NSButton *b = [tabBar addTabButton];
+ [b setTarget:self];
+ [b setAction:@selector(newTab:)];
+
+ [urlField setRefreshAction:@selector(reloadPage:)];
+ [urlField bind:@"favicon" toObject:activeBrowserController withKeyPath:@"selection.favicon" options:nil];
+
+ [self bind:@"canGoBack"
+ toObject:activeBrowserController
+ withKeyPath:@"selection.canGoBack"
+ options:nil];
+ [self bind:@"canGoForward"
+ toObject:activeBrowserController
+ withKeyPath:@"selection.canGoForward"
+ options:nil];
+
+ [navigationControl setMenu:historyBackMenu forSegment:0];
+ [navigationControl setMenu:historyForwardMenu forSegment:1];
+}
+
+- (void)addTab:(BrowserViewController *)browser
+{
+ NSTabViewItem *item = [[NSTabViewItem alloc] initWithIdentifier:browser];
+
+ [item setView:[browser view]];
+ [item bind:@"label" toObject:browser withKeyPath:@"title" options:nil];
+
+ [tabView addTabViewItem:item];
+ [browser setWindowController:self];
+
+ [tabView selectTabViewItem:item];
+}
+
+- (void)removeTab:(BrowserViewController *)browser
+{
+ NSUInteger itemIndex = [tabView indexOfTabViewItemWithIdentifier:browser];
+ if (itemIndex != NSNotFound) {
+ NSTabViewItem *item = [tabView tabViewItemAtIndex:itemIndex];
+ [tabView removeTabViewItem:item];
+ [browser setWindowController:nil];
+ }
+}
+
+- (BOOL)windowShouldClose:(NSWindow *)window
+{
+ if (tabView.numberOfTabViewItems <= 1 || [[NSUserDefaults standardUserDefaults] boolForKey:kAlwaysCloseMultipleTabs]) {
+ return YES;
+ }
+
+ NSAlert *ask = [[NSAlert alloc] init];
+ ask.messageText = NSLocalizedString(@"Do you really want to close this window?", nil);
+ [ask addButtonWithTitle:NSLocalizedString(@"Yes", @"'Yes' button")];
+ [ask addButtonWithTitle:NSLocalizedString(@"No", @"'No' button")];
+ ask.informativeText = [NSString localizedStringWithFormat:NSLocalizedString(@"There are %d tabs open, do you want to close them all?", nil), tabView.numberOfTabViewItems];
+ ask.showsSuppressionButton = YES;
+
+ [ask beginSheetModalForWindow:window
+ completionHandler:^(NSModalResponse returnCode) {
+ if (returnCode != NSAlertFirstButtonReturn) {
+ return;
+ }
+
+ [[NSUserDefaults standardUserDefaults] setBool:[[ask suppressionButton] state] == NSOnState
+ forKey:kAlwaysCloseMultipleTabs];
+ [self.window close];
+
+ }];
+
+ return NO;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ for (NSTabViewItem *tab in [tabView tabViewItems]) {
+ [tabView removeTabViewItem:tab];
+ }
+}
+
+- (id)supplementalTargetForAction:(SEL)action sender:(id)sender
+{
+ if ([self.activeBrowser respondsToSelector:action]) {
+ return activeBrowser;
+ }
+
+ return [super supplementalTargetForAction:action sender:sender];
+}
+
+- (IBAction)newTab:(id)sender
+{
+ nsurl *url;
+ nserror error;
+
+ if (nsoption_charp(homepage_url) != NULL) {
+ error = nsurl_create(nsoption_charp(homepage_url), &url);
+ } else {
+ error = nsurl_create(NETSURF_HOMEPAGE, &url);
+ }
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY | BW_CREATE_TAB,
+ url,
+ NULL,
+ [activeBrowser browser],
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)closeCurrentTab:(id)sender
+{
+ [self removeTab:activeBrowser];
+ if (tabView.numberOfTabViewItems == 0) {
+ [self.window close];
+ }
+}
+
+- (void)setCanGoBack:(BOOL)can
+{
+ [navigationControl setEnabled:can forSegment:0];
+}
+
+- (BOOL)canGoBack
+{
+ return [navigationControl isEnabledForSegment:0];
+}
+
+- (void)setCanGoForward:(BOOL)can
+{
+ [navigationControl setEnabled:can forSegment:1];
+}
+
+- (BOOL)canGoForward
+{
+ return [navigationControl isEnabledForSegment:1];
+}
+
+- (void)windowDidBecomeMain:(NSNotification *)note
+{
+ [(NetSurfApp *)NSApp setFrontTab:[[tabView selectedTabViewItem] identifier]];
+}
+
+- (void)menuNeedsUpdate:(NSMenu *)menu
+{
+ if (menu == historyBackMenu) {
+ [activeBrowser buildBackMenu:menu];
+ } else if (menu == historyForwardMenu) {
+ [activeBrowser buildForwardMenu:menu];
+ }
+}
+
+#pragma mark -
+#pragma mark Tab bar delegate
+
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ [self setActiveBrowser:[tabViewItem identifier]];
+ if ([[self window] isMainWindow]) {
+ [(NetSurfApp *)NSApp setFrontTab:[tabViewItem identifier]];
+ }
+}
+
+- (BOOL)tabView:(NSTabView *)aTabView shouldDragTabViewItem:(NSTabViewItem *)tabViewItem fromTabBar:(PSMTabBarControl *)tabBarControl
+{
+ return [aTabView numberOfTabViewItems] > 1;
+}
+
+- (BOOL)tabView:(NSTabView *)aTabView shouldDropTabViewItem:(NSTabViewItem *)tabViewItem inTabBar:(PSMTabBarControl *)tabBarControl
+{
+ [[tabViewItem identifier] setWindowController:self];
+ return YES;
+}
+
+- (PSMTabBarControl *)tabView:(NSTabView *)aTabView newTabBarForDraggedTabViewItem:(NSTabViewItem *)tabViewItem atPoint:(NSPoint)point
+{
+ BrowserWindowController *newWindow = [[BrowserWindowController alloc] init];
+ [[tabViewItem identifier] setWindowController:newWindow];
+ [[newWindow window] setFrameOrigin:point];
+ return newWindow->tabBar;
+}
+
+- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ [tabViewItem unbind:@"label"];
+
+ if (activeBrowser == [tabViewItem identifier]) {
+ [self setActiveBrowser:nil];
+ [(NetSurfApp *)NSApp setFrontTab:nil];
+ }
+
+ browser_window_destroy([[tabViewItem identifier] browser]);
+}
+
+@end
diff --git a/frontends/cocoa/DownloadWindowController.h b/frontends/cocoa/DownloadWindowController.h
new file mode 100644
index 000000000..2cc36ed19
--- /dev/null
+++ b/frontends/cocoa/DownloadWindowController.h
@@ -0,0 +1,53 @@
+/*
+ * 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>
+
+struct gui_download_table *cocoa_download_table;
+
+@interface DownloadWindowController : NSWindowController {
+ struct download_context *context;
+ unsigned long totalSize;
+ unsigned long receivedSize;
+
+ NSURL *url;
+ NSString *mimeType;
+ NSURL *saveURL;
+ NSFileHandle *outputFile;
+ NSMutableData *savedData;
+ NSDate *startDate;
+
+ BOOL canClose;
+ BOOL shouldClose;
+}
+
+@property (readwrite, copy, nonatomic) NSURL *URL;
+@property (readwrite, copy, nonatomic) NSString *MIMEType;
+@property (readwrite, assign, nonatomic) unsigned long totalSize;
+@property (readwrite, copy, nonatomic) NSURL *saveURL;
+@property (readwrite, assign, nonatomic) unsigned long receivedSize;
+
+@property (readonly, nonatomic) NSString *fileName;
+@property (readonly, nonatomic) NSImage *icon;
+@property (readonly, nonatomic) NSString *statusText;
+
+- (id)initWithContext:(struct download_context *)ctx;
+
+- (void)abort;
+
+@end
diff --git a/frontends/cocoa/DownloadWindowController.m b/frontends/cocoa/DownloadWindowController.m
new file mode 100644
index 000000000..8850327b9
--- /dev/null
+++ b/frontends/cocoa/DownloadWindowController.m
@@ -0,0 +1,414 @@
+/*
+ * 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 "utils/log.h"
+#import "utils/nsurl.h"
+#import "desktop/download.h"
+#import "netsurf/download.h"
+
+#import "cocoa/DownloadWindowController.h"
+#import "cocoa/gui.h"
+
+@interface DownloadWindowController ()
+
+@property (readwrite, retain, nonatomic) NSFileHandle *outputFile;
+@property (readwrite, retain, nonatomic) NSMutableData *savedData;
+@property (readwrite, copy, nonatomic) NSDate *startDate;
+
+- (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
+- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
+- (void)askCancelDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
+
+- (BOOL)receivedData:(NSData *)data;
+
+- (void)showError:(NSString *)error;
+- (void)downloadDone;
+- (void)removeIfPossible;
+
+@end
+
+static void cocoa_unregister_download(DownloadWindowController *download);
+static void cocoa_register_download(DownloadWindowController *download);
+
+@implementation DownloadWindowController
+
+- (id)initWithContext:(struct download_context *)ctx
+{
+ if ((self = [super initWithWindowNibName:@"DownloadWindow"]) == nil) {
+ return nil;
+ }
+
+ context = ctx;
+ totalSize = download_context_get_total_length(context);
+ [self setURL:[NSURL URLWithString:[NSString stringWithUTF8String:nsurl_access(download_context_get_url(context))]]];
+ [self setMIMEType:[NSString stringWithUTF8String:download_context_get_mime_type(context)]];
+ [self setStartDate:[NSDate date]];
+
+ return self;
+}
+
+- (void)dealloc
+{
+ download_context_destroy(context);
+}
+
+- (void)abort
+{
+ download_context_abort(context);
+ [self removeIfPossible];
+}
+
+- (void)askForSave
+{
+ canClose = NO;
+ [[NSSavePanel savePanel]
+ beginSheetForDirectory:nil
+ file:[NSString stringWithUTF8String:download_context_get_filename(context)]
+ modalForWindow:[self window]
+ modalDelegate:self
+ didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:)
+ contextInfo:NULL];
+}
+
+- (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
+{
+ canClose = YES;
+
+ if (returnCode == NSModalResponseCancel) {
+ [self abort];
+ return;
+ }
+
+ NSURL *targetURL = [sheet URL];
+ NSString *path = [targetURL path];
+
+ [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
+
+ FSRef ref;
+ if (CFURLGetFSRef((CFURLRef)targetURL, &ref)) {
+ NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
+ url, (NSString *)kLSQuarantineDataURLKey,
+ (NSString *)kLSQuarantineTypeWebDownload, (NSString *)kLSQuarantineTypeKey,
+ nil];
+ LSSetItemAttribute(&ref, kLSRolesAll, kLSItemQuarantineProperties, (__bridge CFDictionaryRef)attributes);
+ NSLOG(netsurf, INFO, "Set quarantine attributes on file %s", [path UTF8String]);
+ }
+
+ [self setOutputFile:[NSFileHandle fileHandleForWritingAtPath:path]];
+ [self setSaveURL:targetURL];
+
+ NSWindow *win = [self window];
+ [win setRepresentedURL:targetURL];
+ [win setTitle:[self fileName]];
+
+ if (nil == outputFile) {
+ [self performSelector:@selector(showError:) withObject:@"Cannot create file" afterDelay:0];
+ return;
+ }
+
+ if (nil != savedData) {
+ [outputFile writeData:savedData];
+ [self setSavedData:nil];
+ }
+
+ [self removeIfPossible];
+}
+
+- (BOOL)receivedData:(NSData *)data
+{
+ if (outputFile) {
+ [outputFile writeData:data];
+ } else {
+ if (nil == savedData) {
+ [self setSavedData:[NSMutableData data]];
+ }
+ [savedData appendData:data];
+ }
+
+ [self setReceivedSize:receivedSize + [data length]];
+
+ return YES;
+}
+
+- (void)showError:(NSString *)error
+{
+ canClose = NO;
+ NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Error", @"show error")
+ defaultButton:NSLocalizedString(@"OK", @"'OK' button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:@"%@", error];
+
+ [alert beginSheetModalForWindow:[self window]
+ modalDelegate:self
+ didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
+ contextInfo:NULL];
+}
+
+- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
+{
+ [self abort];
+}
+
+- (void)removeIfPossible
+{
+ if (canClose && shouldClose) {
+ cocoa_unregister_download(self);
+ }
+}
+- (void)downloadDone
+{
+ shouldClose = YES;
+ [self removeIfPossible];
+}
+
+- (BOOL)windowShouldClose:(id)sender
+{
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:kAlwaysCancelDownload]) {
+ return YES;
+ }
+
+ NSAlert *ask = [NSAlert alertWithMessageText:NSLocalizedString(@"Cancel download?", @"Download")
+ defaultButton:NSLocalizedString(@"Yes", @"")
+ alternateButton:NSLocalizedString(@"No", @"")
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"Should the download of '%@' really be cancelled?", @"Download"),
+ [self fileName]];
+ [ask setShowsSuppressionButton:YES];
+ [ask beginSheetModalForWindow:[self window]
+ modalDelegate:self
+ didEndSelector:@selector(askCancelDidEnd:returnCode:contextInfo:)
+ contextInfo:NULL];
+ return NO;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ [self abort];
+}
+
+- (void)askCancelDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
+{
+ if (returnCode == NSModalResponseOK) {
+ [[NSUserDefaults standardUserDefaults]
+ setBool:[[alert suppressionButton] state] == NSOnState
+ forKey:kAlwaysCancelDownload];
+ [self close];
+ }
+}
+
+#pragma mark -
+#pragma mark Properties
+
+@synthesize URL = url;
+@synthesize MIMEType = mimeType;
+@synthesize totalSize;
+@synthesize saveURL;
+@synthesize outputFile;
+@synthesize savedData;
+@synthesize receivedSize;
+@synthesize startDate;
+
++ (NSSet *)keyPathsForValuesAffectingStatusText
+{
+ return [NSSet setWithObjects:@"totalSize", @"receivedSize", nil];
+}
+
+#ifndef NSAppKitVersionNumber10_5
+#define NSAppKitVersionNumber10_5 949
+#endif
+
+static NSString *cocoa_file_size_string(float size)
+{
+ static unsigned factor = 0;
+ if (factor == 0) {
+ if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
+ factor = 1000;
+ } else {
+ factor = 1024;
+ }
+ }
+
+ if (size == 0)
+ return @"nothing";
+ if (size <= 1.0)
+ return @"1 byte";
+
+ if (size < factor - 1)
+ return [NSString stringWithFormat:@"%1.0f bytes", size];
+
+ size /= factor;
+ if (size < factor - 1)
+ return [NSString stringWithFormat:@"%1.1f KB", size];
+
+ size /= factor;
+ if (size < factor - 1)
+ return [NSString stringWithFormat:@"%1.1f MB", size];
+
+ size /= factor;
+ if (size < factor - 1)
+ return [NSString stringWithFormat:@"%1.1f GB", size];
+
+ size /= factor;
+ return [NSString stringWithFormat:@"%1.1f TB", size];
+}
+
+static NSString *cocoa_time_string(unsigned seconds)
+{
+ if (seconds <= 10) {
+ return NSLocalizedString(@"less than 10 seconds",
+ @"time remaining");
+ }
+
+ if (seconds < 60) {
+ return [NSString stringWithFormat:NSLocalizedString(@"%u seconds",
+ @"time remaining"),
+ seconds];
+ }
+
+ unsigned minutes = seconds / 60;
+ seconds = seconds % 60;
+
+ if (minutes < 60) {
+ return [NSString stringWithFormat:NSLocalizedString(@"%u:%02u minutes",
+ @"time remaining: minutes, seconds"),
+ minutes, seconds];
+ }
+
+ unsigned hours = minutes / 60;
+ minutes = minutes % 60;
+
+ return [NSString stringWithFormat:NSLocalizedString(@"%2:%02u hours", @"time remaining: hours, minutes"), hours, minutes];
+}
+
+- (NSString *)statusText
+{
+ NSString *speedString = @"";
+
+ float speed = 0.0;
+ NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
+ if (elapsedTime >= 0.1) {
+ speed = (float)receivedSize / elapsedTime;
+ speedString = [NSString stringWithFormat:@" (%@/s)", cocoa_file_size_string(speed)];
+ }
+
+ NSString *timeRemainingString = @"";
+ NSString *totalSizeString = @"";
+ if (totalSize != 0) {
+ if (speed > 0.0) {
+ float timeRemaining = (float)(totalSize - receivedSize) / speed;
+ timeRemainingString = [NSString stringWithFormat:@": %@", cocoa_time_string(timeRemaining)];
+ }
+ totalSizeString = [NSString stringWithFormat:NSLocalizedString(@" of %@", @"... of (total size)"), cocoa_file_size_string(totalSize)];
+ }
+
+ return [NSString stringWithFormat:@"%@%@%@%@", cocoa_file_size_string(receivedSize),
+ totalSizeString, speedString, timeRemainingString];
+}
+
++ (NSSet *)keyPathsForValuesAffectingFileName
+{
+ return [NSSet setWithObject:@"saveURL"];
+}
+
+- (NSString *)fileName
+{
+ return [[saveURL path] lastPathComponent];
+}
+
++ (NSSet *)keyPathsForValuesAffectingIcon
+{
+ return [NSSet setWithObjects:@"mimeType", @"URL", nil];
+}
+
+- (NSImage *)icon
+{
+ NSString *type = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (__bridge CFStringRef)mimeType, NULL);
+ if ([type hasPrefix:@"dyn."] || [type isEqualToString:(NSString *)kUTTypeData]) {
+ NSString *pathExt = [[url path] pathExtension];
+ type = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)pathExt, NULL);
+ }
+ return [[NSWorkspace sharedWorkspace] iconForFileType:type];
+}
+
+#pragma mark -
+#pragma mark NetSurf interface functions
+
+static struct gui_download_window *
+gui_download_window_create(download_context *ctx,
+ struct gui_window *parent)
+{
+ DownloadWindowController *const window = [[DownloadWindowController alloc] initWithContext:ctx];
+ cocoa_register_download(window);
+ [window askForSave];
+
+ return (__bridge_retained struct gui_download_window *)window;
+}
+
+static nserror
+gui_download_window_data(struct gui_download_window *dw,
+ const char *data,
+ unsigned int size)
+{
+ DownloadWindowController *const window = (__bridge DownloadWindowController *)dw;
+ return [window receivedData:[NSData dataWithBytes:data length:size]] ? NSERROR_OK : NSERROR_SAVE_FAILED;
+}
+
+static void
+gui_download_window_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+ DownloadWindowController *const window = (__bridge DownloadWindowController *)dw;
+ [window showError:[NSString stringWithUTF8String:error_msg]];
+}
+
+static void
+gui_download_window_done(struct gui_download_window *dw)
+{
+ DownloadWindowController *const window = (__bridge DownloadWindowController *)dw;
+ [window downloadDone];
+}
+
+@end
+
+#pragma mark -
+static NSMutableSet *cocoa_all_downloads = nil;
+
+static void
+cocoa_register_download(DownloadWindowController *download)
+{
+ if (cocoa_all_downloads == nil) {
+ cocoa_all_downloads = [[NSMutableSet alloc] init];
+ }
+ [cocoa_all_downloads addObject:download];
+}
+
+static void
+cocoa_unregister_download(DownloadWindowController *download)
+{
+ [cocoa_all_downloads removeObject:download];
+}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *cocoa_download_table = &download_table;
diff --git a/frontends/cocoa/FormSelectMenu.h b/frontends/cocoa/FormSelectMenu.h
new file mode 100644
index 000000000..3ed86e315
--- /dev/null
+++ b/frontends/cocoa/FormSelectMenu.h
@@ -0,0 +1,29 @@
+/*
+ * 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>
+
+struct form_control;
+struct browser_window;
+
+@interface FormSelectMenu : NSObject
+
+- (instancetype)initWithControl:(struct form_control *)control forWindow:(struct browser_window *)window;
+- (void)runInView:(NSView *)view;
+
+@end
diff --git a/frontends/cocoa/FormSelectMenu.m b/frontends/cocoa/FormSelectMenu.m
new file mode 100644
index 000000000..c849ba0c2
--- /dev/null
+++ b/frontends/cocoa/FormSelectMenu.m
@@ -0,0 +1,110 @@
+/*
+ * 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/FormSelectMenu.h"
+#import "cocoa/coordinates.h"
+
+#import "netsurf/types.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/form.h"
+
+static inline NSRect cocoa_rect_for_control(struct browser_window *bw, struct form_control *control)
+{
+ struct rect r;
+ form_control_bounding_rect(control, &r);
+ return cocoa_scaled_rect(browser_window_get_scale(bw),
+ r.x0,
+ r.y0,
+ r.x1,
+ r.y1);
+}
+
+@interface FormSelectMenu () <NSMenuDelegate>
+
+@property (nonatomic) NSMenu *menu;
+@property (nonatomic) NSPopUpButtonCell *cell;
+
+@property (nonatomic) struct browser_window *browser;
+@property (nonatomic) struct form_control *control;
+
+- (void)itemSelected:(id)sender;
+
+@end
+
+@implementation FormSelectMenu
+
+- (instancetype)initWithControl:(struct form_control *)c forWindow:(struct browser_window *)w
+{
+ if ((self = [super init]) == nil)
+ return nil;
+
+ _control = c;
+ _browser = w;
+
+ _menu = [[NSMenu alloc] initWithTitle:@"Select"];
+ if (_menu == nil) {
+ return nil;
+ }
+
+ [_menu addItemWithTitle:@"" action:NULL keyEquivalent:@""];
+
+ NSInteger currentItemIndex = 0;
+ struct form_option *opt;
+ for (opt = form_select_get_option(_control, 0);
+ opt != NULL;
+ opt = opt->next) {
+ NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:opt->text]
+ action:@selector(itemSelected:)
+ keyEquivalent:@""];
+ if (opt->selected) {
+ item.state = NSOnState;
+ }
+ item.target = self;
+ item.tag = currentItemIndex++;
+ [_menu addItem:item];
+ }
+
+ _menu.delegate = self;
+
+ return self;
+}
+
+- (void)runInView:(NSView *)view
+{
+ (void)(__bridge_retained void *) self;
+
+ _cell = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:YES];
+ _cell.menu = _menu;
+
+ const NSRect rect = cocoa_rect_for_control(_browser, _control);
+
+ [_cell attachPopUpWithFrame:rect inView:view];
+ [_cell performClickWithFrame:rect inView:view];
+}
+
+- (void)itemSelected:(id)sender
+{
+ form_select_process_selection(_control, (int)[sender tag]);
+}
+
+- (void)menuDidClose:(NSMenu *)sender
+{
+ (void)(__bridge_transfer id)((__bridge void *)self);
+}
+
+@end
diff --git a/frontends/cocoa/HistoryView.h b/frontends/cocoa/HistoryView.h
new file mode 100644
index 000000000..0fa2af36a
--- /dev/null
+++ b/frontends/cocoa/HistoryView.h
@@ -0,0 +1,30 @@
+/*
+ * 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>
+
+@class BrowserView;
+
+@interface HistoryView : NSView
+
+@property (readwrite, nonatomic) BrowserView *browser;
+@property (readonly, nonatomic) NSSize size;
+
+- (void)updateHistory;
+
+@end
diff --git a/frontends/cocoa/HistoryView.m b/frontends/cocoa/HistoryView.m
new file mode 100644
index 000000000..f935f9fd1
--- /dev/null
+++ b/frontends/cocoa/HistoryView.m
@@ -0,0 +1,136 @@
+/*
+ * 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/HistoryView.h"
+#import "cocoa/font.h"
+#import "cocoa/coordinates.h"
+#import "cocoa/plotter.h"
+#import "cocoa/LocalHistoryController.h"
+#import "cocoa/BrowserView.h"
+#import "utils/errors.h"
+#import "netsurf/core_window.h"
+#import "desktop/browser_history.h"
+#import "desktop/local_history.h"
+#import "netsurf/plotters.h"
+
+@interface HistoryView () {
+ struct local_history_session *_session;
+}
+
+@property (nonatomic) NSMutableArray *toolTips;
+@property (readwrite, nonatomic) NSSize size;
+
+@end
+
+static nserror invalidate(struct core_window *cw, const struct rect *rect)
+{
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+static void update_size(struct core_window *cw, int width, int height)
+{
+ HistoryView *view = (__bridge HistoryView *)cw;
+ NSSize size = cocoa_size(width, height);
+ view.size = size;
+}
+
+static void scroll_visible(struct core_window *cw, const struct rect *r)
+{
+}
+
+static void get_window_dimensions(struct core_window *cw, int *width, int *height)
+{
+}
+
+static void drag_status(struct core_window *cw, core_window_drag_status ds)
+{
+}
+
+static struct core_window_callback_table history_view_table = {
+ .invalidate = invalidate,
+ .update_size = update_size,
+ .scroll_visible = scroll_visible,
+ .get_window_dimensions = get_window_dimensions,
+ .drag_status = drag_status
+};
+
+@implementation HistoryView
+
+- (void)updateHistory
+{
+ if (_session) {
+ local_history_set(_session, self.browser.browser);
+ } else {
+ local_history_init(&history_view_table, (__bridge void *)self, self.browser.browser, &_session);
+ }
+
+ self.frameSize = self.size;
+}
+
+- (void)dealloc
+{
+ if (_session) {
+ local_history_fini(_session);
+ }
+}
+
+- (void)drawRect:(NSRect)rect
+{
+ if (!_session) return;
+
+ struct redraw_context context = {
+ .interactive = true,
+ .background_images = false,
+ .plot = &cocoa_plotters,
+ };
+
+ cocoa_set_clip(rect);
+
+ struct rect clipRect = {
+ .x0 = cocoa_pt_to_px(CGRectGetMinX(rect)),
+ .y0 = cocoa_pt_to_px(CGRectGetMinY(rect)),
+ .x1 = cocoa_pt_to_px(CGRectGetMaxX(rect)),
+ .y1 = cocoa_pt_to_px(CGRectGetMaxY(rect))
+ };
+ local_history_redraw(_session, 0, 0, &clipRect, &context);
+}
+
+- (void)mouseUp:(NSEvent *)theEvent
+{
+ if (!_session) return;
+
+ CGPoint location = [self convertPoint: theEvent.locationInWindow fromView: nil];
+
+ browser_mouse_state state = BROWSER_MOUSE_PRESS_1;
+ if (theEvent.modifierFlags & NSEventModifierFlagCommand) {
+ state = BROWSER_MOUSE_PRESS_2;
+ }
+
+ nserror res = local_history_mouse_action(_session, state, cocoa_pt_to_px(location.x), cocoa_pt_to_px(location.y));
+
+ if (res == NSERROR_OK) {
+ self.browser.historyVisible = NO;
+ }
+}
+
+- (BOOL)isFlipped
+{
+ return YES;
+}
+
+@end
diff --git a/frontends/cocoa/HistoryWindowController.h b/frontends/cocoa/HistoryWindowController.h
new file mode 100644
index 000000000..c16236c2d
--- /dev/null
+++ b/frontends/cocoa/HistoryWindowController.h
@@ -0,0 +1,27 @@
+/*
+ * 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>
+
+@class TreeView;
+
+@interface HistoryWindowController : NSWindowController
+
+@property (nonatomic) IBOutlet TreeView *view;
+
+@end
diff --git a/frontends/cocoa/HistoryWindowController.m b/frontends/cocoa/HistoryWindowController.m
new file mode 100644
index 000000000..8b7067c24
--- /dev/null
+++ b/frontends/cocoa/HistoryWindowController.m
@@ -0,0 +1,49 @@
+/*
+ * 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/HistoryWindowController.h"
+#import "cocoa/Tree.h"
+#import "cocoa/TreeView.h"
+
+#import "desktop/global_history.h"
+
+@interface HistoryWindowController ()
+
+@property (nonatomic) Tree *tree;
+
+@end
+
+@implementation HistoryWindowController
+
+- (instancetype)init
+{
+ if ((self = [super initWithWindowNibName:@"HistoryWindow"]) == nil)
+ return nil;
+
+ _tree = [[Tree alloc] initWithFlags:TREE_HISTORY];
+
+ return self;
+}
+
+- (void)awakeFromNib
+{
+ self.view.tree = self.tree;
+ [[self window] setExcludedFromWindowsMenu:YES];
+}
+
+@end
diff --git a/frontends/cocoa/LocalHistoryController.h b/frontends/cocoa/LocalHistoryController.h
new file mode 100644
index 000000000..d7609238e
--- /dev/null
+++ b/frontends/cocoa/LocalHistoryController.h
@@ -0,0 +1,37 @@
+/*
+ * 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>
+
+@class HistoryView;
+@class BrowserView;
+
+@interface LocalHistoryController : NSWindowController
+
+@property (readwrite, nonatomic) BrowserView *browser;
+@property (readwrite, nonatomic) IBOutlet HistoryView *history;
+
+- (id)initWithBrowser:(BrowserView *)bw;
+
+- (void)attachToView:(NSView *)view;
+- (void)detach;
+- (void)redraw;
+
+- (void)keyDown:(NSEvent *)theEvent;
+
+@end
diff --git a/frontends/cocoa/LocalHistoryController.m b/frontends/cocoa/LocalHistoryController.m
new file mode 100644
index 000000000..1a60783cb
--- /dev/null
+++ b/frontends/cocoa/LocalHistoryController.m
@@ -0,0 +1,119 @@
+/*
+ * 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/LocalHistoryController.h"
+
+#import "cocoa/BrowserView.h"
+#import "cocoa/HistoryView.h"
+#import "cocoa/ArrowWindow.h"
+
+@implementation LocalHistoryController
+
+- (instancetype)initWithBrowser:(BrowserView *)bw
+{
+ if ((self = [super initWithWindowNibName:@"LocalHistoryPanel"]) == nil)
+ return nil;
+
+ _browser = bw;
+
+ return self;
+}
+
+- (void)attachToView:(NSView *)view
+{
+ NSDisableScreenUpdates();
+
+ ArrowWindow *box = (ArrowWindow *)[self window];
+
+ [self.history updateHistory];
+ box.contentSize = self.history.size;
+ [box setArrowPosition:50];
+ [box attachToView:view];
+
+ NSRect frame = [box frame];
+ NSRect screenFrame = [[box screen] visibleFrame];
+
+ const CGFloat arrowSize = [box arrowSize];
+ frame.origin.x += arrowSize;
+ frame.origin.y += arrowSize;
+ frame.size.width -= 2 * arrowSize;
+ frame.size.height -= 2 * arrowSize;
+
+ if (NSMinY(frame) < NSMinY(screenFrame)) {
+ const CGFloat delta = NSMinY(screenFrame) - NSMinY(frame);
+ frame.size.height -= delta;
+ frame.origin.y += delta;
+ }
+
+ CGFloat arrowPositionChange = 50;
+ if (NSMaxX(frame) > NSMaxX(screenFrame)) {
+ const CGFloat delta = NSMaxX(frame) - NSMaxX(screenFrame);
+ arrowPositionChange += delta;
+ frame.origin.x -= delta;
+ }
+
+ if (NSMinX(frame) < NSMinX(screenFrame)) {
+ const CGFloat delta = NSMinX(screenFrame) - NSMinX(frame);
+ arrowPositionChange -= delta;
+ frame.origin.x += delta;
+ frame.size.width -= delta;
+ }
+
+ frame.origin.x -= arrowSize;
+ frame.origin.y -= arrowSize;
+ frame.size.width += 2 * arrowSize;
+ frame.size.height += 2 * arrowSize;
+
+ [box setArrowPosition:arrowPositionChange];
+ [box setFrame:frame display:YES];
+
+ NSEnableScreenUpdates();
+}
+
+- (void)detach
+{
+ [(ArrowWindow *)[self window] detach];
+}
+
+- (void)windowDidLoad
+{
+ [super windowDidLoad];
+
+ self.history.browser = self.browser;
+}
+
+- (void)redraw
+{
+ [self.history setNeedsDisplay:YES];
+}
+
+- (void)keyDown:(NSEvent *)theEvent
+{
+ unichar key = [[theEvent characters] characterAtIndex:0];
+ switch (key) {
+ case 27:
+ [self.browser setHistoryVisible:NO];
+ break;
+
+ default:
+ NSBeep();
+ break;
+ };
+}
+
+@end
diff --git a/frontends/cocoa/Makefile b/frontends/cocoa/Makefile
new file mode 100644
index 000000000..92dec45a8
--- /dev/null
+++ b/frontends/cocoa/Makefile
@@ -0,0 +1,247 @@
+# ----------------------------------------------------------------------------
+# Mac OS X target setup
+# ----------------------------------------------------------------------------
+
+POSTEXES += NetSurf.app
+
+NETSURF_FEATURE_RSVG_CFLAGS := -DWITH_RSVG
+$(eval $(call pkg_config_find_and_add_enabled,RSVG,librsvg-2.0,SVG))
+
+
+SDK_PARAM := $(shell xcodebuild -showsdks | awk '/^$$/{p=0};p; /(OS X|macOS) SDKs:/{p=1}' | head -1 | cut -f3)
+
+ifeq ($(DEPLOYMENT_TARGET),)
+ DEPLOYMENT_TARGET := 10.7
+endif
+
+SDK_PATH ?= $(shell xcodebuild -version $(SDK_PARAM) Path)
+SDK_FLAGS := -isysroot $(SDK_PATH) -mmacosx-version-min=$(DEPLOYMENT_TARGET)
+CFLAGS := $(SDK_FLAGS) $(CFLAGS)
+LDFLAGS := $(SDK_FLAGS) -Wl,-syslibroot,$(SDK_PATH) $(LDFLAGS)
+CXXFLAGS := $(SDK_FLAGS) $(CXXFLAGS)
+
+# for timerisset()
+CFLAGS += -D_DARWIN_C_SOURCE
+
+CFLAGS += -Dnscocoa -D_BSD_SOURCE -D_POSIX_C_SOURCE -std=c99 -fobjc-arc
+
+CFLAGS += -include cocoa/Prefix.pch
+
+VERSION_FULL := $(shell sed -n '/_version.*=.*"/{s/.*"\(.*\)".*/\1/;p;}' desktop/version.c)
+VERSION_MAJ := $(shell sed -n '/_major/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
+VERSION_MIN := $(shell sed -n '/_minor/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
+
+LDFLAGS += -Wl,-framework,Cocoa -Wl,-framework,Carbon $(NETLDFLAGS)
+
+$(eval $(call feature_enabled,IMAGEIO,-DWITH_APPLE_IMAGE,,Apple ImageIO ))
+
+ifneq ($(UNIVERSAL),)
+ UNIVERSAL_FLAGS := $(foreach arch,$(UNIVERSAL),-arch $(arch) )
+ CFLAGS += $(UNIVERSAL_FLAGS)
+ LDFLAGS += $(UNIVERSAL_FLAGS)
+ CXXFLAGS += $(UNIVERSAL_FLAGS)
+endif
+
+
+ifeq ($(VARIANT),debug)
+ CFLAGS += -g
+endif
+
+# ----------------------------------------------------------------------------
+# Source file setup
+# ----------------------------------------------------------------------------
+
+# sources purely for the Mac OS X build
+S_FRONTEND := \
+ BookmarksController.m \
+ BrowserView.m \
+ BrowserViewController.m \
+ BrowserWindowController.m \
+ BrowserWindow.m \
+ DownloadWindowController.m \
+ NetSurfAppDelegate.m \
+ NetsurfApp.m \
+ PreferencesWindowController.m \
+ ScrollableView.m \
+ SearchWindowController.m \
+ URLFieldCell.m \
+ Tree.m \
+ desktop-tree.m \
+ TreeView.m \
+ HistoryView.m \
+ HistoryWindowController.m \
+ FormSelectMenu.m \
+ bitmap.m \
+ fetch.m \
+ font.m \
+ gui.m \
+ plotter.m \
+ schedule.m \
+ selection.m \
+ ArrowBox.m \
+ ArrowWindow.m \
+ LocalHistoryController.m \
+ apple_image.m
+
+S_TABBAR := \
+ NSBezierPath_AMShading.m \
+ NSString_AITruncation.m \
+ PSMOverflowPopUpButton.m \
+ PSMProgressIndicator.m \
+ PSMRolloverButton.m \
+ PSMTabBarCell.m \
+ PSMTabBarControl.m \
+ PSMTabBarController.m \
+ PSMTabDragAssistant.m \
+ PSMTabDragView.m \
+ PSMTabDragWindow.m \
+ PSMTabDragWindowController.m \
+ PSMUnifiedTabStyle.m
+
+S_FRONTEND += $(addprefix PSMTabBarControl/,$(S_TABBAR))
+
+# This is the final source build list
+# Note this is deliberately *not* expanded here as common and image
+# are not yet available
+SOURCES = $(addprefix $(shell pwd)/,$(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_FRONTEND))
+
+# Since we prefix the sources with the pwd, also create a special
+# prefixed rule so that the testament is run
+$(shell pwd)/content/fetchers/about.c: testament
+
+EXETARGET := NetSurf
+
+S_XIBS := \
+ MainMenu.xib \
+ Browser.xib \
+ BrowserWindow.xib \
+ DownloadWindow.xib \
+ SearchWindow.xib \
+ PreferencesWindow.xib \
+ HistoryWindow.xib \
+ BookmarksWindow.xib \
+ LocalHistoryPanel.xib
+
+R_RESOURCES := \
+ default.css \
+ adblock.css \
+ internal.css \
+ quirks.css \
+ NetSurf.icns \
+ HomeTemplate.pdf \
+ Icons \
+ ca-bundle \
+ netsurf.png
+
+
+TABBAR_RESOURCES := \
+ AquaTabClose_Front_Pressed.png \
+ AquaTabClose_Front_Rollover.png \
+ AquaTabClose_Front.png \
+ AquaTabCloseDirty_Front_Pressed.png \
+ AquaTabCloseDirty_Front_Rollover.png \
+ AquaTabCloseDirty_Front.png \
+ AquaTabNew.png \
+ AquaTabNewPressed.png \
+ AquaTabNewRollover.png \
+ overflowImage.png \
+ overflowImagePressed.png \
+ pi.png
+
+R_RESOURCES := $(addprefix $(FRONTEND_RESOURCES_DIR)/,$(R_RESOURCES))
+
+R_RESOURCES += $(addprefix $(FRONTEND_SOURCE_DIR)/PSMTabBarControl/Images/,$(TABBAR_RESOURCES))
+
+LANGUAGES := de en fr it nl
+LOCALIZED_RESOURCES := \
+ Localizable.strings \
+ welcome.html \
+ maps.html \
+ licence.html
+
+
+#languiage project macro
+# $1 is language name
+# $2 is list of resources per language
+define make_lproj
+R_RESOURCES += $$(OBJROOT)/$(1).lproj
+$(2):
+$$(OBJROOT)/$(1).lproj: $(2)
+ $(VQ)echo Bundling language $(1)
+ $(Q)$(MKDIR) -p $$@
+ $(Q)for file in $(2) ; do if [ -e $$$$file ]; then cp -pLR $$$$file $$@ ; fi; done
+ $(Q)$(SPLIT_MESSAGES) -l $(1) -p cocoa -f messages resources/FatMessages > $$@/Messages
+endef
+
+# compile_xib (xib) (lang)
+define compile_xib
+$$(OBJROOT)/$(2).lproj: $$(OBJROOT)/$(2).lproj/$(1:.xib=.nib)
+
+$$(OBJROOT)/$(2).lproj/$(1:.xib=.nib): $(FRONTEND_RESOURCES_DIR)/$(1) $$(OBJROOT)/created
+ $(VQ)echo Compiling XIB $(1) for language $(2)
+ $(Q)$(MKDIR) -p $$(OBJROOT)/$(2).lproj
+ $(Q)$(FRONTEND_SOURCE_DIR)/compile-xib.sh $(FRONTEND_RESOURCES_DIR)/$(1) $(2) $$@
+
+ifeq ($(wildcard $(FRONTEND_RESOURCES_DIR)/$(2).lproj/$(1).strings),$(FRONTEND_RESOURCES_DIR)/$(2).lproj/$(1).strings)
+$$(OBJROOT)/$(2).lproj/$(1:.xib=.nib): $(FRONTEND_RESOURCES_DIR)/$(2).lproj/$(1).strings
+endif
+
+endef
+
+$(foreach lang,$(LANGUAGES),$(eval $(call make_lproj,$(lang),$(addprefix $(FRONTEND_RESOURCES_DIR)/$(lang).lproj/,$(LOCALIZED_RESOURCES)))))
+$(foreach lang,$(LANGUAGES),$(foreach xib,$(S_XIBS),$(eval $(call compile_xib,$(xib),$(lang)))))
+
+# ----------------------------------------------------------------------------
+# Install target
+# ----------------------------------------------------------------------------
+
+install-cocoa: NetSurf.app
+
+NetSurf.app: NetSurf $(FRONTEND_SOURCE_DIR)/Makefile $(R_RESOURCES) NetSurf.app/Contents/Info.plist
+ $(VQ)echo Assembling NetSurf.app bundle
+ $(Q)$(MKDIR) -p NetSurf.app/Contents/MacOS
+ $(Q)cp NetSurf NetSurf.app/Contents/MacOS
+ $(Q)rm -rf NetSurf.app/Contents/Resources
+ $(Q)$(MKDIR) -p NetSurf.app/Contents/Resources
+ $(Q)cp -pLR $(R_RESOURCES) NetSurf.app/Contents/Resources
+ $(Q)echo 'APPL????' > NetSurf.app/Contents/PkgInfo
+
+NetSurf.app/Contents/Info.plist: $(FRONTEND_RESOURCES_DIR)/NetSurf-Info.plist $(FRONTEND_SOURCE_DIR)/Makefile
+ $(VQ)echo Generating Info.plist
+ $(Q)$(MKDIR) -p NetSurf.app/Contents
+ $(Q)sed -e 's/$${EXECUTABLE_NAME}/$(EXETARGET)/' \
+ -e 's/$${PRODUCT_NAME.*}/$(EXETARGET)/' \
+ -e 's/$${MACOSX_DEPLOYMENT_TARGET}/$(DEPLOYMENT_TARGET)/' \
+ -e 's/$${NETSURF_VERSION}/$(VERSION_FULL)/' \
+ -e 's/$${NETSURF_SHORT_VERSION}/$(VERSION_MAJ).$(VERSION_MIN)/' \
+ < $(FRONTEND_RESOURCES_DIR)/NetSurf-Info.plist > NetSurf.app/Contents/Info.plist
+
+# ----------------------------------------------------------------------------
+# Package target
+# ----------------------------------------------------------------------------
+
+package-cocoa: NetSurf.dmg
+
+.INTERMEDIATE: NetSurf.tmp.dmg
+
+NetSurf.tmp.dmg: NetSurf.app
+ hdiutil create -size 8m -fs HFS+ -volname "NetSurf" $@
+ sleep 2
+ hdiutil attach $@
+ sleep 2
+ cp -pPR $^ /Volumes/NetSurf/
+ hdiutil detach $$(echo $$(hdiutil attach $@ | cut -f 1) | cut -f 1 -d ' ')
+ sleep 2
+
+NetSurf.dmg: NetSurf.tmp.dmg
+ hdiutil convert $^ -format UDZO -o $@
+
+CLEANS += clean-package-cocoa
+
+clean-package-cocoa:
+ $(VQ)echo " CLEAN: NetSurf.tmp.dmg"
+ $(Q)$(RM) NetSurf.tmp.dmg
+ $(VQ)echo " CLEAN: NetSurf.dmg"
+ $(Q)$(RM) NetSurf.dmg
+ $(VQ)echo " CLEAN: NetSurf.app"
+ $(Q)$(RM) -r NetSurf.app
diff --git a/frontends/cocoa/Makefile.defaults b/frontends/cocoa/Makefile.defaults
new file mode 100644
index 000000000..49e570c47
--- /dev/null
+++ b/frontends/cocoa/Makefile.defaults
@@ -0,0 +1,28 @@
+# ----------------------------------------------------------------------------
+# Cocoa-specific options
+# ----------------------------------------------------------------------------
+
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := NO
+
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := NO
+
+# Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_RSVG := AUTO
+
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_NSSVG := AUTO
+
+NETSURF_USE_BMP := NO
+NETSURF_USE_GIF := NO
+NETSURF_USE_PNG := NO
+NETSURF_USE_JPEG := NO
+NETSURF_USE_IMAGEIO := YES
+
+MACOSX_VERSION := $(shell sw_vers -productVersion | awk -F '.' '{print $$1 "." $$2}')
+
diff --git a/frontends/cocoa/NetSurf.xcodeproj/project.pbxproj b/frontends/cocoa/NetSurf.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..b64b2563c
--- /dev/null
+++ b/frontends/cocoa/NetSurf.xcodeproj/project.pbxproj
@@ -0,0 +1,2101 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 263A28101EE40CCF005C52B9 /* NSString_AITruncation.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26131EE40BFC005C52B9 /* NSString_AITruncation.m */; };
+ 263A28111EE40CCF005C52B9 /* PSMOverflowPopUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26151EE40BFC005C52B9 /* PSMOverflowPopUpButton.m */; };
+ 263A28121EE40CCF005C52B9 /* PSMProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26171EE40BFC005C52B9 /* PSMProgressIndicator.m */; };
+ 263A28131EE40CCF005C52B9 /* PSMRolloverButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26191EE40BFC005C52B9 /* PSMRolloverButton.m */; };
+ 263A28141EE40CCF005C52B9 /* PSMTabBarCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A261B1EE40BFC005C52B9 /* PSMTabBarCell.m */; };
+ 263A28151EE40CCF005C52B9 /* PSMTabBarControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A261D1EE40BFC005C52B9 /* PSMTabBarControl.m */; };
+ 263A28161EE40CCF005C52B9 /* PSMTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A261F1EE40BFC005C52B9 /* PSMTabBarController.m */; };
+ 263A28171EE40CCF005C52B9 /* PSMTabDragAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26211EE40BFC005C52B9 /* PSMTabDragAssistant.m */; };
+ 263A28181EE40CCF005C52B9 /* PSMTabDragView.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26231EE40BFC005C52B9 /* PSMTabDragView.m */; };
+ 263A28191EE40CCF005C52B9 /* PSMTabDragWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26251EE40BFC005C52B9 /* PSMTabDragWindow.m */; };
+ 263A281A1EE40CCF005C52B9 /* PSMTabDragWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26271EE40BFC005C52B9 /* PSMTabDragWindowController.m */; };
+ 263A281B1EE40CCF005C52B9 /* PSMUnifiedTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A262A1EE40BFC005C52B9 /* PSMUnifiedTabStyle.m */; };
+ 263A281C1EE40CCF005C52B9 /* apple_image.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26821EE40BFC005C52B9 /* apple_image.m */; };
+ 263A281D1EE40CCF005C52B9 /* ArrowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26831EE40BFC005C52B9 /* ArrowBox.m */; };
+ 263A281E1EE40CCF005C52B9 /* ArrowWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26841EE40BFC005C52B9 /* ArrowWindow.m */; };
+ 263A281F1EE40CCF005C52B9 /* bitmap.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26851EE40BFC005C52B9 /* bitmap.m */; };
+ 263A28211EE40CCF005C52B9 /* BookmarksController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26871EE40BFC005C52B9 /* BookmarksController.m */; };
+ 263A28221EE40CCF005C52B9 /* BrowserView.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26881EE40BFC005C52B9 /* BrowserView.m */; };
+ 263A28231EE40CCF005C52B9 /* BrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26891EE40BFC005C52B9 /* BrowserViewController.m */; };
+ 263A28241EE40CCF005C52B9 /* BrowserWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268A1EE40BFC005C52B9 /* BrowserWindow.m */; };
+ 263A28251EE40CCF005C52B9 /* BrowserWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268B1EE40BFC005C52B9 /* BrowserWindowController.m */; };
+ 263A28261EE40CCF005C52B9 /* desktop-tree.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268C1EE40BFC005C52B9 /* desktop-tree.m */; };
+ 263A28271EE40CCF005C52B9 /* DownloadWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268D1EE40BFC005C52B9 /* DownloadWindowController.m */; };
+ 263A28281EE40CCF005C52B9 /* fetch.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268E1EE40BFC005C52B9 /* fetch.m */; };
+ 263A28291EE40CCF005C52B9 /* font.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A268F1EE40BFC005C52B9 /* font.m */; };
+ 263A282A1EE40CCF005C52B9 /* FormSelectMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26901EE40BFC005C52B9 /* FormSelectMenu.m */; };
+ 263A282B1EE40CCF005C52B9 /* gui.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26911EE40BFC005C52B9 /* gui.m */; };
+ 263A282C1EE40CCF005C52B9 /* HistoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26921EE40BFC005C52B9 /* HistoryView.m */; };
+ 263A282D1EE40CCF005C52B9 /* HistoryWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26931EE40BFC005C52B9 /* HistoryWindowController.m */; };
+ 263A282E1EE40CCF005C52B9 /* LocalHistoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26941EE40BFC005C52B9 /* LocalHistoryController.m */; };
+ 263A282F1EE40CCF005C52B9 /* NetsurfApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26951EE40BFC005C52B9 /* NetsurfApp.m */; };
+ 263A28301EE40CCF005C52B9 /* NetSurfAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26961EE40BFC005C52B9 /* NetSurfAppDelegate.m */; };
+ 263A28311EE40CCF005C52B9 /* plotter.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26971EE40BFC005C52B9 /* plotter.m */; };
+ 263A28321EE40CCF005C52B9 /* PreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26981EE40BFC005C52B9 /* PreferencesWindowController.m */; };
+ 263A28331EE40CCF005C52B9 /* schedule.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26991EE40BFC005C52B9 /* schedule.m */; };
+ 263A28341EE40CCF005C52B9 /* ScrollableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269A1EE40BFC005C52B9 /* ScrollableView.m */; };
+ 263A28351EE40CCF005C52B9 /* SearchWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269B1EE40BFC005C52B9 /* SearchWindowController.m */; };
+ 263A28361EE40CCF005C52B9 /* selection.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269C1EE40BFC005C52B9 /* selection.m */; };
+ 263A28371EE40CCF005C52B9 /* Tree.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269D1EE40BFC005C52B9 /* Tree.m */; };
+ 263A28381EE40CCF005C52B9 /* TreeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269E1EE40BFC005C52B9 /* TreeView.m */; };
+ 263A28391EE40CCF005C52B9 /* URLFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A269F1EE40BFC005C52B9 /* URLFieldCell.m */; };
+ 263A283A1EE40CF2005C52B9 /* content.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26A31EE40C4A005C52B9 /* content.c */; };
+ 263A283B1EE40CF2005C52B9 /* content_factory.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26A61EE40C4A005C52B9 /* content_factory.c */; };
+ 263A283C1EE40CF2005C52B9 /* dirlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26A91EE40C4A005C52B9 /* dirlist.c */; };
+ 263A283D1EE40CF2005C52B9 /* fetch.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26AB1EE40C4A005C52B9 /* fetch.c */; };
+ 263A283E1EE40CF2005C52B9 /* about.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26AE1EE40C4A005C52B9 /* about.c */; };
+ 263A283F1EE40CF2005C52B9 /* curl.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26B01EE40C4A005C52B9 /* curl.c */; };
+ 263A28401EE40CF2005C52B9 /* data.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26B21EE40C4A005C52B9 /* data.c */; };
+ 263A28411EE40CF2005C52B9 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26B41EE40C4A005C52B9 /* file.c */; };
+ 263A28421EE40CF2005C52B9 /* resource.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26B71EE40C4A005C52B9 /* resource.c */; };
+ 263A28431EE40CF2005C52B9 /* fs_backing_store.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26BA1EE40C4A005C52B9 /* fs_backing_store.c */; };
+ 263A28441EE40CF2005C52B9 /* css.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26BD1EE40C4A005C52B9 /* css.c */; };
+ 263A28451EE40CF2005C52B9 /* dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26BF1EE40C4A005C52B9 /* dump.c */; };
+ 263A28461EE40CF2005C52B9 /* hints.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26C11EE40C4A005C52B9 /* hints.c */; };
+ 263A28471EE40CF2005C52B9 /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26C31EE40C4A005C52B9 /* internal.c */; };
+ 263A28481EE40CF2005C52B9 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26C61EE40C4A005C52B9 /* select.c */; };
+ 263A28491EE40CF2005C52B9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26C81EE40C4A005C52B9 /* utils.c */; };
+ 263A284A1EE40CF2005C52B9 /* bmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26CB1EE40C4A005C52B9 /* bmp.c */; };
+ 263A284B1EE40CF2005C52B9 /* gif.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26CD1EE40C4A005C52B9 /* gif.c */; };
+ 263A284C1EE40CF2005C52B9 /* ico.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26CF1EE40C4A005C52B9 /* ico.c */; };
+ 263A284D1EE40CF2005C52B9 /* image.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26D11EE40C4A005C52B9 /* image.c */; };
+ 263A284E1EE40CF2005C52B9 /* image_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A26D31EE40C4A005C52B9 /* image_cache.c */; };
+ 263A285A1EE40CF2005C52B9 /* hlcache.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27371EE40C4B005C52B9 /* hlcache.c */; };
+ 263A285B1EE40CF2005C52B9 /* llcache.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27391EE40C4B005C52B9 /* llcache.c */; };
+ 263A285C1EE40CF2005C52B9 /* mimesniff.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A273C1EE40C4B005C52B9 /* mimesniff.c */; };
+ 263A285D1EE40CF2005C52B9 /* no_backing_store.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A273E1EE40C4B005C52B9 /* no_backing_store.c */; };
+ 263A285E1EE40CF2005C52B9 /* urldb.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A273F1EE40C4B005C52B9 /* urldb.c */; };
+ 263A285F1EE40CFB005C52B9 /* browser.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27421EE40C4B005C52B9 /* browser.c */; };
+ 263A28601EE40CFB005C52B9 /* browser_history.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27431EE40C4B005C52B9 /* browser_history.c */; };
+ 263A28611EE40CFB005C52B9 /* cookie_manager.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27461EE40C4B005C52B9 /* cookie_manager.c */; };
+ 263A28621EE40CFB005C52B9 /* download.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27481EE40C4B005C52B9 /* download.c */; };
+ 263A28631EE40CFB005C52B9 /* font_haru.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A274A1EE40C4B005C52B9 /* font_haru.c */; };
+ 263A28641EE40CFB005C52B9 /* frames.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A274D1EE40C4B005C52B9 /* frames.c */; };
+ 263A28651EE40CFB005C52B9 /* global_history.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A274F1EE40C4B005C52B9 /* global_history.c */; };
+ 263A28661EE40CFB005C52B9 /* gui_factory.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27511EE40C4B005C52B9 /* gui_factory.c */; };
+ 263A28671EE40CFB005C52B9 /* hotlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27541EE40C4B005C52B9 /* hotlist.c */; };
+ 263A28681EE40CFB005C52B9 /* knockout.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27561EE40C4B005C52B9 /* knockout.c */; };
+ 263A28691EE40CFB005C52B9 /* local_history.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27581EE40C4B005C52B9 /* local_history.c */; };
+ 263A286A1EE40CFB005C52B9 /* mouse.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A275B1EE40C4B005C52B9 /* mouse.c */; };
+ 263A286B1EE40CFB005C52B9 /* netsurf.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A275C1EE40C4B005C52B9 /* netsurf.c */; };
+ 263A286C1EE40CFB005C52B9 /* plot_style.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A275E1EE40C4B005C52B9 /* plot_style.c */; };
+ 263A286D1EE40CFB005C52B9 /* print.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A275F1EE40C4B005C52B9 /* print.c */; };
+ 263A286E1EE40CFB005C52B9 /* save_complete.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27621EE40C4B005C52B9 /* save_complete.c */; };
+ 263A286F1EE40CFB005C52B9 /* save_pdf.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27641EE40C4B005C52B9 /* save_pdf.c */; };
+ 263A28701EE40CFB005C52B9 /* save_text.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27661EE40C4B005C52B9 /* save_text.c */; };
+ 263A28711EE40CFB005C52B9 /* scrollbar.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27681EE40C4B005C52B9 /* scrollbar.c */; };
+ 263A28721EE40CFB005C52B9 /* search.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A276A1EE40C4B005C52B9 /* search.c */; };
+ 263A28731EE40CFB005C52B9 /* searchweb.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A276C1EE40C4B005C52B9 /* searchweb.c */; };
+ 263A28741EE40CFB005C52B9 /* selection.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A276E1EE40C4B005C52B9 /* selection.c */; };
+ 263A28751EE40CFB005C52B9 /* sslcert_viewer.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27701EE40C4B005C52B9 /* sslcert_viewer.c */; };
+ 263A28761EE40CFB005C52B9 /* system_colour.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27721EE40C4B005C52B9 /* system_colour.c */; };
+ 263A28771EE40CFB005C52B9 /* textarea.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27741EE40C4B005C52B9 /* textarea.c */; };
+ 263A28781EE40CFB005C52B9 /* textinput.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27761EE40C4B005C52B9 /* textinput.c */; };
+ 263A28791EE40CFB005C52B9 /* treeview.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27791EE40C4B005C52B9 /* treeview.c */; };
+ 263A287A1EE40CFB005C52B9 /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A277B1EE40C4B005C52B9 /* version.c */; };
+ 263A287B1EE4120F005C52B9 /* idna.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27E41EE40C4B005C52B9 /* idna.c */; };
+ 263A287C1EE4120F005C52B9 /* libdom.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27EA1EE40C4B005C52B9 /* libdom.c */; };
+ 263A287D1EE4120F005C52B9 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27EC1EE40C4B005C52B9 /* log.c */; };
+ 263A287E1EE4120F005C52B9 /* messages.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27F11EE40C4B005C52B9 /* messages.c */; };
+ 263A287F1EE4120F005C52B9 /* nsoption.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27F31EE40C4B005C52B9 /* nsoption.c */; };
+ 263A28801EE4120F005C52B9 /* nsurl.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27F71EE40C4B005C52B9 /* nsurl.c */; };
+ 263A28811EE4120F005C52B9 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27F81EE40C4B005C52B9 /* parse.c */; };
+ 263A28821EE4120F005C52B9 /* punycode.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27FB1EE40C4B005C52B9 /* punycode.c */; };
+ 263A28831EE4120F005C52B9 /* talloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28011EE40C4B005C52B9 /* talloc.c */; };
+ 263A28841EE4120F005C52B9 /* time.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28041EE40C4B005C52B9 /* time.c */; };
+ 263A28851EE4120F005C52B9 /* url.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28061EE40C4B005C52B9 /* url.c */; };
+ 263A28861EE4120F005C52B9 /* useragent.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28081EE40C4B005C52B9 /* useragent.c */; };
+ 263A28871EE4120F005C52B9 /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A280A1EE40C4B005C52B9 /* utf8.c */; };
+ 263A28881EE4120F005C52B9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A280C1EE40C4B005C52B9 /* utils.c */; };
+ 263A28891EE41213005C52B9 /* challenge.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27D01EE40C4B005C52B9 /* challenge.c */; };
+ 263A288A1EE41213005C52B9 /* content-disposition.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27D31EE40C4B005C52B9 /* content-disposition.c */; };
+ 263A288B1EE41213005C52B9 /* content-type.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27D51EE40C4B005C52B9 /* content-type.c */; };
+ 263A288C1EE41213005C52B9 /* generics.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27D71EE40C4B005C52B9 /* generics.c */; };
+ 263A288D1EE41213005C52B9 /* parameter.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27DA1EE40C4B005C52B9 /* parameter.c */; };
+ 263A288E1EE41213005C52B9 /* primitives.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27DD1EE40C4B005C52B9 /* primitives.c */; };
+ 263A288F1EE41213005C52B9 /* www-authenticate.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27DF1EE40C4B005C52B9 /* www-authenticate.c */; };
+ 263A28901EE41218005C52B9 /* bloom.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27BA1EE40C4B005C52B9 /* bloom.c */; };
+ 263A28911EE41218005C52B9 /* corestrings.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27BE1EE40C4B005C52B9 /* corestrings.c */; };
+ 263A28921EE41218005C52B9 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27C51EE40C4B005C52B9 /* file.c */; };
+ 263A28931EE41218005C52B9 /* filename.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27C71EE40C4B005C52B9 /* filename.c */; };
+ 263A28941EE41218005C52B9 /* filepath.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27C91EE40C4B005C52B9 /* filepath.c */; };
+ 263A28951EE41218005C52B9 /* hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27CD1EE40C4B005C52B9 /* hashtable.c */; };
+ 263A28961EE4121D005C52B9 /* box.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27981EE40C4B005C52B9 /* box.c */; };
+ 263A28971EE4121D005C52B9 /* box_construct.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A279A1EE40C4B005C52B9 /* box_construct.c */; };
+ 263A28981EE4121D005C52B9 /* box_normalise.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A279B1EE40C4B005C52B9 /* box_normalise.c */; };
+ 263A28991EE4121D005C52B9 /* box_textarea.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A279C1EE40C4B005C52B9 /* box_textarea.c */; };
+ 263A289A1EE4121D005C52B9 /* font.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A279E1EE40C4B005C52B9 /* font.c */; };
+ 263A289B1EE4121D005C52B9 /* form.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A01EE40C4B005C52B9 /* form.c */; };
+ 263A289C1EE4121D005C52B9 /* html.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A21EE40C4B005C52B9 /* html.c */; };
+ 263A289D1EE4121D005C52B9 /* html_css.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A41EE40C4B005C52B9 /* html_css.c */; };
+ 263A289E1EE4121D005C52B9 /* html_css_fetcher.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A51EE40C4B005C52B9 /* html_css_fetcher.c */; };
+ 263A289F1EE4121D005C52B9 /* html_forms.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A61EE40C4B005C52B9 /* html_forms.c */; };
+ 263A28A01EE4121D005C52B9 /* html_interaction.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A71EE40C4B005C52B9 /* html_interaction.c */; };
+ 263A28A11EE4121D005C52B9 /* html_object.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27A91EE40C4B005C52B9 /* html_object.c */; };
+ 263A28A21EE4121D005C52B9 /* html_redraw.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27AA1EE40C4B005C52B9 /* html_redraw.c */; };
+ 263A28A31EE4121D005C52B9 /* html_redraw_border.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27AB1EE40C4B005C52B9 /* html_redraw_border.c */; };
+ 263A28A41EE4121D005C52B9 /* html_script.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27AC1EE40C4B005C52B9 /* html_script.c */; };
+ 263A28A51EE4121D005C52B9 /* imagemap.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27AD1EE40C4B005C52B9 /* imagemap.c */; };
+ 263A28A61EE4121D005C52B9 /* layout.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27AF1EE40C4B005C52B9 /* layout.c */; };
+ 263A28A71EE4121D005C52B9 /* search.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27B21EE40C4B005C52B9 /* search.c */; };
+ 263A28A81EE4121D005C52B9 /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27B41EE40C4B005C52B9 /* table.c */; };
+ 263A28A91EE4121D005C52B9 /* textplain.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A27B61EE40C4B005C52B9 /* textplain.c */; };
+ 263A28AC1EE41245005C52B9 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 263A28AB1EE41245005C52B9 /* libiconv.tbd */; };
+ 263A28AE1EE41266005C52B9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 263A28AD1EE41266005C52B9 /* libz.tbd */; };
+ 263A29031EE412BE005C52B9 /* content.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28B01EE412B4005C52B9 /* content.c */; };
+ 263A29041EE412BE005C52B9 /* fetcher.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28F31EE412B4005C52B9 /* fetcher.c */; };
+ 263A29051EE412BE005C52B9 /* none.c in Sources */ = {isa = PBXBuildFile; fileRef = 263A28F91EE412B4005C52B9 /* none.c */; };
+ 263A29071EE4196E005C52B9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 263A29061EE4196E005C52B9 /* Cocoa.framework */; };
+ 263A29081EE41A75005C52B9 /* adblock.css in Resources */ = {isa = PBXBuildFile; fileRef = 263A262D1EE40BFC005C52B9 /* adblock.css */; };
+ 263A29091EE41A7D005C52B9 /* BookmarksWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A262E1EE40BFC005C52B9 /* BookmarksWindow.xib */; };
+ 263A290A1EE41A7D005C52B9 /* Browser.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A262F1EE40BFC005C52B9 /* Browser.xib */; };
+ 263A290B1EE41A7D005C52B9 /* BrowserWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A26301EE40BFC005C52B9 /* BrowserWindow.xib */; };
+ 263A290C1EE41A7D005C52B9 /* ca-bundle in Resources */ = {isa = PBXBuildFile; fileRef = 263A26311EE40BFC005C52B9 /* ca-bundle */; };
+ 263A290D1EE41A8C005C52B9 /* BookmarksWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26321EE40BFC005C52B9 /* BookmarksWindow.xib.strings */; };
+ 263A290E1EE41A8C005C52B9 /* BrowserWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26341EE40BFC005C52B9 /* BrowserWindow.xib.strings */; };
+ 263A290F1EE41A8C005C52B9 /* DownloadWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26361EE40BFC005C52B9 /* DownloadWindow.xib.strings */; };
+ 263A29101EE41A8C005C52B9 /* HistoryWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26381EE40BFC005C52B9 /* HistoryWindow.xib.strings */; };
+ 263A29111EE41A8C005C52B9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A263A1EE40BFC005C52B9 /* Localizable.strings */; };
+ 263A29121EE41A8F005C52B9 /* MainMenu.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A263C1EE40BFC005C52B9 /* MainMenu.xib.strings */; };
+ 263A29131EE41A96005C52B9 /* Messages in Resources */ = {isa = PBXBuildFile; fileRef = 263A263E1EE40BFC005C52B9 /* Messages */; };
+ 263A29141EE41A96005C52B9 /* PreferencesWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26401EE40BFC005C52B9 /* PreferencesWindow.xib.strings */; };
+ 263A29151EE41A96005C52B9 /* SearchWindow.xib.strings in Resources */ = {isa = PBXBuildFile; fileRef = 263A26421EE40BFC005C52B9 /* SearchWindow.xib.strings */; };
+ 263A29161EE41A9A005C52B9 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 263A26441EE40BFC005C52B9 /* default.css */; };
+ 263A29171EE41A9A005C52B9 /* DownloadWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A26451EE40BFC005C52B9 /* DownloadWindow.xib */; };
+ 263A29181EE41A9A005C52B9 /* HistoryWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A264A1EE40BFC005C52B9 /* HistoryWindow.xib */; };
+ 263A29191EE41A9A005C52B9 /* HomeTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 263A264B1EE40BFC005C52B9 /* HomeTemplate.pdf */; };
+ 263A291A1EE41A9F005C52B9 /* arrow-l.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A264D1EE40BFC005C52B9 /* arrow-l.png */; };
+ 263A291B1EE41A9F005C52B9 /* content.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A264E1EE40BFC005C52B9 /* content.png */; };
+ 263A291C1EE41A9F005C52B9 /* directory.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A264F1EE40BFC005C52B9 /* directory.png */; };
+ 263A291D1EE41A9F005C52B9 /* directory2.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26501EE40BFC005C52B9 /* directory2.png */; };
+ 263A291E1EE41A9F005C52B9 /* hotlist-add.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26511EE40BFC005C52B9 /* hotlist-add.png */; };
+ 263A291F1EE41A9F005C52B9 /* hotlist-rmv.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26521EE40BFC005C52B9 /* hotlist-rmv.png */; };
+ 263A29201EE41A9F005C52B9 /* search.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26531EE40BFC005C52B9 /* search.png */; };
+ 263A29211EE41AA4005C52B9 /* internal.css in Resources */ = {isa = PBXBuildFile; fileRef = 263A26541EE40BFC005C52B9 /* internal.css */; };
+ 263A29221EE41AA4005C52B9 /* LocalHistoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A26571EE40BFC005C52B9 /* LocalHistoryPanel.xib */; };
+ 263A29231EE41AA4005C52B9 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A26581EE40BFC005C52B9 /* MainMenu.xib */; };
+ 263A29241EE41AA8005C52B9 /* NetSurf.icns in Resources */ = {isa = PBXBuildFile; fileRef = 263A265A1EE40BFC005C52B9 /* NetSurf.icns */; };
+ 263A29251EE41AA8005C52B9 /* netsurf.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A265B1EE40BFC005C52B9 /* netsurf.png */; };
+ 263A29261EE41AA8005C52B9 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A265E1EE40BFC005C52B9 /* PreferencesWindow.xib */; };
+ 263A29271EE41AA8005C52B9 /* quirks.css in Resources */ = {isa = PBXBuildFile; fileRef = 263A265F1EE40BFC005C52B9 /* quirks.css */; };
+ 263A29281EE41AA8005C52B9 /* SearchWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 263A26601EE40BFC005C52B9 /* SearchWindow.xib */; };
+ 263A29291EE41B53005C52B9 /* AquaTabClose_Front.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26041EE40BFC005C52B9 /* AquaTabClose_Front.png */; };
+ 263A292A1EE41B53005C52B9 /* AquaTabClose_Front_Pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26051EE40BFC005C52B9 /* AquaTabClose_Front_Pressed.png */; };
+ 263A292B1EE41B53005C52B9 /* AquaTabClose_Front_Rollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26061EE40BFC005C52B9 /* AquaTabClose_Front_Rollover.png */; };
+ 263A292C1EE41B53005C52B9 /* AquaTabCloseDirty_Front.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26071EE40BFC005C52B9 /* AquaTabCloseDirty_Front.png */; };
+ 263A292D1EE41B53005C52B9 /* AquaTabCloseDirty_Front_Pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26081EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Pressed.png */; };
+ 263A292E1EE41B53005C52B9 /* AquaTabCloseDirty_Front_Rollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A26091EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Rollover.png */; };
+ 263A292F1EE41B53005C52B9 /* AquaTabNew.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260A1EE40BFC005C52B9 /* AquaTabNew.png */; };
+ 263A29301EE41B53005C52B9 /* AquaTabNewPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260B1EE40BFC005C52B9 /* AquaTabNewPressed.png */; };
+ 263A29311EE41B53005C52B9 /* AquaTabNewRollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260C1EE40BFC005C52B9 /* AquaTabNewRollover.png */; };
+ 263A29321EE41B53005C52B9 /* overflowImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260D1EE40BFC005C52B9 /* overflowImage.png */; };
+ 263A29331EE41B53005C52B9 /* overflowImagePressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260E1EE40BFC005C52B9 /* overflowImagePressed.png */; };
+ 263A29341EE41B53005C52B9 /* pi.png in Resources */ = {isa = PBXBuildFile; fileRef = 263A260F1EE40BFC005C52B9 /* pi.png */; };
+ 263A29351EE41B5E005C52B9 /* NSBezierPath_AMShading.m in Sources */ = {isa = PBXBuildFile; fileRef = 263A26111EE40BFC005C52B9 /* NSBezierPath_AMShading.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 261DB24F1318444F00C59F12 /* compile-xib.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "compile-xib.sh"; sourceTree = "<group>"; };
+ 261DB2501318444F00C59F12 /* extract-strings.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "extract-strings.sh"; sourceTree = "<group>"; };
+ 2636299412F699250048542C /* NetSurf.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = NetSurf.app; path = ../../NetSurf.app; sourceTree = SOURCE_ROOT; };
+ 263A25EE1EE40BD6005C52B9 /* NetSurfBrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetSurfBrowser.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 263A26041EE40BFC005C52B9 /* AquaTabClose_Front.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabClose_Front.png; sourceTree = "<group>"; };
+ 263A26051EE40BFC005C52B9 /* AquaTabClose_Front_Pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabClose_Front_Pressed.png; sourceTree = "<group>"; };
+ 263A26061EE40BFC005C52B9 /* AquaTabClose_Front_Rollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabClose_Front_Rollover.png; sourceTree = "<group>"; };
+ 263A26071EE40BFC005C52B9 /* AquaTabCloseDirty_Front.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabCloseDirty_Front.png; sourceTree = "<group>"; };
+ 263A26081EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabCloseDirty_Front_Pressed.png; sourceTree = "<group>"; };
+ 263A26091EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Rollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabCloseDirty_Front_Rollover.png; sourceTree = "<group>"; };
+ 263A260A1EE40BFC005C52B9 /* AquaTabNew.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabNew.png; sourceTree = "<group>"; };
+ 263A260B1EE40BFC005C52B9 /* AquaTabNewPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabNewPressed.png; sourceTree = "<group>"; };
+ 263A260C1EE40BFC005C52B9 /* AquaTabNewRollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AquaTabNewRollover.png; sourceTree = "<group>"; };
+ 263A260D1EE40BFC005C52B9 /* overflowImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = overflowImage.png; sourceTree = "<group>"; };
+ 263A260E1EE40BFC005C52B9 /* overflowImagePressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = overflowImagePressed.png; sourceTree = "<group>"; };
+ 263A260F1EE40BFC005C52B9 /* pi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pi.png; sourceTree = "<group>"; };
+ 263A26101EE40BFC005C52B9 /* NSBezierPath_AMShading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSBezierPath_AMShading.h; sourceTree = "<group>"; };
+ 263A26111EE40BFC005C52B9 /* NSBezierPath_AMShading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSBezierPath_AMShading.m; sourceTree = "<group>"; };
+ 263A26121EE40BFC005C52B9 /* NSString_AITruncation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSString_AITruncation.h; sourceTree = "<group>"; };
+ 263A26131EE40BFC005C52B9 /* NSString_AITruncation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSString_AITruncation.m; sourceTree = "<group>"; };
+ 263A26141EE40BFC005C52B9 /* PSMOverflowPopUpButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMOverflowPopUpButton.h; sourceTree = "<group>"; };
+ 263A26151EE40BFC005C52B9 /* PSMOverflowPopUpButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMOverflowPopUpButton.m; sourceTree = "<group>"; };
+ 263A26161EE40BFC005C52B9 /* PSMProgressIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMProgressIndicator.h; sourceTree = "<group>"; };
+ 263A26171EE40BFC005C52B9 /* PSMProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMProgressIndicator.m; sourceTree = "<group>"; };
+ 263A26181EE40BFC005C52B9 /* PSMRolloverButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMRolloverButton.h; sourceTree = "<group>"; };
+ 263A26191EE40BFC005C52B9 /* PSMRolloverButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMRolloverButton.m; sourceTree = "<group>"; };
+ 263A261A1EE40BFC005C52B9 /* PSMTabBarCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabBarCell.h; sourceTree = "<group>"; };
+ 263A261B1EE40BFC005C52B9 /* PSMTabBarCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabBarCell.m; sourceTree = "<group>"; };
+ 263A261C1EE40BFC005C52B9 /* PSMTabBarControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabBarControl.h; sourceTree = "<group>"; };
+ 263A261D1EE40BFC005C52B9 /* PSMTabBarControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabBarControl.m; sourceTree = "<group>"; };
+ 263A261E1EE40BFC005C52B9 /* PSMTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabBarController.h; sourceTree = "<group>"; };
+ 263A261F1EE40BFC005C52B9 /* PSMTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabBarController.m; sourceTree = "<group>"; };
+ 263A26201EE40BFC005C52B9 /* PSMTabDragAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabDragAssistant.h; sourceTree = "<group>"; };
+ 263A26211EE40BFC005C52B9 /* PSMTabDragAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabDragAssistant.m; sourceTree = "<group>"; };
+ 263A26221EE40BFC005C52B9 /* PSMTabDragView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabDragView.h; sourceTree = "<group>"; };
+ 263A26231EE40BFC005C52B9 /* PSMTabDragView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabDragView.m; sourceTree = "<group>"; };
+ 263A26241EE40BFC005C52B9 /* PSMTabDragWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabDragWindow.h; sourceTree = "<group>"; };
+ 263A26251EE40BFC005C52B9 /* PSMTabDragWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabDragWindow.m; sourceTree = "<group>"; };
+ 263A26261EE40BFC005C52B9 /* PSMTabDragWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabDragWindowController.h; sourceTree = "<group>"; };
+ 263A26271EE40BFC005C52B9 /* PSMTabDragWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMTabDragWindowController.m; sourceTree = "<group>"; };
+ 263A26281EE40BFC005C52B9 /* PSMTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMTabStyle.h; sourceTree = "<group>"; };
+ 263A26291EE40BFC005C52B9 /* PSMUnifiedTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMUnifiedTabStyle.h; sourceTree = "<group>"; };
+ 263A262A1EE40BFC005C52B9 /* PSMUnifiedTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMUnifiedTabStyle.m; sourceTree = "<group>"; };
+ 263A262B1EE40BFC005C52B9 /* ReadMe.rtfd */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; path = ReadMe.rtfd; sourceTree = "<group>"; };
+ 263A262D1EE40BFC005C52B9 /* adblock.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = adblock.css; sourceTree = "<group>"; };
+ 263A262E1EE40BFC005C52B9 /* BookmarksWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BookmarksWindow.xib; sourceTree = "<group>"; };
+ 263A262F1EE40BFC005C52B9 /* Browser.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Browser.xib; sourceTree = "<group>"; };
+ 263A26301EE40BFC005C52B9 /* BrowserWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BrowserWindow.xib; sourceTree = "<group>"; };
+ 263A26311EE40BFC005C52B9 /* ca-bundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "ca-bundle"; sourceTree = "<group>"; };
+ 263A26331EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/BookmarksWindow.xib.strings; sourceTree = "<group>"; };
+ 263A26351EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/BrowserWindow.xib.strings; sourceTree = "<group>"; };
+ 263A26371EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/DownloadWindow.xib.strings; sourceTree = "<group>"; };
+ 263A26391EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/HistoryWindow.xib.strings; sourceTree = "<group>"; };
+ 263A263B1EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
+ 263A263D1EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainMenu.xib.strings; sourceTree = "<group>"; };
+ 263A263F1EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = file; name = de; path = de.lproj/Messages; sourceTree = "<group>"; };
+ 263A26411EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PreferencesWindow.xib.strings; sourceTree = "<group>"; };
+ 263A26431EE40BFC005C52B9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SearchWindow.xib.strings; sourceTree = "<group>"; };
+ 263A26441EE40BFC005C52B9 /* default.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = default.css; sourceTree = "<group>"; };
+ 263A26451EE40BFC005C52B9 /* DownloadWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DownloadWindow.xib; sourceTree = "<group>"; };
+ 263A26461EE40BFC005C52B9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
+ 263A26471EE40BFC005C52B9 /* en */ = {isa = PBXFileReference; lastKnownFileType = file; name = en; path = en.lproj/Messages; sourceTree = "<group>"; };
+ 263A26481EE40BFC005C52B9 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
+ 263A26491EE40BFC005C52B9 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file; name = fr; path = fr.lproj/Messages; sourceTree = "<group>"; };
+ 263A264A1EE40BFC005C52B9 /* HistoryWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HistoryWindow.xib; sourceTree = "<group>"; };
+ 263A264B1EE40BFC005C52B9 /* HomeTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = HomeTemplate.pdf; sourceTree = "<group>"; };
+ 263A264D1EE40BFC005C52B9 /* arrow-l.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-l.png"; sourceTree = "<group>"; };
+ 263A264E1EE40BFC005C52B9 /* content.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = content.png; sourceTree = "<group>"; };
+ 263A264F1EE40BFC005C52B9 /* directory.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = directory.png; sourceTree = "<group>"; };
+ 263A26501EE40BFC005C52B9 /* directory2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = directory2.png; sourceTree = "<group>"; };
+ 263A26511EE40BFC005C52B9 /* hotlist-add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "hotlist-add.png"; sourceTree = "<group>"; };
+ 263A26521EE40BFC005C52B9 /* hotlist-rmv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "hotlist-rmv.png"; sourceTree = "<group>"; };
+ 263A26531EE40BFC005C52B9 /* search.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search.png; sourceTree = "<group>"; };
+ 263A26541EE40BFC005C52B9 /* internal.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = internal.css; sourceTree = "<group>"; };
+ 263A26551EE40BFC005C52B9 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
+ 263A26561EE40BFC005C52B9 /* it */ = {isa = PBXFileReference; lastKnownFileType = file; name = it; path = it.lproj/Messages; sourceTree = "<group>"; };
+ 263A26571EE40BFC005C52B9 /* LocalHistoryPanel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LocalHistoryPanel.xib; sourceTree = "<group>"; };
+ 263A26581EE40BFC005C52B9 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; };
+ 263A26591EE40BFC005C52B9 /* NetSurf-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "NetSurf-Info.plist"; sourceTree = "<group>"; };
+ 263A265A1EE40BFC005C52B9 /* NetSurf.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = NetSurf.icns; sourceTree = "<group>"; };
+ 263A265B1EE40BFC005C52B9 /* netsurf.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = netsurf.png; sourceTree = "<group>"; };
+ 263A265C1EE40BFC005C52B9 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; };
+ 263A265D1EE40BFC005C52B9 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file; name = nl; path = nl.lproj/Messages; sourceTree = "<group>"; };
+ 263A265E1EE40BFC005C52B9 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
+ 263A265F1EE40BFC005C52B9 /* quirks.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = quirks.css; sourceTree = "<group>"; };
+ 263A26601EE40BFC005C52B9 /* SearchWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SearchWindow.xib; sourceTree = "<group>"; };
+ 263A26611EE40BFC005C52B9 /* apple_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apple_image.h; sourceTree = SOURCE_ROOT; };
+ 263A26621EE40BFC005C52B9 /* ArrowBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrowBox.h; sourceTree = SOURCE_ROOT; };
+ 263A26631EE40BFC005C52B9 /* ArrowWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrowWindow.h; sourceTree = SOURCE_ROOT; };
+ 263A26641EE40BFC005C52B9 /* bitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitmap.h; sourceTree = SOURCE_ROOT; };
+ 263A26661EE40BFC005C52B9 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = SOURCE_ROOT; };
+ 263A26671EE40BFC005C52B9 /* BrowserView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserView.h; sourceTree = SOURCE_ROOT; };
+ 263A26681EE40BFC005C52B9 /* BrowserViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserViewController.h; sourceTree = SOURCE_ROOT; };
+ 263A26691EE40BFC005C52B9 /* BrowserWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserWindow.h; sourceTree = SOURCE_ROOT; };
+ 263A266A1EE40BFC005C52B9 /* BrowserWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserWindowController.h; sourceTree = SOURCE_ROOT; };
+ 263A266B1EE40BFC005C52B9 /* coordinates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coordinates.h; sourceTree = SOURCE_ROOT; };
+ 263A266C1EE40BFC005C52B9 /* desktop-tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "desktop-tree.h"; sourceTree = SOURCE_ROOT; };
+ 263A266D1EE40BFC005C52B9 /* DownloadWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadWindowController.h; sourceTree = SOURCE_ROOT; };
+ 263A266E1EE40BFC005C52B9 /* fetch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fetch.h; sourceTree = SOURCE_ROOT; };
+ 263A266F1EE40BFC005C52B9 /* font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font.h; sourceTree = SOURCE_ROOT; };
+ 263A26701EE40BFC005C52B9 /* FormSelectMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormSelectMenu.h; sourceTree = SOURCE_ROOT; };
+ 263A26711EE40BFC005C52B9 /* gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui.h; sourceTree = SOURCE_ROOT; };
+ 263A26721EE40BFC005C52B9 /* HistoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryView.h; sourceTree = SOURCE_ROOT; };
+ 263A26731EE40BFC005C52B9 /* HistoryWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryWindowController.h; sourceTree = SOURCE_ROOT; };
+ 263A26741EE40BFC005C52B9 /* LocalHistoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalHistoryController.h; sourceTree = SOURCE_ROOT; };
+ 263A26751EE40BFC005C52B9 /* NetsurfApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetsurfApp.h; sourceTree = SOURCE_ROOT; };
+ 263A26761EE40BFC005C52B9 /* NetSurfAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetSurfAppDelegate.h; sourceTree = SOURCE_ROOT; };
+ 263A26771EE40BFC005C52B9 /* plotter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plotter.h; sourceTree = SOURCE_ROOT; };
+ 263A26781EE40BFC005C52B9 /* PreferencesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreferencesWindowController.h; sourceTree = SOURCE_ROOT; };
+ 263A26791EE40BFC005C52B9 /* schedule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = schedule.h; sourceTree = SOURCE_ROOT; };
+ 263A267A1EE40BFC005C52B9 /* ScrollableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollableView.h; sourceTree = SOURCE_ROOT; };
+ 263A267B1EE40BFC005C52B9 /* SearchWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchWindowController.h; sourceTree = SOURCE_ROOT; };
+ 263A267C1EE40BFC005C52B9 /* selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = selection.h; sourceTree = SOURCE_ROOT; };
+ 263A267D1EE40BFC005C52B9 /* Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tree.h; sourceTree = SOURCE_ROOT; };
+ 263A267E1EE40BFC005C52B9 /* TreeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeView.h; sourceTree = SOURCE_ROOT; };
+ 263A267F1EE40BFC005C52B9 /* URLFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLFieldCell.h; sourceTree = SOURCE_ROOT; };
+ 263A26801EE40BFC005C52B9 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = SOURCE_ROOT; };
+ 263A26811EE40BFC005C52B9 /* Makefile.defaults */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.defaults; sourceTree = SOURCE_ROOT; };
+ 263A26821EE40BFC005C52B9 /* apple_image.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = apple_image.m; sourceTree = SOURCE_ROOT; };
+ 263A26831EE40BFC005C52B9 /* ArrowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ArrowBox.m; sourceTree = SOURCE_ROOT; };
+ 263A26841EE40BFC005C52B9 /* ArrowWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ArrowWindow.m; sourceTree = SOURCE_ROOT; };
+ 263A26851EE40BFC005C52B9 /* bitmap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = bitmap.m; sourceTree = SOURCE_ROOT; };
+ 263A26871EE40BFC005C52B9 /* BookmarksController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarksController.m; sourceTree = SOURCE_ROOT; };
+ 263A26881EE40BFC005C52B9 /* BrowserView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserView.m; sourceTree = SOURCE_ROOT; };
+ 263A26891EE40BFC005C52B9 /* BrowserViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserViewController.m; sourceTree = SOURCE_ROOT; };
+ 263A268A1EE40BFC005C52B9 /* BrowserWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserWindow.m; sourceTree = SOURCE_ROOT; };
+ 263A268B1EE40BFC005C52B9 /* BrowserWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserWindowController.m; sourceTree = SOURCE_ROOT; };
+ 263A268C1EE40BFC005C52B9 /* desktop-tree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "desktop-tree.m"; sourceTree = SOURCE_ROOT; };
+ 263A268D1EE40BFC005C52B9 /* DownloadWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DownloadWindowController.m; sourceTree = SOURCE_ROOT; };
+ 263A268E1EE40BFC005C52B9 /* fetch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = fetch.m; sourceTree = SOURCE_ROOT; };
+ 263A268F1EE40BFC005C52B9 /* font.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = font.m; sourceTree = SOURCE_ROOT; };
+ 263A26901EE40BFC005C52B9 /* FormSelectMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FormSelectMenu.m; sourceTree = SOURCE_ROOT; };
+ 263A26911EE40BFC005C52B9 /* gui.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gui.m; sourceTree = SOURCE_ROOT; };
+ 263A26921EE40BFC005C52B9 /* HistoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryView.m; sourceTree = SOURCE_ROOT; };
+ 263A26931EE40BFC005C52B9 /* HistoryWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryWindowController.m; sourceTree = SOURCE_ROOT; };
+ 263A26941EE40BFC005C52B9 /* LocalHistoryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalHistoryController.m; sourceTree = SOURCE_ROOT; };
+ 263A26951EE40BFC005C52B9 /* NetsurfApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetsurfApp.m; sourceTree = SOURCE_ROOT; };
+ 263A26961EE40BFC005C52B9 /* NetSurfAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetSurfAppDelegate.m; sourceTree = SOURCE_ROOT; };
+ 263A26971EE40BFC005C52B9 /* plotter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = plotter.m; sourceTree = SOURCE_ROOT; };
+ 263A26981EE40BFC005C52B9 /* PreferencesWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreferencesWindowController.m; sourceTree = SOURCE_ROOT; };
+ 263A26991EE40BFC005C52B9 /* schedule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = schedule.m; sourceTree = SOURCE_ROOT; };
+ 263A269A1EE40BFC005C52B9 /* ScrollableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollableView.m; sourceTree = SOURCE_ROOT; };
+ 263A269B1EE40BFC005C52B9 /* SearchWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchWindowController.m; sourceTree = SOURCE_ROOT; };
+ 263A269C1EE40BFC005C52B9 /* selection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = selection.m; sourceTree = SOURCE_ROOT; };
+ 263A269D1EE40BFC005C52B9 /* Tree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tree.m; sourceTree = SOURCE_ROOT; };
+ 263A269E1EE40BFC005C52B9 /* TreeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeView.m; sourceTree = SOURCE_ROOT; };
+ 263A269F1EE40BFC005C52B9 /* URLFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLFieldCell.m; sourceTree = SOURCE_ROOT; };
+ 263A26A21EE40C4A005C52B9 /* backing_store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backing_store.h; sourceTree = "<group>"; };
+ 263A26A31EE40C4A005C52B9 /* content.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = content.c; sourceTree = "<group>"; };
+ 263A26A41EE40C4A005C52B9 /* content.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content.h; sourceTree = "<group>"; };
+ 263A26A51EE40C4A005C52B9 /* content_debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content_debug.h; sourceTree = "<group>"; };
+ 263A26A61EE40C4A005C52B9 /* content_factory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = content_factory.c; sourceTree = "<group>"; };
+ 263A26A71EE40C4A005C52B9 /* content_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content_factory.h; sourceTree = "<group>"; };
+ 263A26A81EE40C4A005C52B9 /* content_protected.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content_protected.h; sourceTree = "<group>"; };
+ 263A26A91EE40C4A005C52B9 /* dirlist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dirlist.c; sourceTree = "<group>"; };
+ 263A26AA1EE40C4A005C52B9 /* dirlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dirlist.h; sourceTree = "<group>"; };
+ 263A26AB1EE40C4A005C52B9 /* fetch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fetch.c; sourceTree = "<group>"; };
+ 263A26AC1EE40C4A005C52B9 /* fetch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fetch.h; sourceTree = "<group>"; };
+ 263A26AE1EE40C4A005C52B9 /* about.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = about.c; sourceTree = "<group>"; };
+ 263A26AF1EE40C4A005C52B9 /* about.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = about.h; sourceTree = "<group>"; };
+ 263A26B01EE40C4A005C52B9 /* curl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = curl.c; sourceTree = "<group>"; };
+ 263A26B11EE40C4A005C52B9 /* curl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = curl.h; sourceTree = "<group>"; };
+ 263A26B21EE40C4A005C52B9 /* data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = data.c; sourceTree = "<group>"; };
+ 263A26B31EE40C4A005C52B9 /* data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = "<group>"; };
+ 263A26B41EE40C4A005C52B9 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = file.c; sourceTree = "<group>"; };
+ 263A26B51EE40C4A005C52B9 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = "<group>"; };
+ 263A26B61EE40C4A005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A26B71EE40C4A005C52B9 /* resource.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resource.c; sourceTree = "<group>"; };
+ 263A26B81EE40C4A005C52B9 /* resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resource.h; sourceTree = "<group>"; };
+ 263A26B91EE40C4A005C52B9 /* fetchers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fetchers.h; sourceTree = "<group>"; };
+ 263A26BA1EE40C4A005C52B9 /* fs_backing_store.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fs_backing_store.c; sourceTree = "<group>"; };
+ 263A26BD1EE40C4A005C52B9 /* css.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = css.c; sourceTree = "<group>"; };
+ 263A26BE1EE40C4A005C52B9 /* css.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = css.h; sourceTree = "<group>"; };
+ 263A26BF1EE40C4A005C52B9 /* dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dump.c; sourceTree = "<group>"; };
+ 263A26C01EE40C4A005C52B9 /* dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dump.h; sourceTree = "<group>"; };
+ 263A26C11EE40C4A005C52B9 /* hints.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hints.c; sourceTree = "<group>"; };
+ 263A26C21EE40C4A005C52B9 /* hints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hints.h; sourceTree = "<group>"; };
+ 263A26C31EE40C4A005C52B9 /* internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = internal.c; sourceTree = "<group>"; };
+ 263A26C41EE40C4A005C52B9 /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; };
+ 263A26C51EE40C4A005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A26C61EE40C4A005C52B9 /* select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = select.c; sourceTree = "<group>"; };
+ 263A26C71EE40C4A005C52B9 /* select.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = select.h; sourceTree = "<group>"; };
+ 263A26C81EE40C4A005C52B9 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utils.c; sourceTree = "<group>"; };
+ 263A26C91EE40C4A005C52B9 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = "<group>"; };
+ 263A26CB1EE40C4A005C52B9 /* bmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bmp.c; sourceTree = "<group>"; };
+ 263A26CC1EE40C4A005C52B9 /* bmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bmp.h; sourceTree = "<group>"; };
+ 263A26CD1EE40C4A005C52B9 /* gif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gif.c; sourceTree = "<group>"; };
+ 263A26CE1EE40C4A005C52B9 /* gif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gif.h; sourceTree = "<group>"; };
+ 263A26CF1EE40C4A005C52B9 /* ico.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ico.c; sourceTree = "<group>"; };
+ 263A26D01EE40C4A005C52B9 /* ico.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ico.h; sourceTree = "<group>"; };
+ 263A26D11EE40C4A005C52B9 /* image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = image.c; sourceTree = "<group>"; };
+ 263A26D21EE40C4A005C52B9 /* image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = image.h; sourceTree = "<group>"; };
+ 263A26D31EE40C4A005C52B9 /* image_cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = image_cache.c; sourceTree = "<group>"; };
+ 263A26D41EE40C4A005C52B9 /* image_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = image_cache.h; sourceTree = "<group>"; };
+ 263A26D61EE40C4A005C52B9 /* jpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jpeg.h; sourceTree = "<group>"; };
+ 263A26D71EE40C4A005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A26D91EE40C4A005C52B9 /* nssprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nssprite.h; sourceTree = "<group>"; };
+ 263A26DB1EE40C4A005C52B9 /* png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = png.h; sourceTree = "<group>"; };
+ 263A26DD1EE40C4A005C52B9 /* rsvg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsvg.h; sourceTree = "<group>"; };
+ 263A26DF1EE40C4A005C52B9 /* svg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = svg.h; sourceTree = "<group>"; };
+ 263A26E11EE40C4A005C52B9 /* video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video.h; sourceTree = "<group>"; };
+ 263A27361EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A27371EE40C4B005C52B9 /* hlcache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hlcache.c; sourceTree = "<group>"; };
+ 263A27381EE40C4B005C52B9 /* hlcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hlcache.h; sourceTree = "<group>"; };
+ 263A27391EE40C4B005C52B9 /* llcache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = llcache.c; sourceTree = "<group>"; };
+ 263A273A1EE40C4B005C52B9 /* llcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llcache.h; sourceTree = "<group>"; };
+ 263A273B1EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A273C1EE40C4B005C52B9 /* mimesniff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mimesniff.c; sourceTree = "<group>"; };
+ 263A273D1EE40C4B005C52B9 /* mimesniff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mimesniff.h; sourceTree = "<group>"; };
+ 263A273E1EE40C4B005C52B9 /* no_backing_store.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = no_backing_store.c; sourceTree = "<group>"; };
+ 263A273F1EE40C4B005C52B9 /* urldb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = urldb.c; sourceTree = "<group>"; };
+ 263A27401EE40C4B005C52B9 /* urldb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = urldb.h; sourceTree = "<group>"; };
+ 263A27421EE40C4B005C52B9 /* browser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = browser.c; sourceTree = "<group>"; };
+ 263A27431EE40C4B005C52B9 /* browser_history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = browser_history.c; sourceTree = "<group>"; };
+ 263A27441EE40C4B005C52B9 /* browser_history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser_history.h; sourceTree = "<group>"; };
+ 263A27451EE40C4B005C52B9 /* browser_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser_private.h; sourceTree = "<group>"; };
+ 263A27461EE40C4B005C52B9 /* cookie_manager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cookie_manager.c; sourceTree = "<group>"; };
+ 263A27471EE40C4B005C52B9 /* cookie_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cookie_manager.h; sourceTree = "<group>"; };
+ 263A27481EE40C4B005C52B9 /* download.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = download.c; sourceTree = "<group>"; };
+ 263A27491EE40C4B005C52B9 /* download.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = download.h; sourceTree = "<group>"; };
+ 263A274A1EE40C4B005C52B9 /* font_haru.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = font_haru.c; sourceTree = "<group>"; };
+ 263A274B1EE40C4B005C52B9 /* font_haru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font_haru.h; sourceTree = "<group>"; };
+ 263A274C1EE40C4B005C52B9 /* frame_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frame_types.h; sourceTree = "<group>"; };
+ 263A274D1EE40C4B005C52B9 /* frames.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = frames.c; sourceTree = "<group>"; };
+ 263A274E1EE40C4B005C52B9 /* frames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frames.h; sourceTree = "<group>"; };
+ 263A274F1EE40C4B005C52B9 /* global_history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = global_history.c; sourceTree = "<group>"; };
+ 263A27501EE40C4B005C52B9 /* global_history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = global_history.h; sourceTree = "<group>"; };
+ 263A27511EE40C4B005C52B9 /* gui_factory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gui_factory.c; sourceTree = "<group>"; };
+ 263A27521EE40C4B005C52B9 /* gui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui_internal.h; sourceTree = "<group>"; };
+ 263A27531EE40C4B005C52B9 /* gui_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui_table.h; sourceTree = "<group>"; };
+ 263A27541EE40C4B005C52B9 /* hotlist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hotlist.c; sourceTree = "<group>"; };
+ 263A27551EE40C4B005C52B9 /* hotlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hotlist.h; sourceTree = "<group>"; };
+ 263A27561EE40C4B005C52B9 /* knockout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = knockout.c; sourceTree = "<group>"; };
+ 263A27571EE40C4B005C52B9 /* knockout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = knockout.h; sourceTree = "<group>"; };
+ 263A27581EE40C4B005C52B9 /* local_history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = local_history.c; sourceTree = "<group>"; };
+ 263A27591EE40C4B005C52B9 /* local_history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_history.h; sourceTree = "<group>"; };
+ 263A275A1EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A275B1EE40C4B005C52B9 /* mouse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mouse.c; sourceTree = "<group>"; };
+ 263A275C1EE40C4B005C52B9 /* netsurf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = netsurf.c; sourceTree = "<group>"; };
+ 263A275D1EE40C4B005C52B9 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = "<group>"; };
+ 263A275E1EE40C4B005C52B9 /* plot_style.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = plot_style.c; sourceTree = "<group>"; };
+ 263A275F1EE40C4B005C52B9 /* print.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = print.c; sourceTree = "<group>"; };
+ 263A27601EE40C4B005C52B9 /* print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print.h; sourceTree = "<group>"; };
+ 263A27611EE40C4B005C52B9 /* printer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = printer.h; sourceTree = "<group>"; };
+ 263A27621EE40C4B005C52B9 /* save_complete.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = save_complete.c; sourceTree = "<group>"; };
+ 263A27631EE40C4B005C52B9 /* save_complete.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = save_complete.h; sourceTree = "<group>"; };
+ 263A27641EE40C4B005C52B9 /* save_pdf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = save_pdf.c; sourceTree = "<group>"; };
+ 263A27651EE40C4B005C52B9 /* save_pdf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = save_pdf.h; sourceTree = "<group>"; };
+ 263A27661EE40C4B005C52B9 /* save_text.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = save_text.c; sourceTree = "<group>"; };
+ 263A27671EE40C4B005C52B9 /* save_text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = save_text.h; sourceTree = "<group>"; };
+ 263A27681EE40C4B005C52B9 /* scrollbar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scrollbar.c; sourceTree = "<group>"; };
+ 263A27691EE40C4B005C52B9 /* scrollbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scrollbar.h; sourceTree = "<group>"; };
+ 263A276A1EE40C4B005C52B9 /* search.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = search.c; sourceTree = "<group>"; };
+ 263A276B1EE40C4B005C52B9 /* search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = "<group>"; };
+ 263A276C1EE40C4B005C52B9 /* searchweb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = searchweb.c; sourceTree = "<group>"; };
+ 263A276D1EE40C4B005C52B9 /* searchweb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = searchweb.h; sourceTree = "<group>"; };
+ 263A276E1EE40C4B005C52B9 /* selection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = selection.c; sourceTree = "<group>"; };
+ 263A276F1EE40C4B005C52B9 /* selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = selection.h; sourceTree = "<group>"; };
+ 263A27701EE40C4B005C52B9 /* sslcert_viewer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sslcert_viewer.c; sourceTree = "<group>"; };
+ 263A27711EE40C4B005C52B9 /* sslcert_viewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sslcert_viewer.h; sourceTree = "<group>"; };
+ 263A27721EE40C4B005C52B9 /* system_colour.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = system_colour.c; sourceTree = "<group>"; };
+ 263A27731EE40C4B005C52B9 /* system_colour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = system_colour.h; sourceTree = "<group>"; };
+ 263A27741EE40C4B005C52B9 /* textarea.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = textarea.c; sourceTree = "<group>"; };
+ 263A27751EE40C4B005C52B9 /* textarea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textarea.h; sourceTree = "<group>"; };
+ 263A27761EE40C4B005C52B9 /* textinput.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = textinput.c; sourceTree = "<group>"; };
+ 263A27771EE40C4B005C52B9 /* textinput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textinput.h; sourceTree = "<group>"; };
+ 263A27781EE40C4B005C52B9 /* theme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = theme.h; sourceTree = "<group>"; };
+ 263A27791EE40C4B005C52B9 /* treeview.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = treeview.c; sourceTree = "<group>"; };
+ 263A277A1EE40C4B005C52B9 /* treeview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = treeview.h; sourceTree = "<group>"; };
+ 263A277B1EE40C4B005C52B9 /* version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = version.c; sourceTree = "<group>"; };
+ 263A277C1EE40C4B005C52B9 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = "<group>"; };
+ 263A277F1EE40C4B005C52B9 /* bitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitmap.h; sourceTree = "<group>"; };
+ 263A27801EE40C4B005C52B9 /* browser_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser_window.h; sourceTree = "<group>"; };
+ 263A27811EE40C4B005C52B9 /* clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clipboard.h; sourceTree = "<group>"; };
+ 263A27821EE40C4B005C52B9 /* content.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content.h; sourceTree = "<group>"; };
+ 263A27831EE40C4B005C52B9 /* content_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content_type.h; sourceTree = "<group>"; };
+ 263A27841EE40C4B005C52B9 /* cookie_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cookie_db.h; sourceTree = "<group>"; };
+ 263A27851EE40C4B005C52B9 /* core_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core_window.h; sourceTree = "<group>"; };
+ 263A27861EE40C4B005C52B9 /* css.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = css.h; sourceTree = "<group>"; };
+ 263A27871EE40C4B005C52B9 /* download.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = download.h; sourceTree = "<group>"; };
+ 263A27881EE40C4B005C52B9 /* fetch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fetch.h; sourceTree = "<group>"; };
+ 263A27891EE40C4B005C52B9 /* form.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = form.h; sourceTree = "<group>"; };
+ 263A278A1EE40C4B005C52B9 /* inttypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inttypes.h; sourceTree = "<group>"; };
+ 263A278B1EE40C4B005C52B9 /* keypress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = keypress.h; sourceTree = "<group>"; };
+ 263A278C1EE40C4B005C52B9 /* layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layout.h; sourceTree = "<group>"; };
+ 263A278D1EE40C4B005C52B9 /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = misc.h; sourceTree = "<group>"; };
+ 263A278E1EE40C4B005C52B9 /* mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mouse.h; sourceTree = "<group>"; };
+ 263A278F1EE40C4B005C52B9 /* netsurf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netsurf.h; sourceTree = "<group>"; };
+ 263A27901EE40C4B005C52B9 /* plot_style.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plot_style.h; sourceTree = "<group>"; };
+ 263A27911EE40C4B005C52B9 /* plotters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plotters.h; sourceTree = "<group>"; };
+ 263A27921EE40C4B005C52B9 /* search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = "<group>"; };
+ 263A27931EE40C4B005C52B9 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = "<group>"; };
+ 263A27941EE40C4B005C52B9 /* url_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = url_db.h; sourceTree = "<group>"; };
+ 263A27951EE40C4B005C52B9 /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = "<group>"; };
+ 263A27961EE40C4B005C52B9 /* window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = window.h; sourceTree = "<group>"; };
+ 263A27981EE40C4B005C52B9 /* box.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = box.c; sourceTree = "<group>"; };
+ 263A27991EE40C4B005C52B9 /* box.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = box.h; sourceTree = "<group>"; };
+ 263A279A1EE40C4B005C52B9 /* box_construct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = box_construct.c; sourceTree = "<group>"; };
+ 263A279B1EE40C4B005C52B9 /* box_normalise.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = box_normalise.c; sourceTree = "<group>"; };
+ 263A279C1EE40C4B005C52B9 /* box_textarea.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = box_textarea.c; sourceTree = "<group>"; };
+ 263A279D1EE40C4B005C52B9 /* box_textarea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = box_textarea.h; sourceTree = "<group>"; };
+ 263A279E1EE40C4B005C52B9 /* font.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = font.c; sourceTree = "<group>"; };
+ 263A279F1EE40C4B005C52B9 /* font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font.h; sourceTree = "<group>"; };
+ 263A27A01EE40C4B005C52B9 /* form.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = form.c; sourceTree = "<group>"; };
+ 263A27A11EE40C4B005C52B9 /* form_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = form_internal.h; sourceTree = "<group>"; };
+ 263A27A21EE40C4B005C52B9 /* html.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html.c; sourceTree = "<group>"; };
+ 263A27A31EE40C4B005C52B9 /* html.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = html.h; sourceTree = "<group>"; };
+ 263A27A41EE40C4B005C52B9 /* html_css.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_css.c; sourceTree = "<group>"; };
+ 263A27A51EE40C4B005C52B9 /* html_css_fetcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_css_fetcher.c; sourceTree = "<group>"; };
+ 263A27A61EE40C4B005C52B9 /* html_forms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_forms.c; sourceTree = "<group>"; };
+ 263A27A71EE40C4B005C52B9 /* html_interaction.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_interaction.c; sourceTree = "<group>"; };
+ 263A27A81EE40C4B005C52B9 /* html_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = html_internal.h; sourceTree = "<group>"; };
+ 263A27A91EE40C4B005C52B9 /* html_object.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_object.c; sourceTree = "<group>"; };
+ 263A27AA1EE40C4B005C52B9 /* html_redraw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_redraw.c; sourceTree = "<group>"; };
+ 263A27AB1EE40C4B005C52B9 /* html_redraw_border.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_redraw_border.c; sourceTree = "<group>"; };
+ 263A27AC1EE40C4B005C52B9 /* html_script.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = html_script.c; sourceTree = "<group>"; };
+ 263A27AD1EE40C4B005C52B9 /* imagemap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = imagemap.c; sourceTree = "<group>"; };
+ 263A27AE1EE40C4B005C52B9 /* imagemap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = imagemap.h; sourceTree = "<group>"; };
+ 263A27AF1EE40C4B005C52B9 /* layout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = layout.c; sourceTree = "<group>"; };
+ 263A27B01EE40C4B005C52B9 /* layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layout.h; sourceTree = "<group>"; };
+ 263A27B11EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A27B21EE40C4B005C52B9 /* search.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = search.c; sourceTree = "<group>"; };
+ 263A27B31EE40C4B005C52B9 /* search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = "<group>"; };
+ 263A27B41EE40C4B005C52B9 /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = table.c; sourceTree = "<group>"; };
+ 263A27B51EE40C4B005C52B9 /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = "<group>"; };
+ 263A27B61EE40C4B005C52B9 /* textplain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = textplain.c; sourceTree = "<group>"; };
+ 263A27B71EE40C4B005C52B9 /* textplain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textplain.h; sourceTree = "<group>"; };
+ 263A27B91EE40C4B005C52B9 /* ascii.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ascii.h; sourceTree = "<group>"; };
+ 263A27BA1EE40C4B005C52B9 /* bloom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bloom.c; sourceTree = "<group>"; };
+ 263A27BB1EE40C4B005C52B9 /* bloom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bloom.h; sourceTree = "<group>"; };
+ 263A27BC1EE40C4B005C52B9 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+ 263A27BD1EE40C4B005C52B9 /* corestringlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = corestringlist.h; sourceTree = "<group>"; };
+ 263A27BE1EE40C4B005C52B9 /* corestrings.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = corestrings.c; sourceTree = "<group>"; };
+ 263A27BF1EE40C4B005C52B9 /* corestrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = corestrings.h; sourceTree = "<group>"; };
+ 263A27C01EE40C4B005C52B9 /* coverity-build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "coverity-build.sh"; sourceTree = "<group>"; };
+ 263A27C11EE40C4B005C52B9 /* DerivedJoiningType.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DerivedJoiningType.txt; sourceTree = "<group>"; };
+ 263A27C21EE40C4B005C52B9 /* dirent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dirent.h; sourceTree = "<group>"; };
+ 263A27C31EE40C4B005C52B9 /* errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = errors.h; sourceTree = "<group>"; };
+ 263A27C41EE40C4B005C52B9 /* fetch-transifex.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "fetch-transifex.pl"; sourceTree = "<group>"; };
+ 263A27C51EE40C4B005C52B9 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = file.c; sourceTree = "<group>"; };
+ 263A27C61EE40C4B005C52B9 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = "<group>"; };
+ 263A27C71EE40C4B005C52B9 /* filename.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filename.c; sourceTree = "<group>"; };
+ 263A27C81EE40C4B005C52B9 /* filename.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filename.h; sourceTree = "<group>"; };
+ 263A27C91EE40C4B005C52B9 /* filepath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filepath.c; sourceTree = "<group>"; };
+ 263A27CA1EE40C4B005C52B9 /* filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filepath.h; sourceTree = "<group>"; };
+ 263A27CB1EE40C4B005C52B9 /* git-date.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "git-date.sh"; sourceTree = "<group>"; };
+ 263A27CC1EE40C4B005C52B9 /* git-testament.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "git-testament.pl"; sourceTree = "<group>"; };
+ 263A27CD1EE40C4B005C52B9 /* hashtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hashtable.c; sourceTree = "<group>"; };
+ 263A27CE1EE40C4B005C52B9 /* hashtable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hashtable.h; sourceTree = "<group>"; };
+ 263A27D01EE40C4B005C52B9 /* challenge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = challenge.c; sourceTree = "<group>"; };
+ 263A27D11EE40C4B005C52B9 /* challenge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = challenge.h; sourceTree = "<group>"; };
+ 263A27D21EE40C4B005C52B9 /* challenge_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = challenge_internal.h; sourceTree = "<group>"; };
+ 263A27D31EE40C4B005C52B9 /* content-disposition.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "content-disposition.c"; sourceTree = "<group>"; };
+ 263A27D41EE40C4B005C52B9 /* content-disposition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "content-disposition.h"; sourceTree = "<group>"; };
+ 263A27D51EE40C4B005C52B9 /* content-type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "content-type.c"; sourceTree = "<group>"; };
+ 263A27D61EE40C4B005C52B9 /* content-type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "content-type.h"; sourceTree = "<group>"; };
+ 263A27D71EE40C4B005C52B9 /* generics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = generics.c; sourceTree = "<group>"; };
+ 263A27D81EE40C4B005C52B9 /* generics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generics.h; sourceTree = "<group>"; };
+ 263A27D91EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A27DA1EE40C4B005C52B9 /* parameter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parameter.c; sourceTree = "<group>"; };
+ 263A27DB1EE40C4B005C52B9 /* parameter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parameter.h; sourceTree = "<group>"; };
+ 263A27DC1EE40C4B005C52B9 /* parameter_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parameter_internal.h; sourceTree = "<group>"; };
+ 263A27DD1EE40C4B005C52B9 /* primitives.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = primitives.c; sourceTree = "<group>"; };
+ 263A27DE1EE40C4B005C52B9 /* primitives.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = primitives.h; sourceTree = "<group>"; };
+ 263A27DF1EE40C4B005C52B9 /* www-authenticate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "www-authenticate.c"; sourceTree = "<group>"; };
+ 263A27E01EE40C4B005C52B9 /* www-authenticate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "www-authenticate.h"; sourceTree = "<group>"; };
+ 263A27E11EE40C4B005C52B9 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = http.h; sourceTree = "<group>"; };
+ 263A27E21EE40C4B005C52B9 /* idna-derived-props-gen.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "idna-derived-props-gen.pl"; sourceTree = "<group>"; };
+ 263A27E31EE40C4B005C52B9 /* idna-tables-5.2.0-properties.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "idna-tables-5.2.0-properties.csv"; sourceTree = "<group>"; };
+ 263A27E41EE40C4B005C52B9 /* idna.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = idna.c; sourceTree = "<group>"; };
+ 263A27E51EE40C4B005C52B9 /* idna.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idna.h; sourceTree = "<group>"; };
+ 263A27E61EE40C4B005C52B9 /* idna_props.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idna_props.h; sourceTree = "<group>"; };
+ 263A27E71EE40C4B005C52B9 /* import-messages.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "import-messages.pl"; sourceTree = "<group>"; };
+ 263A27E81EE40C4B005C52B9 /* inet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet.h; sourceTree = "<group>"; };
+ 263A27E91EE40C4B005C52B9 /* jenkins-build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "jenkins-build.sh"; sourceTree = "<group>"; };
+ 263A27EA1EE40C4B005C52B9 /* libdom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libdom.c; sourceTree = "<group>"; };
+ 263A27EB1EE40C4B005C52B9 /* libdom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libdom.h; sourceTree = "<group>"; };
+ 263A27EC1EE40C4B005C52B9 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
+ 263A27ED1EE40C4B005C52B9 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
+ 263A27EE1EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A27EF1EE40C4B005C52B9 /* memanalyze.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = memanalyze.pl; sourceTree = "<group>"; };
+ 263A27F01EE40C4B005C52B9 /* merge-messages.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "merge-messages.lua"; sourceTree = "<group>"; };
+ 263A27F11EE40C4B005C52B9 /* messages.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = messages.c; sourceTree = "<group>"; };
+ 263A27F21EE40C4B005C52B9 /* messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = messages.h; sourceTree = "<group>"; };
+ 263A27F31EE40C4B005C52B9 /* nsoption.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsoption.c; sourceTree = "<group>"; };
+ 263A27F41EE40C4B005C52B9 /* nsoption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsoption.h; sourceTree = "<group>"; };
+ 263A27F61EE40C4B005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A27F71EE40C4B005C52B9 /* nsurl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsurl.c; sourceTree = "<group>"; };
+ 263A27F81EE40C4B005C52B9 /* parse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = "<group>"; };
+ 263A27F91EE40C4B005C52B9 /* private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = private.h; sourceTree = "<group>"; };
+ 263A27FA1EE40C4B005C52B9 /* nsurl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsurl.h; sourceTree = "<group>"; };
+ 263A27FB1EE40C4B005C52B9 /* punycode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = punycode.c; sourceTree = "<group>"; };
+ 263A27FC1EE40C4B005C52B9 /* punycode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = punycode.h; sourceTree = "<group>"; };
+ 263A27FD1EE40C4B005C52B9 /* ring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring.h; sourceTree = "<group>"; };
+ 263A27FE1EE40C4B005C52B9 /* split-messages.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "split-messages.pl"; sourceTree = "<group>"; };
+ 263A27FF1EE40C4B005C52B9 /* string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = "<group>"; };
+ 263A28001EE40C4B005C52B9 /* sys_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sys_time.h; sourceTree = "<group>"; };
+ 263A28011EE40C4B005C52B9 /* talloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = talloc.c; sourceTree = "<group>"; };
+ 263A28021EE40C4B005C52B9 /* talloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = talloc.h; sourceTree = "<group>"; };
+ 263A28031EE40C4B005C52B9 /* test-netsurf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "test-netsurf"; sourceTree = "<group>"; };
+ 263A28041EE40C4B005C52B9 /* time.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = time.c; sourceTree = "<group>"; };
+ 263A28051EE40C4B005C52B9 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = "<group>"; };
+ 263A28061EE40C4B005C52B9 /* url.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = url.c; sourceTree = "<group>"; };
+ 263A28071EE40C4B005C52B9 /* url.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = url.h; sourceTree = "<group>"; };
+ 263A28081EE40C4B005C52B9 /* useragent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = useragent.c; sourceTree = "<group>"; };
+ 263A28091EE40C4B005C52B9 /* useragent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = useragent.h; sourceTree = "<group>"; };
+ 263A280A1EE40C4B005C52B9 /* utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utf8.c; sourceTree = "<group>"; };
+ 263A280B1EE40C4B005C52B9 /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = "<group>"; };
+ 263A280C1EE40C4B005C52B9 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utils.c; sourceTree = "<group>"; };
+ 263A280D1EE40C4B005C52B9 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = "<group>"; };
+ 263A280E1EE40C4B005C52B9 /* utsname.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utsname.h; sourceTree = "<group>"; };
+ 263A280F1EE40C4B005C52B9 /* valgrind.supp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = valgrind.supp; sourceTree = "<group>"; };
+ 263A28AB1EE41245005C52B9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
+ 263A28AD1EE41266005C52B9 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
+ 263A28B01EE412B4005C52B9 /* content.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = content.c; sourceTree = "<group>"; };
+ 263A28B11EE412B4005C52B9 /* content.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = content.h; sourceTree = "<group>"; };
+ 263A28B31EE412B4005C52B9 /* Console.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Console.bnd; sourceTree = "<group>"; };
+ 263A28B41EE412B4005C52B9 /* Document.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Document.bnd; sourceTree = "<group>"; };
+ 263A28B51EE412B4005C52B9 /* duk_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = duk_config.h; sourceTree = "<group>"; };
+ 263A28B61EE412B4005C52B9 /* duk_custom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = duk_custom.h; sourceTree = "<group>"; };
+ 263A28B71EE412B4005C52B9 /* dukky.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dukky.c; sourceTree = "<group>"; };
+ 263A28B81EE412B4005C52B9 /* dukky.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dukky.h; sourceTree = "<group>"; };
+ 263A28B91EE412B4005C52B9 /* duktape.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = duktape.c; sourceTree = "<group>"; };
+ 263A28BA1EE412B4005C52B9 /* duktape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = duktape.h; sourceTree = "<group>"; };
+ 263A28BB1EE412B4005C52B9 /* Element.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Element.bnd; sourceTree = "<group>"; };
+ 263A28BC1EE412B4005C52B9 /* Event.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Event.bnd; sourceTree = "<group>"; };
+ 263A28BD1EE412B4005C52B9 /* EventTarget.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventTarget.bnd; sourceTree = "<group>"; };
+ 263A28BE1EE412B4005C52B9 /* HTMLAnchorElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLAnchorElement.bnd; sourceTree = "<group>"; };
+ 263A28BF1EE412B4005C52B9 /* HTMLAppletElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLAppletElement.bnd; sourceTree = "<group>"; };
+ 263A28C01EE412B4005C52B9 /* HTMLAreaElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLAreaElement.bnd; sourceTree = "<group>"; };
+ 263A28C11EE412B4005C52B9 /* HTMLBaseElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLBaseElement.bnd; sourceTree = "<group>"; };
+ 263A28C21EE412B4005C52B9 /* HTMLBodyElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLBodyElement.bnd; sourceTree = "<group>"; };
+ 263A28C31EE412B4005C52B9 /* HTMLBRElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLBRElement.bnd; sourceTree = "<group>"; };
+ 263A28C41EE412B4005C52B9 /* HTMLButtonElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLButtonElement.bnd; sourceTree = "<group>"; };
+ 263A28C51EE412B4005C52B9 /* HTMLCollection.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLCollection.bnd; sourceTree = "<group>"; };
+ 263A28C61EE412B4005C52B9 /* HTMLDivElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLDivElement.bnd; sourceTree = "<group>"; };
+ 263A28C71EE412B4005C52B9 /* HTMLElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLElement.bnd; sourceTree = "<group>"; };
+ 263A28C81EE412B4005C52B9 /* HTMLFontElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLFontElement.bnd; sourceTree = "<group>"; };
+ 263A28C91EE412B4005C52B9 /* HTMLFormElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLFormElement.bnd; sourceTree = "<group>"; };
+ 263A28CA1EE412B4005C52B9 /* HTMLFrameElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLFrameElement.bnd; sourceTree = "<group>"; };
+ 263A28CB1EE412B4005C52B9 /* HTMLFrameSetElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLFrameSetElement.bnd; sourceTree = "<group>"; };
+ 263A28CC1EE412B4005C52B9 /* HTMLHeadingElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLHeadingElement.bnd; sourceTree = "<group>"; };
+ 263A28CD1EE412B4005C52B9 /* HTMLHRElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLHRElement.bnd; sourceTree = "<group>"; };
+ 263A28CE1EE412B4005C52B9 /* HTMLHTMLElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLHTMLElement.bnd; sourceTree = "<group>"; };
+ 263A28CF1EE412B4005C52B9 /* HTMLIFrameElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLIFrameElement.bnd; sourceTree = "<group>"; };
+ 263A28D01EE412B4005C52B9 /* HTMLImageElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLImageElement.bnd; sourceTree = "<group>"; };
+ 263A28D11EE412B4005C52B9 /* HTMLInputElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLInputElement.bnd; sourceTree = "<group>"; };
+ 263A28D21EE412B4005C52B9 /* HTMLLabelElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLLabelElement.bnd; sourceTree = "<group>"; };
+ 263A28D31EE412B4005C52B9 /* HTMLLegendElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLLegendElement.bnd; sourceTree = "<group>"; };
+ 263A28D41EE412B4005C52B9 /* HTMLLIElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLLIElement.bnd; sourceTree = "<group>"; };
+ 263A28D51EE412B4005C52B9 /* HTMLLinkElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLLinkElement.bnd; sourceTree = "<group>"; };
+ 263A28D61EE412B4005C52B9 /* HTMLMapElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLMapElement.bnd; sourceTree = "<group>"; };
+ 263A28D71EE412B4005C52B9 /* HTMLMarqueeElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLMarqueeElement.bnd; sourceTree = "<group>"; };
+ 263A28D81EE412B4005C52B9 /* HTMLMenuElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLMenuElement.bnd; sourceTree = "<group>"; };
+ 263A28D91EE412B4005C52B9 /* HTMLMetaElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLMetaElement.bnd; sourceTree = "<group>"; };
+ 263A28DA1EE412B4005C52B9 /* HTMLObjectElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLObjectElement.bnd; sourceTree = "<group>"; };
+ 263A28DB1EE412B4005C52B9 /* HTMLOListElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLOListElement.bnd; sourceTree = "<group>"; };
+ 263A28DC1EE412B4005C52B9 /* HTMLOptionElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLOptionElement.bnd; sourceTree = "<group>"; };
+ 263A28DD1EE412B4005C52B9 /* HTMLParagraphElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLParagraphElement.bnd; sourceTree = "<group>"; };
+ 263A28DE1EE412B4005C52B9 /* HTMLParamElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLParamElement.bnd; sourceTree = "<group>"; };
+ 263A28DF1EE412B4005C52B9 /* HTMLPreElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLPreElement.bnd; sourceTree = "<group>"; };
+ 263A28E01EE412B4005C52B9 /* HTMLQuoteElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLQuoteElement.bnd; sourceTree = "<group>"; };
+ 263A28E11EE412B4005C52B9 /* HTMLScriptElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLScriptElement.bnd; sourceTree = "<group>"; };
+ 263A28E21EE412B4005C52B9 /* HTMLSelectElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLSelectElement.bnd; sourceTree = "<group>"; };
+ 263A28E31EE412B4005C52B9 /* HTMLStyleElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLStyleElement.bnd; sourceTree = "<group>"; };
+ 263A28E41EE412B4005C52B9 /* HTMLTableCaptionElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableCaptionElement.bnd; sourceTree = "<group>"; };
+ 263A28E51EE412B4005C52B9 /* HTMLTableCellElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableCellElement.bnd; sourceTree = "<group>"; };
+ 263A28E61EE412B4005C52B9 /* HTMLTableColElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableColElement.bnd; sourceTree = "<group>"; };
+ 263A28E71EE412B4005C52B9 /* HTMLTableElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableElement.bnd; sourceTree = "<group>"; };
+ 263A28E81EE412B4005C52B9 /* HTMLTableRowElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableRowElement.bnd; sourceTree = "<group>"; };
+ 263A28E91EE412B4005C52B9 /* HTMLTableSectionElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTableSectionElement.bnd; sourceTree = "<group>"; };
+ 263A28EA1EE412B4005C52B9 /* HTMLTextAreaElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTextAreaElement.bnd; sourceTree = "<group>"; };
+ 263A28EB1EE412B4005C52B9 /* HTMLTitleElement.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLTitleElement.bnd; sourceTree = "<group>"; };
+ 263A28EC1EE412B4005C52B9 /* Location.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Location.bnd; sourceTree = "<group>"; };
+ 263A28ED1EE412B4005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A28EE1EE412B4005C52B9 /* Navigator.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Navigator.bnd; sourceTree = "<group>"; };
+ 263A28EF1EE412B4005C52B9 /* netsurf.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = netsurf.bnd; sourceTree = "<group>"; };
+ 263A28F01EE412B4005C52B9 /* Node.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Node.bnd; sourceTree = "<group>"; };
+ 263A28F11EE412B4005C52B9 /* NodeList.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NodeList.bnd; sourceTree = "<group>"; };
+ 263A28F21EE412B4005C52B9 /* Window.bnd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Window.bnd; sourceTree = "<group>"; };
+ 263A28F31EE412B4005C52B9 /* fetcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fetcher.c; sourceTree = "<group>"; };
+ 263A28F41EE412B4005C52B9 /* fetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fetcher.h; sourceTree = "<group>"; };
+ 263A28F51EE412B4005C52B9 /* js.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = js.h; sourceTree = "<group>"; };
+ 263A28F61EE412B4005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A28F81EE412B4005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A28F91EE412B4005C52B9 /* none.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = none.c; sourceTree = "<group>"; };
+ 263A28FB1EE412B4005C52B9 /* console.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = console.idl; sourceTree = "<group>"; };
+ 263A28FC1EE412B4005C52B9 /* cssom.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cssom.idl; sourceTree = "<group>"; };
+ 263A28FD1EE412B4005C52B9 /* dom-parsing.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "dom-parsing.idl"; sourceTree = "<group>"; };
+ 263A28FE1EE412B4005C52B9 /* dom.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dom.idl; sourceTree = "<group>"; };
+ 263A28FF1EE412B4005C52B9 /* html.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = html.idl; sourceTree = "<group>"; };
+ 263A29001EE412B4005C52B9 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
+ 263A29011EE412B4005C52B9 /* uievents.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = uievents.idl; sourceTree = "<group>"; };
+ 263A29021EE412B4005C52B9 /* urlutils.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = urlutils.idl; sourceTree = "<group>"; };
+ 263A29061EE4196E005C52B9 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 26890F951EE89C5F00063C30 /* arc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arc.h; sourceTree = SOURCE_ROOT; };
+ 2689BB2D1EE543E20090B679 /* PSMTabBarControl+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PSMTabBarControl+Private.h"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 263A25EB1EE40BD6005C52B9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 263A29071EE4196E005C52B9 /* Cocoa.framework in Frameworks */,
+ 263A28AE1EE41266005C52B9 /* libz.tbd in Frameworks */,
+ 263A28AC1EE41245005C52B9 /* libiconv.tbd in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 2636299412F699250048542C /* NetSurf.app */,
+ 263A25EE1EE40BD6005C52B9 /* NetSurfBrowser.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 261DB24E1318443500C59F12 /* Tools */ = {
+ isa = PBXGroup;
+ children = (
+ 261DB24F1318444F00C59F12 /* compile-xib.sh */,
+ 261DB2501318444F00C59F12 /* extract-strings.sh */,
+ );
+ name = Tools;
+ sourceTree = SOURCE_ROOT;
+ };
+ 263A25EF1EE40BD6005C52B9 /* Cocoa */ = {
+ isa = PBXGroup;
+ children = (
+ 26890F951EE89C5F00063C30 /* arc.h */,
+ 263A26021EE40BFC005C52B9 /* PSMTabBarControl */,
+ 263A262C1EE40BFC005C52B9 /* res */,
+ 263A26611EE40BFC005C52B9 /* apple_image.h */,
+ 263A26621EE40BFC005C52B9 /* ArrowBox.h */,
+ 263A26631EE40BFC005C52B9 /* ArrowWindow.h */,
+ 263A26641EE40BFC005C52B9 /* bitmap.h */,
+ 263A26661EE40BFC005C52B9 /* BookmarksController.h */,
+ 263A26671EE40BFC005C52B9 /* BrowserView.h */,
+ 263A26681EE40BFC005C52B9 /* BrowserViewController.h */,
+ 263A26691EE40BFC005C52B9 /* BrowserWindow.h */,
+ 263A266A1EE40BFC005C52B9 /* BrowserWindowController.h */,
+ 263A266B1EE40BFC005C52B9 /* coordinates.h */,
+ 263A266C1EE40BFC005C52B9 /* desktop-tree.h */,
+ 263A266D1EE40BFC005C52B9 /* DownloadWindowController.h */,
+ 263A266E1EE40BFC005C52B9 /* fetch.h */,
+ 263A266F1EE40BFC005C52B9 /* font.h */,
+ 263A26701EE40BFC005C52B9 /* FormSelectMenu.h */,
+ 263A26711EE40BFC005C52B9 /* gui.h */,
+ 263A26721EE40BFC005C52B9 /* HistoryView.h */,
+ 263A26731EE40BFC005C52B9 /* HistoryWindowController.h */,
+ 263A26741EE40BFC005C52B9 /* LocalHistoryController.h */,
+ 263A26751EE40BFC005C52B9 /* NetsurfApp.h */,
+ 263A26761EE40BFC005C52B9 /* NetSurfAppDelegate.h */,
+ 263A26771EE40BFC005C52B9 /* plotter.h */,
+ 263A26781EE40BFC005C52B9 /* PreferencesWindowController.h */,
+ 263A26791EE40BFC005C52B9 /* schedule.h */,
+ 263A267A1EE40BFC005C52B9 /* ScrollableView.h */,
+ 263A267B1EE40BFC005C52B9 /* SearchWindowController.h */,
+ 263A267C1EE40BFC005C52B9 /* selection.h */,
+ 263A267D1EE40BFC005C52B9 /* Tree.h */,
+ 263A267E1EE40BFC005C52B9 /* TreeView.h */,
+ 263A267F1EE40BFC005C52B9 /* URLFieldCell.h */,
+ 263A26801EE40BFC005C52B9 /* Prefix.pch */,
+ 263A26811EE40BFC005C52B9 /* Makefile.defaults */,
+ 263A26821EE40BFC005C52B9 /* apple_image.m */,
+ 263A26831EE40BFC005C52B9 /* ArrowBox.m */,
+ 263A26841EE40BFC005C52B9 /* ArrowWindow.m */,
+ 263A26851EE40BFC005C52B9 /* bitmap.m */,
+ 263A26871EE40BFC005C52B9 /* BookmarksController.m */,
+ 263A26881EE40BFC005C52B9 /* BrowserView.m */,
+ 263A26891EE40BFC005C52B9 /* BrowserViewController.m */,
+ 263A268A1EE40BFC005C52B9 /* BrowserWindow.m */,
+ 263A268B1EE40BFC005C52B9 /* BrowserWindowController.m */,
+ 263A268C1EE40BFC005C52B9 /* desktop-tree.m */,
+ 263A268D1EE40BFC005C52B9 /* DownloadWindowController.m */,
+ 263A268E1EE40BFC005C52B9 /* fetch.m */,
+ 263A268F1EE40BFC005C52B9 /* font.m */,
+ 263A26901EE40BFC005C52B9 /* FormSelectMenu.m */,
+ 263A26911EE40BFC005C52B9 /* gui.m */,
+ 263A26921EE40BFC005C52B9 /* HistoryView.m */,
+ 263A26931EE40BFC005C52B9 /* HistoryWindowController.m */,
+ 263A26941EE40BFC005C52B9 /* LocalHistoryController.m */,
+ 263A26951EE40BFC005C52B9 /* NetsurfApp.m */,
+ 263A26961EE40BFC005C52B9 /* NetSurfAppDelegate.m */,
+ 263A26971EE40BFC005C52B9 /* plotter.m */,
+ 263A26981EE40BFC005C52B9 /* PreferencesWindowController.m */,
+ 263A26991EE40BFC005C52B9 /* schedule.m */,
+ 263A269A1EE40BFC005C52B9 /* ScrollableView.m */,
+ 263A269B1EE40BFC005C52B9 /* SearchWindowController.m */,
+ 263A269C1EE40BFC005C52B9 /* selection.m */,
+ 263A269D1EE40BFC005C52B9 /* Tree.m */,
+ 263A269E1EE40BFC005C52B9 /* TreeView.m */,
+ 263A269F1EE40BFC005C52B9 /* URLFieldCell.m */,
+ );
+ name = Cocoa;
+ sourceTree = SOURCE_ROOT;
+ };
+ 263A26021EE40BFC005C52B9 /* PSMTabBarControl */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26031EE40BFC005C52B9 /* Images */,
+ 263A26101EE40BFC005C52B9 /* NSBezierPath_AMShading.h */,
+ 263A26111EE40BFC005C52B9 /* NSBezierPath_AMShading.m */,
+ 263A26121EE40BFC005C52B9 /* NSString_AITruncation.h */,
+ 263A26131EE40BFC005C52B9 /* NSString_AITruncation.m */,
+ 263A26141EE40BFC005C52B9 /* PSMOverflowPopUpButton.h */,
+ 263A26151EE40BFC005C52B9 /* PSMOverflowPopUpButton.m */,
+ 263A26161EE40BFC005C52B9 /* PSMProgressIndicator.h */,
+ 263A26171EE40BFC005C52B9 /* PSMProgressIndicator.m */,
+ 263A26181EE40BFC005C52B9 /* PSMRolloverButton.h */,
+ 263A26191EE40BFC005C52B9 /* PSMRolloverButton.m */,
+ 263A261A1EE40BFC005C52B9 /* PSMTabBarCell.h */,
+ 263A261B1EE40BFC005C52B9 /* PSMTabBarCell.m */,
+ 263A261C1EE40BFC005C52B9 /* PSMTabBarControl.h */,
+ 263A261D1EE40BFC005C52B9 /* PSMTabBarControl.m */,
+ 263A261E1EE40BFC005C52B9 /* PSMTabBarController.h */,
+ 263A261F1EE40BFC005C52B9 /* PSMTabBarController.m */,
+ 263A26201EE40BFC005C52B9 /* PSMTabDragAssistant.h */,
+ 263A26211EE40BFC005C52B9 /* PSMTabDragAssistant.m */,
+ 263A26221EE40BFC005C52B9 /* PSMTabDragView.h */,
+ 263A26231EE40BFC005C52B9 /* PSMTabDragView.m */,
+ 263A26241EE40BFC005C52B9 /* PSMTabDragWindow.h */,
+ 263A26251EE40BFC005C52B9 /* PSMTabDragWindow.m */,
+ 263A26261EE40BFC005C52B9 /* PSMTabDragWindowController.h */,
+ 263A26271EE40BFC005C52B9 /* PSMTabDragWindowController.m */,
+ 263A26281EE40BFC005C52B9 /* PSMTabStyle.h */,
+ 263A26291EE40BFC005C52B9 /* PSMUnifiedTabStyle.h */,
+ 263A262A1EE40BFC005C52B9 /* PSMUnifiedTabStyle.m */,
+ 263A262B1EE40BFC005C52B9 /* ReadMe.rtfd */,
+ 2689BB2D1EE543E20090B679 /* PSMTabBarControl+Private.h */,
+ );
+ path = PSMTabBarControl;
+ sourceTree = "<group>";
+ };
+ 263A26031EE40BFC005C52B9 /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26041EE40BFC005C52B9 /* AquaTabClose_Front.png */,
+ 263A26051EE40BFC005C52B9 /* AquaTabClose_Front_Pressed.png */,
+ 263A26061EE40BFC005C52B9 /* AquaTabClose_Front_Rollover.png */,
+ 263A26071EE40BFC005C52B9 /* AquaTabCloseDirty_Front.png */,
+ 263A26081EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Pressed.png */,
+ 263A26091EE40BFC005C52B9 /* AquaTabCloseDirty_Front_Rollover.png */,
+ 263A260A1EE40BFC005C52B9 /* AquaTabNew.png */,
+ 263A260B1EE40BFC005C52B9 /* AquaTabNewPressed.png */,
+ 263A260C1EE40BFC005C52B9 /* AquaTabNewRollover.png */,
+ 263A260D1EE40BFC005C52B9 /* overflowImage.png */,
+ 263A260E1EE40BFC005C52B9 /* overflowImagePressed.png */,
+ 263A260F1EE40BFC005C52B9 /* pi.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+ 263A262C1EE40BFC005C52B9 /* res */ = {
+ isa = PBXGroup;
+ children = (
+ 263A262D1EE40BFC005C52B9 /* adblock.css */,
+ 263A262E1EE40BFC005C52B9 /* BookmarksWindow.xib */,
+ 263A262F1EE40BFC005C52B9 /* Browser.xib */,
+ 263A26301EE40BFC005C52B9 /* BrowserWindow.xib */,
+ 263A26311EE40BFC005C52B9 /* ca-bundle */,
+ 263A26321EE40BFC005C52B9 /* BookmarksWindow.xib.strings */,
+ 263A26341EE40BFC005C52B9 /* BrowserWindow.xib.strings */,
+ 263A26361EE40BFC005C52B9 /* DownloadWindow.xib.strings */,
+ 263A26381EE40BFC005C52B9 /* HistoryWindow.xib.strings */,
+ 263A263A1EE40BFC005C52B9 /* Localizable.strings */,
+ 263A263C1EE40BFC005C52B9 /* MainMenu.xib.strings */,
+ 263A263E1EE40BFC005C52B9 /* Messages */,
+ 263A26401EE40BFC005C52B9 /* PreferencesWindow.xib.strings */,
+ 263A26421EE40BFC005C52B9 /* SearchWindow.xib.strings */,
+ 263A26441EE40BFC005C52B9 /* default.css */,
+ 263A26451EE40BFC005C52B9 /* DownloadWindow.xib */,
+ 263A264A1EE40BFC005C52B9 /* HistoryWindow.xib */,
+ 263A264B1EE40BFC005C52B9 /* HomeTemplate.pdf */,
+ 263A264C1EE40BFC005C52B9 /* Icons */,
+ 263A26541EE40BFC005C52B9 /* internal.css */,
+ 263A26571EE40BFC005C52B9 /* LocalHistoryPanel.xib */,
+ 263A26581EE40BFC005C52B9 /* MainMenu.xib */,
+ 263A26591EE40BFC005C52B9 /* NetSurf-Info.plist */,
+ 263A265A1EE40BFC005C52B9 /* NetSurf.icns */,
+ 263A265B1EE40BFC005C52B9 /* netsurf.png */,
+ 263A265E1EE40BFC005C52B9 /* PreferencesWindow.xib */,
+ 263A265F1EE40BFC005C52B9 /* quirks.css */,
+ 263A26601EE40BFC005C52B9 /* SearchWindow.xib */,
+ );
+ path = res;
+ sourceTree = "<group>";
+ };
+ 263A264C1EE40BFC005C52B9 /* Icons */ = {
+ isa = PBXGroup;
+ children = (
+ 263A264D1EE40BFC005C52B9 /* arrow-l.png */,
+ 263A264E1EE40BFC005C52B9 /* content.png */,
+ 263A264F1EE40BFC005C52B9 /* directory.png */,
+ 263A26501EE40BFC005C52B9 /* directory2.png */,
+ 263A26511EE40BFC005C52B9 /* hotlist-add.png */,
+ 263A26521EE40BFC005C52B9 /* hotlist-rmv.png */,
+ 263A26531EE40BFC005C52B9 /* search.png */,
+ );
+ path = Icons;
+ sourceTree = "<group>";
+ };
+ 263A26A01EE40C1E005C52B9 /* Engine */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26A11EE40C4A005C52B9 /* content */,
+ 263A27411EE40C4B005C52B9 /* desktop */,
+ 263A277D1EE40C4B005C52B9 /* include */,
+ 263A27971EE40C4B005C52B9 /* render */,
+ 263A27B81EE40C4B005C52B9 /* utils */,
+ );
+ name = Engine;
+ path = ../..;
+ sourceTree = SOURCE_ROOT;
+ };
+ 263A26A11EE40C4A005C52B9 /* content */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26A21EE40C4A005C52B9 /* backing_store.h */,
+ 263A26A31EE40C4A005C52B9 /* content.c */,
+ 263A26A41EE40C4A005C52B9 /* content.h */,
+ 263A26A51EE40C4A005C52B9 /* content_debug.h */,
+ 263A26A61EE40C4A005C52B9 /* content_factory.c */,
+ 263A26A71EE40C4A005C52B9 /* content_factory.h */,
+ 263A26A81EE40C4A005C52B9 /* content_protected.h */,
+ 263A26A91EE40C4A005C52B9 /* dirlist.c */,
+ 263A26AA1EE40C4A005C52B9 /* dirlist.h */,
+ 263A26AB1EE40C4A005C52B9 /* fetch.c */,
+ 263A26AC1EE40C4A005C52B9 /* fetch.h */,
+ 263A26AD1EE40C4A005C52B9 /* fetchers */,
+ 263A26B91EE40C4A005C52B9 /* fetchers.h */,
+ 263A26BA1EE40C4A005C52B9 /* fs_backing_store.c */,
+ 263A26BB1EE40C4A005C52B9 /* handlers */,
+ 263A27371EE40C4B005C52B9 /* hlcache.c */,
+ 263A27381EE40C4B005C52B9 /* hlcache.h */,
+ 263A27391EE40C4B005C52B9 /* llcache.c */,
+ 263A273A1EE40C4B005C52B9 /* llcache.h */,
+ 263A273B1EE40C4B005C52B9 /* Makefile */,
+ 263A273C1EE40C4B005C52B9 /* mimesniff.c */,
+ 263A273D1EE40C4B005C52B9 /* mimesniff.h */,
+ 263A273E1EE40C4B005C52B9 /* no_backing_store.c */,
+ 263A273F1EE40C4B005C52B9 /* urldb.c */,
+ 263A27401EE40C4B005C52B9 /* urldb.h */,
+ );
+ path = content;
+ sourceTree = "<group>";
+ };
+ 263A26AD1EE40C4A005C52B9 /* fetchers */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26AE1EE40C4A005C52B9 /* about.c */,
+ 263A26AF1EE40C4A005C52B9 /* about.h */,
+ 263A26B01EE40C4A005C52B9 /* curl.c */,
+ 263A26B11EE40C4A005C52B9 /* curl.h */,
+ 263A26B21EE40C4A005C52B9 /* data.c */,
+ 263A26B31EE40C4A005C52B9 /* data.h */,
+ 263A26B41EE40C4A005C52B9 /* file.c */,
+ 263A26B51EE40C4A005C52B9 /* file.h */,
+ 263A26B61EE40C4A005C52B9 /* Makefile */,
+ 263A26B71EE40C4A005C52B9 /* resource.c */,
+ 263A26B81EE40C4A005C52B9 /* resource.h */,
+ );
+ path = fetchers;
+ sourceTree = "<group>";
+ };
+ 263A26BB1EE40C4A005C52B9 /* handlers */ = {
+ isa = PBXGroup;
+ children = (
+ 263A28AF1EE412B4005C52B9 /* javascript */,
+ 263A26BC1EE40C4A005C52B9 /* css */,
+ 263A26CA1EE40C4A005C52B9 /* image */,
+ 263A27361EE40C4B005C52B9 /* Makefile */,
+ );
+ path = handlers;
+ sourceTree = "<group>";
+ };
+ 263A26BC1EE40C4A005C52B9 /* css */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26BD1EE40C4A005C52B9 /* css.c */,
+ 263A26BE1EE40C4A005C52B9 /* css.h */,
+ 263A26BF1EE40C4A005C52B9 /* dump.c */,
+ 263A26C01EE40C4A005C52B9 /* dump.h */,
+ 263A26C11EE40C4A005C52B9 /* hints.c */,
+ 263A26C21EE40C4A005C52B9 /* hints.h */,
+ 263A26C31EE40C4A005C52B9 /* internal.c */,
+ 263A26C41EE40C4A005C52B9 /* internal.h */,
+ 263A26C51EE40C4A005C52B9 /* Makefile */,
+ 263A26C61EE40C4A005C52B9 /* select.c */,
+ 263A26C71EE40C4A005C52B9 /* select.h */,
+ 263A26C81EE40C4A005C52B9 /* utils.c */,
+ 263A26C91EE40C4A005C52B9 /* utils.h */,
+ );
+ path = css;
+ sourceTree = "<group>";
+ };
+ 263A26CA1EE40C4A005C52B9 /* image */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26CB1EE40C4A005C52B9 /* bmp.c */,
+ 263A26CC1EE40C4A005C52B9 /* bmp.h */,
+ 263A26CD1EE40C4A005C52B9 /* gif.c */,
+ 263A26CE1EE40C4A005C52B9 /* gif.h */,
+ 263A26CF1EE40C4A005C52B9 /* ico.c */,
+ 263A26D01EE40C4A005C52B9 /* ico.h */,
+ 263A26D11EE40C4A005C52B9 /* image.c */,
+ 263A26D21EE40C4A005C52B9 /* image.h */,
+ 263A26D31EE40C4A005C52B9 /* image_cache.c */,
+ 263A26D41EE40C4A005C52B9 /* image_cache.h */,
+ 263A26D61EE40C4A005C52B9 /* jpeg.h */,
+ 263A26D71EE40C4A005C52B9 /* Makefile */,
+ 263A26D91EE40C4A005C52B9 /* nssprite.h */,
+ 263A26DB1EE40C4A005C52B9 /* png.h */,
+ 263A26DD1EE40C4A005C52B9 /* rsvg.h */,
+ 263A26DF1EE40C4A005C52B9 /* svg.h */,
+ 263A26E11EE40C4A005C52B9 /* video.h */,
+ );
+ path = image;
+ sourceTree = "<group>";
+ };
+ 263A27411EE40C4B005C52B9 /* desktop */ = {
+ isa = PBXGroup;
+ children = (
+ 263A27421EE40C4B005C52B9 /* browser.c */,
+ 263A27431EE40C4B005C52B9 /* browser_history.c */,
+ 263A27441EE40C4B005C52B9 /* browser_history.h */,
+ 263A27451EE40C4B005C52B9 /* browser_private.h */,
+ 263A27461EE40C4B005C52B9 /* cookie_manager.c */,
+ 263A27471EE40C4B005C52B9 /* cookie_manager.h */,
+ 263A27481EE40C4B005C52B9 /* download.c */,
+ 263A27491EE40C4B005C52B9 /* download.h */,
+ 263A274A1EE40C4B005C52B9 /* font_haru.c */,
+ 263A274B1EE40C4B005C52B9 /* font_haru.h */,
+ 263A274C1EE40C4B005C52B9 /* frame_types.h */,
+ 263A274D1EE40C4B005C52B9 /* frames.c */,
+ 263A274E1EE40C4B005C52B9 /* frames.h */,
+ 263A274F1EE40C4B005C52B9 /* global_history.c */,
+ 263A27501EE40C4B005C52B9 /* global_history.h */,
+ 263A27511EE40C4B005C52B9 /* gui_factory.c */,
+ 263A27521EE40C4B005C52B9 /* gui_internal.h */,
+ 263A27531EE40C4B005C52B9 /* gui_table.h */,
+ 263A27541EE40C4B005C52B9 /* hotlist.c */,
+ 263A27551EE40C4B005C52B9 /* hotlist.h */,
+ 263A27561EE40C4B005C52B9 /* knockout.c */,
+ 263A27571EE40C4B005C52B9 /* knockout.h */,
+ 263A27581EE40C4B005C52B9 /* local_history.c */,
+ 263A27591EE40C4B005C52B9 /* local_history.h */,
+ 263A275A1EE40C4B005C52B9 /* Makefile */,
+ 263A275B1EE40C4B005C52B9 /* mouse.c */,
+ 263A275C1EE40C4B005C52B9 /* netsurf.c */,
+ 263A275D1EE40C4B005C52B9 /* options.h */,
+ 263A275E1EE40C4B005C52B9 /* plot_style.c */,
+ 263A275F1EE40C4B005C52B9 /* print.c */,
+ 263A27601EE40C4B005C52B9 /* print.h */,
+ 263A27611EE40C4B005C52B9 /* printer.h */,
+ 263A27621EE40C4B005C52B9 /* save_complete.c */,
+ 263A27631EE40C4B005C52B9 /* save_complete.h */,
+ 263A27641EE40C4B005C52B9 /* save_pdf.c */,
+ 263A27651EE40C4B005C52B9 /* save_pdf.h */,
+ 263A27661EE40C4B005C52B9 /* save_text.c */,
+ 263A27671EE40C4B005C52B9 /* save_text.h */,
+ 263A27681EE40C4B005C52B9 /* scrollbar.c */,
+ 263A27691EE40C4B005C52B9 /* scrollbar.h */,
+ 263A276A1EE40C4B005C52B9 /* search.c */,
+ 263A276B1EE40C4B005C52B9 /* search.h */,
+ 263A276C1EE40C4B005C52B9 /* searchweb.c */,
+ 263A276D1EE40C4B005C52B9 /* searchweb.h */,
+ 263A276E1EE40C4B005C52B9 /* selection.c */,
+ 263A276F1EE40C4B005C52B9 /* selection.h */,
+ 263A27701EE40C4B005C52B9 /* sslcert_viewer.c */,
+ 263A27711EE40C4B005C52B9 /* sslcert_viewer.h */,
+ 263A27721EE40C4B005C52B9 /* system_colour.c */,
+ 263A27731EE40C4B005C52B9 /* system_colour.h */,
+ 263A27741EE40C4B005C52B9 /* textarea.c */,
+ 263A27751EE40C4B005C52B9 /* textarea.h */,
+ 263A27761EE40C4B005C52B9 /* textinput.c */,
+ 263A27771EE40C4B005C52B9 /* textinput.h */,
+ 263A27781EE40C4B005C52B9 /* theme.h */,
+ 263A27791EE40C4B005C52B9 /* treeview.c */,
+ 263A277A1EE40C4B005C52B9 /* treeview.h */,
+ 263A277B1EE40C4B005C52B9 /* version.c */,
+ 263A277C1EE40C4B005C52B9 /* version.h */,
+ );
+ path = desktop;
+ sourceTree = "<group>";
+ };
+ 263A277D1EE40C4B005C52B9 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 263A277E1EE40C4B005C52B9 /* netsurf */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ 263A277E1EE40C4B005C52B9 /* netsurf */ = {
+ isa = PBXGroup;
+ children = (
+ 263A277F1EE40C4B005C52B9 /* bitmap.h */,
+ 263A27801EE40C4B005C52B9 /* browser_window.h */,
+ 263A27811EE40C4B005C52B9 /* clipboard.h */,
+ 263A27821EE40C4B005C52B9 /* content.h */,
+ 263A27831EE40C4B005C52B9 /* content_type.h */,
+ 263A27841EE40C4B005C52B9 /* cookie_db.h */,
+ 263A27851EE40C4B005C52B9 /* core_window.h */,
+ 263A27861EE40C4B005C52B9 /* css.h */,
+ 263A27871EE40C4B005C52B9 /* download.h */,
+ 263A27881EE40C4B005C52B9 /* fetch.h */,
+ 263A27891EE40C4B005C52B9 /* form.h */,
+ 263A278A1EE40C4B005C52B9 /* inttypes.h */,
+ 263A278B1EE40C4B005C52B9 /* keypress.h */,
+ 263A278C1EE40C4B005C52B9 /* layout.h */,
+ 263A278D1EE40C4B005C52B9 /* misc.h */,
+ 263A278E1EE40C4B005C52B9 /* mouse.h */,
+ 263A278F1EE40C4B005C52B9 /* netsurf.h */,
+ 263A27901EE40C4B005C52B9 /* plot_style.h */,
+ 263A27911EE40C4B005C52B9 /* plotters.h */,
+ 263A27921EE40C4B005C52B9 /* search.h */,
+ 263A27931EE40C4B005C52B9 /* types.h */,
+ 263A27941EE40C4B005C52B9 /* url_db.h */,
+ 263A27951EE40C4B005C52B9 /* utf8.h */,
+ 263A27961EE40C4B005C52B9 /* window.h */,
+ );
+ path = netsurf;
+ sourceTree = "<group>";
+ };
+ 263A27971EE40C4B005C52B9 /* render */ = {
+ isa = PBXGroup;
+ children = (
+ 263A27981EE40C4B005C52B9 /* box.c */,
+ 263A27991EE40C4B005C52B9 /* box.h */,
+ 263A279A1EE40C4B005C52B9 /* box_construct.c */,
+ 263A279B1EE40C4B005C52B9 /* box_normalise.c */,
+ 263A279C1EE40C4B005C52B9 /* box_textarea.c */,
+ 263A279D1EE40C4B005C52B9 /* box_textarea.h */,
+ 263A279E1EE40C4B005C52B9 /* font.c */,
+ 263A279F1EE40C4B005C52B9 /* font.h */,
+ 263A27A01EE40C4B005C52B9 /* form.c */,
+ 263A27A11EE40C4B005C52B9 /* form_internal.h */,
+ 263A27A21EE40C4B005C52B9 /* html.c */,
+ 263A27A31EE40C4B005C52B9 /* html.h */,
+ 263A27A41EE40C4B005C52B9 /* html_css.c */,
+ 263A27A51EE40C4B005C52B9 /* html_css_fetcher.c */,
+ 263A27A61EE40C4B005C52B9 /* html_forms.c */,
+ 263A27A71EE40C4B005C52B9 /* html_interaction.c */,
+ 263A27A81EE40C4B005C52B9 /* html_internal.h */,
+ 263A27A91EE40C4B005C52B9 /* html_object.c */,
+ 263A27AA1EE40C4B005C52B9 /* html_redraw.c */,
+ 263A27AB1EE40C4B005C52B9 /* html_redraw_border.c */,
+ 263A27AC1EE40C4B005C52B9 /* html_script.c */,
+ 263A27AD1EE40C4B005C52B9 /* imagemap.c */,
+ 263A27AE1EE40C4B005C52B9 /* imagemap.h */,
+ 263A27AF1EE40C4B005C52B9 /* layout.c */,
+ 263A27B01EE40C4B005C52B9 /* layout.h */,
+ 263A27B11EE40C4B005C52B9 /* Makefile */,
+ 263A27B21EE40C4B005C52B9 /* search.c */,
+ 263A27B31EE40C4B005C52B9 /* search.h */,
+ 263A27B41EE40C4B005C52B9 /* table.c */,
+ 263A27B51EE40C4B005C52B9 /* table.h */,
+ 263A27B61EE40C4B005C52B9 /* textplain.c */,
+ 263A27B71EE40C4B005C52B9 /* textplain.h */,
+ );
+ path = render;
+ sourceTree = "<group>";
+ };
+ 263A27B81EE40C4B005C52B9 /* utils */ = {
+ isa = PBXGroup;
+ children = (
+ 263A27B91EE40C4B005C52B9 /* ascii.h */,
+ 263A27BA1EE40C4B005C52B9 /* bloom.c */,
+ 263A27BB1EE40C4B005C52B9 /* bloom.h */,
+ 263A27BC1EE40C4B005C52B9 /* config.h */,
+ 263A27BD1EE40C4B005C52B9 /* corestringlist.h */,
+ 263A27BE1EE40C4B005C52B9 /* corestrings.c */,
+ 263A27BF1EE40C4B005C52B9 /* corestrings.h */,
+ 263A27C01EE40C4B005C52B9 /* coverity-build.sh */,
+ 263A27C11EE40C4B005C52B9 /* DerivedJoiningType.txt */,
+ 263A27C21EE40C4B005C52B9 /* dirent.h */,
+ 263A27C31EE40C4B005C52B9 /* errors.h */,
+ 263A27C41EE40C4B005C52B9 /* fetch-transifex.pl */,
+ 263A27C51EE40C4B005C52B9 /* file.c */,
+ 263A27C61EE40C4B005C52B9 /* file.h */,
+ 263A27C71EE40C4B005C52B9 /* filename.c */,
+ 263A27C81EE40C4B005C52B9 /* filename.h */,
+ 263A27C91EE40C4B005C52B9 /* filepath.c */,
+ 263A27CA1EE40C4B005C52B9 /* filepath.h */,
+ 263A27CB1EE40C4B005C52B9 /* git-date.sh */,
+ 263A27CC1EE40C4B005C52B9 /* git-testament.pl */,
+ 263A27CD1EE40C4B005C52B9 /* hashtable.c */,
+ 263A27CE1EE40C4B005C52B9 /* hashtable.h */,
+ 263A27CF1EE40C4B005C52B9 /* http */,
+ 263A27E11EE40C4B005C52B9 /* http.h */,
+ 263A27E21EE40C4B005C52B9 /* idna-derived-props-gen.pl */,
+ 263A27E31EE40C4B005C52B9 /* idna-tables-5.2.0-properties.csv */,
+ 263A27E41EE40C4B005C52B9 /* idna.c */,
+ 263A27E51EE40C4B005C52B9 /* idna.h */,
+ 263A27E61EE40C4B005C52B9 /* idna_props.h */,
+ 263A27E71EE40C4B005C52B9 /* import-messages.pl */,
+ 263A27E81EE40C4B005C52B9 /* inet.h */,
+ 263A27E91EE40C4B005C52B9 /* jenkins-build.sh */,
+ 263A27EA1EE40C4B005C52B9 /* libdom.c */,
+ 263A27EB1EE40C4B005C52B9 /* libdom.h */,
+ 263A27EC1EE40C4B005C52B9 /* log.c */,
+ 263A27ED1EE40C4B005C52B9 /* log.h */,
+ 263A27EE1EE40C4B005C52B9 /* Makefile */,
+ 263A27EF1EE40C4B005C52B9 /* memanalyze.pl */,
+ 263A27F01EE40C4B005C52B9 /* merge-messages.lua */,
+ 263A27F11EE40C4B005C52B9 /* messages.c */,
+ 263A27F21EE40C4B005C52B9 /* messages.h */,
+ 263A27F31EE40C4B005C52B9 /* nsoption.c */,
+ 263A27F41EE40C4B005C52B9 /* nsoption.h */,
+ 263A27F51EE40C4B005C52B9 /* nsurl */,
+ 263A27FA1EE40C4B005C52B9 /* nsurl.h */,
+ 263A27FB1EE40C4B005C52B9 /* punycode.c */,
+ 263A27FC1EE40C4B005C52B9 /* punycode.h */,
+ 263A27FD1EE40C4B005C52B9 /* ring.h */,
+ 263A27FE1EE40C4B005C52B9 /* split-messages.pl */,
+ 263A27FF1EE40C4B005C52B9 /* string.h */,
+ 263A28001EE40C4B005C52B9 /* sys_time.h */,
+ 263A28011EE40C4B005C52B9 /* talloc.c */,
+ 263A28021EE40C4B005C52B9 /* talloc.h */,
+ 263A28031EE40C4B005C52B9 /* test-netsurf */,
+ 263A28041EE40C4B005C52B9 /* time.c */,
+ 263A28051EE40C4B005C52B9 /* time.h */,
+ 263A28061EE40C4B005C52B9 /* url.c */,
+ 263A28071EE40C4B005C52B9 /* url.h */,
+ 263A28081EE40C4B005C52B9 /* useragent.c */,
+ 263A28091EE40C4B005C52B9 /* useragent.h */,
+ 263A280A1EE40C4B005C52B9 /* utf8.c */,
+ 263A280B1EE40C4B005C52B9 /* utf8.h */,
+ 263A280C1EE40C4B005C52B9 /* utils.c */,
+ 263A280D1EE40C4B005C52B9 /* utils.h */,
+ 263A280E1EE40C4B005C52B9 /* utsname.h */,
+ 263A280F1EE40C4B005C52B9 /* valgrind.supp */,
+ );
+ path = utils;
+ sourceTree = "<group>";
+ };
+ 263A27CF1EE40C4B005C52B9 /* http */ = {
+ isa = PBXGroup;
+ children = (
+ 263A27D01EE40C4B005C52B9 /* challenge.c */,
+ 263A27D11EE40C4B005C52B9 /* challenge.h */,
+ 263A27D21EE40C4B005C52B9 /* challenge_internal.h */,
+ 263A27D31EE40C4B005C52B9 /* content-disposition.c */,
+ 263A27D41EE40C4B005C52B9 /* content-disposition.h */,
+ 263A27D51EE40C4B005C52B9 /* content-type.c */,
+ 263A27D61EE40C4B005C52B9 /* content-type.h */,
+ 263A27D71EE40C4B005C52B9 /* generics.c */,
+ 263A27D81EE40C4B005C52B9 /* generics.h */,
+ 263A27D91EE40C4B005C52B9 /* Makefile */,
+ 263A27DA1EE40C4B005C52B9 /* parameter.c */,
+ 263A27DB1EE40C4B005C52B9 /* parameter.h */,
+ 263A27DC1EE40C4B005C52B9 /* parameter_internal.h */,
+ 263A27DD1EE40C4B005C52B9 /* primitives.c */,
+ 263A27DE1EE40C4B005C52B9 /* primitives.h */,
+ 263A27DF1EE40C4B005C52B9 /* www-authenticate.c */,
+ 263A27E01EE40C4B005C52B9 /* www-authenticate.h */,
+ );
+ path = http;
+ sourceTree = "<group>";
+ };
+ 263A27F51EE40C4B005C52B9 /* nsurl */ = {
+ isa = PBXGroup;
+ children = (
+ 263A27F61EE40C4B005C52B9 /* Makefile */,
+ 263A27F71EE40C4B005C52B9 /* nsurl.c */,
+ 263A27F81EE40C4B005C52B9 /* parse.c */,
+ 263A27F91EE40C4B005C52B9 /* private.h */,
+ );
+ path = nsurl;
+ sourceTree = "<group>";
+ };
+ 263A28AA1EE41245005C52B9 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 263A29061EE4196E005C52B9 /* Cocoa.framework */,
+ 263A28AD1EE41266005C52B9 /* libz.tbd */,
+ 263A28AB1EE41245005C52B9 /* libiconv.tbd */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 263A28AF1EE412B4005C52B9 /* javascript */ = {
+ isa = PBXGroup;
+ children = (
+ 263A28B01EE412B4005C52B9 /* content.c */,
+ 263A28B11EE412B4005C52B9 /* content.h */,
+ 263A28B21EE412B4005C52B9 /* duktape */,
+ 263A28F31EE412B4005C52B9 /* fetcher.c */,
+ 263A28F41EE412B4005C52B9 /* fetcher.h */,
+ 263A28F51EE412B4005C52B9 /* js.h */,
+ 263A28F61EE412B4005C52B9 /* Makefile */,
+ 263A28F71EE412B4005C52B9 /* none */,
+ 263A28FA1EE412B4005C52B9 /* WebIDL */,
+ );
+ path = javascript;
+ sourceTree = "<group>";
+ };
+ 263A28B21EE412B4005C52B9 /* duktape */ = {
+ isa = PBXGroup;
+ children = (
+ 263A28B31EE412B4005C52B9 /* Console.bnd */,
+ 263A28B41EE412B4005C52B9 /* Document.bnd */,
+ 263A28B51EE412B4005C52B9 /* duk_config.h */,
+ 263A28B61EE412B4005C52B9 /* duk_custom.h */,
+ 263A28B71EE412B4005C52B9 /* dukky.c */,
+ 263A28B81EE412B4005C52B9 /* dukky.h */,
+ 263A28B91EE412B4005C52B9 /* duktape.c */,
+ 263A28BA1EE412B4005C52B9 /* duktape.h */,
+ 263A28BB1EE412B4005C52B9 /* Element.bnd */,
+ 263A28BC1EE412B4005C52B9 /* Event.bnd */,
+ 263A28BD1EE412B4005C52B9 /* EventTarget.bnd */,
+ 263A28BE1EE412B4005C52B9 /* HTMLAnchorElement.bnd */,
+ 263A28BF1EE412B4005C52B9 /* HTMLAppletElement.bnd */,
+ 263A28C01EE412B4005C52B9 /* HTMLAreaElement.bnd */,
+ 263A28C11EE412B4005C52B9 /* HTMLBaseElement.bnd */,
+ 263A28C21EE412B4005C52B9 /* HTMLBodyElement.bnd */,
+ 263A28C31EE412B4005C52B9 /* HTMLBRElement.bnd */,
+ 263A28C41EE412B4005C52B9 /* HTMLButtonElement.bnd */,
+ 263A28C51EE412B4005C52B9 /* HTMLCollection.bnd */,
+ 263A28C61EE412B4005C52B9 /* HTMLDivElement.bnd */,
+ 263A28C71EE412B4005C52B9 /* HTMLElement.bnd */,
+ 263A28C81EE412B4005C52B9 /* HTMLFontElement.bnd */,
+ 263A28C91EE412B4005C52B9 /* HTMLFormElement.bnd */,
+ 263A28CA1EE412B4005C52B9 /* HTMLFrameElement.bnd */,
+ 263A28CB1EE412B4005C52B9 /* HTMLFrameSetElement.bnd */,
+ 263A28CC1EE412B4005C52B9 /* HTMLHeadingElement.bnd */,
+ 263A28CD1EE412B4005C52B9 /* HTMLHRElement.bnd */,
+ 263A28CE1EE412B4005C52B9 /* HTMLHTMLElement.bnd */,
+ 263A28CF1EE412B4005C52B9 /* HTMLIFrameElement.bnd */,
+ 263A28D01EE412B4005C52B9 /* HTMLImageElement.bnd */,
+ 263A28D11EE412B4005C52B9 /* HTMLInputElement.bnd */,
+ 263A28D21EE412B4005C52B9 /* HTMLLabelElement.bnd */,
+ 263A28D31EE412B4005C52B9 /* HTMLLegendElement.bnd */,
+ 263A28D41EE412B4005C52B9 /* HTMLLIElement.bnd */,
+ 263A28D51EE412B4005C52B9 /* HTMLLinkElement.bnd */,
+ 263A28D61EE412B4005C52B9 /* HTMLMapElement.bnd */,
+ 263A28D71EE412B4005C52B9 /* HTMLMarqueeElement.bnd */,
+ 263A28D81EE412B4005C52B9 /* HTMLMenuElement.bnd */,
+ 263A28D91EE412B4005C52B9 /* HTMLMetaElement.bnd */,
+ 263A28DA1EE412B4005C52B9 /* HTMLObjectElement.bnd */,
+ 263A28DB1EE412B4005C52B9 /* HTMLOListElement.bnd */,
+ 263A28DC1EE412B4005C52B9 /* HTMLOptionElement.bnd */,
+ 263A28DD1EE412B4005C52B9 /* HTMLParagraphElement.bnd */,
+ 263A28DE1EE412B4005C52B9 /* HTMLParamElement.bnd */,
+ 263A28DF1EE412B4005C52B9 /* HTMLPreElement.bnd */,
+ 263A28E01EE412B4005C52B9 /* HTMLQuoteElement.bnd */,
+ 263A28E11EE412B4005C52B9 /* HTMLScriptElement.bnd */,
+ 263A28E21EE412B4005C52B9 /* HTMLSelectElement.bnd */,
+ 263A28E31EE412B4005C52B9 /* HTMLStyleElement.bnd */,
+ 263A28E41EE412B4005C52B9 /* HTMLTableCaptionElement.bnd */,
+ 263A28E51EE412B4005C52B9 /* HTMLTableCellElement.bnd */,
+ 263A28E61EE412B4005C52B9 /* HTMLTableColElement.bnd */,
+ 263A28E71EE412B4005C52B9 /* HTMLTableElement.bnd */,
+ 263A28E81EE412B4005C52B9 /* HTMLTableRowElement.bnd */,
+ 263A28E91EE412B4005C52B9 /* HTMLTableSectionElement.bnd */,
+ 263A28EA1EE412B4005C52B9 /* HTMLTextAreaElement.bnd */,
+ 263A28EB1EE412B4005C52B9 /* HTMLTitleElement.bnd */,
+ 263A28EC1EE412B4005C52B9 /* Location.bnd */,
+ 263A28ED1EE412B4005C52B9 /* Makefile */,
+ 263A28EE1EE412B4005C52B9 /* Navigator.bnd */,
+ 263A28EF1EE412B4005C52B9 /* netsurf.bnd */,
+ 263A28F01EE412B4005C52B9 /* Node.bnd */,
+ 263A28F11EE412B4005C52B9 /* NodeList.bnd */,
+ 263A28F21EE412B4005C52B9 /* Window.bnd */,
+ );
+ path = duktape;
+ sourceTree = "<group>";
+ };
+ 263A28F71EE412B4005C52B9 /* none */ = {
+ isa = PBXGroup;
+ children = (
+ 263A28F81EE412B4005C52B9 /* Makefile */,
+ 263A28F91EE412B4005C52B9 /* none.c */,
+ );
+ path = none;
+ sourceTree = "<group>";
+ };
+ 263A28FA1EE412B4005C52B9 /* WebIDL */ = {
+ isa = PBXGroup;
+ children = (
+ 263A28FB1EE412B4005C52B9 /* console.idl */,
+ 263A28FC1EE412B4005C52B9 /* cssom.idl */,
+ 263A28FD1EE412B4005C52B9 /* dom-parsing.idl */,
+ 263A28FE1EE412B4005C52B9 /* dom.idl */,
+ 263A28FF1EE412B4005C52B9 /* html.idl */,
+ 263A29001EE412B4005C52B9 /* Makefile */,
+ 263A29011EE412B4005C52B9 /* uievents.idl */,
+ 263A29021EE412B4005C52B9 /* urlutils.idl */,
+ );
+ path = WebIDL;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* Untitled */ = {
+ isa = PBXGroup;
+ children = (
+ 263A26A01EE40C1E005C52B9 /* Engine */,
+ 261DB24E1318443500C59F12 /* Tools */,
+ 263A25EF1EE40BD6005C52B9 /* Cocoa */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ 263A28AA1EE41245005C52B9 /* Frameworks */,
+ );
+ name = Untitled;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXLegacyTarget section */
+ 2636298F12F698E00048542C /* NetSurf */ = {
+ isa = PBXLegacyTarget;
+ buildArgumentsString = "PREFIX=../build TARGET=cocoa SDKROOT= VARIANT=debug Q= $(ACTION)";
+ buildConfigurationList = 2636299512F699250048542C /* Build configuration list for PBXLegacyTarget "NetSurf" */;
+ buildPhases = (
+ );
+ buildToolPath = make;
+ buildWorkingDirectory = "$(SRCROOT)/../..";
+ dependencies = (
+ );
+ name = NetSurf;
+ passBuildSettingsInEnvironment = 1;
+ productName = NetSurf;
+ };
+/* End PBXLegacyTarget section */
+
+/* Begin PBXNativeTarget section */
+ 263A25ED1EE40BD6005C52B9 /* NetSurfBrowser */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 263A25FF1EE40BD6005C52B9 /* Build configuration list for PBXNativeTarget "NetSurfBrowser" */;
+ buildPhases = (
+ 26890F931EE88CE100063C30 /* Build Testament Header */,
+ 263A25EA1EE40BD6005C52B9 /* Sources */,
+ 263A25EB1EE40BD6005C52B9 /* Frameworks */,
+ 263A25EC1EE40BD6005C52B9 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = NetSurfBrowser;
+ productName = NetSurfBrowser;
+ productReference = 263A25EE1EE40BD6005C52B9 /* NetSurfBrowser.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 0900;
+ TargetAttributes = {
+ 263A25ED1EE40BD6005C52B9 = {
+ CreatedOnToolsVersion = 8.3.2;
+ ProvisioningStyle = Automatic;
+ };
+ };
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NetSurf" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ de,
+ en,
+ fr,
+ it,
+ nl,
+ Base,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* Untitled */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 2636298F12F698E00048542C /* NetSurf */,
+ 263A25ED1EE40BD6005C52B9 /* NetSurfBrowser */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 263A25EC1EE40BD6005C52B9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 263A292D1EE41B53005C52B9 /* AquaTabCloseDirty_Front_Pressed.png in Resources */,
+ 263A29281EE41AA8005C52B9 /* SearchWindow.xib in Resources */,
+ 263A29271EE41AA8005C52B9 /* quirks.css in Resources */,
+ 263A292C1EE41B53005C52B9 /* AquaTabCloseDirty_Front.png in Resources */,
+ 263A29131EE41A96005C52B9 /* Messages in Resources */,
+ 263A290A1EE41A7D005C52B9 /* Browser.xib in Resources */,
+ 263A29211EE41AA4005C52B9 /* internal.css in Resources */,
+ 263A292E1EE41B53005C52B9 /* AquaTabCloseDirty_Front_Rollover.png in Resources */,
+ 263A29241EE41AA8005C52B9 /* NetSurf.icns in Resources */,
+ 263A290D1EE41A8C005C52B9 /* BookmarksWindow.xib.strings in Resources */,
+ 263A29251EE41AA8005C52B9 /* netsurf.png in Resources */,
+ 263A29291EE41B53005C52B9 /* AquaTabClose_Front.png in Resources */,
+ 263A291A1EE41A9F005C52B9 /* arrow-l.png in Resources */,
+ 263A29171EE41A9A005C52B9 /* DownloadWindow.xib in Resources */,
+ 263A29201EE41A9F005C52B9 /* search.png in Resources */,
+ 263A290C1EE41A7D005C52B9 /* ca-bundle in Resources */,
+ 263A29101EE41A8C005C52B9 /* HistoryWindow.xib.strings in Resources */,
+ 263A29301EE41B53005C52B9 /* AquaTabNewPressed.png in Resources */,
+ 263A290F1EE41A8C005C52B9 /* DownloadWindow.xib.strings in Resources */,
+ 263A291E1EE41A9F005C52B9 /* hotlist-add.png in Resources */,
+ 263A29341EE41B53005C52B9 /* pi.png in Resources */,
+ 263A29261EE41AA8005C52B9 /* PreferencesWindow.xib in Resources */,
+ 263A291D1EE41A9F005C52B9 /* directory2.png in Resources */,
+ 263A29121EE41A8F005C52B9 /* MainMenu.xib.strings in Resources */,
+ 263A29111EE41A8C005C52B9 /* Localizable.strings in Resources */,
+ 263A29081EE41A75005C52B9 /* adblock.css in Resources */,
+ 263A290B1EE41A7D005C52B9 /* BrowserWindow.xib in Resources */,
+ 263A29141EE41A96005C52B9 /* PreferencesWindow.xib.strings in Resources */,
+ 263A292F1EE41B53005C52B9 /* AquaTabNew.png in Resources */,
+ 263A291B1EE41A9F005C52B9 /* content.png in Resources */,
+ 263A29321EE41B53005C52B9 /* overflowImage.png in Resources */,
+ 263A29151EE41A96005C52B9 /* SearchWindow.xib.strings in Resources */,
+ 263A29231EE41AA4005C52B9 /* MainMenu.xib in Resources */,
+ 263A292A1EE41B53005C52B9 /* AquaTabClose_Front_Pressed.png in Resources */,
+ 263A29181EE41A9A005C52B9 /* HistoryWindow.xib in Resources */,
+ 263A29091EE41A7D005C52B9 /* BookmarksWindow.xib in Resources */,
+ 263A29221EE41AA4005C52B9 /* LocalHistoryPanel.xib in Resources */,
+ 263A29331EE41B53005C52B9 /* overflowImagePressed.png in Resources */,
+ 263A291F1EE41A9F005C52B9 /* hotlist-rmv.png in Resources */,
+ 263A292B1EE41B53005C52B9 /* AquaTabClose_Front_Rollover.png in Resources */,
+ 263A29311EE41B53005C52B9 /* AquaTabNewRollover.png in Resources */,
+ 263A290E1EE41A8C005C52B9 /* BrowserWindow.xib.strings in Resources */,
+ 263A291C1EE41A9F005C52B9 /* directory.png in Resources */,
+ 263A29161EE41A9A005C52B9 /* default.css in Resources */,
+ 263A29191EE41A9A005C52B9 /* HomeTemplate.pdf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 26890F931EE88CE100063C30 /* Build Testament Header */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Build Testament Header";
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/testament.h",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "ROOT=\"${SRCROOT}/../..\"\nexec perl -w \"${ROOT}/utils/git-testament.pl\" \"${ROOT}\" \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 263A25EA1EE40BD6005C52B9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 263A289C1EE4121D005C52B9 /* html.c in Sources */,
+ 263A287D1EE4120F005C52B9 /* log.c in Sources */,
+ 263A28471EE40CF2005C52B9 /* internal.c in Sources */,
+ 263A28671EE40CFB005C52B9 /* hotlist.c in Sources */,
+ 263A28291EE40CCF005C52B9 /* font.m in Sources */,
+ 263A286F1EE40CFB005C52B9 /* save_pdf.c in Sources */,
+ 263A281F1EE40CCF005C52B9 /* bitmap.m in Sources */,
+ 263A28381EE40CCF005C52B9 /* TreeView.m in Sources */,
+ 263A289E1EE4121D005C52B9 /* html_css_fetcher.c in Sources */,
+ 263A282E1EE40CCF005C52B9 /* LocalHistoryController.m in Sources */,
+ 263A28941EE41218005C52B9 /* filepath.c in Sources */,
+ 263A28731EE40CFB005C52B9 /* searchweb.c in Sources */,
+ 263A285C1EE40CF2005C52B9 /* mimesniff.c in Sources */,
+ 263A288B1EE41213005C52B9 /* content-type.c in Sources */,
+ 263A285B1EE40CF2005C52B9 /* llcache.c in Sources */,
+ 263A28871EE4120F005C52B9 /* utf8.c in Sources */,
+ 263A28851EE4120F005C52B9 /* url.c in Sources */,
+ 263A282A1EE40CCF005C52B9 /* FormSelectMenu.m in Sources */,
+ 263A28441EE40CF2005C52B9 /* css.c in Sources */,
+ 263A28711EE40CFB005C52B9 /* scrollbar.c in Sources */,
+ 263A289F1EE4121D005C52B9 /* html_forms.c in Sources */,
+ 263A29041EE412BE005C52B9 /* fetcher.c in Sources */,
+ 263A28A01EE4121D005C52B9 /* html_interaction.c in Sources */,
+ 263A288D1EE41213005C52B9 /* parameter.c in Sources */,
+ 263A28191EE40CCF005C52B9 /* PSMTabDragWindow.m in Sources */,
+ 263A28431EE40CF2005C52B9 /* fs_backing_store.c in Sources */,
+ 263A28841EE4120F005C52B9 /* time.c in Sources */,
+ 263A285A1EE40CF2005C52B9 /* hlcache.c in Sources */,
+ 263A28611EE40CFB005C52B9 /* cookie_manager.c in Sources */,
+ 263A281A1EE40CCF005C52B9 /* PSMTabDragWindowController.m in Sources */,
+ 263A284C1EE40CF2005C52B9 /* ico.c in Sources */,
+ 263A288F1EE41213005C52B9 /* www-authenticate.c in Sources */,
+ 263A28161EE40CCF005C52B9 /* PSMTabBarController.m in Sources */,
+ 263A28891EE41213005C52B9 /* challenge.c in Sources */,
+ 263A287C1EE4120F005C52B9 /* libdom.c in Sources */,
+ 263A29051EE412BE005C52B9 /* none.c in Sources */,
+ 263A28261EE40CCF005C52B9 /* desktop-tree.m in Sources */,
+ 263A281B1EE40CCF005C52B9 /* PSMUnifiedTabStyle.m in Sources */,
+ 263A285D1EE40CF2005C52B9 /* no_backing_store.c in Sources */,
+ 263A286B1EE40CFB005C52B9 /* netsurf.c in Sources */,
+ 263A284E1EE40CF2005C52B9 /* image_cache.c in Sources */,
+ 263A286D1EE40CFB005C52B9 /* print.c in Sources */,
+ 263A28391EE40CCF005C52B9 /* URLFieldCell.m in Sources */,
+ 263A28121EE40CCF005C52B9 /* PSMProgressIndicator.m in Sources */,
+ 263A28251EE40CCF005C52B9 /* BrowserWindowController.m in Sources */,
+ 263A288A1EE41213005C52B9 /* content-disposition.c in Sources */,
+ 263A29351EE41B5E005C52B9 /* NSBezierPath_AMShading.m in Sources */,
+ 263A28461EE40CF2005C52B9 /* hints.c in Sources */,
+ 263A28631EE40CFB005C52B9 /* font_haru.c in Sources */,
+ 263A283F1EE40CF2005C52B9 /* curl.c in Sources */,
+ 263A28481EE40CF2005C52B9 /* select.c in Sources */,
+ 263A287E1EE4120F005C52B9 /* messages.c in Sources */,
+ 263A28801EE4120F005C52B9 /* nsurl.c in Sources */,
+ 263A28361EE40CCF005C52B9 /* selection.m in Sources */,
+ 263A28A41EE4121D005C52B9 /* html_script.c in Sources */,
+ 263A28A31EE4121D005C52B9 /* html_redraw_border.c in Sources */,
+ 263A28241EE40CCF005C52B9 /* BrowserWindow.m in Sources */,
+ 263A289B1EE4121D005C52B9 /* form.c in Sources */,
+ 263A285E1EE40CF2005C52B9 /* urldb.c in Sources */,
+ 263A28221EE40CCF005C52B9 /* BrowserView.m in Sources */,
+ 263A282D1EE40CCF005C52B9 /* HistoryWindowController.m in Sources */,
+ 263A28101EE40CCF005C52B9 /* NSString_AITruncation.m in Sources */,
+ 263A28761EE40CFB005C52B9 /* system_colour.c in Sources */,
+ 263A28931EE41218005C52B9 /* filename.c in Sources */,
+ 263A287F1EE4120F005C52B9 /* nsoption.c in Sources */,
+ 263A28791EE40CFB005C52B9 /* treeview.c in Sources */,
+ 263A28A71EE4121D005C52B9 /* search.c in Sources */,
+ 263A28811EE4120F005C52B9 /* parse.c in Sources */,
+ 263A28911EE41218005C52B9 /* corestrings.c in Sources */,
+ 263A282F1EE40CCF005C52B9 /* NetsurfApp.m in Sources */,
+ 263A28151EE40CCF005C52B9 /* PSMTabBarControl.m in Sources */,
+ 263A28451EE40CF2005C52B9 /* dump.c in Sources */,
+ 263A28321EE40CCF005C52B9 /* PreferencesWindowController.m in Sources */,
+ 263A28341EE40CCF005C52B9 /* ScrollableView.m in Sources */,
+ 263A281D1EE40CCF005C52B9 /* ArrowBox.m in Sources */,
+ 263A28831EE4120F005C52B9 /* talloc.c in Sources */,
+ 263A28771EE40CFB005C52B9 /* textarea.c in Sources */,
+ 263A28A81EE4121D005C52B9 /* table.c in Sources */,
+ 263A286E1EE40CFB005C52B9 /* save_complete.c in Sources */,
+ 263A287B1EE4120F005C52B9 /* idna.c in Sources */,
+ 263A284D1EE40CF2005C52B9 /* image.c in Sources */,
+ 263A28621EE40CFB005C52B9 /* download.c in Sources */,
+ 263A28681EE40CFB005C52B9 /* knockout.c in Sources */,
+ 263A28861EE4120F005C52B9 /* useragent.c in Sources */,
+ 263A288C1EE41213005C52B9 /* generics.c in Sources */,
+ 263A28211EE40CCF005C52B9 /* BookmarksController.m in Sources */,
+ 263A28881EE4120F005C52B9 /* utils.c in Sources */,
+ 263A28641EE40CFB005C52B9 /* frames.c in Sources */,
+ 263A28901EE41218005C52B9 /* bloom.c in Sources */,
+ 263A28951EE41218005C52B9 /* hashtable.c in Sources */,
+ 263A289A1EE4121D005C52B9 /* font.c in Sources */,
+ 263A283B1EE40CF2005C52B9 /* content_factory.c in Sources */,
+ 263A283C1EE40CF2005C52B9 /* dirlist.c in Sources */,
+ 263A282C1EE40CCF005C52B9 /* HistoryView.m in Sources */,
+ 263A28A21EE4121D005C52B9 /* html_redraw.c in Sources */,
+ 263A28751EE40CFB005C52B9 /* sslcert_viewer.c in Sources */,
+ 263A285F1EE40CFB005C52B9 /* browser.c in Sources */,
+ 263A28961EE4121D005C52B9 /* box.c in Sources */,
+ 263A28821EE4120F005C52B9 /* punycode.c in Sources */,
+ 263A28111EE40CCF005C52B9 /* PSMOverflowPopUpButton.m in Sources */,
+ 263A28A91EE4121D005C52B9 /* textplain.c in Sources */,
+ 263A28781EE40CFB005C52B9 /* textinput.c in Sources */,
+ 263A28601EE40CFB005C52B9 /* browser_history.c in Sources */,
+ 263A28721EE40CFB005C52B9 /* search.c in Sources */,
+ 263A28281EE40CCF005C52B9 /* fetch.m in Sources */,
+ 263A28691EE40CFB005C52B9 /* local_history.c in Sources */,
+ 263A284B1EE40CF2005C52B9 /* gif.c in Sources */,
+ 263A28371EE40CCF005C52B9 /* Tree.m in Sources */,
+ 263A28651EE40CFB005C52B9 /* global_history.c in Sources */,
+ 263A283D1EE40CF2005C52B9 /* fetch.c in Sources */,
+ 263A281E1EE40CCF005C52B9 /* ArrowWindow.m in Sources */,
+ 263A289D1EE4121D005C52B9 /* html_css.c in Sources */,
+ 263A28661EE40CFB005C52B9 /* gui_factory.c in Sources */,
+ 263A283E1EE40CF2005C52B9 /* about.c in Sources */,
+ 263A281C1EE40CCF005C52B9 /* apple_image.m in Sources */,
+ 263A28921EE41218005C52B9 /* file.c in Sources */,
+ 263A28491EE40CF2005C52B9 /* utils.c in Sources */,
+ 263A286A1EE40CFB005C52B9 /* mouse.c in Sources */,
+ 263A28421EE40CF2005C52B9 /* resource.c in Sources */,
+ 263A28311EE40CCF005C52B9 /* plotter.m in Sources */,
+ 263A29031EE412BE005C52B9 /* content.c in Sources */,
+ 263A28271EE40CCF005C52B9 /* DownloadWindowController.m in Sources */,
+ 263A282B1EE40CCF005C52B9 /* gui.m in Sources */,
+ 263A283A1EE40CF2005C52B9 /* content.c in Sources */,
+ 263A28131EE40CCF005C52B9 /* PSMRolloverButton.m in Sources */,
+ 263A28991EE4121D005C52B9 /* box_textarea.c in Sources */,
+ 263A28141EE40CCF005C52B9 /* PSMTabBarCell.m in Sources */,
+ 263A284A1EE40CF2005C52B9 /* bmp.c in Sources */,
+ 263A28331EE40CCF005C52B9 /* schedule.m in Sources */,
+ 263A28181EE40CCF005C52B9 /* PSMTabDragView.m in Sources */,
+ 263A28401EE40CF2005C52B9 /* data.c in Sources */,
+ 263A288E1EE41213005C52B9 /* primitives.c in Sources */,
+ 263A28A11EE4121D005C52B9 /* html_object.c in Sources */,
+ 263A28351EE40CCF005C52B9 /* SearchWindowController.m in Sources */,
+ 263A286C1EE40CFB005C52B9 /* plot_style.c in Sources */,
+ 263A28411EE40CF2005C52B9 /* file.c in Sources */,
+ 263A28231EE40CCF005C52B9 /* BrowserViewController.m in Sources */,
+ 263A28981EE4121D005C52B9 /* box_normalise.c in Sources */,
+ 263A28701EE40CFB005C52B9 /* save_text.c in Sources */,
+ 263A28A51EE4121D005C52B9 /* imagemap.c in Sources */,
+ 263A28971EE4121D005C52B9 /* box_construct.c in Sources */,
+ 263A28301EE40CCF005C52B9 /* NetSurfAppDelegate.m in Sources */,
+ 263A28A61EE4121D005C52B9 /* layout.c in Sources */,
+ 263A28171EE40CCF005C52B9 /* PSMTabDragAssistant.m in Sources */,
+ 263A287A1EE40CFB005C52B9 /* version.c in Sources */,
+ 263A28741EE40CFB005C52B9 /* selection.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 263A26321EE40BFC005C52B9 /* BookmarksWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26331EE40BFC005C52B9 /* de */,
+ );
+ name = BookmarksWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A26341EE40BFC005C52B9 /* BrowserWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26351EE40BFC005C52B9 /* de */,
+ );
+ name = BrowserWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A26361EE40BFC005C52B9 /* DownloadWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26371EE40BFC005C52B9 /* de */,
+ );
+ name = DownloadWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A26381EE40BFC005C52B9 /* HistoryWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26391EE40BFC005C52B9 /* de */,
+ );
+ name = HistoryWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A263A1EE40BFC005C52B9 /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A263B1EE40BFC005C52B9 /* de */,
+ 263A26461EE40BFC005C52B9 /* en */,
+ 263A26481EE40BFC005C52B9 /* fr */,
+ 263A26551EE40BFC005C52B9 /* it */,
+ 263A265C1EE40BFC005C52B9 /* nl */,
+ );
+ name = Localizable.strings;
+ sourceTree = "<group>";
+ };
+ 263A263C1EE40BFC005C52B9 /* MainMenu.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A263D1EE40BFC005C52B9 /* de */,
+ );
+ name = MainMenu.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A263E1EE40BFC005C52B9 /* Messages */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A263F1EE40BFC005C52B9 /* de */,
+ 263A26471EE40BFC005C52B9 /* en */,
+ 263A26491EE40BFC005C52B9 /* fr */,
+ 263A26561EE40BFC005C52B9 /* it */,
+ 263A265D1EE40BFC005C52B9 /* nl */,
+ );
+ name = Messages;
+ sourceTree = "<group>";
+ };
+ 263A26401EE40BFC005C52B9 /* PreferencesWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26411EE40BFC005C52B9 /* de */,
+ );
+ name = PreferencesWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+ 263A26421EE40BFC005C52B9 /* SearchWindow.xib.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 263A26431EE40BFC005C52B9 /* de */,
+ );
+ name = SearchWindow.xib.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 2636299012F698E10048542C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ MKDIR = "mkdir -p";
+ PATH = "$(PATH):$NETSURF_LIB_PREFIX/bin";
+ PKG_CONFIG_PATH = "$(NETSURF_LIB_PREFIX)/lib/pkgconfig:$(CURL_PREFIX)/lib/pkgconfig:$(OPENSSL_PREFIX)/lib/pkgconfig:$(RSVG_PREFIX)/lib/pkgconfig";
+ PRODUCT_NAME = NetSurf;
+ RSVG_PREFIX = /usr/local/opt/librsvg;
+ };
+ name = Debug;
+ };
+ 2636299112F698E10048542C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ MKDIR = "mkdir -p";
+ PATH = "$(PATH):$NETSURF_LIB_PREFIX/bin";
+ PKG_CONFIG_PATH = "$(NETSURF_LIB_PREFIX)/lib/pkgconfig:$(CURL_PREFIX)/lib/pkgconfig:$(OPENSSL_PREFIX)/lib/pkgconfig:$(RSVG_PREFIX)/lib/pkgconfig";
+ PRODUCT_NAME = NetSurf;
+ RSVG_PREFIX = /usr/local/opt/librsvg;
+ };
+ name = Release;
+ };
+ 263A26001EE40BD6005C52B9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_ENABLE_MODULES = NO;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ "'NETSURF_HOMEPAGE=\"about:welcome\"'",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/..",
+ "$(NETSURF_ROOT)",
+ "$(NETSURF_LIB_PREFIX)/include",
+ "$(NETSURF_ROOT)/include",
+ "$(OPENSSL_PREFIX)/include",
+ "$(NETSURF_ROOT)/content/handlers",
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/res/NetSurf-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(OPENSSL_PREFIX)/lib",
+ "$(NETSURF_LIB_PREFIX)/lib",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.12;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ OTHER_CFLAGS = (
+ "-Dnscocoa",
+ "-DWITH_CURL",
+ );
+ OTHER_LDFLAGS = (
+ "-lcss",
+ "-ldom",
+ "-lhubbub",
+ "-lnsbmp",
+ "-lnsgif",
+ "-lnslayout",
+ "-lnspsl",
+ "-lnsutils",
+ "-lparserutils",
+ "-lsvgtiny",
+ "-lutf8proc",
+ "-lwapcaplet",
+ "-lssl",
+ "-lcurl",
+ "-lcrypto",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.netsurf-browser.NetSurfBrowser";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 263A26011EE40BD6005C52B9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_ENABLE_MODULES = NO;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_NO_COMMON_BLOCKS = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "'NETSURF_HOMEPAGE=\"about:welcome\"'",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/..",
+ "$(NETSURF_ROOT)",
+ "$(NETSURF_LIB_PREFIX)/include",
+ "$(NETSURF_ROOT)/include",
+ "$(OPENSSL_PREFIX)/include",
+ "$(NETSURF_ROOT)/content/handlers",
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/res/NetSurf-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(OPENSSL_PREFIX)/lib",
+ "$(NETSURF_LIB_PREFIX)/lib",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.12;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_CFLAGS = (
+ "-Dnscocoa",
+ "-DWITH_CURL",
+ );
+ OTHER_LDFLAGS = (
+ "-lcss",
+ "-ldom",
+ "-lhubbub",
+ "-lnsbmp",
+ "-lnsgif",
+ "-lnslayout",
+ "-lnspsl",
+ "-lnsutils",
+ "-lparserutils",
+ "-lsvgtiny",
+ "-lutf8proc",
+ "-lwapcaplet",
+ "-lssl",
+ "-lcurl",
+ "-lcrypto",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.netsurf-browser.NetSurfBrowser";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CURL_PREFIX = /usr/local/opt/curl;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ NETSURF_LIB_PREFIX = "$(NETSURF_ROOT)/../build";
+ NETSURF_ROOT = "$(SRCROOT)/../..";
+ ONLY_ACTIVE_ARCH = YES;
+ OPENSSL_PREFIX = /usr/local/opt/openssl;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CURL_PREFIX = /usr/local/opt/curl;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ NETSURF_LIB_PREFIX = "$(NETSURF_ROOT)/../build";
+ NETSURF_ROOT = "$(SRCROOT)/../..";
+ ONLY_ACTIVE_ARCH = NO;
+ OPENSSL_PREFIX = /usr/local/opt/openssl;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 2636299512F699250048542C /* Build configuration list for PBXLegacyTarget "NetSurf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2636299012F698E10048542C /* Debug */,
+ 2636299112F698E10048542C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 263A25FF1EE40BD6005C52B9 /* Build configuration list for PBXNativeTarget "NetSurfBrowser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 263A26001EE40BD6005C52B9 /* Debug */,
+ 263A26011EE40BD6005C52B9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NetSurf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/frontends/cocoa/NetSurf.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontends/cocoa/NetSurf.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..919434a62
--- /dev/null
+++ b/frontends/cocoa/NetSurf.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:">
+ </FileRef>
+</Workspace>
diff --git a/frontends/cocoa/NetSurfAppDelegate.h b/frontends/cocoa/NetSurfAppDelegate.h
new file mode 100644
index 000000000..37d07a4d2
--- /dev/null
+++ b/frontends/cocoa/NetSurfAppDelegate.h
@@ -0,0 +1,38 @@
+/*
+ * 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>
+
+@class SearchWindowController;
+@class PreferencesWindowController;
+@class HistoryWindowController;
+
+@interface NetSurfAppDelegate : NSObject
+
+@property (nonatomic) SearchWindowController *search;
+@property (nonatomic) PreferencesWindowController *preferences;
+@property (nonatomic) HistoryWindowController *history;
+
+- (IBAction)showSearchWindow:(id)sender;
+- (IBAction)searchForward:(id)sender;
+- (IBAction)searchBackward:(id)sender;
+
+- (IBAction)showPreferences:(id)sender;
+- (IBAction)showGlobalHistory:(id)sender;
+
+@end
diff --git a/frontends/cocoa/NetSurfAppDelegate.m b/frontends/cocoa/NetSurfAppDelegate.m
new file mode 100644
index 000000000..013b77a8d
--- /dev/null
+++ b/frontends/cocoa/NetSurfAppDelegate.m
@@ -0,0 +1,194 @@
+/*
+ * 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 "utils/nsoption.h"
+#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsurl.h"
+#import "netsurf/browser_window.h"
+
+#import "cocoa/gui.h"
+#import "cocoa/NetSurfAppDelegate.h"
+#import "cocoa/SearchWindowController.h"
+#import "cocoa/PreferencesWindowController.h"
+#import "cocoa/HistoryWindowController.h"
+
+@interface NetSurfAppDelegate ()
+
+- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent;
+
+@end
+
+@implementation NetSurfAppDelegate
+
+- (void)newDocument:(id)sender
+{
+ nsurl *url;
+ nserror error;
+
+ if (nsoption_charp(homepage_url) != NULL) {
+ error = nsurl_create(nsoption_charp(homepage_url), &url);
+ } else {
+ error = nsurl_create(NETSURF_HOMEPAGE, &url);
+ }
+
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (void)openDocument:(id)sender
+{
+ nsurl *u;
+ nserror error;
+
+ NSOpenPanel *openPanel = [NSOpenPanel openPanel];
+ [openPanel setAllowsMultipleSelection:YES];
+ if ([openPanel runModalForTypes:nil] == NSModalResponseOK) {
+ for (NSURL *url in [openPanel URLs]) {
+ error = nsurl_create([[url absoluteString] UTF8String], &u);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ u,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(u);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+ }
+ }
+}
+
+- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
+{
+ nsurl *url;
+ nserror error;
+ NSString *urlAsString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
+
+ error = nsurl_create([urlAsString UTF8String], &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+}
+
+- (IBAction)showSearchWindow:(id)sender
+{
+ if (self.search == nil) {
+ self.search = [[SearchWindowController alloc] init];
+ }
+ [self.search.window makeKeyAndOrderFront:self];
+}
+
+- (IBAction)searchForward:(id)sender
+{
+ [self.search search:SearchForward];
+}
+
+- (IBAction)searchBackward:(id)sender
+{
+ [self.search search:SearchBackward];
+}
+
+- (BOOL)validateMenuItem:(id)item
+{
+ SEL action = [item action];
+
+ if (action == @selector(searchForward:)) {
+ return [self.search canGoForward];
+ } else if (action == @selector(searchBackward:)) {
+ return [self.search canGoBack];
+ }
+
+ return YES;
+}
+
+- (IBAction)showPreferences:(id)sender
+{
+ if (self.preferences == nil) {
+ self.preferences = [[PreferencesWindowController alloc] init];
+ }
+ [self.preferences showWindow:sender];
+}
+
+- (IBAction)showGlobalHistory:(id)sender
+{
+ if (self.history == nil) {
+ self.history = [[HistoryWindowController alloc] init];
+ }
+ [self.history showWindow:sender];
+}
+
+// Application delegate methods
+
+- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender
+{
+ [self newDocument:self];
+ return YES;
+}
+
+- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
+{
+ NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
+ [appleEventManager setEventHandler:self
+ andSelector:@selector(handleGetURLEvent:withReplyEvent:)
+ forEventClass:kInternetEventClass
+ andEventID:kAEGetURL];
+}
+
+- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
+{
+ nsurl *url;
+ nserror error;
+ NSURL *urltxt = [NSURL fileURLWithPath:filename];
+
+ error = nsurl_create([[urltxt absoluteString] UTF8String], &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+
+ return YES;
+}
+
+@end
diff --git a/frontends/cocoa/NetsurfApp.h b/frontends/cocoa/NetsurfApp.h
new file mode 100644
index 000000000..03bf45446
--- /dev/null
+++ b/frontends/cocoa/NetsurfApp.h
@@ -0,0 +1,29 @@
+/*
+ * 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>
+
+@class BrowserViewController;
+
+@interface NetSurfApp : NSApplication
+
+@property (nonatomic) BrowserViewController *frontTab;
+
+@end
+
+NSString *cocoa_get_user_path(NSString *fileName);
diff --git a/frontends/cocoa/NetsurfApp.m b/frontends/cocoa/NetsurfApp.m
new file mode 100644
index 000000000..fabf8a795
--- /dev/null
+++ b/frontends/cocoa/NetsurfApp.m
@@ -0,0 +1,302 @@
+/*
+ * 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/apple_image.h"
+#import "cocoa/NetsurfApp.h"
+#import "cocoa/gui.h"
+#import "cocoa/plotter.h"
+#import "cocoa/DownloadWindowController.h"
+#import "cocoa/SearchWindowController.h"
+#import "cocoa/selection.h"
+#import "cocoa/fetch.h"
+#import "cocoa/bitmap.h"
+#import "cocoa/font.h"
+
+#import "utils/filename.h"
+#import "utils/log.h"
+#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsoption.h"
+#import "utils/nsurl.h"
+#import "netsurf/plotters.h"
+#import "netsurf/mouse.h"
+#import "netsurf/netsurf.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/cookie_db.h"
+#import "netsurf/url_db.h"
+#import "desktop/save_complete.h"
+#import "cocoa/desktop-tree.h"
+
+#ifndef NETSURF_HOMEPAGE
+#define NETSURF_HOMEPAGE "http://www.netsurf-browser.org/welcome/"
+#endif
+
+@implementation NetSurfApp
+
+@synthesize frontTab;
+
+static bool cocoa_done = false;
+
+/**
+ * Cause an abnormal program termination.
+ *
+ * \note This never returns and is intended to terminate without any cleanup.
+ *
+ * \param error The message to display to the user.
+ */
+static void die(const char *const error)
+{
+ [NSException raise:@"NetsurfDie" format:@"Error: %s", error];
+}
+
+- (void)loadOptions
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ cocoa_get_user_path(@"Cookies"),
+ kCookiesFileOption,
+ cocoa_get_user_path(@"URLs"),
+ kURLsFileOption,
+ [NSString stringWithUTF8String:NETSURF_HOMEPAGE],
+ kHomepageURLOption,
+ nil]];
+
+ nsoption_setnull_charp(cookie_file, strdup([[defaults objectForKey:kCookiesFileOption] UTF8String]));
+
+ nsoption_setnull_charp(cookie_jar, strdup(nsoption_charp(cookie_file)));
+
+ nsoption_setnull_charp(homepage_url, strdup([[defaults objectForKey:kHomepageURLOption] UTF8String]));
+
+ urldb_load([[defaults objectForKey:kURLsFileOption] UTF8String]);
+ urldb_load_cookies(nsoption_charp(cookie_file));
+
+ cocoa_update_scale_factor();
+ NSLOG(netsurf, INFO, "done setup");
+}
+
+- (void)saveOptions
+{
+ urldb_save_cookies(nsoption_charp(cookie_file));
+ urldb_save([[[NSUserDefaults standardUserDefaults] objectForKey:kURLsFileOption] UTF8String]);
+}
+
+- (void)run
+{
+ @autoreleasepool {
+
+ @autoreleasepool {
+
+ [self finishLaunching];
+
+ [self loadOptions];
+ }
+
+ while (!cocoa_done) {
+ @autoreleasepool {
+
+ NSEvent *event =
+ [self nextEventMatchingMask:NSEventMaskAny
+ untilDate:[NSDate distantFuture]
+ inMode:NSDefaultRunLoopMode
+ dequeue:YES];
+ if (nil != event) {
+ [self sendEvent:event];
+ [self updateWindows];
+ }
+ }
+ }
+
+ [self saveOptions];
+ }
+}
+
+- (void)terminate:(id)sender
+{
+ [[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationWillTerminateNotification object:self];
+
+ cocoa_done = true;
+ [self postEvent:[NSEvent otherEventWithType:NSEventTypeApplicationDefined
+ location:NSZeroPoint
+ modifierFlags:0
+ timestamp:0
+ windowNumber:0
+ context:NULL
+ subtype:0
+ data1:0
+ data2:0]
+ atStart:YES];
+}
+
+@end
+
+#pragma mark -
+
+static NSString *cocoa_get_preferences_path(void)
+{
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
+ NSCAssert([paths count] >= 1, @"Where is the application support directory?");
+
+ NSString *netsurfPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"NetSurf"];
+
+ NSFileManager *fm = [NSFileManager defaultManager];
+ BOOL isDirectory = NO;
+ BOOL exists = [fm fileExistsAtPath:netsurfPath isDirectory:&isDirectory];
+
+ if (!exists) {
+ exists = [fm createDirectoryAtPath:netsurfPath withIntermediateDirectories:YES attributes:nil error:NULL];
+ isDirectory = YES;
+ }
+ if (!(exists && isDirectory)) {
+ die("Cannot create netsurf preferences directory");
+ }
+
+ return netsurfPath;
+}
+
+NSString *cocoa_get_user_path(NSString *fileName)
+{
+ return [cocoa_get_preferences_path() stringByAppendingPathComponent:fileName];
+}
+
+static const char *cocoa_get_options_file(void)
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ cocoa_get_user_path(@"Options"), kOptionsFileOption,
+ nil]];
+
+ return [[defaults objectForKey:kOptionsFileOption] UTF8String];
+}
+
+static NSApplication *cocoa_prepare_app(void)
+{
+ /* if application instance has already been created return it */
+ if (NSApp != nil) {
+ return NSApp;
+ }
+
+ NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
+
+ /* Obtain principle class of bundle which must implement sharedApplication API */
+ Class principalClass = NSClassFromString([infoDictionary objectForKey:@"NSPrincipalClass"]);
+ NSCAssert([principalClass respondsToSelector:@selector(sharedApplication)],
+ @"Principal class must implement sharedApplication.");
+
+ /* create application instance */
+ [principalClass sharedApplication];
+
+ /* load interface nib */
+ NSString *mainNibName = [infoDictionary objectForKey:@"NSMainNibFile"];
+ NSNib *mainNib = [[NSNib alloc] initWithNibNamed:mainNibName bundle:[NSBundle mainBundle]];
+ [mainNib instantiateNibWithOwner:NSApp topLevelObjects:nil];
+
+ return NSApp;
+}
+
+/**
+ * Set option defaults for cocoa frontend
+ *
+ * @param defaults The option table to update.
+ * @return error status.
+ */
+static nserror set_defaults(struct nsoption_s *defaults)
+{
+ /* Set defaults for absent option strings */
+ const char *const ca_bundle = [[[NSBundle mainBundle] pathForResource:@"ca-bundle" ofType:@""] UTF8String];
+
+ nsoption_setnull_charp(ca_bundle, strdup(ca_bundle));
+
+ return NSERROR_OK;
+}
+
+int main(int argc, char **argv)
+{
+ nsurl *url;
+ nserror error;
+ struct netsurf_table cocoa_table = {
+ .misc = cocoa_misc_table,
+ .window = cocoa_window_table,
+ .clipboard = cocoa_clipboard_table,
+ .download = cocoa_download_table,
+ .fetch = cocoa_fetch_table,
+ .search = cocoa_search_table,
+ .bitmap = cocoa_bitmap_table,
+ .layout = cocoa_layout_table,
+ };
+
+ error = netsurf_register(&cocoa_table);
+ if (error != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
+
+ const char *const messages = [[[NSBundle mainBundle] pathForResource:@"Messages" ofType:@""] UTF8String];
+ const char *const options = cocoa_get_options_file();
+
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(NULL, &argc, argv);
+
+ /* user options setup */
+ error = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (error != NSERROR_OK) {
+ die("Options failed to initialise");
+ }
+ nsoption_read(options, NULL);
+ nsoption_commandline(&argc, argv, NULL);
+
+ error = messages_add_from_file(messages);
+
+ /* common initialisation */
+ error = netsurf_init(NULL);
+ if (error != NSERROR_OK) {
+ die("NetSurf failed to initialise");
+ }
+
+ /* Initialise filename allocator */
+ filename_initialise();
+
+ (void)apple_image_init();
+
+ NSApplication *app = cocoa_prepare_app();
+
+ for (int i = 1; i < argc; i++) {
+ /* skip -psn_* and other possible options */
+ if (argv[i][0] == '-')
+ continue;
+
+ error = nsurl_create(argv[i], &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ cocoa_warning(messages_get_errorcode(error), 0);
+ }
+ }
+
+ [app run];
+
+ netsurf_exit();
+
+ return 0;
+}
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front.png
new file mode 100644
index 000000000..77d220505
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Pressed.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Pressed.png
new file mode 100644
index 000000000..197ea95c2
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Pressed.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Rollover.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Rollover.png
new file mode 100644
index 000000000..2dfe5777e
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabCloseDirty_Front_Rollover.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front.png
new file mode 100644
index 000000000..02b72d39e
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Pressed.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Pressed.png
new file mode 100644
index 000000000..f81125a01
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Pressed.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Rollover.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Rollover.png
new file mode 100644
index 000000000..4f6b865f7
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabClose_Front_Rollover.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabNew.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNew.png
new file mode 100644
index 000000000..10a83705d
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNew.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewPressed.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewPressed.png
new file mode 100644
index 000000000..cb4dd10f2
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewPressed.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewRollover.png b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewRollover.png
new file mode 100644
index 000000000..4d469f8a6
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/AquaTabNewRollover.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/overflowImage.png b/frontends/cocoa/PSMTabBarControl/Images/overflowImage.png
new file mode 100644
index 000000000..2b762555d
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/overflowImage.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/overflowImagePressed.png b/frontends/cocoa/PSMTabBarControl/Images/overflowImagePressed.png
new file mode 100644
index 000000000..b3918b344
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/overflowImagePressed.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/Images/pi.png b/frontends/cocoa/PSMTabBarControl/Images/pi.png
new file mode 100644
index 000000000..4d598dc73
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/Images/pi.png
Binary files differ
diff --git a/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.h b/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.h
new file mode 100644
index 000000000..9aa17a905
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.h
@@ -0,0 +1,22 @@
+//
+// NSBezierPath_AMShading.h
+// ------------------------
+//
+// Created by Andreas on 2005-06-01.
+// Copyright 2005 Andreas Mayer. All rights reserved.
+//
+// based on http://www.cocoadev.com/index.pl?GradientFill
+
+#import <Cocoa/Cocoa.h>
+
+@interface NSBezierPath (AMShading)
+
+- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor;
+- (void)customVerticalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor;
+
+- (void)linearGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor;
+- (void)linearVerticalGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor;
+
+- (void)bilinearGradientFillWithOuterColor:(NSColor *)outerColor innerColor:(NSColor *)innerColor;
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.m b/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.m
new file mode 100644
index 000000000..dbd180599
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/NSBezierPath_AMShading.m
@@ -0,0 +1,126 @@
+//
+// NSBezierPath_AMShading.m
+// ------------------------
+//
+// Created by Andreas on 2005-06-01.
+// Copyright 2005 Andreas Mayer. All rights reserved.
+//
+
+#import "NSBezierPath_AMShading.h"
+
+@implementation NSBezierPath (AMShading)
+
+static void linearShadedColor(void *info, const CGFloat *in, CGFloat *out)
+{
+ CGFloat *colors = (CGFloat *)info;
+ *out++ = colors[0] + *in * colors[8];
+ *out++ = colors[1] + *in * colors[9];
+ *out++ = colors[2] + *in * colors[10];
+ *out++ = colors[3] + *in * colors[11];
+}
+
+static void bilinearShadedColor(void *info, const CGFloat *in, CGFloat *out)
+{
+ CGFloat *colors = (CGFloat *)info;
+ CGFloat factor = (*in) * 2.0;
+ if (*in > 0.5) {
+ factor = 2 - factor;
+ }
+ *out++ = colors[0] + factor * colors[8];
+ *out++ = colors[1] + factor * colors[9];
+ *out++ = colors[2] + factor * colors[10];
+ *out++ = colors[3] + factor * colors[11];
+}
+
+- (void)linearGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor
+{
+ static const CGFunctionCallbacks callbacks = { 0, &linearShadedColor, NULL };
+
+ [self customHorizontalFillWithCallbacks:callbacks firstColor:startColor secondColor:endColor];
+}
+
+- (void)linearVerticalGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor
+{
+ static const CGFunctionCallbacks callbacks = { 0, &linearShadedColor, NULL };
+
+ [self customVerticalFillWithCallbacks:callbacks firstColor:startColor secondColor:endColor];
+}
+
+- (void)bilinearGradientFillWithOuterColor:(NSColor *)outerColor innerColor:(NSColor *)innerColor
+{
+ static const CGFunctionCallbacks callbacks = { 0, &bilinearShadedColor, NULL };
+
+ [self customHorizontalFillWithCallbacks:callbacks firstColor:innerColor secondColor:outerColor];
+}
+
+- (void)customFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint
+{
+ CGColorSpaceRef colorspace;
+ CGShadingRef shading;
+ CGFunctionRef function;
+ CGFloat colors[12]; // pointer to color values
+
+ // get my context
+ CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
+
+ NSColor *deviceDependentFirstColor = [firstColor colorUsingColorSpaceName:NSDeviceRGBColorSpace];
+ NSColor *deviceDependentSecondColor = [secondColor colorUsingColorSpaceName:NSDeviceRGBColorSpace];
+
+ // set up colors for gradient
+ colors[0] = [deviceDependentFirstColor redComponent];
+ colors[1] = [deviceDependentFirstColor greenComponent];
+ colors[2] = [deviceDependentFirstColor blueComponent];
+ colors[3] = [deviceDependentFirstColor alphaComponent];
+
+ colors[4] = [deviceDependentSecondColor redComponent];
+ colors[5] = [deviceDependentSecondColor greenComponent];
+ colors[6] = [deviceDependentSecondColor blueComponent];
+ colors[7] = [deviceDependentSecondColor alphaComponent];
+
+ // difference between start and end color for each color components
+ colors[8] = (colors[4] - colors[0]);
+ colors[9] = (colors[5] - colors[1]);
+ colors[10] = (colors[6] - colors[2]);
+ colors[11] = (colors[7] - colors[3]);
+
+ // draw gradient
+ colorspace = CGColorSpaceCreateDeviceRGB();
+ size_t components = 1 + CGColorSpaceGetNumberOfComponents(colorspace);
+ static const CGFloat domain[2] = { 0.0, 1.0 };
+ static const CGFloat range[10] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
+ //static const CGFunctionCallbacks callbacks = {0, &bilinearShadedColor, NULL};
+
+ // Create a CGFunctionRef that describes a function taking 1 input and kChannelsPerColor outputs.
+ function = CGFunctionCreate(colors, 1, domain, components, range, &functionCallbacks);
+
+ shading = CGShadingCreateAxial(colorspace, startPoint, endPoint, function, NO, NO);
+
+ CGContextSaveGState(currentContext);
+ [self addClip];
+ CGContextDrawShading(currentContext, shading);
+ CGContextRestoreGState(currentContext);
+
+ CGShadingRelease(shading);
+ CGFunctionRelease(function);
+ CGColorSpaceRelease(colorspace);
+}
+
+- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor
+{
+ [self customFillWithCallbacks:functionCallbacks
+ firstColor:firstColor
+ secondColor:secondColor
+ startPoint:CGPointMake(0, NSMinY([self bounds]))
+ endPoint:CGPointMake(0, NSMaxY([self bounds]))];
+}
+
+- (void)customVerticalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor
+{
+ [self customFillWithCallbacks:functionCallbacks
+ firstColor:firstColor
+ secondColor:secondColor
+ startPoint:CGPointMake(NSMinX([self bounds]), 0)
+ endPoint:CGPointMake(NSMaxX([self bounds]), 0)];
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.h b/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.h
new file mode 100644
index 000000000..cbcbf2c7f
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.h
@@ -0,0 +1,12 @@
+//
+// NSString_AITruncation.h
+// PSMTabBarControl
+//
+// Created by Evan Schoenberg on 7/14/07.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface NSString (AITruncation)
+- (NSString *)stringWithEllipsisByTruncatingToLength:(NSUInteger)length;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.m b/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.m
new file mode 100644
index 000000000..9d9ce6189
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/NSString_AITruncation.m
@@ -0,0 +1,34 @@
+//
+// NSString_AITruncation.m
+// PSMTabBarControl
+//
+// Created by Evan Schoenberg on 7/14/07.
+// From Adium, which is licensed under the GPL. Used in PSMTabBarControl with permission.
+// The contents of this remain licensed under the GPL.
+//
+
+#import "NSString_AITruncation.h"
+
+@implementation NSString (AITruncation)
+
++ (id)ellipsis
+{
+ return [NSString stringWithUTF8String:"\xE2\x80\xA6"];
+}
+
+- (NSString *)stringWithEllipsisByTruncatingToLength:(NSUInteger)length
+{
+ NSString *returnString;
+
+ if (length < [self length]) {
+ //Truncate and append the ellipsis
+ returnString = [[self substringToIndex:length - 1] stringByAppendingString:[NSString ellipsis]];
+ } else {
+ //We don't need to truncate, so don't append an ellipsis
+ returnString = [self copy];
+ }
+
+ return returnString;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.h b/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.h
new file mode 100644
index 000000000..0c39f32e0
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.h
@@ -0,0 +1,27 @@
+//
+// PSMOverflowPopUpButton.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 11/4/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface PSMOverflowPopUpButton : NSPopUpButton {
+ NSImage *_PSMTabBarOverflowPopUpImage;
+ NSImage *_PSMTabBarOverflowDownPopUpImage;
+ BOOL _down;
+ BOOL _animatingAlternateImage;
+ NSTimer *_animationTimer;
+ CGFloat _animationValue;
+}
+
+//alternate image display
+- (BOOL)animatingAlternateImage;
+- (void)setAnimatingAlternateImage:(BOOL)flag;
+
+// archiving
+- (void)encodeWithCoder:(NSCoder *)aCoder;
+- (id)initWithCoder:(NSCoder *)aDecoder;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.m b/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.m
new file mode 100644
index 000000000..d589227c5
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMOverflowPopUpButton.m
@@ -0,0 +1,157 @@
+//
+// PSMOverflowPopUpButton.m
+// PSMTabBarControl
+//
+// Created by John Pannell on 11/4/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+#import <math.h>
+#import "PSMOverflowPopUpButton.h"
+#import "PSMTabBarControl.h"
+
+#define TIMER_INTERVAL 1.0 / 15.0
+#define ANIMATION_STEP 0.033f
+
+@implementation PSMOverflowPopUpButton
+
+- (id)initWithFrame:(NSRect)frameRect pullsDown:(BOOL)flag
+{
+ if ((self = [super initWithFrame:frameRect pullsDown:YES]) != nil) {
+ [self setBezelStyle:NSRegularSquareBezelStyle];
+ [self setBordered:NO];
+ [self setTitle:@""];
+ [self setPreferredEdge:NSMaxXEdge];
+ _PSMTabBarOverflowPopUpImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"overflowImage"]];
+ _PSMTabBarOverflowDownPopUpImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"overflowImagePressed"]];
+ _animatingAlternateImage = NO;
+ }
+ return self;
+}
+
+- (void)drawRect:(NSRect)rect
+{
+ if (_PSMTabBarOverflowPopUpImage == nil) {
+ [super drawRect:rect];
+ return;
+ }
+
+ NSImage *image = (_down) ? _PSMTabBarOverflowDownPopUpImage : _PSMTabBarOverflowPopUpImage;
+ NSSize imageSize = [image size];
+ NSRect bounds = [self bounds];
+
+ NSPoint drawPoint = NSMakePoint(NSMidX(bounds) - (imageSize.width * 0.5f), NSMidY(bounds) - (imageSize.height * 0.5f));
+
+ if ([self isFlipped]) {
+ drawPoint.y += imageSize.height;
+ }
+
+ [image drawAtPoint:drawPoint fromRect:CGRectZero operation:NSCompositingOperationSourceOver fraction:(_animatingAlternateImage ? 0.7f : 1.0f)];
+
+ if (_animatingAlternateImage) {
+ NSImage *alternateImage = [self alternateImage];
+ NSSize altImageSize = [alternateImage size];
+ drawPoint = NSMakePoint(NSMidX(bounds) - (altImageSize.width * 0.5f), NSMidY(bounds) - (altImageSize.height * 0.5f));
+
+ if ([self isFlipped]) {
+ drawPoint.y += altImageSize.height;
+ }
+
+ [[self alternateImage] drawAtPoint:drawPoint fromRect:CGRectZero operation:NSCompositingOperationSourceOver fraction:sin(_animationValue * M_PI)];
+ }
+}
+
+- (void)mouseDown:(NSEvent *)event
+{
+ _down = YES;
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationReceived:) name:NSMenuDidEndTrackingNotification object:[self menu]];
+ [self setNeedsDisplay:YES];
+ [super mouseDown:event];
+}
+
+- (void)setHidden:(BOOL)value
+{
+ if ([self isHidden] != value) {
+ if (value) {
+ // Stop any animating alternate image if we hide
+ [_animationTimer invalidate], _animationTimer = nil;
+ } else if (_animatingAlternateImage) {
+ // Restart any animating alternate image if we unhide
+ _animationValue = ANIMATION_STEP;
+ _animationTimer = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL target:self selector:@selector(animateStep:) userInfo:nil repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSEventTrackingRunLoopMode];
+ }
+ }
+
+ [super setHidden:value];
+}
+
+- (void)notificationReceived:(NSNotification *)notification
+{
+ _down = NO;
+ [self setNeedsDisplay:YES];
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)setAnimatingAlternateImage:(BOOL)flag
+{
+ if (_animatingAlternateImage != flag) {
+ _animatingAlternateImage = flag;
+
+ if (![self isHidden]) {
+ if (flag) {
+ _animationValue = ANIMATION_STEP;
+ _animationTimer = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL target:self selector:@selector(animateStep:) userInfo:nil repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSEventTrackingRunLoopMode];
+ } else {
+ [_animationTimer invalidate], _animationTimer = nil;
+ }
+
+ [self setNeedsDisplay:YES];
+ }
+ }
+}
+
+- (BOOL)animatingAlternateImage
+{
+ return _animatingAlternateImage;
+}
+
+- (void)animateStep:(NSTimer *)timer
+{
+ _animationValue += ANIMATION_STEP;
+
+ if (_animationValue >= 1) {
+ _animationValue = ANIMATION_STEP;
+ }
+
+ [self setNeedsDisplay:YES];
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ [super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:_PSMTabBarOverflowPopUpImage forKey:@"PSMTabBarOverflowPopUpImage"];
+ [aCoder encodeObject:_PSMTabBarOverflowDownPopUpImage forKey:@"PSMTabBarOverflowDownPopUpImage"];
+ [aCoder encodeBool:_animatingAlternateImage forKey:@"PSMTabBarOverflowAnimatingAlternateImage"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ if ((self = [super initWithCoder:aDecoder])) {
+ if ([aDecoder allowsKeyedCoding]) {
+ _PSMTabBarOverflowPopUpImage =
+ [aDecoder decodeObjectForKey:@"PSMTabBarOverflowPopUpImage"];
+ _PSMTabBarOverflowDownPopUpImage = [aDecoder decodeObjectForKey:@"PSMTabBarOverflowDownPopUpImage"];
+ [self setAnimatingAlternateImage:[aDecoder decodeBoolForKey:@"PSMTabBarOverflowAnimatingAlternateImage"]];
+ }
+ }
+ return self;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.h b/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.h
new file mode 100644
index 000000000..75c81d33c
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.h
@@ -0,0 +1,14 @@
+//
+// PSMProgressIndicator.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 2/23/06.
+// Copyright 2006 Positive Spin Media. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface PSMProgressIndicator : NSProgressIndicator {
+}
+
+@end \ No newline at end of file
diff --git a/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.m b/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.m
new file mode 100644
index 000000000..4532f31be
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMProgressIndicator.m
@@ -0,0 +1,43 @@
+//
+// PSMProgressIndicator.m
+// PSMTabBarControl
+//
+// Created by John Pannell on 2/23/06.
+// Copyright 2006 Positive Spin Media. All rights reserved.
+//
+
+#import "PSMProgressIndicator.h"
+#import "PSMTabBarControl.h"
+
+@interface PSMTabBarControl (PSMProgressIndicatorExtensions)
+
+- (void)update;
+
+@end
+
+@implementation PSMProgressIndicator
+
+- (id)initWithFrame:(NSRect)frameRect
+{
+ if ((self = [super initWithFrame:frameRect]) == nil)
+ return nil;
+ [self setControlSize:NSControlSizeSmall];
+ return self;
+}
+
+// overrides to make tab bar control re-layout things if status changes
+- (void)setHidden:(BOOL)flag
+{
+ [super setHidden:flag];
+ [(PSMTabBarControl *)[self superview] update];
+}
+
+- (void)stopAnimation:(id)sender
+{
+ [NSObject cancelPreviousPerformRequestsWithTarget:self
+ selector:@selector(startAnimation:)
+ object:nil];
+ [super stopAnimation:sender];
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.h b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.h
new file mode 100644
index 000000000..6f2afdb09
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.h
@@ -0,0 +1,28 @@
+//
+// PSMOverflowPopUpButton.h
+// NetScrape
+//
+// Created by John Pannell on 8/4/04.
+// Copyright 2004 Positive Spin Media. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface PSMRolloverButton : NSButton {
+ NSImage *_rolloverImage;
+ NSImage *_usualImage;
+ NSTrackingRectTag _myTrackingRectTag;
+}
+
+// the regular image
+- (void)setUsualImage:(NSImage *)newImage;
+- (NSImage *)usualImage;
+
+// the rollover image
+- (void)setRolloverImage:(NSImage *)newImage;
+- (NSImage *)rolloverImage;
+
+// tracking rect for mouse events
+- (void)addTrackingRect;
+- (void)removeTrackingRect;
+@end \ No newline at end of file
diff --git a/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m
new file mode 100644
index 000000000..65df6aa0f
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMRolloverButton.m
@@ -0,0 +1,180 @@
+//
+// PSMOverflowPopUpButton.m
+// NetScrape
+//
+// Created by John Pannell on 8/4/04.
+// Copyright 2004 Positive Spin Media. All rights reserved.
+//
+
+#import "PSMRolloverButton.h"
+
+@implementation PSMRolloverButton
+
+- (void)awakeFromNib
+{
+ if ([[self superclass] instancesRespondToSelector:@selector(awakeFromNib)]) {
+ [super awakeFromNib];
+ }
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(rolloverFrameDidChange:)
+ name:NSViewFrameDidChangeNotification
+ object:self];
+ [self setPostsFrameChangedNotifications:YES];
+ [self resetCursorRects];
+
+ _myTrackingRectTag = -1;
+}
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [self removeTrackingRect];
+}
+
+// the regular image
+- (void)setUsualImage:(NSImage *)newImage
+{
+ _usualImage = newImage;
+
+ [self setImage:_usualImage];
+}
+
+- (NSImage *)usualImage
+{
+ return _usualImage;
+}
+
+- (void)setRolloverImage:(NSImage *)newImage
+{
+ _rolloverImage = newImage;
+}
+
+- (NSImage *)rolloverImage
+{
+ return _rolloverImage;
+}
+
+//Remove old tracking rects when we change superviews
+- (void)viewWillMoveToSuperview:(NSView *)newSuperview
+{
+ [self removeTrackingRect];
+
+ [super viewWillMoveToSuperview:newSuperview];
+}
+
+- (void)viewDidMoveToSuperview
+{
+ [super viewDidMoveToSuperview];
+
+ [self resetCursorRects];
+}
+
+- (void)viewWillMoveToWindow:(NSWindow *)newWindow
+{
+ [self removeTrackingRect];
+
+ [super viewWillMoveToWindow:newWindow];
+}
+
+- (void)viewDidMoveToWindow
+{
+ [super viewDidMoveToWindow];
+
+ [self resetCursorRects];
+}
+
+- (void)rolloverFrameDidChange:(NSNotification *)inNotification
+{
+ [self resetCursorRects];
+}
+
+- (void)addTrackingRect
+{
+ // assign a tracking rect to watch for mouse enter/exit
+ NSRect trackRect = [self bounds];
+ NSPoint localPoint = [self convertPoint:NSPointFromCGPoint([self.window convertRectFromScreen:(NSRect){.origin = NSEvent.mouseLocation, .size = CGSizeMake(1, 1) }].origin) fromView:nil];
+ BOOL mouseInside = NSPointInRect(localPoint, trackRect);
+
+ _myTrackingRectTag = [self addTrackingRect:trackRect owner:self userData:nil assumeInside:mouseInside];
+ if (mouseInside) {
+ //[self mouseEntered:nil];
+ [self setImage:_rolloverImage];
+ } else {
+ //[self mouseExited:nil];
+ [self setImage:_usualImage];
+ }
+}
+
+- (void)removeTrackingRect
+{
+ if (_myTrackingRectTag != -1) {
+ [self removeTrackingRect:_myTrackingRectTag];
+ }
+ _myTrackingRectTag = -1;
+}
+
+// override for rollover effect
+- (void)mouseEntered:(NSEvent *)theEvent
+{
+ // set rollover image
+ [self setImage:_rolloverImage];
+
+ [super mouseEntered:theEvent];
+}
+
+- (void)mouseExited:(NSEvent *)theEvent
+{
+ // restore usual image
+ [self setImage:_usualImage];
+
+ [super mouseExited:theEvent];
+}
+
+- (void)resetCursorRects
+{
+ // called when the button rect has been changed
+ [self removeTrackingRect];
+ [self addTrackingRect];
+}
+
+- (void)setFrame:(NSRect)rect
+{
+ [super setFrame:rect];
+ [self resetCursorRects];
+}
+
+- (void)setBounds:(NSRect)rect
+{
+ [super setBounds:rect];
+ [self resetCursorRects];
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ [super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:_rolloverImage forKey:@"rolloverImage"];
+ [aCoder encodeObject:_usualImage forKey:@"usualImage"];
+ [aCoder encodeInt64:_myTrackingRectTag forKey:@"myTrackingRectTag"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ self = [super initWithCoder:aDecoder];
+ if (self) {
+ if ([aDecoder allowsKeyedCoding]) {
+ _rolloverImage = [aDecoder decodeObjectForKey:@"rolloverImage"];
+ _usualImage = [aDecoder decodeObjectForKey:@"usualImage"];
+ _myTrackingRectTag = [aDecoder decodeInt64ForKey:@"myTrackingRectTag"];
+ }
+ }
+ return self;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.h b/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.h
new file mode 100644
index 000000000..f5c51b495
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.h
@@ -0,0 +1,115 @@
+//
+// PSMTabBarCell.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 10/13/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "PSMTabBarControl.h"
+#import "PSMProgressIndicator.h"
+
+@interface PSMTabBarCell : NSActionCell {
+ // sizing
+ NSRect _frame;
+ NSSize _stringSize;
+ NSInteger _currentStep;
+ BOOL _isPlaceholder;
+
+ // state
+ NSInteger _tabState;
+ NSTrackingRectTag _closeButtonTrackingTag; // left side tracking, if dragging
+ NSTrackingRectTag _cellTrackingTag; // right side tracking, if dragging
+ BOOL _closeButtonOver;
+ BOOL _closeButtonPressed;
+ PSMProgressIndicator *_indicator;
+ BOOL _isInOverflowMenu;
+ BOOL _hasCloseButton;
+ BOOL _isCloseButtonSuppressed;
+ BOOL _hasIcon;
+ BOOL _hasLargeImage;
+ NSInteger _count;
+ NSColor *_countColor;
+ BOOL _isEdited;
+}
+
+// creation/destruction
+- (id)initWithControlView:(PSMTabBarControl *)controlView;
+- (id)initPlaceholderWithFrame:(NSRect)frame expanded:(BOOL)value inControlView:(PSMTabBarControl *)controlView;
+- (void)dealloc;
+
+// accessors
+- (id)controlView;
+- (void)setControlView:(id)view;
+- (NSTrackingRectTag)closeButtonTrackingTag;
+- (void)setCloseButtonTrackingTag:(NSTrackingRectTag)tag;
+- (NSTrackingRectTag)cellTrackingTag;
+- (void)setCellTrackingTag:(NSTrackingRectTag)tag;
+- (CGFloat)width;
+- (NSRect)frame;
+- (void)setFrame:(NSRect)rect;
+- (void)setStringValue:(NSString *)aString;
+- (NSSize)stringSize;
+- (NSAttributedString *)attributedStringValue;
+- (NSInteger)tabState;
+- (void)setTabState:(NSInteger)state;
+- (NSProgressIndicator *)indicator;
+- (BOOL)isInOverflowMenu;
+- (void)setIsInOverflowMenu:(BOOL)value;
+- (BOOL)closeButtonPressed;
+- (void)setCloseButtonPressed:(BOOL)value;
+- (BOOL)closeButtonOver;
+- (void)setCloseButtonOver:(BOOL)value;
+- (BOOL)hasCloseButton;
+- (void)setHasCloseButton:(BOOL)set;
+- (void)setCloseButtonSuppressed:(BOOL)suppress;
+- (BOOL)isCloseButtonSuppressed;
+- (BOOL)hasIcon;
+- (void)setHasIcon:(BOOL)value;
+- (BOOL)hasLargeImage;
+- (void)setHasLargeImage:(BOOL)value;
+- (NSInteger)count;
+- (void)setCount:(NSInteger)value;
+- (NSColor *)countColor;
+- (void)setCountColor:(NSColor *)value;
+- (BOOL)isPlaceholder;
+- (void)setIsPlaceholder:(BOOL)value;
+- (NSInteger)currentStep;
+- (void)setCurrentStep:(NSInteger)value;
+- (BOOL)isEdited;
+- (void)setIsEdited:(BOOL)value;
+
+// component attributes
+- (NSRect)indicatorRectForFrame:(NSRect)cellFrame;
+- (NSRect)closeButtonRectForFrame:(NSRect)cellFrame;
+- (CGFloat)minimumWidthOfCell;
+- (CGFloat)desiredWidthOfCell;
+
+// drawing
+- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView;
+
+// tracking the mouse
+- (void)mouseEntered:(NSEvent *)theEvent;
+- (void)mouseExited:(NSEvent *)theEvent;
+
+// drag support
+- (NSImage *)dragImage;
+
+// archiving
+- (void)encodeWithCoder:(NSCoder *)aCoder;
+- (id)initWithCoder:(NSCoder *)aDecoder;
+
+@end
+
+@interface PSMTabBarControl (CellAccessors)
+
+- (id<PSMTabStyle>)style;
+
+@end
+
+@interface NSObject (IdentifierAccesors)
+
+- (NSImage *)largeImage;
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.m b/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.m
new file mode 100644
index 000000000..5a8edfd77
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarCell.m
@@ -0,0 +1,536 @@
+//
+// PSMTabBarCell.m
+// PSMTabBarControl
+//
+// Created by John Pannell on 10/13/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+#import "PSMTabBarCell.h"
+#import "PSMTabBarControl.h"
+#import "PSMTabStyle.h"
+#import "PSMProgressIndicator.h"
+#import "PSMTabDragAssistant.h"
+#import "PSMTabBarControl+Private.h"
+
+@implementation PSMTabBarCell
+
+#pragma mark -
+#pragma mark Creation/Destruction
+- (id)initWithControlView:(PSMTabBarControl *)controlView
+{
+ if ((self = [super init])) {
+ _controlView = controlView;
+ _closeButtonTrackingTag = 0;
+ _cellTrackingTag = 0;
+ _closeButtonOver = NO;
+ _closeButtonPressed = NO;
+ _indicator = [[PSMProgressIndicator alloc] initWithFrame:NSMakeRect(0.0, 0.0, kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth)];
+ [_indicator setStyle:NSProgressIndicatorSpinningStyle];
+ [_indicator setAutoresizingMask:NSViewMinYMargin];
+ _hasCloseButton = YES;
+ _isCloseButtonSuppressed = NO;
+ _count = 0;
+ _countColor = nil;
+ _isEdited = NO;
+ _isPlaceholder = NO;
+ }
+ return self;
+}
+
+- (id)initPlaceholderWithFrame:(NSRect)frame expanded:(BOOL)value inControlView:(PSMTabBarControl *)controlView
+{
+ if ((self = [super init])) {
+ _controlView = controlView;
+ _isPlaceholder = YES;
+ if (!value) {
+ if ([controlView orientation] == PSMTabBarHorizontalOrientation) {
+ frame.size.width = 0.0;
+ } else {
+ frame.size.height = 0.0;
+ }
+ }
+ [self setFrame:frame];
+ _closeButtonTrackingTag = 0;
+ _cellTrackingTag = 0;
+ _closeButtonOver = NO;
+ _closeButtonPressed = NO;
+ _indicator = nil;
+ _hasCloseButton = YES;
+ _isCloseButtonSuppressed = NO;
+ _count = 0;
+ _countColor = nil;
+ _isEdited = NO;
+
+ if (value) {
+ [self setCurrentStep:(kPSMTabDragAnimationSteps - 1)];
+ } else {
+ [self setCurrentStep:0];
+ }
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+
+ [_indicator removeFromSuperviewWithoutNeedingDisplay];
+}
+
+#pragma mark -
+#pragma mark Accessors
+
+- (id)controlView
+{
+ return _controlView;
+}
+
+- (void)setControlView:(id)view
+{
+ // no retain release pattern, as this simply switches a tab to another view.
+ _controlView = view;
+}
+
+- (NSTrackingRectTag)closeButtonTrackingTag
+{
+ return _closeButtonTrackingTag;
+}
+
+- (void)setCloseButtonTrackingTag:(NSTrackingRectTag)tag
+{
+ _closeButtonTrackingTag = tag;
+}
+
+- (NSTrackingRectTag)cellTrackingTag
+{
+ return _cellTrackingTag;
+}
+
+- (void)setCellTrackingTag:(NSTrackingRectTag)tag
+{
+ _cellTrackingTag = tag;
+}
+
+- (CGFloat)width
+{
+ return _frame.size.width;
+}
+
+- (NSRect)frame
+{
+ return _frame;
+}
+
+- (void)setFrame:(NSRect)rect
+{
+ _frame = rect;
+
+ //move the status indicator along with the rest of the cell
+ if (![[self indicator] isHidden] && ![_controlView isTabBarHidden]) {
+ [[self indicator] setFrame:[self indicatorRectForFrame:rect]];
+ }
+}
+
+- (void)setStringValue:(NSString *)aString
+{
+ [super setStringValue:aString];
+ _stringSize = [[self attributedStringValue] size];
+ // need to redisplay now - binding observation was too quick.
+ [_controlView update];
+}
+
+- (NSSize)stringSize
+{
+ return _stringSize;
+}
+
+- (NSAttributedString *)attributedStringValue
+{
+ return [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] attributedStringValueForTabCell:self];
+}
+
+- (NSInteger)tabState
+{
+ return _tabState;
+}
+
+- (void)setTabState:(NSInteger)state
+{
+ _tabState = state;
+}
+
+- (NSProgressIndicator *)indicator
+{
+ return _indicator;
+}
+
+- (BOOL)isInOverflowMenu
+{
+ return _isInOverflowMenu;
+}
+
+- (void)setIsInOverflowMenu:(BOOL)value
+{
+ if (_isInOverflowMenu != value) {
+ _isInOverflowMenu = value;
+ if ([[[self controlView] delegate] respondsToSelector:@selector(tabView:tabViewItem:isInOverflowMenu:)]) {
+ [[[self controlView] delegate] tabView:[self controlView] tabViewItem:[self representedObject] isInOverflowMenu:_isInOverflowMenu];
+ }
+ }
+}
+
+- (BOOL)closeButtonPressed
+{
+ return _closeButtonPressed;
+}
+
+- (void)setCloseButtonPressed:(BOOL)value
+{
+ _closeButtonPressed = value;
+}
+
+- (BOOL)closeButtonOver
+{
+ return (_closeButtonOver && ([_controlView allowsBackgroundTabClosing] || ([self tabState] & PSMTab_SelectedMask) || [[NSApp currentEvent] modifierFlags] & NSEventModifierFlagCommand));
+}
+
+- (void)setCloseButtonOver:(BOOL)value
+{
+ _closeButtonOver = value;
+}
+
+- (BOOL)hasCloseButton
+{
+ return _hasCloseButton;
+}
+
+- (void)setHasCloseButton:(BOOL)set
+{
+ _hasCloseButton = set;
+}
+
+- (void)setCloseButtonSuppressed:(BOOL)suppress
+{
+ _isCloseButtonSuppressed = suppress;
+}
+
+- (BOOL)isCloseButtonSuppressed
+{
+ return _isCloseButtonSuppressed;
+}
+
+- (BOOL)hasIcon
+{
+ return _hasIcon;
+}
+
+- (void)setHasIcon:(BOOL)value
+{
+ _hasIcon = value;
+ //[_controlView update:[[self controlView] automaticallyAnimates]]; // binding notice is too fast
+}
+
+- (BOOL)hasLargeImage
+{
+ return _hasLargeImage;
+}
+
+- (void)setHasLargeImage:(BOOL)value
+{
+ _hasLargeImage = value;
+}
+
+- (NSInteger)count
+{
+ return _count;
+}
+
+- (void)setCount:(NSInteger)value
+{
+ _count = value;
+ //[_controlView update:[[self controlView] automaticallyAnimates]]; // binding notice is too fast
+}
+
+- (NSColor *)countColor
+{
+ return _countColor;
+}
+
+- (void)setCountColor:(NSColor *)color
+{
+ _countColor = color;
+}
+
+- (BOOL)isPlaceholder
+{
+ return _isPlaceholder;
+}
+
+- (void)setIsPlaceholder:(BOOL)value
+{
+ _isPlaceholder = value;
+}
+
+- (NSInteger)currentStep
+{
+ return _currentStep;
+}
+
+- (void)setCurrentStep:(NSInteger)value
+{
+ if (value < 0) {
+ value = 0;
+ }
+
+ if (value > (kPSMTabDragAnimationSteps - 1)) {
+ value = (kPSMTabDragAnimationSteps - 1);
+ }
+
+ _currentStep = value;
+}
+
+- (BOOL)isEdited
+{
+ return _isEdited;
+}
+
+- (void)setIsEdited:(BOOL)value
+{
+ _isEdited = value;
+ //[_controlView update:[[self controlView] automaticallyAnimates]]; // binding notice is too fast
+}
+
+#pragma mark -
+#pragma mark Bindings
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+ // the progress indicator, label, icon, or count has changed - redraw the control view
+ //[_controlView update];
+ //I seem to have run into some odd issue with update not being called at the right time. This seems to avoid the problem.
+ [_controlView performSelector:@selector(update) withObject:nil afterDelay:0.0];
+}
+
+#pragma mark -
+#pragma mark Component Attributes
+
+- (NSRect)indicatorRectForFrame:(NSRect)cellFrame
+{
+ return [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] indicatorRectForTabCell:self];
+}
+
+- (NSRect)closeButtonRectForFrame:(NSRect)cellFrame
+{
+ return [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] closeButtonRectForTabCell:self withFrame:cellFrame];
+}
+
+- (CGFloat)minimumWidthOfCell
+{
+ return [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] minimumWidthOfTabCell:self];
+}
+
+- (CGFloat)desiredWidthOfCell
+{
+ return [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] desiredWidthOfTabCell:self];
+}
+
+#pragma mark -
+#pragma mark Drawing
+
+- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
+{
+ if (_isPlaceholder) {
+ [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set];
+ NSRectFillUsingOperation(cellFrame, NSCompositingOperationSourceAtop);
+ return;
+ }
+
+ [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] drawTabCell:self];
+}
+
+#pragma mark -
+#pragma mark Tracking
+
+- (void)mouseEntered:(NSEvent *)theEvent
+{
+ // check for which tag
+ if ([theEvent trackingNumber] == _closeButtonTrackingTag) {
+ _closeButtonOver = YES;
+ }
+ if ([theEvent trackingNumber] == _cellTrackingTag) {
+ [self setHighlighted:YES];
+ [_controlView setNeedsDisplay:NO];
+ }
+
+ // scrubtastic
+ if ([_controlView allowsScrubbing] && ([theEvent modifierFlags] & NSEventModifierFlagOption)) {
+ [_controlView performSelector:@selector(tabClick:) withObject:self];
+ }
+
+ // tell the control we only need to redraw the affected tab
+ [_controlView setNeedsDisplayInRect:NSInsetRect([self frame], -2, -2)];
+}
+
+- (void)mouseExited:(NSEvent *)theEvent
+{
+ // check for which tag
+ if ([theEvent trackingNumber] == _closeButtonTrackingTag) {
+ _closeButtonOver = NO;
+ }
+
+ if ([theEvent trackingNumber] == _cellTrackingTag) {
+ [self setHighlighted:NO];
+ [_controlView setNeedsDisplay:NO];
+ }
+
+ //tell the control we only need to redraw the affected tab
+ [_controlView setNeedsDisplayInRect:NSInsetRect([self frame], -2, -2)];
+}
+
+#pragma mark -
+#pragma mark Drag Support
+
+- (NSImage *)dragImage
+{
+ NSRect cellFrame = [(id<PSMTabStyle>)[(PSMTabBarControl *)_controlView style] dragRectForTabCell:self orientation:(PSMTabBarOrientation)[(PSMTabBarControl *)_controlView orientation]];
+ //NSRect cellFrame = [self frame];
+
+ [_controlView lockFocus];
+ NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:cellFrame];
+ [_controlView unlockFocus];
+ NSImage *image = [[NSImage alloc] initWithSize:[rep size]];
+ [image addRepresentation:rep];
+ NSImage *returnImage = [[NSImage alloc] initWithSize:[rep size]];
+ [returnImage lockFocus];
+ [image drawAtPoint:NSMakePoint(0.0, 0.0) fromRect:NSZeroRect operation:NSCompositingOperationSourceOver fraction:1.0];
+ [returnImage unlockFocus];
+ if (![[self indicator] isHidden]) {
+ NSImage *pi = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"pi"]];
+ [returnImage lockFocus];
+ NSPoint indicatorPoint = NSMakePoint([self frame].size.width - MARGIN_X - kPSMTabBarIndicatorWidth, MARGIN_Y);
+ [pi drawAtPoint:indicatorPoint fromRect:NSZeroRect operation:NSCompositingOperationSourceOver fraction:1.0];
+ [returnImage unlockFocus];
+ }
+ return returnImage;
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ [super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeRect:_frame forKey:@"frame"];
+ [aCoder encodeSize:_stringSize forKey:@"stringSize"];
+ [aCoder encodeInteger:_currentStep forKey:@"currentStep"];
+ [aCoder encodeBool:_isPlaceholder forKey:@"isPlaceholder"];
+ [aCoder encodeInteger:_tabState forKey:@"tabState"];
+ [aCoder encodeInteger:_closeButtonTrackingTag forKey:@"closeButtonTrackingTag"];
+ [aCoder encodeInteger:_cellTrackingTag forKey:@"cellTrackingTag"];
+ [aCoder encodeBool:_closeButtonOver forKey:@"closeButtonOver"];
+ [aCoder encodeBool:_closeButtonPressed forKey:@"closeButtonPressed"];
+ [aCoder encodeObject:_indicator forKey:@"indicator"];
+ [aCoder encodeBool:_isInOverflowMenu forKey:@"isInOverflowMenu"];
+ [aCoder encodeBool:_hasCloseButton forKey:@"hasCloseButton"];
+ [aCoder encodeBool:_isCloseButtonSuppressed forKey:@"isCloseButtonSuppressed"];
+ [aCoder encodeBool:_hasIcon forKey:@"hasIcon"];
+ [aCoder encodeBool:_hasLargeImage forKey:@"hasLargeImage"];
+ [aCoder encodeInteger:_count forKey:@"count"];
+ [aCoder encodeBool:_isEdited forKey:@"isEdited"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ self = [super initWithCoder:aDecoder];
+ if (self) {
+ if ([aDecoder allowsKeyedCoding]) {
+ _frame = [aDecoder decodeRectForKey:@"frame"];
+ _stringSize = [aDecoder decodeSizeForKey:@"stringSize"];
+ _currentStep = [aDecoder decodeIntegerForKey:@"currentStep"];
+ _isPlaceholder = [aDecoder decodeBoolForKey:@"isPlaceholder"];
+ _tabState = [aDecoder decodeIntegerForKey:@"tabState"];
+ _closeButtonTrackingTag = [aDecoder decodeIntegerForKey:@"closeButtonTrackingTag"];
+ _cellTrackingTag = [aDecoder decodeIntegerForKey:@"cellTrackingTag"];
+ _closeButtonOver = [aDecoder decodeBoolForKey:@"closeButtonOver"];
+ _closeButtonPressed = [aDecoder decodeBoolForKey:@"closeButtonPressed"];
+ _indicator = [aDecoder decodeObjectForKey:@"indicator"];
+ _isInOverflowMenu = [aDecoder decodeBoolForKey:@"isInOverflowMenu"];
+ _hasCloseButton = [aDecoder decodeBoolForKey:@"hasCloseButton"];
+ _isCloseButtonSuppressed = [aDecoder decodeBoolForKey:@"isCloseButtonSuppressed"];
+ _hasIcon = [aDecoder decodeBoolForKey:@"hasIcon"];
+ _hasLargeImage = [aDecoder decodeBoolForKey:@"hasLargeImage"];
+ _count = [aDecoder decodeIntegerForKey:@"count"];
+ _isEdited = [aDecoder decodeBoolForKey:@"isEdited"];
+ }
+ }
+ return self;
+}
+
+#pragma mark -
+#pragma mark Accessibility
+
+- (BOOL)accessibilityIsIgnored
+{
+ return NO;
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute
+{
+ id attributeValue = nil;
+
+ if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
+ attributeValue = NSAccessibilityButtonRole;
+ } else if ([attribute isEqualToString:NSAccessibilityHelpAttribute]) {
+ if ([[[self controlView] delegate] respondsToSelector:@selector(accessibilityStringForTabView:objectCount:)]) {
+ attributeValue = [NSString stringWithFormat:@"%@, %lu %@", [self stringValue],
+ (unsigned long)[self count],
+ [[[self controlView] delegate] accessibilityStringForTabView:[[self controlView] tabView]
+ objectCount:[self count]]];
+ } else {
+ attributeValue = [self stringValue];
+ }
+ } else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
+ attributeValue = [NSNumber numberWithBool:([self tabState] == 2)];
+ } else {
+ attributeValue = [super accessibilityAttributeValue:attribute];
+ }
+
+ return attributeValue;
+}
+
+- (NSArray *)accessibilityActionNames
+{
+ static NSArray *actions;
+
+ if (!actions) {
+ actions = [[NSArray alloc] initWithObjects:NSAccessibilityPressAction, nil];
+ }
+ return actions;
+}
+
+- (NSString *)accessibilityActionDescription:(NSString *)action
+{
+ return NSAccessibilityActionDescription(action);
+}
+
+- (void)accessibilityPerformAction:(NSString *)action
+{
+ if ([action isEqualToString:NSAccessibilityPressAction]) {
+ // this tab was selected
+ [_controlView performSelector:@selector(tabClick:) withObject:self];
+ }
+}
+
+- (id)accessibilityHitTest:(NSPoint)point
+{
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (id)accessibilityFocusedUIElement:(NSPoint)point
+{
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarControl+Private.h b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl+Private.h
new file mode 100644
index 000000000..8df3fd368
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl+Private.h
@@ -0,0 +1,49 @@
+#import "PSMTabBarControl.h"
+
+@interface PSMTabBarControl (Private)
+
+// constructor/destructor
+- (void)initAddedProperties;
+
+// accessors
+- (NSEvent *)lastMouseDownEvent;
+- (void)setLastMouseDownEvent:(NSEvent *)event;
+
+// contents
+- (void)addTabViewItem:(NSTabViewItem *)item;
+- (void)removeTabForCell:(PSMTabBarCell *)cell;
+
+// draw
+- (void)update;
+- (void)update:(BOOL)animate;
+- (void)_setupTrackingRectsForCell:(PSMTabBarCell *)cell;
+- (void)_positionOverflowMenu;
+- (void)_checkWindowFrame;
+
+// actions
+- (void)overflowMenuAction:(id)sender;
+- (void)closeTabClick:(id)sender;
+- (void)tabClick:(id)sender;
+- (void)tabNothing:(id)sender;
+
+// notification handlers
+- (void)frameDidChange:(NSNotification *)notification;
+- (void)windowDidMove:(NSNotification *)aNotification;
+- (void)windowDidUpdate:(NSNotification *)notification;
+
+// NSTabView delegate
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)tabView;
+
+// archiving
+- (void)encodeWithCoder:(NSCoder *)aCoder;
+- (id)initWithCoder:(NSCoder *)aDecoder;
+
+// convenience
+- (void)_bindPropertiesForCell:(PSMTabBarCell *)cell andTabViewItem:(NSTabViewItem *)item;
+- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame;
+
+- (void)_animateCells:(NSTimer *)timer;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.h b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.h
new file mode 100644
index 000000000..26f11de7a
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.h
@@ -0,0 +1,239 @@
+//
+// PSMTabBarControl.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 10/13/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+/*
+ This view provides a control interface to manage a regular NSTabView. It looks and works like the tabbed browsing interface of many popular browsers.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#define PSMTabDragDidEndNotification @"PSMTabDragDidEndNotification"
+#define PSMTabDragDidBeginNotification @"PSMTabDragDidBeginNotification"
+
+#define kPSMTabBarControlHeight 22
+// internal cell border
+#define MARGIN_X 6
+#define MARGIN_Y 3
+// padding between objects
+#define kPSMTabBarCellPadding 4
+// fixed size objects
+#define kPSMMinimumTitleWidth 30
+#define kPSMTabBarIndicatorWidth 16.0
+#define kPSMTabBarIconWidth 16.0
+#define kPSMHideAnimationSteps 3.0
+
+// Value used in _currentStep to indicate that resizing operation is not in progress
+#define kPSMIsNotBeingResized -1
+
+// Value used in _currentStep when a resizing operation has just been started
+#define kPSMStartResizeAnimation 0
+
+@class PSMOverflowPopUpButton;
+@class PSMRolloverButton;
+@class PSMTabBarCell;
+@class PSMTabBarController;
+@protocol PSMTabStyle;
+
+typedef enum {
+ PSMTabBarHorizontalOrientation,
+ PSMTabBarVerticalOrientation
+} PSMTabBarOrientation;
+
+typedef enum {
+ PSMTabBarTearOffAlphaWindow,
+ PSMTabBarTearOffMiniwindow
+} PSMTabBarTearOffStyle;
+
+enum {
+ PSMTab_SelectedMask = 1 << 1,
+ PSMTab_LeftIsSelectedMask = 1 << 2,
+ PSMTab_RightIsSelectedMask = 1 << 3,
+ PSMTab_PositionLeftMask = 1 << 4,
+ PSMTab_PositionMiddleMask = 1 << 5,
+ PSMTab_PositionRightMask = 1 << 6,
+ PSMTab_PositionSingleMask = 1 << 7,
+};
+
+@interface PSMTabBarControl : NSControl {
+
+ // control basics
+ NSMutableArray *_cells; // the cells that draw the tabs
+ IBOutlet NSTabView *tabView; // the tab view being navigated
+ PSMOverflowPopUpButton *_overflowPopUpButton; // for too many tabs
+ PSMRolloverButton *_addTabButton;
+ PSMTabBarController *_controller;
+
+ // Spring-loading.
+ NSTimer *_springTimer;
+ NSTabViewItem *_tabViewItemWithSpring;
+
+ // drawing style
+ id<PSMTabStyle> style;
+ BOOL _canCloseOnlyTab;
+ BOOL _disableTabClose;
+ BOOL _hideForSingleTab;
+ BOOL _showAddTabButton;
+ BOOL _sizeCellsToFit;
+ BOOL _useOverflowMenu;
+ BOOL _alwaysShowActiveTab;
+ BOOL _allowsScrubbing;
+ NSInteger _resizeAreaCompensation;
+ PSMTabBarOrientation _orientation;
+ BOOL _automaticallyAnimates;
+ NSTimer *_animationTimer;
+ PSMTabBarTearOffStyle _tearOffStyle;
+
+ // behavior
+ BOOL _allowsBackgroundTabClosing;
+ BOOL _selectsTabsOnMouseDown;
+
+ // vertical tab resizing
+ BOOL _allowsResizing;
+ BOOL _resizing;
+
+ // cell width
+ NSInteger _cellMinWidth;
+ NSInteger _cellMaxWidth;
+ NSInteger _cellOptimumWidth;
+
+ // animation for hide/show
+ NSInteger _currentStep;
+ BOOL _isHidden;
+ IBOutlet id partnerView; // gets resized when hide/show
+ BOOL _awakenedFromNib;
+ NSInteger _tabBarWidth;
+ NSTimer *_showHideAnimationTimer;
+
+ // drag and drop
+ NSEvent *_lastMouseDownEvent; // keep this for dragging reference
+ BOOL _didDrag;
+ BOOL _closeClicked;
+
+ // MVC help
+ IBOutlet id delegate;
+}
+
+// control characteristics
++ (NSBundle *)bundle;
+- (CGFloat)availableCellWidth;
+- (NSRect)genericCellRect;
+
+// control configuration
+- (PSMTabBarOrientation)orientation;
+- (void)setOrientation:(PSMTabBarOrientation)value;
+- (BOOL)canCloseOnlyTab;
+- (void)setCanCloseOnlyTab:(BOOL)value;
+- (BOOL)disableTabClose;
+- (void)setDisableTabClose:(BOOL)value;
+- (id<PSMTabStyle>)style;
+- (void)setStyle:(id<PSMTabStyle>)newStyle;
+- (NSString *)styleName;
+- (void)setStyleNamed:(NSString *)name;
+- (BOOL)hideForSingleTab;
+- (void)setHideForSingleTab:(BOOL)value;
+- (BOOL)showAddTabButton;
+- (void)setShowAddTabButton:(BOOL)value;
+- (NSInteger)cellMinWidth;
+- (void)setCellMinWidth:(NSInteger)value;
+- (NSInteger)cellMaxWidth;
+- (void)setCellMaxWidth:(NSInteger)value;
+- (NSInteger)cellOptimumWidth;
+- (void)setCellOptimumWidth:(NSInteger)value;
+- (BOOL)sizeCellsToFit;
+- (void)setSizeCellsToFit:(BOOL)value;
+- (BOOL)useOverflowMenu;
+- (void)setUseOverflowMenu:(BOOL)value;
+- (BOOL)allowsBackgroundTabClosing;
+- (void)setAllowsBackgroundTabClosing:(BOOL)value;
+- (BOOL)allowsResizing;
+- (void)setAllowsResizing:(BOOL)value;
+- (BOOL)selectsTabsOnMouseDown;
+- (void)setSelectsTabsOnMouseDown:(BOOL)value;
+- (BOOL)automaticallyAnimates;
+- (void)setAutomaticallyAnimates:(BOOL)value;
+- (BOOL)alwaysShowActiveTab;
+- (void)setAlwaysShowActiveTab:(BOOL)value;
+- (BOOL)allowsScrubbing;
+- (void)setAllowsScrubbing:(BOOL)value;
+- (PSMTabBarTearOffStyle)tearOffStyle;
+- (void)setTearOffStyle:(PSMTabBarTearOffStyle)tearOffStyle;
+
+// Factory for default style
++ (Class)defaultStyleClass;
+
+// accessors
+- (NSTabView *)tabView;
+- (void)setTabView:(NSTabView *)view;
+- (id)delegate;
+- (void)setDelegate:(id)object;
+- (id)partnerView;
+- (void)setPartnerView:(id)view;
+
+// the buttons
+- (PSMRolloverButton *)addTabButton;
+- (PSMOverflowPopUpButton *)overflowPopUpButton;
+
+// tab information
+- (NSMutableArray *)representedTabViewItems;
+- (NSInteger)numberOfVisibleTabs;
+- (PSMTabBarCell *)lastVisibleTab;
+
+// special effects
+- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate;
+- (BOOL)isTabBarHidden;
+- (BOOL)isAnimating;
+
+// internal bindings methods also used by the tab drag assistant
+- (void)bindPropertiesForCell:(PSMTabBarCell *)cell andTabViewItem:(NSTabViewItem *)item;
+- (void)removeTabForCell:(PSMTabBarCell *)cell;
+
+@end
+
+@interface NSObject (TabBarControlDelegateMethods)
+
+//Standard NSTabView methods
+- (BOOL)tabView:(NSTabView *)aTabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//"Spring-loaded" tabs methods
+- (NSArray *)allowedDraggedTypesForTabView:(NSTabView *)aTabView;
+- (void)tabView:(NSTabView *)aTabView acceptedDraggingInfo:(id<NSDraggingInfo>)draggingInfo onTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//Contextual menu method
+- (NSMenu *)tabView:(NSTabView *)aTabView menuForTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//Drag and drop methods
+- (BOOL)tabView:(NSTabView *)aTabView shouldDragTabViewItem:(NSTabViewItem *)tabViewItem fromTabBar:(PSMTabBarControl *)tabBarControl;
+- (BOOL)tabView:(NSTabView *)aTabView shouldDropTabViewItem:(NSTabViewItem *)tabViewItem inTabBar:(PSMTabBarControl *)tabBarControl;
+- (BOOL)tabView:(NSTabView *)aTabView shouldAllowTabViewItem:(NSTabViewItem *)tabViewItem toLeaveTabBar:(PSMTabBarControl *)tabBarControl;
+- (void)tabView:(NSTabView *)aTabView didDropTabViewItem:(NSTabViewItem *)tabViewItem inTabBar:(PSMTabBarControl *)tabBarControl;
+
+//Tear-off tabs methods
+- (NSImage *)tabView:(NSTabView *)aTabView imageForTabViewItem:(NSTabViewItem *)tabViewItem offset:(NSSize *)offset styleMask:(NSUInteger *)styleMask;
+- (PSMTabBarControl *)tabView:(NSTabView *)aTabView newTabBarForDraggedTabViewItem:(NSTabViewItem *)tabViewItem atPoint:(NSPoint)point;
+- (void)tabView:(NSTabView *)aTabView closeWindowForLastTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//Overflow menu validation
+- (BOOL)tabView:(NSTabView *)aTabView validateOverflowMenuItem:(NSMenuItem *)menuItem forTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabView:(NSTabView *)aTabView tabViewItem:(NSTabViewItem *)tabViewItem isInOverflowMenu:(BOOL)inOverflowMenu;
+
+//tab bar hiding methods
+- (void)tabView:(NSTabView *)aTabView tabBarDidHide:(PSMTabBarControl *)tabBarControl;
+- (void)tabView:(NSTabView *)aTabView tabBarDidUnhide:(PSMTabBarControl *)tabBarControl;
+- (CGFloat)desiredWidthForVerticalTabBar:(PSMTabBarControl *)tabBarControl;
+
+//closing
+- (BOOL)tabView:(NSTabView *)aTabView disableTabCloseForTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//tooltips
+- (NSString *)tabView:(NSTabView *)aTabView toolTipForTabViewItem:(NSTabViewItem *)tabViewItem;
+
+//accessibility
+- (NSString *)accessibilityStringForTabView:(NSTabView *)aTabView objectCount:(NSInteger)objectCount;
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.m b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.m
new file mode 100644
index 000000000..0d6a2d7bc
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarControl.m
@@ -0,0 +1,2035 @@
+//
+// PSMTabBarControl.m
+// PSMTabBarControl
+//
+// Created by John Pannell on 10/13/05.
+// Copyright 2005 Positive Spin Media. All rights reserved.
+//
+
+#import <objc/runtime.h>
+
+#import "PSMTabBarControl.h"
+#import "PSMTabBarCell.h"
+#import "PSMOverflowPopUpButton.h"
+#import "PSMRolloverButton.h"
+#import "PSMTabStyle.h"
+#import "PSMUnifiedTabStyle.h"
+#import "PSMTabDragAssistant.h"
+#import "PSMTabBarController.h"
+
+#import "PSMTabBarControl+Private.h"
+
+@protocol PSMTabBarItem
+@optional
+- (BOOL)isProcessing;
+
+@optional
+- (int)objectCount;
+
+@end
+
+@implementation PSMTabBarControl
+
+#pragma mark -
+#pragma mark Characteristics
+
++ (NSBundle *)bundle
+{
+ static NSBundle *bundle = nil;
+ if (!bundle) {
+ bundle = [NSBundle bundleForClass:[PSMTabBarControl class]];
+ }
+ return bundle;
+}
+
+/*!
+ @method availableCellWidth
+ @abstract The number of pixels available for cells
+ @discussion Calculates the number of pixels available for cells based on margins and the window resize badge.
+ @returns Returns the amount of space for cells.
+ */
+
+- (CGFloat)availableCellWidth
+{
+ return [self frame].size.width - [style leftMarginForTabBarControl] - [style rightMarginForTabBarControl] - _resizeAreaCompensation;
+}
+
+/*!
+ @method genericCellRect
+ @abstract The basic rect for a tab cell.
+ @discussion Creates a generic frame for a tab cell based on the current control state.
+ @returns Returns a basic rect for a tab cell.
+ */
+
+- (NSRect)genericCellRect
+{
+ NSRect aRect = [self frame];
+ aRect.origin.x = [style leftMarginForTabBarControl];
+ aRect.origin.y = 0.0;
+ aRect.size.width = [self availableCellWidth];
+ aRect.size.height = [style tabCellHeight];
+ return aRect;
+}
+
+#pragma mark -
+#pragma mark Constructor/destructor
+
+- (void)initAddedProperties
+{
+ _cells = [[NSMutableArray alloc] initWithCapacity:10];
+ _controller = [[PSMTabBarController alloc] initWithTabBarControl:self];
+ _animationTimer = nil;
+
+ // default config
+ _currentStep = kPSMIsNotBeingResized;
+ _orientation = PSMTabBarHorizontalOrientation;
+ _canCloseOnlyTab = NO;
+ _disableTabClose = NO;
+ _showAddTabButton = NO;
+ _hideForSingleTab = NO;
+ _sizeCellsToFit = NO;
+ _isHidden = NO;
+ _awakenedFromNib = NO;
+ _automaticallyAnimates = NO;
+ _useOverflowMenu = YES;
+ _allowsBackgroundTabClosing = YES;
+ _allowsResizing = NO;
+ _selectsTabsOnMouseDown = NO;
+ _alwaysShowActiveTab = NO;
+ _allowsScrubbing = NO;
+ _cellMinWidth = 100;
+ _cellMaxWidth = 280;
+ _cellOptimumWidth = 130;
+ _tearOffStyle = PSMTabBarTearOffAlphaWindow;
+ style = [[[[self class] defaultStyleClass] alloc] init];
+
+ // the overflow button/menu
+ NSRect overflowButtonRect = NSMakeRect([self frame].size.width - [style rightMarginForTabBarControl] + 1, 0, [style rightMarginForTabBarControl] - 1, [self frame].size.height);
+ _overflowPopUpButton = [[PSMOverflowPopUpButton alloc] initWithFrame:overflowButtonRect pullsDown:YES];
+ [_overflowPopUpButton setAutoresizingMask:NSViewNotSizable | NSViewMinXMargin];
+ [_overflowPopUpButton setHidden:YES];
+ [self addSubview:_overflowPopUpButton];
+ [self _positionOverflowMenu];
+
+ // new tab button
+ NSRect addTabButtonRect = NSMakeRect([self frame].size.width - [style rightMarginForTabBarControl] + 1, 3.0, 16.0, 16.0);
+ _addTabButton = [[PSMRolloverButton alloc] initWithFrame:addTabButtonRect];
+ if (_addTabButton) {
+ NSImage *newButtonImage = [style addTabButtonImage];
+ if (newButtonImage) {
+ [_addTabButton setUsualImage:newButtonImage];
+ }
+ newButtonImage = [style addTabButtonPressedImage];
+ if (newButtonImage) {
+ [_addTabButton setAlternateImage:newButtonImage];
+ }
+ newButtonImage = [style addTabButtonRolloverImage];
+ if (newButtonImage) {
+ [_addTabButton setRolloverImage:newButtonImage];
+ }
+ [_addTabButton setTitle:@""];
+ [_addTabButton setImagePosition:NSImageOnly];
+ [_addTabButton setButtonType:NSMomentaryChangeButton];
+ [_addTabButton setBordered:NO];
+ [_addTabButton setBezelStyle:NSShadowlessSquareBezelStyle];
+ [self addSubview:_addTabButton];
+
+ if (_showAddTabButton) {
+ [_addTabButton setHidden:NO];
+ } else {
+ [_addTabButton setHidden:YES];
+ }
+ [_addTabButton setNeedsDisplay:YES];
+ }
+}
+
++ (Class)defaultStyleClass
+{
+ return [PSMUnifiedTabStyle class];
+}
+
+- (id)initWithFrame:(NSRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self) {
+ // Initialization
+ [self initAddedProperties];
+ [self registerForDraggedTypes:[NSArray arrayWithObjects:@"PSMTabBarControlItemPBType", nil]];
+
+ // resize
+ [self setPostsFrameChangedNotifications:YES];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(frameDidChange:) name:NSViewFrameDidChangeNotification object:self];
+ }
+ [self setTarget:self];
+ return self;
+}
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ //stop any animations that may be running
+ [_animationTimer invalidate];
+
+ [_showHideAnimationTimer invalidate];
+
+ //Also unwind the spring, if it's wound.
+ [_springTimer invalidate];
+
+ //unbind all the items to prevent crashing
+ //not sure if this is necessary or not
+ // http://code.google.com/p/maccode/issues/detail?id=35
+ NSEnumerator *enumerator = [[_cells copy] objectEnumerator];
+ PSMTabBarCell *nextCell;
+ while ((nextCell = [enumerator nextObject])) {
+ [self removeTabForCell:nextCell];
+ }
+
+ [self unregisterDraggedTypes];
+}
+
+- (void)awakeFromNib
+{
+ // build cells from existing tab view items
+ NSArray *existingItems = [tabView tabViewItems];
+ NSEnumerator *e = [existingItems objectEnumerator];
+ NSTabViewItem *item;
+ while ((item = [e nextObject])) {
+ if (![[self representedTabViewItems] containsObject:item]) {
+ [self addTabViewItem:item];
+ }
+ }
+}
+
+- (void)viewWillMoveToWindow:(NSWindow *)aWindow
+{
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+
+ [center removeObserver:self name:NSWindowDidBecomeKeyNotification object:nil];
+ [center removeObserver:self name:NSWindowDidResignKeyNotification object:nil];
+ [center removeObserver:self name:NSWindowDidUpdateNotification object:nil];
+ [center removeObserver:self name:NSWindowDidMoveNotification object:nil];
+
+ if (_showHideAnimationTimer) {
+ [_showHideAnimationTimer invalidate];
+ _showHideAnimationTimer = nil;
+ }
+
+ if (aWindow) {
+ [center addObserver:self selector:@selector(windowStatusDidChange:) name:NSWindowDidBecomeKeyNotification object:aWindow];
+ [center addObserver:self selector:@selector(windowStatusDidChange:) name:NSWindowDidResignKeyNotification object:aWindow];
+ [center addObserver:self selector:@selector(windowDidUpdate:) name:NSWindowDidUpdateNotification object:aWindow];
+ [center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:aWindow];
+ }
+}
+
+- (void)windowStatusDidChange:(NSNotification *)notification
+{
+ [self setNeedsDisplay:YES];
+}
+
+#pragma mark -
+#pragma mark Accessors
+
+- (NSMutableArray *)cells
+{
+ return _cells;
+}
+
+- (NSEvent *)lastMouseDownEvent
+{
+ return _lastMouseDownEvent;
+}
+
+- (void)setLastMouseDownEvent:(NSEvent *)event
+{
+ _lastMouseDownEvent = event;
+}
+
+- (id)delegate
+{
+ return delegate;
+}
+
+- (void)setDelegate:(id)object
+{
+ delegate = object;
+
+ NSMutableArray *types = [NSMutableArray arrayWithObject:@"PSMTabBarControlItemPBType"];
+
+ //Update the allowed drag types
+ if ([self delegate] && [[self delegate] respondsToSelector:@selector(allowedDraggedTypesForTabView:)]) {
+ [types addObjectsFromArray:[[self delegate] allowedDraggedTypesForTabView:tabView]];
+ }
+ [self unregisterDraggedTypes];
+ [self registerForDraggedTypes:types];
+}
+
+- (NSTabView *)tabView
+{
+ return tabView;
+}
+
+- (void)setTabView:(NSTabView *)view
+{
+ tabView = view;
+}
+
+- (id<PSMTabStyle>)style
+{
+ return style;
+}
+
+- (NSString *)styleName
+{
+ return [style name];
+}
+
+- (void)setStyle:(id<PSMTabStyle>)newStyle
+{
+ if (style != newStyle) {
+
+ // restyle add tab button
+ if (_addTabButton) {
+ NSImage *newButtonImage = [style addTabButtonImage];
+ if (newButtonImage) {
+ [_addTabButton setUsualImage:newButtonImage];
+ }
+
+ newButtonImage = [style addTabButtonPressedImage];
+ if (newButtonImage) {
+ [_addTabButton setAlternateImage:newButtonImage];
+ }
+
+ newButtonImage = [style addTabButtonRolloverImage];
+ if (newButtonImage) {
+ [_addTabButton setRolloverImage:newButtonImage];
+ }
+ }
+
+ [self update];
+ }
+}
+
+- (void)setStyleNamed:(NSString *)name
+{
+
+ Class styleClass = NSClassFromString([NSString stringWithFormat:@"PSM%@TabStyle", [name capitalizedString]]);
+ if (styleClass == Nil) {
+ styleClass = object_getClass([PSMTabBarControl defaultStyleClass]);
+ }
+
+ id<PSMTabStyle> newStyle = [[styleClass alloc] init];
+ [self setStyle:newStyle];
+}
+
+- (PSMTabBarOrientation)orientation
+{
+ return _orientation;
+}
+
+- (void)setOrientation:(PSMTabBarOrientation)value
+{
+ PSMTabBarOrientation lastOrientation = _orientation;
+ _orientation = value;
+
+ if (_tabBarWidth < 10) {
+ _tabBarWidth = 120;
+ }
+
+ if (lastOrientation != _orientation) {
+ [[self style] setOrientation:_orientation];
+
+ [self _positionOverflowMenu]; //move the overflow popup button to the right place
+ [self update:NO];
+ }
+}
+
+- (BOOL)canCloseOnlyTab
+{
+ return _canCloseOnlyTab;
+}
+
+- (void)setCanCloseOnlyTab:(BOOL)value
+{
+ _canCloseOnlyTab = value;
+ if ([_cells count] == 1) {
+ [self update];
+ }
+}
+
+- (BOOL)disableTabClose
+{
+ return _disableTabClose;
+}
+
+- (void)setDisableTabClose:(BOOL)value
+{
+ _disableTabClose = value;
+ [self update];
+}
+
+- (BOOL)hideForSingleTab
+{
+ return _hideForSingleTab;
+}
+
+- (void)setHideForSingleTab:(BOOL)value
+{
+ _hideForSingleTab = value;
+ [self update];
+}
+
+- (BOOL)showAddTabButton
+{
+ return _showAddTabButton;
+}
+
+- (void)setShowAddTabButton:(BOOL)value
+{
+ _showAddTabButton = value;
+ if (!NSIsEmptyRect([_controller addButtonRect])) {
+ [_addTabButton setFrame:[_controller addButtonRect]];
+ }
+
+ [_addTabButton setHidden:!_showAddTabButton];
+ [_addTabButton setNeedsDisplay:YES];
+
+ [self update];
+}
+
+- (NSInteger)cellMinWidth
+{
+ return _cellMinWidth;
+}
+
+- (void)setCellMinWidth:(NSInteger)value
+{
+ _cellMinWidth = value;
+ [self update];
+}
+
+- (NSInteger)cellMaxWidth
+{
+ return _cellMaxWidth;
+}
+
+- (void)setCellMaxWidth:(NSInteger)value
+{
+ _cellMaxWidth = value;
+ [self update];
+}
+
+- (NSInteger)cellOptimumWidth
+{
+ return _cellOptimumWidth;
+}
+
+- (void)setCellOptimumWidth:(NSInteger)value
+{
+ _cellOptimumWidth = value;
+ [self update];
+}
+
+- (BOOL)sizeCellsToFit
+{
+ return _sizeCellsToFit;
+}
+
+- (void)setSizeCellsToFit:(BOOL)value
+{
+ _sizeCellsToFit = value;
+ [self update];
+}
+
+- (BOOL)useOverflowMenu
+{
+ return _useOverflowMenu;
+}
+
+- (void)setUseOverflowMenu:(BOOL)value
+{
+ _useOverflowMenu = value;
+ [self update];
+}
+
+- (PSMRolloverButton *)addTabButton
+{
+ return _addTabButton;
+}
+
+- (PSMOverflowPopUpButton *)overflowPopUpButton
+{
+ return _overflowPopUpButton;
+}
+
+- (BOOL)allowsBackgroundTabClosing
+{
+ return _allowsBackgroundTabClosing;
+}
+
+- (void)setAllowsBackgroundTabClosing:(BOOL)value
+{
+ _allowsBackgroundTabClosing = value;
+}
+
+- (BOOL)allowsResizing
+{
+ return _allowsResizing;
+}
+
+- (void)setAllowsResizing:(BOOL)value
+{
+ _allowsResizing = value;
+}
+
+- (BOOL)selectsTabsOnMouseDown
+{
+ return _selectsTabsOnMouseDown;
+}
+
+- (void)setSelectsTabsOnMouseDown:(BOOL)value
+{
+ _selectsTabsOnMouseDown = value;
+}
+
+- (BOOL)automaticallyAnimates
+{
+ return _automaticallyAnimates;
+}
+
+- (void)setAutomaticallyAnimates:(BOOL)value
+{
+ _automaticallyAnimates = value;
+}
+
+- (BOOL)alwaysShowActiveTab
+{
+ return _alwaysShowActiveTab;
+}
+
+- (void)setAlwaysShowActiveTab:(BOOL)value
+{
+ _alwaysShowActiveTab = value;
+}
+
+- (BOOL)allowsScrubbing
+{
+ return _allowsScrubbing;
+}
+
+- (void)setAllowsScrubbing:(BOOL)value
+{
+ _allowsScrubbing = value;
+}
+
+- (PSMTabBarTearOffStyle)tearOffStyle
+{
+ return _tearOffStyle;
+}
+
+- (void)setTearOffStyle:(PSMTabBarTearOffStyle)tearOffStyle
+{
+ _tearOffStyle = tearOffStyle;
+}
+
+#pragma mark -
+#pragma mark Functionality
+
+- (void)addTabViewItem:(NSTabViewItem *)item
+{
+ // create cell
+ PSMTabBarCell *cell = [[PSMTabBarCell alloc] initWithControlView:self];
+ NSRect cellRect, lastCellFrame;
+ if ([_cells lastObject] != nil) {
+ cellRect = lastCellFrame = [[_cells lastObject] frame];
+ } else {
+ cellRect = lastCellFrame = NSZeroRect;
+ }
+
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ cellRect = [self genericCellRect];
+ cellRect.size.width = 30;
+ cellRect.origin.x = lastCellFrame.origin.x + lastCellFrame.size.width;
+ } else {
+ cellRect = /*lastCellFrame*/ [self genericCellRect];
+ cellRect.size.width = lastCellFrame.size.width;
+ cellRect.size.height = 0;
+ cellRect.origin.y = lastCellFrame.origin.y + lastCellFrame.size.height;
+ }
+
+ [cell setRepresentedObject:item];
+ [cell setFrame:cellRect];
+
+ // bind it up
+ [self bindPropertiesForCell:cell andTabViewItem:item];
+
+ // add to collection
+ [_cells addObject:cell];
+ if ([_cells count] == (NSUInteger)[tabView numberOfTabViewItems]) {
+ [self update]; // don't update unless all are accounted for!
+ }
+}
+
+- (void)removeTabForCell:(PSMTabBarCell *)cell
+{
+ NSTabViewItem *item = [cell representedObject];
+
+ // unbind
+ [[cell indicator] unbind:@"animate"];
+ [[cell indicator] unbind:@"hidden"];
+ [cell unbind:@"hasIcon"];
+ [cell unbind:@"hasLargeImage"];
+ [cell unbind:@"title"];
+ [cell unbind:@"count"];
+ [cell unbind:@"countColor"];
+ [cell unbind:@"isEdited"];
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(isProcessing)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"isProcessing"];
+ }
+ }
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(icon)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"icon"];
+ }
+ }
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(objectCount)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"objectCount"];
+ }
+ }
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(countColor)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"countColor"];
+ }
+ }
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(largeImage)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"largeImage"];
+ }
+ }
+
+ if ([item identifier] != nil) {
+ if ([[item identifier] respondsToSelector:@selector(isEdited)]) {
+ [[item identifier] removeObserver:cell forKeyPath:@"isEdited"];
+ }
+ }
+
+ // stop watching identifier
+ [item removeObserver:self forKeyPath:@"identifier"];
+
+ // remove indicator
+ if ([[self subviews] containsObject:[cell indicator]]) {
+ [[cell indicator] removeFromSuperview];
+ }
+ // remove tracking
+ [[NSNotificationCenter defaultCenter] removeObserver:cell];
+
+ if ([cell closeButtonTrackingTag] != 0) {
+ [self removeTrackingRect:[cell closeButtonTrackingTag]];
+ [cell setCloseButtonTrackingTag:0];
+ }
+ if ([cell cellTrackingTag] != 0) {
+ [self removeTrackingRect:[cell cellTrackingTag]];
+ [cell setCellTrackingTag:0];
+ }
+
+ // pull from collection
+ [_cells removeObject:cell];
+
+ [self update];
+}
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+ // did the tab's identifier change?
+ if ([keyPath isEqualToString:@"identifier"]) {
+ NSEnumerator *e = [_cells objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ if ([cell representedObject] == object) {
+ [self _bindPropertiesForCell:cell andTabViewItem:object];
+ }
+ }
+ }
+}
+
+#pragma mark -
+#pragma mark Hide/Show
+
+- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate
+{
+ if (!_awakenedFromNib || (_isHidden && hide) || (!_isHidden && !hide) || (_currentStep != kPSMIsNotBeingResized)) {
+ return;
+ }
+
+ [[self subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
+
+ _isHidden = hide;
+ _currentStep = 0;
+ if (!animate) {
+ _currentStep = (NSInteger)kPSMHideAnimationSteps;
+ }
+
+ if (hide) {
+ [_overflowPopUpButton removeFromSuperview];
+ [_addTabButton removeFromSuperview];
+ } else if (!animate) {
+ [self addSubview:_overflowPopUpButton];
+ [self addSubview:_addTabButton];
+ }
+
+ CGFloat partnerOriginalSize, partnerOriginalOrigin, myOriginalSize, myOriginalOrigin, partnerTargetSize, partnerTargetOrigin, myTargetSize, myTargetOrigin;
+
+ // target values for partner
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ // current (original) values
+ myOriginalSize = [self frame].size.height;
+ myOriginalOrigin = [self frame].origin.y;
+ if (partnerView) {
+ partnerOriginalSize = [partnerView frame].size.height;
+ partnerOriginalOrigin = [partnerView frame].origin.y;
+ } else {
+ partnerOriginalSize = [[self window] frame].size.height;
+ partnerOriginalOrigin = [[self window] frame].origin.y;
+ }
+
+ if (partnerView) {
+ // above or below me?
+ if ((myOriginalOrigin - 22) > partnerOriginalOrigin) {
+ // partner is below me
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin + 21;
+ myTargetSize = myOriginalSize - 21;
+ partnerTargetOrigin = partnerOriginalOrigin;
+ partnerTargetSize = partnerOriginalSize + 21;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin - 21;
+ myTargetSize = myOriginalSize + 21;
+ partnerTargetOrigin = partnerOriginalOrigin;
+ partnerTargetSize = partnerOriginalSize - 21;
+ }
+ } else {
+ // partner is above me
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = myOriginalSize - 21;
+ partnerTargetOrigin = partnerOriginalOrigin - 21;
+ partnerTargetSize = partnerOriginalSize + 21;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = myOriginalSize + 21;
+ partnerTargetOrigin = partnerOriginalOrigin + 21;
+ partnerTargetSize = partnerOriginalSize - 21;
+ }
+ }
+ } else {
+ // for window movement
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = myOriginalSize - 21;
+ partnerTargetOrigin = partnerOriginalOrigin + 21;
+ partnerTargetSize = partnerOriginalSize - 21;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = myOriginalSize + 21;
+ partnerTargetOrigin = partnerOriginalOrigin - 21;
+ partnerTargetSize = partnerOriginalSize + 21;
+ }
+ }
+ } else { /* vertical */
+ // current (original) values
+ myOriginalSize = [self frame].size.width;
+ myOriginalOrigin = [self frame].origin.x;
+ if (partnerView) {
+ partnerOriginalSize = [partnerView frame].size.width;
+ partnerOriginalOrigin = [partnerView frame].origin.x;
+ } else {
+ partnerOriginalSize = [[self window] frame].size.width;
+ partnerOriginalOrigin = [[self window] frame].origin.x;
+ }
+
+ if (partnerView) {
+ //to the left or right?
+ if (myOriginalOrigin < partnerOriginalOrigin + partnerOriginalSize) {
+ // partner is to the left
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = 1;
+ partnerTargetOrigin = partnerOriginalOrigin - myOriginalSize + 1;
+ partnerTargetSize = partnerOriginalSize + myOriginalSize - 1;
+ _tabBarWidth = myOriginalSize;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = myOriginalSize + _tabBarWidth;
+ partnerTargetOrigin = partnerOriginalOrigin + _tabBarWidth;
+ partnerTargetSize = partnerOriginalSize - _tabBarWidth;
+ }
+ } else {
+ // partner is to the right
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin + myOriginalSize;
+ myTargetSize = 1;
+ partnerTargetOrigin = partnerOriginalOrigin;
+ partnerTargetSize = partnerOriginalSize + myOriginalSize;
+ _tabBarWidth = myOriginalSize;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin - _tabBarWidth;
+ myTargetSize = myOriginalSize + _tabBarWidth;
+ partnerTargetOrigin = partnerOriginalOrigin;
+ partnerTargetSize = partnerOriginalSize - _tabBarWidth;
+ }
+ }
+ } else {
+ // for window movement
+ if (_isHidden) {
+ // I'm shrinking
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = 1;
+ partnerTargetOrigin = partnerOriginalOrigin + myOriginalSize - 1;
+ partnerTargetSize = partnerOriginalSize - myOriginalSize + 1;
+ _tabBarWidth = myOriginalSize;
+ } else {
+ // I'm growing
+ myTargetOrigin = myOriginalOrigin;
+ myTargetSize = _tabBarWidth;
+ partnerTargetOrigin = partnerOriginalOrigin - _tabBarWidth + 1;
+ partnerTargetSize = partnerOriginalSize + _tabBarWidth - 1;
+ }
+ }
+
+ if (!_isHidden && [[self delegate] respondsToSelector:@selector(desiredWidthForVerticalTabBar:)]) {
+ myTargetSize = [[self delegate] desiredWidthForVerticalTabBar:self];
+ }
+ }
+
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithDouble:myOriginalOrigin], @"myOriginalOrigin", [NSNumber numberWithDouble:partnerOriginalOrigin], @"partnerOriginalOrigin", [NSNumber numberWithDouble:myOriginalSize], @"myOriginalSize", [NSNumber numberWithDouble:partnerOriginalSize], @"partnerOriginalSize", [NSNumber numberWithDouble:myTargetOrigin], @"myTargetOrigin", [NSNumber numberWithDouble:partnerTargetOrigin], @"partnerTargetOrigin", [NSNumber numberWithDouble:myTargetSize], @"myTargetSize", [NSNumber numberWithDouble:partnerTargetSize], @"partnerTargetSize", nil];
+ if (_showHideAnimationTimer) {
+ [_showHideAnimationTimer invalidate];
+ }
+ _showHideAnimationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / 30.0) target:self selector:@selector(animateShowHide:) userInfo:userInfo repeats:YES];
+}
+
+- (void)animateShowHide:(NSTimer *)timer
+{
+ // moves the frame of the tab bar and window (or partner view) linearly to hide or show the tab bar
+ NSRect myFrame = [self frame];
+ NSDictionary *userInfo = [timer userInfo];
+ CGFloat myCurrentOrigin = ([[userInfo objectForKey:@"myOriginalOrigin"] doubleValue] + (([[userInfo objectForKey:@"myTargetOrigin"] doubleValue] - [[userInfo objectForKey:@"myOriginalOrigin"] doubleValue]) * (_currentStep / kPSMHideAnimationSteps)));
+ CGFloat myCurrentSize = ([[userInfo objectForKey:@"myOriginalSize"] doubleValue] + (([[userInfo objectForKey:@"myTargetSize"] doubleValue] - [[userInfo objectForKey:@"myOriginalSize"] doubleValue]) * (_currentStep / kPSMHideAnimationSteps)));
+ CGFloat partnerCurrentOrigin = ([[userInfo objectForKey:@"partnerOriginalOrigin"] doubleValue] + (([[userInfo objectForKey:@"partnerTargetOrigin"] doubleValue] - [[userInfo objectForKey:@"partnerOriginalOrigin"] doubleValue]) * (_currentStep / kPSMHideAnimationSteps)));
+ CGFloat partnerCurrentSize = ([[userInfo objectForKey:@"partnerOriginalSize"] doubleValue] + (([[userInfo objectForKey:@"partnerTargetSize"] doubleValue] - [[userInfo objectForKey:@"partnerOriginalSize"] doubleValue]) * (_currentStep / kPSMHideAnimationSteps)));
+
+ NSRect myNewFrame;
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ myNewFrame = NSMakeRect(myFrame.origin.x, myCurrentOrigin, myFrame.size.width, myCurrentSize);
+ } else {
+ myNewFrame = NSMakeRect(myCurrentOrigin, myFrame.origin.y, myCurrentSize, myFrame.size.height);
+ }
+
+ if (partnerView) {
+ // resize self and view
+ NSRect resizeRect;
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ resizeRect = NSMakeRect([partnerView frame].origin.x, partnerCurrentOrigin, [partnerView frame].size.width, partnerCurrentSize);
+ } else {
+ resizeRect = NSMakeRect(partnerCurrentOrigin, [partnerView frame].origin.y, partnerCurrentSize, [partnerView frame].size.height);
+ }
+ [partnerView setFrame:resizeRect];
+ [partnerView setNeedsDisplay:YES];
+ [self setFrame:myNewFrame];
+ } else {
+ // resize self and window
+ NSRect resizeRect;
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ resizeRect = NSMakeRect([[self window] frame].origin.x, partnerCurrentOrigin, [[self window] frame].size.width, partnerCurrentSize);
+ } else {
+ resizeRect = NSMakeRect(partnerCurrentOrigin, [[self window] frame].origin.y, partnerCurrentSize, [[self window] frame].size.height);
+ }
+ [[self window] setFrame:resizeRect display:YES];
+ [self setFrame:myNewFrame];
+ }
+
+ // next
+ _currentStep++;
+ if (_currentStep == kPSMHideAnimationSteps + 1) {
+ _currentStep = kPSMIsNotBeingResized;
+ [self viewDidEndLiveResize];
+ [self update:NO];
+
+ //send the delegate messages
+ if (_isHidden) {
+ if ([[self delegate] respondsToSelector:@selector(tabView:tabBarDidHide:)]) {
+ [[self delegate] tabView:[self tabView] tabBarDidHide:self];
+ }
+ } else {
+ [self addSubview:_overflowPopUpButton];
+ [self addSubview:_addTabButton];
+
+ if ([[self delegate] respondsToSelector:@selector(tabView:tabBarDidUnhide:)]) {
+ [[self delegate] tabView:[self tabView] tabBarDidUnhide:self];
+ }
+ }
+
+ [_showHideAnimationTimer invalidate];
+ _showHideAnimationTimer = nil;
+ }
+ [[self window] display];
+}
+
+- (BOOL)isTabBarHidden
+{
+ return _isHidden;
+}
+
+- (BOOL)isAnimating
+{
+ return _animationTimer != nil;
+}
+
+- (id)partnerView
+{
+ return partnerView;
+}
+
+- (void)setPartnerView:(id)view
+{
+ partnerView = view;
+}
+
+#pragma mark -
+#pragma mark Drawing
+
+- (BOOL)isFlipped
+{
+ return YES;
+}
+
+- (void)drawRect:(NSRect)rect
+{
+ [style drawTabBar:self inRect:rect];
+}
+
+- (void)update
+{
+ [self update:_automaticallyAnimates];
+}
+
+- (void)update:(BOOL)animate
+{
+ // make sure all of our tabs are accounted for before updating
+ if ((NSUInteger)[[self tabView] numberOfTabViewItems] != [_cells count]) {
+ return;
+ }
+
+ // hide/show? (these return if already in desired state)
+ if ((_hideForSingleTab) && ([_cells count] <= 1)) {
+ [self hideTabBar:YES animate:YES];
+ return;
+ } else {
+ [self hideTabBar:NO animate:YES];
+ }
+
+ [self removeAllToolTips];
+ [_controller layoutCells]; //eventually we should only have to call this when we know something has changed
+
+ PSMTabBarCell *currentCell;
+
+ NSMenu *overflowMenu = [_controller overflowMenu];
+ [_overflowPopUpButton setHidden:(overflowMenu == nil)];
+ [_overflowPopUpButton setMenu:overflowMenu];
+
+ [_animationTimer invalidate];
+ _animationTimer = nil;
+
+ if (animate) {
+ NSMutableArray *targetFrames = [NSMutableArray arrayWithCapacity:[_cells count]];
+
+ for (NSUInteger i = 0; i < [_cells count]; i++) {
+ currentCell = [_cells objectAtIndex:i];
+
+ //we're going from NSRect -> NSValue -> NSRect -> NSValue here - oh well
+ [targetFrames addObject:[NSValue valueWithRect:[_controller cellFrameAtIndex:i]]];
+ }
+
+ [_addTabButton setHidden:!_showAddTabButton];
+
+ NSAnimation *animation = [[NSAnimation alloc] initWithDuration:0.50 animationCurve:NSAnimationEaseInOut];
+ [animation setAnimationBlockingMode:NSAnimationNonblocking];
+ [animation startAnimation];
+ _animationTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0
+ target:self
+ selector:@selector(_animateCells:)
+ userInfo:[NSArray arrayWithObjects:targetFrames, animation, nil]
+ repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSEventTrackingRunLoopMode];
+ [self _animateCells:_animationTimer];
+ } else {
+ for (NSUInteger i = 0; i < [_cells count]; i++) {
+ currentCell = [_cells objectAtIndex:i];
+ [currentCell setFrame:[_controller cellFrameAtIndex:i]];
+
+ if (![currentCell isInOverflowMenu]) {
+ [self _setupTrackingRectsForCell:currentCell];
+ }
+ }
+
+ [_addTabButton setFrame:[_controller addButtonRect]];
+ [_addTabButton setHidden:!_showAddTabButton];
+ [self setNeedsDisplay:YES];
+ }
+}
+
+- (void)_animateCells:(NSTimer *)timer
+{
+ NSAnimation *animation = [[timer userInfo] objectAtIndex:1];
+ NSArray *targetFrames = [[timer userInfo] objectAtIndex:0];
+ PSMTabBarCell *currentCell;
+ NSUInteger cellCount = [_cells count];
+
+ if ((cellCount > 0) && [animation isAnimating]) {
+ //compare our target position with the current position and move towards the target
+ for (NSUInteger i = 0; i < [targetFrames count] && i < cellCount; i++) {
+ currentCell = [_cells objectAtIndex:i];
+ NSRect cellFrame = [currentCell frame], targetFrame = [[targetFrames objectAtIndex:i] rectValue];
+ CGFloat sizeChange;
+ CGFloat originChange;
+
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ sizeChange = (targetFrame.size.width - cellFrame.size.width) * [animation currentProgress];
+ originChange = (targetFrame.origin.x - cellFrame.origin.x) * [animation currentProgress];
+ cellFrame.size.width += sizeChange;
+ cellFrame.origin.x += originChange;
+ } else {
+ sizeChange = (targetFrame.size.height - cellFrame.size.height) * [animation currentProgress];
+ originChange = (targetFrame.origin.y - cellFrame.origin.y) * [animation currentProgress];
+ cellFrame.size.height += sizeChange;
+ cellFrame.origin.y += originChange;
+ }
+
+ [currentCell setFrame:cellFrame];
+
+ //highlight the cell if the mouse is over it
+ NSPoint mousePoint = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:nil];
+ NSRect closeRect = [currentCell closeButtonRectForFrame:cellFrame];
+ [currentCell setHighlighted:NSMouseInRect(mousePoint, cellFrame, [self isFlipped])];
+ [currentCell setCloseButtonOver:NSMouseInRect(mousePoint, closeRect, [self isFlipped])];
+ }
+
+ if (_showAddTabButton) {
+ //animate the add tab button
+ NSRect target = [_controller addButtonRect], frame = [_addTabButton frame];
+ frame.origin.x += (target.origin.x - frame.origin.x) * [animation currentProgress];
+ [_addTabButton setFrame:frame];
+ }
+ } else {
+ //put all the cells where they should be in their final position
+ if (cellCount > 0) {
+ for (NSUInteger i = 0; i < [targetFrames count] && i < cellCount; i++) {
+ PSMTabBarCell *currentCell = [_cells objectAtIndex:i];
+ NSRect cellFrame = [currentCell frame], targetFrame = [[targetFrames objectAtIndex:i] rectValue];
+
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ cellFrame.size.width = targetFrame.size.width;
+ cellFrame.origin.x = targetFrame.origin.x;
+ } else {
+ cellFrame.size.height = targetFrame.size.height;
+ cellFrame.origin.y = targetFrame.origin.y;
+ }
+
+ [currentCell setFrame:cellFrame];
+
+ //highlight the cell if the mouse is over it
+ NSPoint mousePoint = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:nil];
+ NSRect closeRect = [currentCell closeButtonRectForFrame:cellFrame];
+ [currentCell setHighlighted:NSMouseInRect(mousePoint, cellFrame, [self isFlipped])];
+ [currentCell setCloseButtonOver:NSMouseInRect(mousePoint, closeRect, [self isFlipped])];
+ }
+ }
+
+ //set the frame for the add tab button
+ if (_showAddTabButton) {
+ NSRect frame = [_addTabButton frame];
+ frame.origin.x = [_controller addButtonRect].origin.x;
+ [_addTabButton setFrame:frame];
+ }
+
+ [_animationTimer invalidate];
+ _animationTimer = nil;
+
+ for (NSUInteger i = 0; i < cellCount; i++) {
+ currentCell = [_cells objectAtIndex:i];
+
+ //we've hit the cells that are in overflow, stop setting up tracking rects
+ if ([currentCell isInOverflowMenu]) {
+ break;
+ }
+
+ [self _setupTrackingRectsForCell:currentCell];
+ }
+ }
+
+ [self setNeedsDisplay:YES];
+}
+
+- (void)_setupTrackingRectsForCell:(PSMTabBarCell *)cell
+{
+ NSInteger tag, index = [_cells indexOfObject:cell];
+ NSRect cellTrackingRect = [_controller cellTrackingRectAtIndex:index];
+ NSPoint mousePoint = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:nil];
+ BOOL mouseInCell = NSMouseInRect(mousePoint, cellTrackingRect, [self isFlipped]);
+
+ //set the cell tracking rect
+ [self removeTrackingRect:[cell cellTrackingTag]];
+ tag = [self addTrackingRect:cellTrackingRect owner:cell userData:nil assumeInside:mouseInCell];
+ [cell setCellTrackingTag:tag];
+ [cell setHighlighted:mouseInCell];
+
+ if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
+ NSRect closeRect = [_controller closeButtonTrackingRectAtIndex:index];
+ BOOL mouseInCloseRect = NSMouseInRect(mousePoint, closeRect, [self isFlipped]);
+
+ //set the close button tracking rect
+ [self removeTrackingRect:[cell closeButtonTrackingTag]];
+ tag = [self addTrackingRect:closeRect owner:cell userData:nil assumeInside:mouseInCloseRect];
+ [cell setCloseButtonTrackingTag:tag];
+
+ [cell setCloseButtonOver:mouseInCloseRect];
+ }
+
+ //set the tooltip tracking rect
+ [self addToolTipRect:[cell frame] owner:self userData:nil];
+}
+
+- (void)_positionOverflowMenu
+{
+ NSRect cellRect, frame = [self frame];
+ cellRect.size.height = [style tabCellHeight];
+ cellRect.size.width = [style rightMarginForTabBarControl];
+
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ cellRect.origin.y = 0;
+ cellRect.origin.x = frame.size.width - [style rightMarginForTabBarControl] + (_resizeAreaCompensation ? -(_resizeAreaCompensation - 1) : 1);
+ [_overflowPopUpButton setAutoresizingMask:NSViewNotSizable | NSViewMinXMargin];
+ } else {
+ cellRect.origin.x = 0;
+ cellRect.origin.y = frame.size.height - [style tabCellHeight];
+ cellRect.size.width = frame.size.width;
+ [_overflowPopUpButton setAutoresizingMask:NSViewNotSizable | NSViewMinXMargin | NSViewMinYMargin];
+ }
+
+ [_overflowPopUpButton setFrame:cellRect];
+}
+
+- (void)_checkWindowFrame
+{
+ //figure out if the new frame puts the control in the way of the resize widget
+ NSWindow *window = [self window];
+
+ if (window) {
+ NSRect resizeWidgetFrame = [[window contentView] frame];
+ resizeWidgetFrame.origin.x += resizeWidgetFrame.size.width - 22;
+ resizeWidgetFrame.size.width = 22;
+ resizeWidgetFrame.size.height = 22;
+
+ if ([window showsResizeIndicator] && NSIntersectsRect([self frame], resizeWidgetFrame)) {
+ //the resize widgets are larger on metal windows
+ _resizeAreaCompensation = [window styleMask] & NSWindowStyleMaskTexturedBackground ? 20 : 8;
+ } else {
+ _resizeAreaCompensation = 0;
+ }
+
+ [self _positionOverflowMenu];
+ }
+}
+
+#pragma mark -
+#pragma mark Mouse Tracking
+
+- (BOOL)mouseDownCanMoveWindow
+{
+ return NO;
+}
+
+- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
+{
+ return YES;
+}
+
+- (void)mouseDown:(NSEvent *)theEvent
+{
+ _didDrag = NO;
+
+ // keep for dragging
+ [self setLastMouseDownEvent:theEvent];
+ // what cell?
+ NSPoint mousePt = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+ NSRect frame = [self frame];
+
+ if ([self orientation] == PSMTabBarVerticalOrientation && [self allowsResizing] && partnerView && (mousePt.x > frame.size.width - 3)) {
+ _resizing = YES;
+ }
+
+ NSRect cellFrame;
+ PSMTabBarCell *cell = [self cellForPoint:mousePt cellFrame:&cellFrame];
+ if (cell) {
+ BOOL overClose = NSMouseInRect(mousePt, [cell closeButtonRectForFrame:cellFrame], [self isFlipped]);
+ if (overClose && ![self disableTabClose] && ![cell isCloseButtonSuppressed] && ([self allowsBackgroundTabClosing] || [[cell representedObject] isEqualTo:[tabView selectedTabViewItem]] || [theEvent modifierFlags] & NSEventModifierFlagCommand)) {
+ [cell setCloseButtonOver:NO];
+ [cell setCloseButtonPressed:YES];
+ _closeClicked = YES;
+ } else {
+ [cell setCloseButtonPressed:NO];
+ if (_selectsTabsOnMouseDown) {
+ [self performSelector:@selector(tabClick:) withObject:cell];
+ }
+ }
+ [self setNeedsDisplay:YES];
+ }
+}
+
+- (void)mouseDragged:(NSEvent *)theEvent
+{
+ if ([self lastMouseDownEvent] == nil) {
+ return;
+ }
+
+ NSPoint currentPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+
+ if (_resizing) {
+ NSRect frame = [self frame];
+ CGFloat resizeAmount = [theEvent deltaX];
+ if ((currentPoint.x > frame.size.width && resizeAmount > 0) || (currentPoint.x < frame.size.width && resizeAmount < 0)) {
+ [[NSCursor resizeLeftRightCursor] push];
+
+ NSRect partnerFrame = [partnerView frame];
+
+ //do some bounds checking
+ if ((frame.size.width + resizeAmount > [self cellMinWidth]) && (frame.size.width + resizeAmount < [self cellMaxWidth])) {
+ frame.size.width += resizeAmount;
+ partnerFrame.size.width -= resizeAmount;
+ partnerFrame.origin.x += resizeAmount;
+
+ [self setFrame:frame];
+ [partnerView setFrame:partnerFrame];
+ [[self superview] setNeedsDisplay:YES];
+ }
+ }
+ return;
+ }
+
+ NSRect cellFrame;
+ NSPoint trackingStartPoint = [self convertPoint:[[self lastMouseDownEvent] locationInWindow] fromView:nil];
+ PSMTabBarCell *cell = [self cellForPoint:trackingStartPoint cellFrame:&cellFrame];
+ if (cell) {
+ //check to see if the close button was the target in the clicked cell
+ //highlight/unhighlight the close button as necessary
+ NSRect iconRect = [cell closeButtonRectForFrame:cellFrame];
+
+ if (_closeClicked && NSMouseInRect(trackingStartPoint, iconRect, [self isFlipped]) && ([self allowsBackgroundTabClosing] || [[cell representedObject] isEqualTo:[tabView selectedTabViewItem]])) {
+ [cell setCloseButtonPressed:NSMouseInRect(currentPoint, iconRect, [self isFlipped])];
+ [self setNeedsDisplay:YES];
+ return;
+ }
+
+ CGFloat dx = fabs(currentPoint.x - trackingStartPoint.x);
+ CGFloat dy = fabs(currentPoint.y - trackingStartPoint.y);
+ CGFloat distance = sqrt(dx * dx + dy * dy);
+
+ if (distance >= 10 && !_didDrag && ![[PSMTabDragAssistant sharedDragAssistant] isDragging] &&
+ [self delegate] && [[self delegate] respondsToSelector:@selector(tabView:shouldDragTabViewItem:fromTabBar:)] &&
+ [[self delegate] tabView:tabView
+ shouldDragTabViewItem:[cell representedObject]
+ fromTabBar:self]) {
+ _didDrag = YES;
+ [[PSMTabDragAssistant sharedDragAssistant] startDraggingCell:cell fromTabBar:self withMouseDownEvent:[self lastMouseDownEvent]];
+ }
+ }
+}
+
+- (void)mouseUp:(NSEvent *)theEvent
+{
+ if (_resizing) {
+ _resizing = NO;
+ [[NSCursor arrowCursor] set];
+ } else {
+ // what cell?
+ NSPoint mousePt = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+ NSRect cellFrame, mouseDownCellFrame;
+ PSMTabBarCell *cell = [self cellForPoint:mousePt cellFrame:&cellFrame];
+ PSMTabBarCell *mouseDownCell = [self cellForPoint:[self convertPoint:[[self lastMouseDownEvent] locationInWindow] fromView:nil] cellFrame:&mouseDownCellFrame];
+ if (cell) {
+ NSPoint trackingStartPoint = [self convertPoint:[[self lastMouseDownEvent] locationInWindow] fromView:nil];
+ NSRect iconRect = [mouseDownCell closeButtonRectForFrame:mouseDownCellFrame];
+
+ if ((NSMouseInRect(mousePt, iconRect, [self isFlipped])) && ![self disableTabClose] && ![cell isCloseButtonSuppressed] && [mouseDownCell closeButtonPressed]) {
+ if (([[NSApp currentEvent] modifierFlags] & NSEventModifierFlagOption) != 0) {
+ //If the user is holding Option, close all other tabs
+ NSEnumerator *enumerator = [[[self cells] copy] objectEnumerator];
+ PSMTabBarCell *otherCell;
+
+ while ((otherCell = [enumerator nextObject])) {
+ if (otherCell != cell) {
+ [self performSelector:@selector(closeTabClick:) withObject:otherCell];
+ }
+ }
+
+ //Fix the close button for the clicked tab not to be pressed
+ [cell setCloseButtonPressed:NO];
+ } else {
+ //Otherwise, close this tab
+ [self performSelector:@selector(closeTabClick:) withObject:cell];
+ }
+ } else if (NSMouseInRect(mousePt, mouseDownCellFrame, [self isFlipped]) && (!NSMouseInRect(trackingStartPoint, [cell closeButtonRectForFrame:cellFrame], [self isFlipped]) || ![self allowsBackgroundTabClosing] || [self disableTabClose])) {
+ [mouseDownCell setCloseButtonPressed:NO];
+ // If -[self selectsTabsOnMouseDown] is TRUE, we already performed tabClick: on mouseDown.
+ if (![self selectsTabsOnMouseDown]) {
+ [self performSelector:@selector(tabClick:) withObject:cell];
+ }
+ } else {
+ [mouseDownCell setCloseButtonPressed:NO];
+ [self performSelector:@selector(tabNothing:) withObject:cell];
+ }
+ }
+
+ _closeClicked = NO;
+ }
+}
+
+- (NSMenu *)menuForEvent:(NSEvent *)event
+{
+ NSMenu *menu = nil;
+ NSTabViewItem *item = [[self cellForPoint:[self convertPoint:[event locationInWindow] fromView:nil] cellFrame:nil] representedObject];
+
+ if (item && [[self delegate] respondsToSelector:@selector(tabView:menuForTabViewItem:)]) {
+ menu = [[self delegate] tabView:tabView menuForTabViewItem:item];
+ }
+ return menu;
+}
+
+#pragma mark -
+#pragma mark Drag and Drop
+
+- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent *)theEvent
+{
+ return YES;
+}
+
+// NSDraggingSource
+- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
+{
+ return (isLocal ? NSDragOperationMove : NSDragOperationNone);
+}
+
+- (BOOL)ignoreModifierKeysWhileDragging
+{
+ return YES;
+}
+
+- (void)draggedImage:(NSImage *)anImage beganAt:(NSPoint)screenPoint
+{
+ [[PSMTabDragAssistant sharedDragAssistant] draggingBeganAt:screenPoint];
+}
+
+- (void)draggedImage:(NSImage *)image movedTo:(NSPoint)screenPoint
+{
+ [[PSMTabDragAssistant sharedDragAssistant] draggingMovedTo:screenPoint];
+}
+
+// NSDraggingDestination
+- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
+{
+ if ([[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] != NSNotFound) {
+ if ([self delegate] && [[self delegate] respondsToSelector:@selector(tabView:shouldDropTabViewItem:inTabBar:)] && ![[self delegate] tabView:[[sender draggingSource] tabView] shouldDropTabViewItem:[[[PSMTabDragAssistant sharedDragAssistant] draggedCell] representedObject] inTabBar:self]) {
+ return NSDragOperationNone;
+ }
+
+ [[PSMTabDragAssistant sharedDragAssistant] draggingEnteredTabBar:self atPoint:[self convertPoint:[sender draggingLocation] fromView:nil]];
+ return NSDragOperationMove;
+ }
+
+ return NSDragOperationNone;
+}
+
+- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
+{
+ PSMTabBarCell *cell = [self cellForPoint:[self convertPoint:[sender draggingLocation] fromView:nil] cellFrame:nil];
+
+ if ([[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] != NSNotFound) {
+ if ([self delegate] && [[self delegate] respondsToSelector:@selector(tabView:shouldDropTabViewItem:inTabBar:)] && ![[self delegate] tabView:[[sender draggingSource] tabView] shouldDropTabViewItem:[[[PSMTabDragAssistant sharedDragAssistant] draggedCell] representedObject] inTabBar:self]) {
+ return NSDragOperationNone;
+ }
+
+ [[PSMTabDragAssistant sharedDragAssistant] draggingUpdatedInTabBar:self atPoint:[self convertPoint:[sender draggingLocation] fromView:nil]];
+ return NSDragOperationMove;
+ } else if (cell) {
+ //something that was accepted by the delegate was dragged on
+
+ //Test for the space bar (the skip-the-delay key).
+ /*enum { virtualKeycodeForSpace = 49 }; //Source: IM:Tx (Fig. C-2)
+ union {
+ KeyMap keymap;
+ char bits[16];
+ } keymap;
+ GetKeys(keymap.keymap);
+ if ((GetCurrentEventKeyModifiers() == 0) && bit_test(keymap.bits, virtualKeycodeForSpace)) {
+ //The user pressed the space bar. This skips the delay; the user wants to pop the spring on this tab *now*.
+
+ //For some reason, it crashes if I call -fire here. I don't know why. It doesn't crash if I simply set the fire date to now.
+ [_springTimer setFireDate:[NSDate date]];
+ } else {*/
+ //Wind the spring for a spring-loaded drop.
+ //The delay time comes from Finder's defaults, which specifies it in milliseconds.
+ //If the delegate can't handle our spring-loaded drop, we'll abort it when the timer fires. See fireSpring:. This is simpler than constantly (checking for spring-loaded awareness and tearing down/rebuilding the timer) at every delegate change.
+
+ //If the user has dragged to a different tab, reset the timer.
+ if (_tabViewItemWithSpring != [cell representedObject]) {
+ [_springTimer invalidate];
+ _springTimer = nil;
+ _tabViewItemWithSpring = [cell representedObject];
+ }
+ if (!_springTimer) {
+ //Finder's default delay time, as of Tiger, is 668 ms. If the user has never changed it, there's no setting in its defaults, so we default to that amount.
+ NSNumber *delayNumber = (__bridge_transfer NSNumber *)CFPreferencesCopyAppValue((CFStringRef) @"SpringingDelayMilliseconds", (CFStringRef) @"com.apple.finder");
+ NSTimeInterval delaySeconds = delayNumber ? [delayNumber doubleValue] / 1000.0 : 0.668;
+ _springTimer = [NSTimer scheduledTimerWithTimeInterval:delaySeconds
+ target:self
+ selector:@selector(fireSpring:)
+ userInfo:sender
+ repeats:NO];
+ }
+ return NSDragOperationCopy;
+ }
+
+ return NSDragOperationNone;
+}
+
+- (void)draggingExited:(id<NSDraggingInfo>)sender
+{
+ [_springTimer invalidate];
+ _springTimer = nil;
+
+ [[PSMTabDragAssistant sharedDragAssistant] draggingExitedTabBar:self];
+}
+
+- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender
+{
+ //validate the drag operation only if there's a valid tab bar to drop into
+ return [[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] == NSNotFound ||
+ [[PSMTabDragAssistant sharedDragAssistant] destinationTabBar] != nil;
+}
+
+- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
+{
+ if ([[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] != NSNotFound) {
+ [[PSMTabDragAssistant sharedDragAssistant] performDragOperation];
+ } else if ([self delegate] && [[self delegate] respondsToSelector:@selector(tabView:acceptedDraggingInfo:onTabViewItem:)]) {
+ //forward the drop to the delegate
+ [[self delegate] tabView:tabView acceptedDraggingInfo:sender onTabViewItem:[[self cellForPoint:[self convertPoint:[sender draggingLocation] fromView:nil] cellFrame:nil] representedObject]];
+ }
+ return YES;
+}
+
+- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
+{
+ [[PSMTabDragAssistant sharedDragAssistant] draggedImageEndedAt:aPoint operation:operation];
+}
+
+- (void)concludeDragOperation:(id<NSDraggingInfo>)sender
+{
+}
+
+#pragma mark -
+#pragma mark Spring-loading
+
+- (void)fireSpring:(NSTimer *)timer
+{
+ NSAssert1(timer == _springTimer, @"Spring fired by unrecognized timer %@", timer);
+
+ id<NSDraggingInfo> sender = [timer userInfo];
+ PSMTabBarCell *cell = [self cellForPoint:[self convertPoint:[sender draggingLocation] fromView:nil] cellFrame:nil];
+ [tabView selectTabViewItem:[cell representedObject]];
+
+ _tabViewItemWithSpring = nil;
+ [_springTimer invalidate];
+ _springTimer = nil;
+}
+
+#pragma mark -
+#pragma mark Actions
+
+- (void)overflowMenuAction:(id)sender
+{
+ NSTabViewItem *tabViewItem = (NSTabViewItem *)[sender representedObject];
+ [tabView selectTabViewItem:tabViewItem];
+}
+
+- (void)closeTabClick:(id)sender
+{
+ NSTabViewItem *item = [sender representedObject];
+ if (([_cells count] == 1) && (![self canCloseOnlyTab])) {
+ return;
+ }
+
+ if ([[self delegate] respondsToSelector:@selector(tabView:shouldCloseTabViewItem:)]) {
+ if (![[self delegate] tabView:tabView shouldCloseTabViewItem:item]) {
+ // fix mouse downed close button
+ [sender setCloseButtonPressed:NO];
+ return;
+ }
+ }
+
+ [tabView removeTabViewItem:item];
+}
+
+- (void)tabClick:(id)sender
+{
+ [tabView selectTabViewItem:[sender representedObject]];
+}
+
+- (void)tabNothing:(id)sender
+{
+ //[self update]; // takes care of highlighting based on state
+}
+
+- (void)frameDidChange:(NSNotification *)notification
+{
+ [self _checkWindowFrame];
+
+ // trying to address the drawing artifacts for the progress indicators - hackery follows
+ // this one fixes the "blanking" effect when the control hides and shows itself
+ NSEnumerator *e = [_cells objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ [[cell indicator] stopAnimation:self];
+
+ [[cell indicator] performSelector:@selector(startAnimation:)
+ withObject:nil
+ afterDelay:0];
+ }
+
+ [self update:NO];
+}
+
+- (void)viewDidMoveToWindow
+{
+ [self _checkWindowFrame];
+}
+
+- (void)viewWillStartLiveResize
+{
+ NSEnumerator *e = [_cells objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ [[cell indicator] stopAnimation:self];
+ }
+ [self setNeedsDisplay:YES];
+}
+
+- (void)viewDidEndLiveResize
+{
+ NSEnumerator *e = [_cells objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ [[cell indicator] startAnimation:self];
+ }
+
+ [self _checkWindowFrame];
+ [self update:NO];
+}
+
+- (void)resetCursorRects
+{
+ [super resetCursorRects];
+ if ([self orientation] == PSMTabBarVerticalOrientation) {
+ NSRect frame = [self frame];
+ [self addCursorRect:NSMakeRect(frame.size.width - 2, 0, 2, frame.size.height) cursor:[NSCursor resizeLeftRightCursor]];
+ }
+}
+
+- (void)windowDidMove:(NSNotification *)aNotification
+{
+ [self setNeedsDisplay:YES];
+}
+
+- (void)windowDidUpdate:(NSNotification *)notification
+{
+ // hide? must readjust things if I'm not supposed to be showing
+ // this block of code only runs when the app launches
+ if ([self hideForSingleTab] && ([_cells count] <= 1) && !_awakenedFromNib) {
+ // must adjust frames now before display
+ NSRect myFrame = [self frame];
+ if ([self orientation] == PSMTabBarHorizontalOrientation) {
+ if (partnerView) {
+ NSRect partnerFrame = [partnerView frame];
+ // above or below me?
+ if (myFrame.origin.y - 22 > [partnerView frame].origin.y) {
+ // partner is below me
+ [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y + 21, myFrame.size.width, myFrame.size.height - 21)];
+ [partnerView setFrame:NSMakeRect(partnerFrame.origin.x, partnerFrame.origin.y, partnerFrame.size.width, partnerFrame.size.height + 21)];
+ } else {
+ // partner is above me
+ [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height - 21)];
+ [partnerView setFrame:NSMakeRect(partnerFrame.origin.x, partnerFrame.origin.y - 21, partnerFrame.size.width, partnerFrame.size.height + 21)];
+ }
+ [partnerView setNeedsDisplay:YES];
+ [self setNeedsDisplay:YES];
+ } else {
+ // for window movement
+ NSRect windowFrame = [[self window] frame];
+ [[self window] setFrame:NSMakeRect(windowFrame.origin.x, windowFrame.origin.y + 21, windowFrame.size.width, windowFrame.size.height - 21) display:YES];
+ [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height - 21)];
+ }
+ } else {
+ if (partnerView) {
+ NSRect partnerFrame = [partnerView frame];
+ //to the left or right?
+ if (myFrame.origin.x < [partnerView frame].origin.x) {
+ // partner is to the left
+ [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, 1, myFrame.size.height)];
+ [partnerView setFrame:NSMakeRect(partnerFrame.origin.x - myFrame.size.width + 1, partnerFrame.origin.y, partnerFrame.size.width + myFrame.size.width - 1, partnerFrame.size.height)];
+ } else {
+ // partner to the right
+ [self setFrame:NSMakeRect(myFrame.origin.x + myFrame.size.width, myFrame.origin.y, 1, myFrame.size.height)];
+ [partnerView setFrame:NSMakeRect(partnerFrame.origin.x, partnerFrame.origin.y, partnerFrame.size.width + myFrame.size.width, partnerFrame.size.height)];
+ }
+ _tabBarWidth = myFrame.size.width;
+ [partnerView setNeedsDisplay:YES];
+ [self setNeedsDisplay:YES];
+ } else {
+ // for window movement
+ NSRect windowFrame = [[self window] frame];
+ [[self window] setFrame:NSMakeRect(windowFrame.origin.x + myFrame.size.width - 1, windowFrame.origin.y, windowFrame.size.width - myFrame.size.width + 1, windowFrame.size.height) display:YES];
+ [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, 1, myFrame.size.height)];
+ }
+ }
+
+ _isHidden = YES;
+
+ if ([[self delegate] respondsToSelector:@selector(tabView:tabBarDidHide:)]) {
+ [[self delegate] tabView:[self tabView] tabBarDidHide:self];
+ }
+ }
+
+ _awakenedFromNib = YES;
+ [self setNeedsDisplay:YES];
+
+ //we only need to do this once
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidUpdateNotification object:nil];
+}
+
+#pragma mark -
+#pragma mark Menu Validation
+
+- (BOOL)validateMenuItem:(NSMenuItem *)sender
+{
+ [sender setState:([[sender representedObject] isEqualTo:[tabView selectedTabViewItem]]) ? NSOnState : NSOffState];
+
+ return [[self delegate] respondsToSelector:@selector(tabView:validateOverflowMenuItem:forTabViewItem:)] ? [[self delegate] tabView:[self tabView] validateOverflowMenuItem:sender forTabViewItem:[sender representedObject]] : YES;
+}
+
+#pragma mark -
+#pragma mark NSTabView Delegate
+
+- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ // here's a weird one - this message is sent before the "tabViewDidChangeNumberOfTabViewItems"
+ // message, thus I can end up updating when there are no cells, if no tabs were (yet) present
+ NSUInteger tabIndex = [aTabView indexOfTabViewItem:tabViewItem];
+
+ if ([_cells count] > 0 && tabIndex < [_cells count]) {
+ PSMTabBarCell *thisCell = [_cells objectAtIndex:tabIndex];
+ if (_alwaysShowActiveTab && [thisCell isInOverflowMenu]) {
+ //temporarily disable the delegate in order to move the tab to a different index
+ id tempDelegate = [aTabView delegate];
+ [aTabView setDelegate:nil];
+
+ // move it all around first
+ [aTabView removeTabViewItem:tabViewItem];
+ [aTabView insertTabViewItem:tabViewItem atIndex:0];
+ [_cells removeObjectAtIndex:tabIndex];
+ [_cells insertObject:thisCell atIndex:0];
+ [thisCell setIsInOverflowMenu:NO]; //very important else we get a fun recursive loop going
+ [[_cells objectAtIndex:[_cells count] - 1] setIsInOverflowMenu:YES]; //these 2 lines are pretty uncool and this logic needs to be updated
+
+ [aTabView setDelegate:tempDelegate];
+
+ //reset the selection since removing it changed the selection
+ [aTabView selectTabViewItem:tabViewItem];
+
+ [self update];
+ } else {
+ [_controller setSelectedCell:thisCell];
+ [self setNeedsDisplay:YES];
+ }
+ }
+
+ if ([[self delegate] respondsToSelector:@selector(tabView:didSelectTabViewItem:)]) {
+ [[self delegate] performSelector:@selector(tabView:didSelectTabViewItem:) withObject:aTabView withObject:tabViewItem];
+ }
+}
+
+- (BOOL)tabView:(NSTabView *)aTabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ if ([[self delegate] respondsToSelector:@selector(tabView:shouldSelectTabViewItem:)]) {
+ return [[self delegate] tabView:aTabView shouldSelectTabViewItem:tabViewItem];
+ } else {
+ return YES;
+ }
+}
+- (void)tabView:(NSTabView *)aTabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ if ([[self delegate] respondsToSelector:@selector(tabView:willSelectTabViewItem:)]) {
+ [[self delegate] performSelector:@selector(tabView:willSelectTabViewItem:) withObject:aTabView withObject:tabViewItem];
+ }
+}
+
+- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)aTabView
+{
+ NSArray *tabItems = [tabView tabViewItems];
+ // go through cells, remove any whose representedObjects are not in [tabView tabViewItems]
+ NSEnumerator *e = [[_cells copy] objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ //remove the observer binding
+ if ([cell representedObject] && ![tabItems containsObject:[cell representedObject]]) {
+ if ([[self delegate] respondsToSelector:@selector(tabView:didCloseTabViewItem:)]) {
+ [[self delegate] tabView:aTabView didCloseTabViewItem:[cell representedObject]];
+ }
+
+ [self removeTabForCell:cell];
+ }
+ }
+
+ // go through tab view items, add cell for any not present
+ NSMutableArray *cellItems = [self representedTabViewItems];
+ NSEnumerator *ex = [tabItems objectEnumerator];
+ NSTabViewItem *item;
+ while ((item = [ex nextObject])) {
+ if (![cellItems containsObject:item]) {
+ [self addTabViewItem:item];
+ }
+ }
+
+ // pass along for other delegate responses
+ if ([[self delegate] respondsToSelector:@selector(tabViewDidChangeNumberOfTabViewItems:)]) {
+ [[self delegate] performSelector:@selector(tabViewDidChangeNumberOfTabViewItems:) withObject:aTabView];
+ }
+
+ // reset cursor tracking for the add tab button if one exists
+ if ([self addTabButton]) {
+ [[self addTabButton] resetCursorRects];
+ }
+}
+
+#pragma mark -
+#pragma mark Tooltips
+
+- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)userData
+{
+ if ([[self delegate] respondsToSelector:@selector(tabView:toolTipForTabViewItem:)]) {
+ return [[self delegate] tabView:[self tabView] toolTipForTabViewItem:[[self cellForPoint:point cellFrame:nil] representedObject]];
+ }
+ return nil;
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ [super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:_cells forKey:@"PSMcells"];
+ [aCoder encodeObject:tabView forKey:@"PSMtabView"];
+ [aCoder encodeObject:_overflowPopUpButton forKey:@"PSMoverflowPopUpButton"];
+ [aCoder encodeObject:_addTabButton forKey:@"PSMaddTabButton"];
+ [aCoder encodeObject:style forKey:@"PSMstyle"];
+ [aCoder encodeInteger:_orientation forKey:@"PSMorientation"];
+ [aCoder encodeBool:_canCloseOnlyTab forKey:@"PSMcanCloseOnlyTab"];
+ [aCoder encodeBool:_disableTabClose forKey:@"PSMdisableTabClose"];
+ [aCoder encodeBool:_hideForSingleTab forKey:@"PSMhideForSingleTab"];
+ [aCoder encodeBool:_allowsBackgroundTabClosing forKey:@"PSMallowsBackgroundTabClosing"];
+ [aCoder encodeBool:_allowsResizing forKey:@"PSMallowsResizing"];
+ [aCoder encodeBool:_selectsTabsOnMouseDown forKey:@"PSMselectsTabsOnMouseDown"];
+ [aCoder encodeBool:_showAddTabButton forKey:@"PSMshowAddTabButton"];
+ [aCoder encodeBool:_sizeCellsToFit forKey:@"PSMsizeCellsToFit"];
+ [aCoder encodeInteger:_cellMinWidth forKey:@"PSMcellMinWidth"];
+ [aCoder encodeInteger:_cellMaxWidth forKey:@"PSMcellMaxWidth"];
+ [aCoder encodeInteger:_cellOptimumWidth forKey:@"PSMcellOptimumWidth"];
+ [aCoder encodeInteger:_currentStep forKey:@"PSMcurrentStep"];
+ [aCoder encodeBool:_isHidden forKey:@"PSMisHidden"];
+ [aCoder encodeObject:partnerView forKey:@"PSMpartnerView"];
+ [aCoder encodeBool:_awakenedFromNib forKey:@"PSMawakenedFromNib"];
+ [aCoder encodeObject:_lastMouseDownEvent forKey:@"PSMlastMouseDownEvent"];
+ [aCoder encodeObject:delegate forKey:@"PSMdelegate"];
+ [aCoder encodeBool:_useOverflowMenu forKey:@"PSMuseOverflowMenu"];
+ [aCoder encodeBool:_automaticallyAnimates forKey:@"PSMautomaticallyAnimates"];
+ [aCoder encodeBool:_alwaysShowActiveTab forKey:@"PSMalwaysShowActiveTab"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ self = [super initWithCoder:aDecoder];
+ if (self) {
+ // Initialization
+ [self initAddedProperties];
+ [self registerForDraggedTypes:[NSArray arrayWithObjects:@"PSMTabBarControlItemPBType", nil]];
+
+ // resize
+ [self setPostsFrameChangedNotifications:YES];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(frameDidChange:) name:NSViewFrameDidChangeNotification object:self];
+ if ([aDecoder allowsKeyedCoding]) {
+ _cells = [aDecoder decodeObjectForKey:@"PSMcells"];
+ tabView = [aDecoder decodeObjectForKey:@"PSMtabView"];
+ _overflowPopUpButton = [aDecoder decodeObjectForKey:@"PSMoverflowPopUpButton"];
+ _addTabButton = [aDecoder decodeObjectForKey:@"PSMaddTabButton"];
+ style = [aDecoder decodeObjectForKey:@"PSMstyle"];
+ _orientation = (PSMTabBarOrientation)[aDecoder decodeIntegerForKey:@"PSMorientation"];
+ _canCloseOnlyTab = [aDecoder decodeBoolForKey:@"PSMcanCloseOnlyTab"];
+ _disableTabClose = [aDecoder decodeBoolForKey:@"PSMdisableTabClose"];
+ _hideForSingleTab = [aDecoder decodeBoolForKey:@"PSMhideForSingleTab"];
+ _allowsBackgroundTabClosing = [aDecoder decodeBoolForKey:@"PSMallowsBackgroundTabClosing"];
+ _allowsResizing = [aDecoder decodeBoolForKey:@"PSMallowsResizing"];
+ _selectsTabsOnMouseDown = [aDecoder decodeBoolForKey:@"PSMselectsTabsOnMouseDown"];
+ _showAddTabButton = [aDecoder decodeBoolForKey:@"PSMshowAddTabButton"];
+ _sizeCellsToFit = [aDecoder decodeBoolForKey:@"PSMsizeCellsToFit"];
+ _cellMinWidth = [aDecoder decodeIntegerForKey:@"PSMcellMinWidth"];
+ _cellMaxWidth = [aDecoder decodeIntegerForKey:@"PSMcellMaxWidth"];
+ _cellOptimumWidth = [aDecoder decodeIntegerForKey:@"PSMcellOptimumWidth"];
+ _currentStep = [aDecoder decodeIntegerForKey:@"PSMcurrentStep"];
+ _isHidden = [aDecoder decodeBoolForKey:@"PSMisHidden"];
+ partnerView = [aDecoder decodeObjectForKey:@"PSMpartnerView"];
+ _awakenedFromNib = [aDecoder decodeBoolForKey:@"PSMawakenedFromNib"];
+ _lastMouseDownEvent = [aDecoder decodeObjectForKey:@"PSMlastMouseDownEvent"];
+ _useOverflowMenu = [aDecoder decodeBoolForKey:@"PSMuseOverflowMenu"];
+ _automaticallyAnimates = [aDecoder decodeBoolForKey:@"PSMautomaticallyAnimates"];
+ _alwaysShowActiveTab = [aDecoder decodeBoolForKey:@"PSMalwaysShowActiveTab"];
+ delegate = [aDecoder decodeObjectForKey:@"PSMdelegate"];
+ }
+ }
+ [self setTarget:self];
+ return self;
+}
+
+#pragma mark -
+#pragma mark IB Palette
+
+- (NSSize)minimumFrameSizeFromKnobPosition:(NSInteger)position
+{
+ return NSMakeSize(100.0, 22.0);
+}
+
+- (NSSize)maximumFrameSizeFromKnobPosition:(NSInteger)knobPosition
+{
+ return NSMakeSize(10000.0, 22.0);
+}
+
+- (void)placeView:(NSRect)newFrame
+{
+ // this is called any time the view is resized in IB
+ [self setFrame:newFrame];
+ [self update:NO];
+}
+
+#pragma mark -
+#pragma mark Convenience
+
+- (void)bindPropertiesForCell:(PSMTabBarCell *)cell andTabViewItem:(NSTabViewItem *)item
+{
+ [self _bindPropertiesForCell:cell andTabViewItem:item];
+
+ // watch for changes in the identifier
+ [item addObserver:self forKeyPath:@"identifier" options:0 context:nil];
+}
+
+- (void)_bindPropertiesForCell:(PSMTabBarCell *)cell andTabViewItem:(NSTabViewItem *)item
+{
+ // bind the indicator to the represented object's status (if it exists)
+ [[cell indicator] setHidden:YES];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(isProcessing)]) {
+ NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];
+ [bindingOptions setObject:NSNegateBooleanTransformerName forKey:@"NSValueTransformerName"];
+ [[cell indicator] bind:@"animate" toObject:[item identifier] withKeyPath:@"isProcessing" options:nil];
+ [[cell indicator] bind:@"hidden" toObject:[item identifier] withKeyPath:@"isProcessing" options:bindingOptions];
+ [[item identifier] addObserver:cell forKeyPath:@"isProcessing" options:0 context:nil];
+ }
+ }
+
+ // bind for the existence of an icon
+ [cell setHasIcon:NO];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(icon)]) {
+ NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];
+ [bindingOptions setObject:NSIsNotNilTransformerName forKey:@"NSValueTransformerName"];
+ [cell bind:@"hasIcon" toObject:[item identifier] withKeyPath:@"icon" options:bindingOptions];
+ [[item identifier] addObserver:cell forKeyPath:@"icon" options:0 context:nil];
+ }
+ }
+
+ // bind for the existence of a counter
+ [cell setCount:0];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(objectCount)]) {
+ [cell bind:@"count" toObject:[item identifier] withKeyPath:@"objectCount" options:nil];
+ [[item identifier] addObserver:cell forKeyPath:@"objectCount" options:0 context:nil];
+ }
+ }
+
+ // bind for the color of a counter
+ [cell setCountColor:nil];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(countColor)]) {
+ [cell bind:@"countColor" toObject:[item identifier] withKeyPath:@"countColor" options:nil];
+ [[item identifier] addObserver:cell forKeyPath:@"countColor" options:0 context:nil];
+ }
+ }
+
+ // bind for a large image
+ [cell setHasLargeImage:NO];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(largeImage)]) {
+ NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];
+ [bindingOptions setObject:NSIsNotNilTransformerName forKey:@"NSValueTransformerName"];
+ [cell bind:@"hasLargeImage" toObject:[item identifier] withKeyPath:@"largeImage" options:bindingOptions];
+ [[item identifier] addObserver:cell forKeyPath:@"largeImage" options:0 context:nil];
+ }
+ }
+
+ [cell setIsEdited:NO];
+ if ([item identifier] != nil) {
+ if ([[[cell representedObject] identifier] respondsToSelector:@selector(isEdited)]) {
+ [cell bind:@"isEdited" toObject:[item identifier] withKeyPath:@"isEdited" options:nil];
+ [[item identifier] addObserver:cell forKeyPath:@"isEdited" options:0 context:nil];
+ }
+ }
+
+ // bind my string value to the label on the represented tab
+ [cell bind:@"title" toObject:item withKeyPath:@"label" options:nil];
+}
+
+- (NSMutableArray *)representedTabViewItems
+{
+ NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[_cells count]];
+ NSEnumerator *e = [_cells objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ if ([cell representedObject]) {
+ [temp addObject:[cell representedObject]];
+ }
+ }
+ return temp;
+}
+
+- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame
+{
+ if ([self orientation] == PSMTabBarHorizontalOrientation && !NSPointInRect(point, [self genericCellRect])) {
+ return nil;
+ }
+
+ NSInteger i, cnt = [_cells count];
+ for (i = 0; i < cnt; i++) {
+ PSMTabBarCell *cell = [_cells objectAtIndex:i];
+
+ if (NSPointInRect(point, [cell frame])) {
+ if (outFrame) {
+ *outFrame = [cell frame];
+ }
+ return cell;
+ }
+ }
+ return nil;
+}
+
+- (PSMTabBarCell *)lastVisibleTab
+{
+ NSInteger i, cellCount = [_cells count];
+ for (i = 0; i < cellCount; i++) {
+ if ([[_cells objectAtIndex:i] isInOverflowMenu]) {
+ return [_cells objectAtIndex:(i - 1)];
+ }
+ }
+ return [_cells objectAtIndex:(cellCount - 1)];
+}
+
+- (NSInteger)numberOfVisibleTabs
+{
+ NSUInteger i, cellCount = 0;
+ PSMTabBarCell *nextCell;
+
+ for (i = 0; i < [_cells count]; i++) {
+ nextCell = [_cells objectAtIndex:i];
+
+ if ([nextCell isInOverflowMenu]) {
+ break;
+ }
+
+ if (![nextCell isPlaceholder]) {
+ cellCount++;
+ }
+ }
+
+ return cellCount;
+}
+
+#pragma mark -
+#pragma mark Accessibility
+
+- (BOOL)accessibilityIsIgnored
+{
+ return NO;
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute
+{
+ id attributeValue = nil;
+ if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
+ attributeValue = NSAccessibilityGroupRole;
+ } else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
+ attributeValue = NSAccessibilityUnignoredChildren(_cells);
+ } else {
+ attributeValue = [super accessibilityAttributeValue:attribute];
+ }
+ return attributeValue;
+}
+
+- (id)accessibilityHitTest:(NSPoint)point
+{
+ id hitTestResult = self;
+
+ NSEnumerator *enumerator = [_cells objectEnumerator];
+ PSMTabBarCell *cell = nil;
+ PSMTabBarCell *highlightedCell = nil;
+
+ while (!highlightedCell && (cell = [enumerator nextObject])) {
+ if ([cell isHighlighted]) {
+ highlightedCell = cell;
+ }
+ }
+
+ if (highlightedCell) {
+ hitTestResult = [highlightedCell accessibilityHitTest:point];
+ }
+
+ return hitTestResult;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarController.h b/frontends/cocoa/PSMTabBarControl/PSMTabBarController.h
new file mode 100644
index 000000000..80c94df4f
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarController.h
@@ -0,0 +1,38 @@
+//
+// PSMTabBarController.h
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 11/24/06.
+// Copyright 2006 Kent Sutherland. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@class PSMTabBarControl, PSMTabBarCell;
+
+@interface PSMTabBarController : NSObject
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+ <NSMenuDelegate>
+#endif
+{
+ PSMTabBarControl *_control;
+ NSMutableArray *_cellTrackingRects;
+ NSMutableArray *_closeButtonTrackingRects;
+ NSMutableArray *_cellFrames;
+ NSRect _addButtonRect;
+ NSMenu *_overflowMenu;
+}
+
+- (id)initWithTabBarControl:(PSMTabBarControl *)control;
+
+- (NSRect)addButtonRect;
+- (NSMenu *)overflowMenu;
+- (NSRect)cellTrackingRectAtIndex:(NSUInteger)index;
+- (NSRect)closeButtonTrackingRectAtIndex:(NSUInteger)index;
+- (NSRect)cellFrameAtIndex:(NSUInteger)index;
+
+- (void)setSelectedCell:(PSMTabBarCell *)cell;
+
+- (void)layoutCells;
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabBarController.m b/frontends/cocoa/PSMTabBarControl/PSMTabBarController.m
new file mode 100644
index 000000000..232bb4948
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabBarController.m
@@ -0,0 +1,648 @@
+//
+// PSMTabBarController.m
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 11/24/06.
+// Copyright 2006 Kent Sutherland. All rights reserved.
+//
+
+#import "PSMTabBarController.h"
+#import "PSMTabBarControl.h"
+#import "PSMTabBarCell.h"
+#import "PSMTabStyle.h"
+#import "NSString_AITruncation.h"
+#import "PSMRolloverButton.h"
+
+#define MAX_OVERFLOW_MENUITEM_TITLE_LENGTH 60
+
+@interface PSMTabBarController (Private)
+- (NSArray *)_generateWidthsFromCells:(NSArray *)cells;
+- (void)_setupCells:(NSArray *)cells withWidths:(NSArray *)widths;
+@end
+
+@implementation PSMTabBarController
+
+/*!
+ @method initWithTabBarControl:
+ @abstract Creates a new PSMTabBarController instance.
+ @discussion Creates a new PSMTabBarController for controlling a PSMTabBarControl. Should only be called by
+ PSMTabBarControl.
+ @param A PSMTabBarControl.
+ @returns A newly created PSMTabBarController instance.
+ */
+
+- (id)initWithTabBarControl:(PSMTabBarControl *)control
+{
+ if ((self = [super init])) {
+ _control = control;
+ _cellTrackingRects = [[NSMutableArray alloc] init];
+ _closeButtonTrackingRects = [[NSMutableArray alloc] init];
+ _cellFrames = [[NSMutableArray alloc] init];
+ _addButtonRect = NSZeroRect;
+ }
+ return self;
+}
+
+/*!
+ @method addButtonRect
+ @abstract Returns the position for the add tab button.
+ @discussion Returns the position for the add tab button.
+ @returns The rect for the add button rect.
+ */
+
+- (NSRect)addButtonRect
+{
+ return _addButtonRect;
+}
+
+/*!
+ @method overflowMenu
+ @abstract Returns current overflow menu or nil if there is none.
+ @discussion Returns current overflow menu or nil if there is none.
+ @returns The current overflow menu.
+ */
+
+- (NSMenu *)overflowMenu
+{
+ return _overflowMenu;
+}
+
+/*!
+ @method cellTrackingRectAtIndex:
+ @abstract Returns the rect for the tracking rect at the requested index.
+ @discussion Returns the rect for the tracking rect at the requested index.
+ @param Index of a cell.
+ @returns The tracking rect of the cell at the requested index.
+ */
+
+- (NSRect)cellTrackingRectAtIndex:(NSUInteger)index
+{
+ NSRect rect;
+ if (index < [_cellTrackingRects count]) {
+ rect = [[_cellTrackingRects objectAtIndex:index] rectValue];
+ } else {
+ NSLog(@"cellTrackingRectAtIndex: Invalid index (%ld)", (long)index);
+ rect = NSZeroRect;
+ }
+ return rect;
+}
+
+/*!
+ @method closeButtonTrackingRectAtIndex:
+ @abstract Returns the tracking rect for the close button at the requested index.
+ @discussion Returns the tracking rect for the close button at the requested index.
+ @param Index of a cell.
+ @returns The close button tracking rect of the cell at the requested index.
+ */
+
+- (NSRect)closeButtonTrackingRectAtIndex:(NSUInteger)index
+{
+ NSRect rect;
+ if (index < [_closeButtonTrackingRects count]) {
+ rect = [[_closeButtonTrackingRects objectAtIndex:index] rectValue];
+ } else {
+ NSLog(@"closeButtonTrackingRectAtIndex: Invalid index (%ld)", (long)index);
+ rect = NSZeroRect;
+ }
+ return rect;
+}
+
+/*!
+ @method cellFrameAtIndex:
+ @abstract Returns the frame for the cell at the requested index.
+ @discussion Returns the frame for the cell at the requested index.
+ @param Index of a cell.
+ @returns The frame of the cell at the requested index.
+ */
+
+- (NSRect)cellFrameAtIndex:(NSUInteger)index
+{
+ NSRect rect;
+
+ if (index < [_cellFrames count]) {
+ rect = [[_cellFrames objectAtIndex:index] rectValue];
+ } else {
+ NSLog(@"cellFrameAtIndex: Invalid index (%ld)", (long)index);
+ rect = NSZeroRect;
+ }
+ return rect;
+}
+
+/*!
+ @method setSelectedCell:
+ @abstract Changes the cell states so the given cell is the currently selected cell.
+ @discussion Makes the given cell the active cell and properly recalculates the tab states for surrounding cells.
+ @param An instance of PSMTabBarCell to make active.
+ */
+
+- (void)setSelectedCell:(PSMTabBarCell *)cell
+{
+ NSArray *cells = [_control cells];
+ NSEnumerator *enumerator = [cells objectEnumerator];
+ PSMTabBarCell *lastCell = nil, *nextCell;
+
+ //deselect the previously selected tab
+ while ((nextCell = [enumerator nextObject]) && ([nextCell state] == NSOffState)) {
+ lastCell = nextCell;
+ }
+
+ [nextCell setState:NSOffState];
+ [nextCell setTabState:PSMTab_PositionMiddleMask];
+
+ if (lastCell && lastCell != [_control lastVisibleTab]) {
+ [lastCell setTabState:~[lastCell tabState] & PSMTab_RightIsSelectedMask];
+ }
+
+ if ((nextCell = [enumerator nextObject])) {
+ [nextCell setTabState:~[lastCell tabState] & PSMTab_LeftIsSelectedMask];
+ }
+
+ [cell setState:NSOnState];
+ [cell setTabState:PSMTab_SelectedMask];
+
+ if (![cell isInOverflowMenu]) {
+ NSUInteger cellIndex = [cells indexOfObject:cell];
+
+ if (cellIndex > 0) {
+ nextCell = [cells objectAtIndex:cellIndex - 1];
+ [nextCell setTabState:[nextCell tabState] | PSMTab_RightIsSelectedMask];
+ }
+
+ if (cellIndex < [cells count] - 1) {
+ nextCell = [cells objectAtIndex:cellIndex + 1];
+ [nextCell setTabState:[nextCell tabState] | PSMTab_LeftIsSelectedMask];
+ }
+ }
+}
+
+/*!
+ @method layoutCells
+ @abstract Recalculates cell positions and states.
+ @discussion This method calculates the proper frame, tabState and overflow menu status for all cells in the
+ tab bar control.
+ */
+
+- (void)layoutCells
+{
+ NSArray *cells = [_control cells];
+ NSInteger cellCount = [cells count];
+
+ // make sure all of our tabs are accounted for before updating
+ if ([[_control tabView] numberOfTabViewItems] != cellCount) {
+ return;
+ }
+
+ [_cellTrackingRects removeAllObjects];
+ [_closeButtonTrackingRects removeAllObjects];
+ [_cellFrames removeAllObjects];
+
+ NSArray *cellWidths = [self _generateWidthsFromCells:cells];
+ [self _setupCells:cells withWidths:cellWidths];
+
+ //set up the rect from the add tab button
+ _addButtonRect = [_control genericCellRect];
+ _addButtonRect.size = [[_control addTabButton] frame].size;
+ if ([_control orientation] == PSMTabBarHorizontalOrientation) {
+ _addButtonRect.origin.y = MARGIN_Y;
+ _addButtonRect.origin.x += [[cellWidths valueForKeyPath:@"@sum.floatValue"] doubleValue] + 2;
+ } else {
+ _addButtonRect.origin.x = 0;
+ _addButtonRect.origin.y = [[cellWidths lastObject] doubleValue];
+ }
+}
+
+/*!
+ * @method _shrinkWidths:towardMinimum:withAvailableWidth:
+ * @abstract Decreases widths in an array toward a minimum until they fit within availableWidth, if possible
+ * @param An array of NSNumbers
+ * @param The target minimum
+ * @param The maximum available width
+ * @returns The amount by which the total array width was shrunk
+ */
+- (NSInteger)_shrinkWidths:(NSMutableArray *)newWidths towardMinimum:(NSInteger)minimum withAvailableWidth:(CGFloat)availableWidth
+{
+ BOOL changed = NO;
+ NSInteger count = [newWidths count];
+ NSInteger totalWidths = [[newWidths valueForKeyPath:@"@sum.intValue"] integerValue];
+ NSInteger originalTotalWidths = totalWidths;
+
+ do {
+ changed = NO;
+
+ for (NSInteger q = (count - 1); q >= 0; q--) {
+ CGFloat cellWidth = [[newWidths objectAtIndex:q] doubleValue];
+ if (cellWidth - 1 >= minimum) {
+ cellWidth--;
+ totalWidths--;
+
+ [newWidths replaceObjectAtIndex:q
+ withObject:[NSNumber numberWithDouble:cellWidth]];
+
+ changed = YES;
+ }
+ }
+ } while (changed && (totalWidths > availableWidth));
+
+ return (originalTotalWidths - totalWidths);
+}
+
+/*!
+ * @function potentialMinimumForArray()
+ * @abstract Calculate the minimum total for a given array of widths
+ * @discussion The array is summed using, for each item, the minimum between the current value and the passed minimum value.
+ * This is useful for getting a sum if the array has size-to-fit widths which will be allowed to be less than the
+ * specified minimum.
+ * @param An array of widths
+ * @param The minimum
+ * @returns The smallest possible sum for the array
+ */
+static NSInteger potentialMinimumForArray(NSArray *array, NSInteger minimum)
+{
+ NSInteger runningTotal = 0;
+ NSInteger count = [array count];
+
+ for (NSInteger i = 0; i < count; i++) {
+ NSInteger currentValue = [[array objectAtIndex:i] integerValue];
+ runningTotal += MIN(currentValue, minimum);
+ }
+
+ return runningTotal;
+}
+
+/*!
+ @method _generateWidthsFromCells:
+ @abstract Calculates the width of cells that would be visible.
+ @discussion Calculates the width of cells in the tab bar and returns an array of widths for the cells that would be
+ visible. Uses large blocks of code that were previously in PSMTabBarControl's update method.
+ @param An array of PSMTabBarCells.
+ @returns An array of numbers representing the widths of cells that would be visible.
+ */
+
+- (NSArray *)_generateWidthsFromCells:(NSArray *)cells
+{
+ NSInteger cellCount = [cells count], i, numberOfVisibleCells = ([_control orientation] == PSMTabBarHorizontalOrientation) ? 1 : 0;
+ NSMutableArray *newWidths = [NSMutableArray arrayWithCapacity:cellCount];
+ id<PSMTabStyle> style = [_control style];
+ CGFloat availableWidth = [_control availableCellWidth], currentOrigin = 0, totalOccupiedWidth = 0.0, width;
+ NSRect cellRect = [_control genericCellRect], controlRect = [_control frame];
+ PSMTabBarCell *currentCell;
+
+ if ([_control orientation] == PSMTabBarVerticalOrientation) {
+ currentOrigin = [style topMarginForTabBarControl];
+ }
+
+ //Don't let cells overlap the add tab button if it is visible
+ if ([_control showAddTabButton]) {
+ availableWidth -= [self addButtonRect].size.width;
+ }
+
+ for (i = 0; i < cellCount; i++) {
+ currentCell = [cells objectAtIndex:i];
+
+ // supress close button?
+ [currentCell setCloseButtonSuppressed:((cellCount == 1 && [_control canCloseOnlyTab] == NO) ||
+ [_control disableTabClose] || ([[_control delegate] respondsToSelector:@selector(tabView:disableTabCloseForTabViewItem:)] && [[_control delegate] tabView:[_control tabView]
+ disableTabCloseForTabViewItem:[currentCell representedObject]]))];
+
+ if ([_control orientation] == PSMTabBarHorizontalOrientation) {
+ // Determine cell width
+ if ([_control sizeCellsToFit]) {
+ width = [currentCell desiredWidthOfCell];
+ if (width > [_control cellMaxWidth]) {
+ width = [_control cellMaxWidth];
+ }
+ } else {
+ width = [_control cellOptimumWidth];
+ }
+
+ width = ceil(width);
+
+ //check to see if there is not enough space to place all tabs as preferred
+ if (totalOccupiedWidth + width >= availableWidth) {
+ //There's not enough space to add currentCell at its preferred width!
+
+ //If we're not going to use the overflow menu, cram all the tab cells into the bar regardless of minimum width
+ if (![_control useOverflowMenu]) {
+ NSInteger j, averageWidth = (availableWidth / cellCount);
+
+ numberOfVisibleCells = cellCount;
+ [newWidths removeAllObjects];
+
+ for (j = 0; j < cellCount; j++) {
+ CGFloat desiredWidth = [[cells objectAtIndex:j] desiredWidthOfCell];
+ [newWidths addObject:[NSNumber numberWithDouble:(desiredWidth < averageWidth && [_control sizeCellsToFit]) ? desiredWidth : averageWidth]];
+ }
+
+ totalOccupiedWidth = [[newWidths valueForKeyPath:@"@sum.intValue"] integerValue];
+ break;
+ }
+
+ //We'll be using the overflow menu if needed.
+ numberOfVisibleCells = i;
+ if ([_control sizeCellsToFit]) {
+ BOOL remainingCellsMustGoToOverflow = NO;
+
+ totalOccupiedWidth = [[newWidths valueForKeyPath:@"@sum.intValue"] integerValue];
+
+ /* Can I squeeze it in without violating min cell width? This is the width we would take up
+ * if every cell so far were at the control minimum size (or their current size if that is less than the control minimum).
+ */
+ if ((potentialMinimumForArray(newWidths, [_control cellMinWidth]) + MIN(width, [_control cellMinWidth])) <= availableWidth) {
+ /* It's definitely possible for cells so far to be visible.
+ * Shrink other cells to allow this one to fit
+ */
+ NSInteger cellMinWidth = [_control cellMinWidth];
+
+ /* Start off adding it to the array; we know that it will eventually fit because
+ * (the potential minimum <= availableWidth)
+ *
+ * This allows average and minimum aggregates on the NSArray to work.
+ */
+ [newWidths addObject:[NSNumber numberWithDouble:width]];
+ numberOfVisibleCells++;
+
+ totalOccupiedWidth += width;
+
+ //First, try to shrink tabs toward the average. Tabs smaller than average won't change
+ totalOccupiedWidth -= [self _shrinkWidths:newWidths
+ towardMinimum:[[newWidths valueForKeyPath:@"@avg.intValue"] integerValue]
+ withAvailableWidth:availableWidth];
+
+ if (totalOccupiedWidth > availableWidth) {
+ //Next, shrink tabs toward the smallest of the existing tabs. The smallest tab won't change.
+ NSInteger smallestTabWidth = [[newWidths valueForKeyPath:@"@min.intValue"] integerValue];
+ if (smallestTabWidth > cellMinWidth) {
+ totalOccupiedWidth -= [self _shrinkWidths:newWidths
+ towardMinimum:smallestTabWidth
+ withAvailableWidth:availableWidth];
+ }
+ }
+
+ if (totalOccupiedWidth > availableWidth) {
+ //Finally, shrink tabs toward the imposed minimum size. All tabs larger than the minimum wll change.
+ totalOccupiedWidth -= [self _shrinkWidths:newWidths
+ towardMinimum:cellMinWidth
+ withAvailableWidth:availableWidth];
+ }
+
+ if (totalOccupiedWidth > availableWidth) {
+ NSLog(@"**** -[PSMTabBarController generateWidthsFromCells:] This is a failure (available %f, total %f, width is %f)",
+ availableWidth, totalOccupiedWidth, width);
+ remainingCellsMustGoToOverflow = YES;
+ }
+
+ if (totalOccupiedWidth < availableWidth) {
+ /* We're not using all available space not but exceeded available width before;
+ * stretch all cells to fully fit the bar
+ */
+ NSInteger leftoverWidth = availableWidth - totalOccupiedWidth;
+ if (leftoverWidth > 0) {
+ NSInteger q;
+ for (q = numberOfVisibleCells - 1; q >= 0; q--) {
+ NSInteger desiredAddition = (NSInteger)leftoverWidth / (q + 1);
+ NSInteger newCellWidth = (NSInteger)[[newWidths objectAtIndex:q] doubleValue] + desiredAddition;
+ [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithDouble:newCellWidth]];
+ leftoverWidth -= desiredAddition;
+ totalOccupiedWidth += desiredAddition;
+ }
+ }
+ }
+ } else {
+ // stretch - distribute leftover room among cells, since we can't add this cell
+ NSInteger leftoverWidth = availableWidth - totalOccupiedWidth;
+ NSInteger q;
+ for (q = i - 1; q >= 0; q--) {
+ NSInteger desiredAddition = (NSInteger)leftoverWidth / (q + 1);
+ NSInteger newCellWidth = (NSInteger)[[newWidths objectAtIndex:q] doubleValue] + desiredAddition;
+ [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithDouble:newCellWidth]];
+ leftoverWidth -= desiredAddition;
+ }
+
+ remainingCellsMustGoToOverflow = YES;
+ }
+
+ // done assigning widths; remaining cells go in overflow menu
+ if (remainingCellsMustGoToOverflow) {
+ break;
+ }
+ } else {
+ //We're not using size-to-fit
+ NSInteger revisedWidth = availableWidth / (i + 1);
+ if (revisedWidth >= [_control cellMinWidth]) {
+ NSUInteger q;
+ totalOccupiedWidth = 0;
+
+ for (q = 0; q < [newWidths count]; q++) {
+ [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithDouble:revisedWidth]];
+ totalOccupiedWidth += revisedWidth;
+ }
+ // just squeezed this one in...
+ [newWidths addObject:[NSNumber numberWithDouble:revisedWidth]];
+ totalOccupiedWidth += revisedWidth;
+ numberOfVisibleCells++;
+ } else {
+ // couldn't fit that last one...
+ break;
+ }
+ }
+ } else {
+ //(totalOccupiedWidth < availableWidth)
+ numberOfVisibleCells = cellCount;
+ [newWidths addObject:[NSNumber numberWithDouble:width]];
+ totalOccupiedWidth += width;
+ }
+ } else {
+ //lay out vertical tabs
+ if (currentOrigin + cellRect.size.height <= controlRect.size.height) {
+ [newWidths addObject:[NSNumber numberWithDouble:currentOrigin]];
+ numberOfVisibleCells++;
+ currentOrigin += cellRect.size.height;
+ } else {
+ //out of room, the remaining tabs go into overflow
+ if ([newWidths count] > 0 && controlRect.size.height - currentOrigin < 17) {
+ [newWidths removeLastObject];
+ numberOfVisibleCells--;
+ }
+ break;
+ }
+ }
+ }
+
+ //make sure there are at least two items in the horizontal tab bar
+ if ([_control orientation] == PSMTabBarHorizontalOrientation) {
+ if (numberOfVisibleCells<2 && [cells count]> 1) {
+ PSMTabBarCell *cell1 = [cells objectAtIndex:0], *cell2 = [cells objectAtIndex:1];
+ NSNumber *cellWidth;
+
+ [newWidths removeAllObjects];
+ totalOccupiedWidth = 0;
+
+ cellWidth = [NSNumber numberWithDouble:[cell1 desiredWidthOfCell] < availableWidth * 0.5f ? [cell1 desiredWidthOfCell] : availableWidth * 0.5f];
+ [newWidths addObject:cellWidth];
+ totalOccupiedWidth += [cellWidth doubleValue];
+
+ cellWidth = [NSNumber numberWithDouble:[cell2 desiredWidthOfCell] < (availableWidth - totalOccupiedWidth) ? [cell2 desiredWidthOfCell] : (availableWidth - totalOccupiedWidth)];
+ [newWidths addObject:cellWidth];
+ totalOccupiedWidth += [cellWidth doubleValue];
+
+ if (totalOccupiedWidth < availableWidth) {
+ [newWidths replaceObjectAtIndex:0 withObject:[NSNumber numberWithDouble:availableWidth - [cellWidth doubleValue]]];
+ }
+
+ numberOfVisibleCells = 2;
+ }
+ }
+
+ return newWidths;
+}
+
+/*!
+ @method _setupCells:withWidths
+ @abstract Creates tracking rect arrays and sets the frames of the visible cells.
+ @discussion Creates tracking rect arrays and sets the cells given in the widths array.
+ */
+
+- (void)_setupCells:(NSArray *)cells withWidths:(NSArray *)widths
+{
+ NSUInteger i, tabState, cellCount = [cells count];
+ NSRect cellRect = [_control genericCellRect];
+ PSMTabBarCell *cell;
+ NSTabViewItem *selectedTabViewItem = [[_control tabView] selectedTabViewItem];
+ NSMenuItem *menuItem;
+
+ _overflowMenu = nil;
+
+ for (i = 0; i < cellCount; i++) {
+ cell = [cells objectAtIndex:i];
+
+ if (i < [widths count]) {
+ tabState = 0;
+
+ // set cell frame
+ if ([_control orientation] == PSMTabBarHorizontalOrientation) {
+ cellRect.size.width = [[widths objectAtIndex:i] doubleValue];
+ } else {
+ cellRect.size.width = [_control frame].size.width;
+ cellRect.origin.y = [[widths objectAtIndex:i] doubleValue];
+ cellRect.origin.x = 0;
+ }
+
+ [_cellFrames addObject:[NSValue valueWithRect:cellRect]];
+
+ //add tracking rects to arrays
+ [_closeButtonTrackingRects addObject:[NSValue valueWithRect:[cell closeButtonRectForFrame:cellRect]]];
+ [_cellTrackingRects addObject:[NSValue valueWithRect:cellRect]];
+
+ if ([[cell representedObject] isEqualTo:selectedTabViewItem]) {
+ [cell setState:NSOnState];
+ tabState |= PSMTab_SelectedMask;
+ // previous cell
+ if (i > 0) {
+ [[cells objectAtIndex:i - 1] setTabState:([(PSMTabBarCell *)[cells objectAtIndex:i - 1] tabState] | PSMTab_RightIsSelectedMask)];
+ }
+ // next cell - see below
+ } else {
+ [cell setState:NSOffState];
+ // see if prev cell was selected
+ if ((i > 0) && ([[cells objectAtIndex:i - 1] state] == NSOnState)) {
+ tabState |= PSMTab_LeftIsSelectedMask;
+ }
+ }
+
+ // more tab states
+ if ([widths count] == 1) {
+ tabState |= PSMTab_PositionLeftMask | PSMTab_PositionRightMask | PSMTab_PositionSingleMask;
+ } else if (i == 0) {
+ tabState |= PSMTab_PositionLeftMask;
+ } else if (i == [widths count] - 1) {
+ tabState |= PSMTab_PositionRightMask;
+ }
+
+ [cell setTabState:tabState];
+ [cell setIsInOverflowMenu:NO];
+
+ // indicator
+ if (![[cell indicator] isHidden] && ![_control isTabBarHidden]) {
+ if (![[_control subviews] containsObject:[cell indicator]]) {
+ [_control addSubview:[cell indicator]];
+ [[cell indicator] startAnimation:self];
+ }
+ }
+
+ // next...
+ cellRect.origin.x += [[widths objectAtIndex:i] doubleValue];
+ } else {
+ [cell setState:NSOffState];
+ [cell setIsInOverflowMenu:YES];
+ [[cell indicator] removeFromSuperview];
+
+ //position the cell well offscreen
+ if ([_control orientation] == PSMTabBarHorizontalOrientation) {
+ cellRect.origin.x += [[_control style] rightMarginForTabBarControl] + 20;
+ } else {
+ cellRect.origin.y = [_control frame].size.height + 2;
+ }
+
+ [_cellFrames addObject:[NSValue valueWithRect:cellRect]];
+
+ if (_overflowMenu == nil) {
+ _overflowMenu = [[NSMenu alloc] init];
+ [_overflowMenu insertItemWithTitle:@"" action:nil keyEquivalent:@"" atIndex:0]; // Because the overflowPupUpButton is a pull down menu
+ [_overflowMenu setDelegate:self];
+ }
+
+ // Each item's title is limited to 60 characters. If more than 60 characters, use an ellipsis to indicate that more exists.
+ menuItem = [_overflowMenu addItemWithTitle:[[[cell attributedStringValue] string] stringWithEllipsisByTruncatingToLength:MAX_OVERFLOW_MENUITEM_TITLE_LENGTH]
+ action:@selector(overflowMenuAction:)
+ keyEquivalent:@""];
+ [menuItem setTarget:_control];
+ [menuItem setRepresentedObject:[cell representedObject]];
+
+ if ([cell count] > 0) {
+ [menuItem setTitle:[[menuItem title] stringByAppendingFormat:@" (%lu)", (unsigned long)[cell count]]];
+ }
+ }
+ }
+}
+
+- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)menuItem atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
+{
+ if (menu == _overflowMenu) {
+ if ([[[menuItem representedObject] identifier] respondsToSelector:@selector(icon)]) {
+ [menuItem setImage:[[[menuItem representedObject] identifier] valueForKey:@"icon"]];
+ }
+ }
+
+ return TRUE;
+}
+
+- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
+{
+ if (menu == _overflowMenu) {
+ return [_overflowMenu numberOfItems];
+ } else {
+ NSLog(@"Warning: Unexpected menu delegate call for menu %@", menu);
+ return 0;
+ }
+}
+
+@end
+
+/*
+ PSMTabBarController will store what the current tab frame state should be like based off the last layout. PSMTabBarControl
+ has to handle fetching the new frame and then changing the tab cell frame.
+ Tab states will probably be changed immediately.
+
+ Tabs that aren't going to be visible need to have their frame set offscreen. Treat them as if they were visible.
+
+ The overflow menu is rebuilt and stored by the controller.
+
+ Arrays of tracking rects will be created here, but not applied.
+ Tracking rects are removed and added by PSMTabBarControl at the end of an animate/display cycle.
+
+ The add tab button frame is handled by this controller. Visibility and location are set by the control.
+
+ isInOverflowMenu should probably be removed in favor of a call that returns yes/no to if a cell is in overflow. (Not yet implemented)
+
+ Still need to rewrite most of the code in PSMTabDragAssistant.
+ */
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.h b/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.h
new file mode 100644
index 000000000..a3a80982a
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.h
@@ -0,0 +1,101 @@
+//
+// PSMTabDragAssistant.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 4/10/06.
+// Copyright 2006 Positive Spin Media. All rights reserved.
+//
+
+/*
+ This class is a sigleton that manages the details of a tab drag and drop. The details were beginning to overwhelm me when keeping all of this in the control and cells :-)
+ */
+
+#import <Cocoa/Cocoa.h>
+#import "PSMTabBarControl.h"
+
+#define kPSMTabDragAnimationSteps 8
+
+@class PSMTabBarCell, PSMTabDragWindowController;
+
+@interface PSMTabDragAssistant : NSObject {
+ PSMTabBarControl *_sourceTabBar;
+ PSMTabBarControl *_destinationTabBar;
+ NSMutableSet *_participatingTabBars;
+ PSMTabBarCell *_draggedCell;
+ NSUInteger _draggedCellIndex; // for snap back
+ BOOL _isDragging;
+
+ // Support for dragging into new windows
+ PSMTabDragWindowController *_draggedTab;
+ PSMTabDragWindowController *_draggedView;
+ NSSize _dragWindowOffset;
+ NSTimer *_fadeTimer;
+ BOOL _centersDragWindows;
+ PSMTabBarTearOffStyle _currentTearOffStyle;
+
+ // Animation
+ NSTimer *_animationTimer;
+ NSMutableArray *_sineCurveWidths;
+ NSPoint _currentMouseLoc;
+ PSMTabBarCell *_targetCell;
+}
+
+// Creation/destruction
++ (PSMTabDragAssistant *)sharedDragAssistant;
+
+// Accessors
+- (PSMTabBarControl *)sourceTabBar;
+- (void)setSourceTabBar:(PSMTabBarControl *)tabBar;
+- (PSMTabBarControl *)destinationTabBar;
+- (void)setDestinationTabBar:(PSMTabBarControl *)tabBar;
+- (PSMTabBarCell *)draggedCell;
+- (void)setDraggedCell:(PSMTabBarCell *)cell;
+- (NSInteger)draggedCellIndex;
+- (void)setDraggedCellIndex:(NSInteger)value;
+- (BOOL)isDragging;
+- (void)setIsDragging:(BOOL)value;
+- (NSPoint)currentMouseLoc;
+- (void)setCurrentMouseLoc:(NSPoint)point;
+- (PSMTabBarCell *)targetCell;
+- (void)setTargetCell:(PSMTabBarCell *)cell;
+
+// Functionality
+- (void)startDraggingCell:(PSMTabBarCell *)cell fromTabBar:(PSMTabBarControl *)control withMouseDownEvent:(NSEvent *)event;
+- (void)draggingEnteredTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc;
+- (void)draggingUpdatedInTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc;
+- (void)draggingExitedTabBar:(PSMTabBarControl *)control;
+- (void)performDragOperation;
+- (void)draggedImageEndedAt:(NSPoint)aPoint operation:(NSDragOperation)operation;
+- (void)finishDrag;
+
+- (void)draggingBeganAt:(NSPoint)aPoint;
+- (void)draggingMovedTo:(NSPoint)aPoint;
+
+// Animation
+- (void)animateDrag:(NSTimer *)timer;
+- (void)calculateDragAnimationForTabBar:(PSMTabBarControl *)control;
+
+// Placeholder
+- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control withDraggedCell:(PSMTabBarCell *)cell;
+- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control;
+- (void)removeAllPlaceholdersFromTabBar:(PSMTabBarControl *)control;
+
+@end
+
+@interface PSMTabBarControl (DragAccessors)
+
+- (id<PSMTabStyle>)style;
+- (NSMutableArray *)cells;
+- (void)setControlView:(id)view;
+- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame;
+- (PSMTabBarCell *)lastVisibleTab;
+- (NSInteger)numberOfVisibleTabs;
+
+@end
+
+void CGContextCopyWindowCaptureContentsToRect(void *grafport, CGRect rect, NSInteger cid, NSInteger wid, NSInteger zero);
+OSStatus CGSSetWindowTransform(NSInteger cid, NSInteger wid, CGAffineTransform transform);
+
+@interface NSApplication (CoreGraphicsUndocumented)
+- (NSInteger)contextID;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.m b/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.m
new file mode 100644
index 000000000..0027f8736
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragAssistant.m
@@ -0,0 +1,850 @@
+//
+// PSMTabDragAssistant.m
+// PSMTabBarControl
+//
+// Created by John Pannell on 4/10/06.
+// Copyright 2006 Positive Spin Media. All rights reserved.
+//
+
+#import "PSMTabDragAssistant.h"
+#import "PSMTabBarCell.h"
+#import "PSMTabStyle.h"
+#import "PSMTabDragWindowController.h"
+#import "PSMOverflowPopUpButton.h"
+#import "PSMRolloverButton.h"
+
+#define PI 3.1417
+
+@interface PSMTabBarControl (Private)
+- (void)update:(BOOL)animate;
+@end
+
+@interface PSMTabDragAssistant (Private)
+- (NSImage *)_imageForViewOfCell:(PSMTabBarCell *)cell styleMask:(NSUInteger *)outMask;
+- (NSImage *)_miniwindowImageOfWindow:(NSWindow *)window;
+- (void)_expandWindow:(NSWindow *)window atPoint:(NSPoint)point;
+@end
+
+@implementation PSMTabDragAssistant
+
+static PSMTabDragAssistant *sharedDragAssistant = nil;
+
+#pragma mark -
+#pragma mark Creation/Destruction
+
++ (PSMTabDragAssistant *)sharedDragAssistant
+{
+ if (!sharedDragAssistant) {
+ sharedDragAssistant = [[PSMTabDragAssistant alloc] init];
+ }
+
+ return sharedDragAssistant;
+}
+
+- (id)init
+{
+ if ((self = [super init])) {
+ _sourceTabBar = nil;
+ _destinationTabBar = nil;
+ _participatingTabBars = [[NSMutableSet alloc] init];
+ _draggedCell = nil;
+ _animationTimer = nil;
+ _sineCurveWidths = [[NSMutableArray alloc] initWithCapacity:kPSMTabDragAnimationSteps];
+ _targetCell = nil;
+ _isDragging = NO;
+ }
+
+ return self;
+}
+
+#pragma mark -
+#pragma mark Accessors
+
+- (PSMTabBarControl *)sourceTabBar
+{
+ return _sourceTabBar;
+}
+
+- (void)setSourceTabBar:(PSMTabBarControl *)tabBar
+{
+ _sourceTabBar = tabBar;
+}
+
+- (PSMTabBarControl *)destinationTabBar
+{
+ return _destinationTabBar;
+}
+
+- (void)setDestinationTabBar:(PSMTabBarControl *)tabBar
+{
+ _destinationTabBar = tabBar;
+}
+
+- (PSMTabBarCell *)draggedCell
+{
+ return _draggedCell;
+}
+
+- (void)setDraggedCell:(PSMTabBarCell *)cell
+{
+ _draggedCell = cell;
+}
+
+- (NSInteger)draggedCellIndex
+{
+ return _draggedCellIndex;
+}
+
+- (void)setDraggedCellIndex:(NSInteger)value
+{
+ _draggedCellIndex = value;
+}
+
+- (BOOL)isDragging
+{
+ return _isDragging;
+}
+
+- (void)setIsDragging:(BOOL)value
+{
+ _isDragging = value;
+}
+
+- (NSPoint)currentMouseLoc
+{
+ return _currentMouseLoc;
+}
+
+- (void)setCurrentMouseLoc:(NSPoint)point
+{
+ _currentMouseLoc = point;
+}
+
+- (PSMTabBarCell *)targetCell
+{
+ return _targetCell;
+}
+
+- (void)setTargetCell:(PSMTabBarCell *)cell
+{
+ _targetCell = cell;
+}
+
+#pragma mark -
+#pragma mark Functionality
+
+- (void)startDraggingCell:(PSMTabBarCell *)cell fromTabBar:(PSMTabBarControl *)control withMouseDownEvent:(NSEvent *)event
+{
+ [self setIsDragging:YES];
+ [self setSourceTabBar:control];
+ [self setDestinationTabBar:control];
+ [_participatingTabBars addObject:control];
+ [self setDraggedCell:cell];
+ [self setDraggedCellIndex:[[control cells] indexOfObject:cell]];
+
+ NSRect cellFrame = [cell frame];
+ // list of widths for animation
+ NSInteger i;
+ CGFloat cellStepSize = ([control orientation] == PSMTabBarHorizontalOrientation) ? (cellFrame.size.width + 6) : (cellFrame.size.height + 1);
+ for (i = 0; i < kPSMTabDragAnimationSteps - 1; i++) {
+ NSInteger thisWidth = (NSInteger)(cellStepSize - ((cellStepSize / 2.0) + ((sin((PI / 2.0) + ((CGFloat)i / (CGFloat)kPSMTabDragAnimationSteps) * PI) * cellStepSize) / 2.0)));
+ [_sineCurveWidths addObject:[NSNumber numberWithInteger:thisWidth]];
+ }
+ [_sineCurveWidths addObject:[NSNumber numberWithInteger:([control orientation] == PSMTabBarHorizontalOrientation) ? cellFrame.size.width : cellFrame.size.height]];
+
+ // hide UI buttons
+ [[control overflowPopUpButton] setHidden:YES];
+ [[control addTabButton] setHidden:YES];
+
+ [[NSCursor closedHandCursor] set];
+
+ NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
+ NSImage *dragImage = [cell dragImage];
+ [[cell indicator] removeFromSuperview];
+ [self distributePlaceholdersInTabBar:control withDraggedCell:cell];
+
+ if ([control isFlipped]) {
+ cellFrame.origin.y += cellFrame.size.height;
+ }
+ [cell setHighlighted:NO];
+ NSSize offset = NSZeroSize;
+ [pboard declareTypes:[NSArray arrayWithObjects:@"PSMTabBarControlItemPBType", nil] owner:nil];
+ [pboard setString:[[NSNumber numberWithInteger:[[control cells] indexOfObject:cell]] stringValue] forType:@"PSMTabBarControlItemPBType"];
+ _animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / 30.0) target:self selector:@selector(animateDrag:) userInfo:nil repeats:YES];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:PSMTabDragDidBeginNotification object:nil];
+
+ //retain the control in case the drag operation causes the control to be released
+
+ if ([control delegate] && [[control delegate] respondsToSelector:@selector(tabView:shouldDropTabViewItem:inTabBar:)] &&
+ [[control delegate] tabView:[control tabView]
+ shouldDropTabViewItem:[[self draggedCell] representedObject]
+ inTabBar:nil]) {
+ _currentTearOffStyle = [control tearOffStyle];
+ _draggedTab = [[PSMTabDragWindowController alloc] initWithImage:dragImage styleMask:NSWindowStyleMaskBorderless tearOffStyle:_currentTearOffStyle];
+
+ cellFrame.origin.y -= cellFrame.size.height;
+ [control dragImage:[[NSImage alloc] initWithSize:NSMakeSize(1, 1)] at:cellFrame.origin offset:offset event:event pasteboard:pboard source:control slideBack:NO];
+ } else {
+ [control dragImage:dragImage at:cellFrame.origin offset:offset event:event pasteboard:pboard source:control slideBack:YES];
+ }
+}
+
+- (void)draggingEnteredTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc
+{
+ if (_currentTearOffStyle == PSMTabBarTearOffMiniwindow && ![self destinationTabBar]) {
+ [_draggedTab switchImages];
+ }
+
+ [self setDestinationTabBar:control];
+ [self setCurrentMouseLoc:mouseLoc];
+ // hide UI buttons
+ [[control overflowPopUpButton] setHidden:YES];
+ [[control addTabButton] setHidden:YES];
+ if ([[control cells] count] == 0 || ![[[control cells] objectAtIndex:0] isPlaceholder]) {
+ [self distributePlaceholdersInTabBar:control];
+ }
+ [_participatingTabBars addObject:control];
+
+ //tell the drag window to display only the header if there is one
+ if (_currentTearOffStyle == PSMTabBarTearOffAlphaWindow && _draggedView) {
+ if (_fadeTimer) {
+ [_fadeTimer invalidate];
+ }
+
+ [[_draggedTab window] orderFront:nil];
+ _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(fadeOutDragWindow:) userInfo:nil repeats:YES];
+ }
+}
+
+- (void)draggingUpdatedInTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc
+{
+ if ([self destinationTabBar] != control) {
+ [self setDestinationTabBar:control];
+ }
+ [self setCurrentMouseLoc:mouseLoc];
+}
+
+- (void)draggingExitedTabBar:(PSMTabBarControl *)control
+{
+ if ([[control delegate] respondsToSelector:@selector(tabView:shouldAllowTabViewItem:toLeaveTabBar:)] && ![[control delegate] tabView:[control tabView] shouldAllowTabViewItem:[[self draggedCell] representedObject] toLeaveTabBar:control]) {
+ return;
+ }
+
+ [self setDestinationTabBar:nil];
+ [self setCurrentMouseLoc:NSMakePoint(-1.0, -1.0)];
+
+ if (_fadeTimer) {
+ [_fadeTimer invalidate];
+ _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(fadeInDragWindow:) userInfo:nil repeats:YES];
+ } else if (_draggedTab) {
+ if (_currentTearOffStyle == PSMTabBarTearOffAlphaWindow) {
+ //create a new floating drag window
+ if (!_draggedView) {
+ NSUInteger styleMask;
+ NSImage *viewImage = [self _imageForViewOfCell:[self draggedCell] styleMask:&styleMask];
+
+ _draggedView = [[PSMTabDragWindowController alloc] initWithImage:viewImage styleMask:styleMask tearOffStyle:PSMTabBarTearOffAlphaWindow];
+ [[_draggedView window] setAlphaValue:0.0];
+ }
+
+ NSPoint windowOrigin = [[control window] frame].origin;
+
+ windowOrigin.x -= _dragWindowOffset.width;
+ windowOrigin.y += _dragWindowOffset.height;
+ [[_draggedView window] setFrameOrigin:windowOrigin];
+ [[_draggedView window] orderWindow:NSWindowBelow relativeTo:[[_draggedTab window] windowNumber]];
+ } else if (_currentTearOffStyle == PSMTabBarTearOffMiniwindow && ![_draggedTab alternateImage]) {
+ NSImage *image;
+ NSSize imageSize;
+ NSUInteger mask; //we don't need this but we can't pass nil in for the style mask, as some delegate implementations will crash
+
+ if (!(image = [self _miniwindowImageOfWindow:[control window]])) {
+ image = [[self _imageForViewOfCell:[self draggedCell] styleMask:&mask] copy];
+ }
+
+ imageSize = [image size];
+ [image setScalesWhenResized:YES];
+
+ if (imageSize.width > imageSize.height) {
+ [image setSize:NSMakeSize(125, 125 * (imageSize.height / imageSize.width))];
+ } else {
+ [image setSize:NSMakeSize(125 * (imageSize.width / imageSize.height), 125)];
+ }
+
+ [_draggedTab setAlternateImage:image];
+ }
+
+ //set the window's alpha mask to zero if the last tab is being dragged
+ //don't fade out the old window if the delegate doesn't respond to the new tab bar method, just to be safe
+ if ([[[self sourceTabBar] tabView] numberOfTabViewItems] == 1 && [self sourceTabBar] == control &&
+ [[[self sourceTabBar] delegate] respondsToSelector:@selector(tabView:newTabBarForDraggedTabViewItem:atPoint:)]) {
+ [[[self sourceTabBar] window] setAlphaValue:0.0];
+
+ if ([_sourceTabBar tearOffStyle] == PSMTabBarTearOffAlphaWindow) {
+ [[_draggedView window] setAlphaValue:kPSMTabDragWindowAlpha];
+ } else {
+ //#warning fix me - what should we do when the last tab is dragged as a miniwindow?
+ }
+ } else {
+ if ([_sourceTabBar tearOffStyle] == PSMTabBarTearOffAlphaWindow) {
+ _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(fadeInDragWindow:) userInfo:nil repeats:YES];
+ } else {
+ [_draggedTab switchImages];
+ _centersDragWindows = YES;
+ }
+ }
+ }
+}
+
+- (void)performDragOperation
+{
+ // move cell
+ NSUInteger destinationIndex = [[[self destinationTabBar] cells] indexOfObject:[self targetCell]];
+
+ //there is the slight possibility of the targetCell now being set properly, so avoid errors
+ if (destinationIndex >= [[[self destinationTabBar] cells] count]) {
+ destinationIndex = [[[self destinationTabBar] cells] count] - 1;
+ }
+
+ [[[self destinationTabBar] cells] replaceObjectAtIndex:destinationIndex withObject:[self draggedCell]];
+ [[self draggedCell] setControlView:[self destinationTabBar]];
+
+ // move actual NSTabViewItem
+ if ([self sourceTabBar] != [self destinationTabBar]) {
+ //remove the tracking rects and bindings registered on the old tab
+ [[self sourceTabBar] removeTrackingRect:[[self draggedCell] closeButtonTrackingTag]];
+ [[self sourceTabBar] removeTrackingRect:[[self draggedCell] cellTrackingTag]];
+ [[self sourceTabBar] removeTabForCell:[self draggedCell]];
+
+ NSUInteger i, insertIndex;
+ NSArray *cells = [[self destinationTabBar] cells];
+
+ //find the index of where the dragged cell was just dropped
+ for (i = 0, insertIndex = 0; (i < [cells count]) && ([cells objectAtIndex:i] != [self draggedCell]); i++, insertIndex++) {
+ if ([[cells objectAtIndex:i] isPlaceholder]) {
+ insertIndex--;
+ }
+ }
+
+ [[[self sourceTabBar] tabView] removeTabViewItem:[[self draggedCell] representedObject]];
+ [[[self destinationTabBar] tabView] insertTabViewItem:[[self draggedCell] representedObject] atIndex:insertIndex];
+
+ //calculate the position for the dragged cell
+ if ([[self destinationTabBar] automaticallyAnimates]) {
+ if (insertIndex > 0) {
+ NSRect cellRect = [[cells objectAtIndex:insertIndex - 1] frame];
+ cellRect.origin.x += cellRect.size.width;
+ [[self draggedCell] setFrame:cellRect];
+ }
+ }
+
+ //rebind the cell to the new control
+ [[self destinationTabBar] bindPropertiesForCell:[self draggedCell] andTabViewItem:[[self draggedCell] representedObject]];
+
+ //select the newly moved item in the destination tab view
+ [[[self destinationTabBar] tabView] selectTabViewItem:[[self draggedCell] representedObject]];
+ } else {
+ //have to do this before checking the index of a cell otherwise placeholders will be counted
+ [self removeAllPlaceholdersFromTabBar:[self sourceTabBar]];
+
+ //rearrange the tab view items
+ NSTabView *tabView = [[self sourceTabBar] tabView];
+ NSTabViewItem *item = [[self draggedCell] representedObject];
+ BOOL reselect = ([tabView selectedTabViewItem] == item);
+ NSArray *cells = [[self sourceTabBar] cells];
+ NSUInteger index;
+ //find the index of where the dragged cell was just dropped
+ for (index = 0; index < [cells count] && [cells objectAtIndex:index] != [self draggedCell]; index++) {
+ ;
+ }
+
+ //temporarily disable the delegate in order to move the tab to a different index
+ id tempDelegate = [tabView delegate];
+ [tabView setDelegate:nil];
+ [tabView removeTabViewItem:item];
+ [tabView insertTabViewItem:item atIndex:index];
+ if (reselect) {
+ [tabView selectTabViewItem:item];
+ }
+ [tabView setDelegate:tempDelegate];
+ }
+
+ if (([self sourceTabBar] != [self destinationTabBar] || [[[self sourceTabBar] cells] indexOfObject:[self draggedCell]] != _draggedCellIndex) && [[[self sourceTabBar] delegate] respondsToSelector:@selector(tabView:didDropTabViewItem:inTabBar:)]) {
+ [[[self sourceTabBar] delegate] tabView:[[self sourceTabBar] tabView] didDropTabViewItem:[[self draggedCell] representedObject] inTabBar:[self destinationTabBar]];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:PSMTabDragDidEndNotification object:nil];
+
+ [self finishDrag];
+}
+
+- (void)draggedImageEndedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
+{
+ if ([self isDragging]) { // means there was not a successful drop (performDragOperation)
+ id sourceDelegate = [[self sourceTabBar] delegate];
+
+ //split off the dragged tab into a new window
+ if ([self destinationTabBar] == nil && sourceDelegate && [sourceDelegate respondsToSelector:@selector(tabView:shouldDropTabViewItem:inTabBar:)] &&
+ [sourceDelegate tabView:[[self sourceTabBar] tabView]
+ shouldDropTabViewItem:[[self draggedCell] representedObject]
+ inTabBar:nil]
+ &&
+ [sourceDelegate respondsToSelector:@selector(tabView:newTabBarForDraggedTabViewItem:atPoint:)]) {
+ PSMTabBarControl *control = [sourceDelegate tabView:[[self sourceTabBar] tabView] newTabBarForDraggedTabViewItem:[[self draggedCell] representedObject] atPoint:aPoint];
+
+ if (control) {
+ //add the dragged tab to the new window
+ [[control cells] insertObject:[self draggedCell] atIndex:0];
+
+ //remove the tracking rects and bindings registered on the old tab
+ [[self sourceTabBar] removeTrackingRect:[[self draggedCell] closeButtonTrackingTag]];
+ [[self sourceTabBar] removeTrackingRect:[[self draggedCell] cellTrackingTag]];
+ [[self sourceTabBar] removeTabForCell:[self draggedCell]];
+
+ //rebind the cell to the new control
+ [control bindPropertiesForCell:[self draggedCell] andTabViewItem:[[self draggedCell] representedObject]];
+
+ [[self draggedCell] setControlView:control];
+
+ [[[self sourceTabBar] tabView] removeTabViewItem:[[self draggedCell] representedObject]];
+
+ [[control tabView] addTabViewItem:[[self draggedCell] representedObject]];
+ [control update:NO]; //make sure the new tab is set in the correct position
+
+ if (_currentTearOffStyle == PSMTabBarTearOffAlphaWindow) {
+ [[control window] makeKeyAndOrderFront:nil];
+ } else {
+ //center the window over where we ended dragging
+ [self _expandWindow:[control window] atPoint:[NSEvent mouseLocation]];
+ }
+
+ if ([sourceDelegate respondsToSelector:@selector(tabView:didDropTabViewItem:inTabBar:)]) {
+ [sourceDelegate tabView:[[self sourceTabBar] tabView] didDropTabViewItem:[[self draggedCell] representedObject] inTabBar:control];
+ }
+ } else {
+ NSLog(@"Delegate returned no control to add to.");
+ [[[self sourceTabBar] cells] insertObject:[self draggedCell] atIndex:[self draggedCellIndex]];
+ }
+ } else {
+ // put cell back
+ [[[self sourceTabBar] cells] insertObject:[self draggedCell] atIndex:[self draggedCellIndex]];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:PSMTabDragDidEndNotification object:nil];
+
+ [self finishDrag];
+ }
+}
+
+- (void)finishDrag
+{
+ if ([[[self sourceTabBar] tabView] numberOfTabViewItems] == 0 && [[[self sourceTabBar] delegate] respondsToSelector:@selector(tabView:closeWindowForLastTabViewItem:)]) {
+ [[[self sourceTabBar] delegate] tabView:[[self sourceTabBar] tabView] closeWindowForLastTabViewItem:[[self draggedCell] representedObject]];
+ }
+
+ if (_draggedTab) {
+ [[_draggedTab window] orderOut:nil];
+ _draggedTab = nil;
+ }
+
+ if (_draggedView) {
+ [[_draggedView window] orderOut:nil];
+ _draggedView = nil;
+ }
+
+ _centersDragWindows = NO;
+
+ [self setIsDragging:NO];
+ [self removeAllPlaceholdersFromTabBar:[self sourceTabBar]];
+ [self setSourceTabBar:nil];
+ [self setDestinationTabBar:nil];
+ NSEnumerator *e = [_participatingTabBars objectEnumerator];
+ PSMTabBarControl *tabBar;
+ while ((tabBar = [e nextObject])) {
+ [self removeAllPlaceholdersFromTabBar:tabBar];
+ }
+ [_participatingTabBars removeAllObjects];
+ [self setDraggedCell:nil];
+ [_animationTimer invalidate];
+ _animationTimer = nil;
+ [_sineCurveWidths removeAllObjects];
+ [self setTargetCell:nil];
+}
+
+- (void)draggingBeganAt:(NSPoint)aPoint
+{
+ if (_draggedTab) {
+ [[_draggedTab window] setFrameTopLeftPoint:aPoint];
+ [[_draggedTab window] orderFront:nil];
+
+ if ([[[self sourceTabBar] tabView] numberOfTabViewItems] == 1) {
+ [self draggingExitedTabBar:[self sourceTabBar]];
+ [[_draggedTab window] setAlphaValue:0.0];
+ }
+ }
+}
+
+- (void)draggingMovedTo:(NSPoint)aPoint
+{
+ if (_draggedTab) {
+ if (_centersDragWindows) {
+ if ([_draggedTab isAnimating]) {
+ return;
+ }
+
+ //Ignore aPoint, as it seems to give wacky values
+ NSRect frame = [[_draggedTab window] frame];
+ frame.origin = [NSEvent mouseLocation];
+ frame.origin.x -= frame.size.width / 2;
+ frame.origin.y -= frame.size.height / 2;
+ [[_draggedTab window] setFrame:frame display:NO];
+ } else {
+ [[_draggedTab window] setFrameTopLeftPoint:aPoint];
+ }
+
+ if (_draggedView) {
+ //move the view representation with the tab
+ //the relative position of the dragged view window will be different
+ //depending on the position of the tab bar relative to the controlled tab view
+
+ aPoint.y -= [[_draggedTab window] frame].size.height;
+ aPoint.x -= _dragWindowOffset.width;
+ aPoint.y += _dragWindowOffset.height;
+ [[_draggedView window] setFrameTopLeftPoint:aPoint];
+ }
+ }
+}
+
+- (void)fadeInDragWindow:(NSTimer *)timer
+{
+ CGFloat value = [[_draggedView window] alphaValue];
+ if (value >= kPSMTabDragWindowAlpha || _draggedTab == nil) {
+ [timer invalidate];
+ _fadeTimer = nil;
+ } else {
+ [[_draggedTab window] setAlphaValue:[[_draggedTab window] alphaValue] - kPSMTabDragAlphaInterval];
+ [[_draggedView window] setAlphaValue:value + kPSMTabDragAlphaInterval];
+ }
+}
+
+- (void)fadeOutDragWindow:(NSTimer *)timer
+{
+ CGFloat value = [[_draggedView window] alphaValue];
+ NSWindow *tabWindow = [_draggedTab window], *viewWindow = [_draggedView window];
+
+ if (value <= 0.0) {
+ [viewWindow setAlphaValue:0.0];
+ [tabWindow setAlphaValue:kPSMTabDragWindowAlpha];
+
+ [timer invalidate];
+ _fadeTimer = nil;
+ } else {
+ if ([tabWindow alphaValue] < kPSMTabDragWindowAlpha) {
+ [tabWindow setAlphaValue:[tabWindow alphaValue] + kPSMTabDragAlphaInterval];
+ }
+ [viewWindow setAlphaValue:value - kPSMTabDragAlphaInterval];
+ }
+}
+
+#pragma mark -
+#pragma mark Private
+
+- (NSImage *)_imageForViewOfCell:(PSMTabBarCell *)cell styleMask:(NSUInteger *)outMask
+{
+ PSMTabBarControl *control = [cell controlView];
+ NSImage *viewImage = nil;
+
+ if (outMask) {
+ *outMask = NSWindowStyleMaskBorderless;
+ }
+
+ if ([control delegate] && [[control delegate] respondsToSelector:@selector(tabView:imageForTabViewItem:offset:styleMask:)]) {
+ //get a custom image representation of the view to drag from the delegate
+ NSImage *tabImage = [_draggedTab image];
+ NSPoint drawPoint;
+ _dragWindowOffset = NSZeroSize;
+ viewImage = [[control delegate] tabView:[control tabView] imageForTabViewItem:[cell representedObject] offset:&_dragWindowOffset styleMask:outMask];
+ [viewImage lockFocus];
+
+ //draw the tab into the returned window, that way we don't have two windows being dragged (this assumes the tab will be on the window)
+ drawPoint = NSMakePoint(_dragWindowOffset.width, [viewImage size].height - _dragWindowOffset.height);
+
+ if ([control orientation] == PSMTabBarHorizontalOrientation) {
+ drawPoint.y += [[control style] tabCellHeight] - [tabImage size].height;
+ _dragWindowOffset.height -= [[control style] tabCellHeight] - [tabImage size].height;
+ } else {
+ drawPoint.x += [control frame].size.width - [tabImage size].width;
+ }
+
+ [tabImage drawAtPoint:drawPoint fromRect:NSZeroRect operation:NSCompositingOperationSourceOver fraction:1.0];
+
+ [viewImage unlockFocus];
+ } else {
+ //the delegate doesn't give a custom image, so use an image of the view
+ NSView *tabView = [[cell representedObject] view];
+ viewImage = [[NSImage alloc] initWithSize:[tabView frame].size];
+ [viewImage lockFocus];
+ [tabView drawRect:[tabView bounds]];
+ [viewImage unlockFocus];
+ }
+
+ if (*outMask | NSWindowStyleMaskBorderless) {
+ _dragWindowOffset.height += 22;
+ }
+
+ return viewImage;
+}
+
+- (NSImage *)_miniwindowImageOfWindow:(NSWindow *)window
+{
+ NSRect rect = [window frame];
+ NSImage *image = [[NSImage alloc] initWithSize:rect.size];
+ [image lockFocus];
+ rect.origin = NSZeroPoint;
+ CGContextCopyWindowCaptureContentsToRect([[NSGraphicsContext currentContext] graphicsPort], *(CGRect *)&rect, [NSApp contextID], [window windowNumber], 0);
+ [image unlockFocus];
+
+ return image;
+}
+
+- (void)_expandWindow:(NSWindow *)window atPoint:(NSPoint)point
+{
+ NSRect frame = [window frame];
+ [window setFrameTopLeftPoint:NSMakePoint(point.x - frame.size.width / 2, point.y + frame.size.height / 2)];
+ [window setAlphaValue:0.0];
+ [window makeKeyAndOrderFront:nil];
+
+ NSAnimation *animation = [[NSAnimation alloc] initWithDuration:0.25 animationCurve:NSAnimationEaseInOut];
+ [animation setAnimationBlockingMode:NSAnimationNonblocking];
+ [animation setCurrentProgress:0.1];
+ [animation startAnimation];
+ NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(_expandWindowTimerFired:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:window, @"Window", animation, @"Animation", nil] repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
+}
+
+- (void)_expandWindowTimerFired:(NSTimer *)timer
+{
+ NSWindow *window = [[timer userInfo] objectForKey:@"Window"];
+ NSAnimation *animation = [[timer userInfo] objectForKey:@"Animation"];
+ CGAffineTransform transform;
+ NSPoint translation;
+ NSRect winFrame = [window frame];
+
+ translation.x = (winFrame.size.width / 2.0);
+ translation.y = (winFrame.size.height / 2.0);
+ transform = CGAffineTransformMakeTranslation(translation.x, translation.y);
+ transform = CGAffineTransformScale(transform, 1.0 / [animation currentValue], 1.0 / [animation currentValue]);
+ transform = CGAffineTransformTranslate(transform, -translation.x, -translation.y);
+
+ translation.x = -winFrame.origin.x;
+ translation.y = winFrame.origin.y + winFrame.size.height - [[NSScreen mainScreen] frame].size.height;
+
+ transform = CGAffineTransformTranslate(transform, translation.x, translation.y);
+
+ CGSSetWindowTransform([NSApp contextID], [window windowNumber], transform);
+
+ [window setAlphaValue:[animation currentValue]];
+
+ if (![animation isAnimating]) {
+ [timer invalidate];
+ }
+}
+
+#pragma mark -
+#pragma mark Animation
+
+- (void)animateDrag:(NSTimer *)timer
+{
+ NSEnumerator *e = [[_participatingTabBars copy] objectEnumerator];
+ PSMTabBarControl *tabBar;
+ while ((tabBar = [e nextObject])) {
+ [self calculateDragAnimationForTabBar:tabBar];
+ [[NSRunLoop currentRunLoop] performSelector:@selector(display) target:tabBar argument:nil order:1 modes:[NSArray arrayWithObjects:@"NSEventTrackingRunLoopMode", @"NSDefaultRunLoopMode", nil]];
+ }
+}
+
+- (void)calculateDragAnimationForTabBar:(PSMTabBarControl *)control
+{
+ BOOL removeFlag = YES;
+ NSMutableArray *cells = [control cells];
+ NSInteger i, cellCount = [cells count];
+ CGFloat position = [control orientation] == PSMTabBarHorizontalOrientation ? [[control style] leftMarginForTabBarControl] : [[control style] topMarginForTabBarControl];
+
+ // identify target cell
+ // mouse at beginning of tabs
+ NSPoint mouseLoc = [self currentMouseLoc];
+ if ([self destinationTabBar] == control) {
+ removeFlag = NO;
+ if (mouseLoc.x < [[control style] leftMarginForTabBarControl]) {
+ [self setTargetCell:[cells objectAtIndex:0]];
+ } else {
+ NSRect overCellRect;
+ PSMTabBarCell *overCell = [control cellForPoint:mouseLoc cellFrame:&overCellRect];
+ if (overCell) {
+ // mouse among cells - placeholder
+ if ([overCell isPlaceholder]) {
+ [self setTargetCell:overCell];
+ } else if ([control orientation] == PSMTabBarHorizontalOrientation) {
+ // non-placeholders - horizontal orientation
+ if (mouseLoc.x < (overCellRect.origin.x + (overCellRect.size.width / 2.0))) {
+ // mouse on left side of cell
+ [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] - 1)]];
+ } else {
+ // mouse on right side of cell
+ [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] + 1)]];
+ }
+ } else {
+ // non-placeholders - vertical orientation
+ if (mouseLoc.y < (overCellRect.origin.y + (overCellRect.size.height / 2.0))) {
+ // mouse on top of cell
+ [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] - 1)]];
+ } else {
+ // mouse on bottom of cell
+ [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] + 1)]];
+ }
+ }
+ } else {
+ // out at end - must find proper cell (could be more in overflow menu)
+ [self setTargetCell:[control lastVisibleTab]];
+ }
+ }
+ } else {
+ [self setTargetCell:nil];
+ }
+
+ for (i = 0; i < cellCount; i++) {
+ PSMTabBarCell *cell = [cells objectAtIndex:i];
+ NSRect newRect = [cell frame];
+ if (![cell isInOverflowMenu]) {
+ if ([cell isPlaceholder]) {
+ if (cell == [self targetCell]) {
+ [cell setCurrentStep:([cell currentStep] + 1)];
+ } else {
+ [cell setCurrentStep:([cell currentStep] - 1)];
+ if ([cell currentStep] > 0) {
+ removeFlag = NO;
+ }
+ }
+
+ if ([control orientation] == PSMTabBarHorizontalOrientation) {
+ newRect.size.width = [[_sineCurveWidths objectAtIndex:[cell currentStep]] integerValue];
+ } else {
+ newRect.size.height = [[_sineCurveWidths objectAtIndex:[cell currentStep]] integerValue];
+ }
+ }
+ } else {
+ break;
+ }
+
+ if ([control orientation] == PSMTabBarHorizontalOrientation) {
+ newRect.origin.x = position;
+ position += newRect.size.width;
+ } else {
+ newRect.origin.y = position;
+ position += newRect.size.height;
+ }
+ [cell setFrame:newRect];
+ if ([cell indicator]) {
+ [[cell indicator] setFrame:[[control style] indicatorRectForTabCell:cell]];
+ }
+ }
+ if (removeFlag) {
+ [_participatingTabBars removeObject:control];
+ [self removeAllPlaceholdersFromTabBar:control];
+ }
+}
+
+#pragma mark -
+#pragma mark Placeholders
+
+- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control withDraggedCell:(PSMTabBarCell *)cell
+{
+ // called upon first drag - must distribute placeholders
+ [self distributePlaceholdersInTabBar:control];
+
+ NSMutableArray *cells = [control cells];
+
+ // replace dragged cell with a placeholder, and clean up surrounding cells
+ NSInteger cellIndex = [cells indexOfObject:cell];
+ PSMTabBarCell *pc = [[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:YES inControlView:control];
+ [cells replaceObjectAtIndex:cellIndex withObject:pc];
+ [cells removeObjectAtIndex:(cellIndex + 1)];
+ [cells removeObjectAtIndex:(cellIndex - 1)];
+
+ if (cellIndex - 2 >= 0) {
+ pc = [cells objectAtIndex:cellIndex - 2];
+ [pc setTabState:~[pc tabState] & PSMTab_RightIsSelectedMask];
+ }
+}
+
+- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control
+{
+ NSUInteger i, numVisibleTabs = [control numberOfVisibleTabs];
+ for (i = 0; i < numVisibleTabs; i++) {
+ PSMTabBarCell *pc = [[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:NO inControlView:control];
+ [[control cells] insertObject:pc atIndex:(2 * i)];
+ }
+
+ PSMTabBarCell *pc = [[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:NO inControlView:control];
+ if ([[control cells] count] > (2 * numVisibleTabs)) {
+ [[control cells] insertObject:pc atIndex:(2 * numVisibleTabs)];
+ } else {
+ [[control cells] addObject:pc];
+ }
+}
+
+- (void)removeAllPlaceholdersFromTabBar:(PSMTabBarControl *)control
+{
+ NSInteger i, cellCount = [[control cells] count];
+ for (i = (cellCount - 1); i >= 0; i--) {
+ PSMTabBarCell *cell = [[control cells] objectAtIndex:i];
+ if ([cell isPlaceholder]) {
+ [control removeTabForCell:cell];
+ }
+ }
+ // redraw
+ [control update:NO];
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ //[super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:_sourceTabBar forKey:@"sourceTabBar"];
+ [aCoder encodeObject:_destinationTabBar forKey:@"destinationTabBar"];
+ [aCoder encodeObject:_participatingTabBars forKey:@"participatingTabBars"];
+ [aCoder encodeObject:_draggedCell forKey:@"draggedCell"];
+ [aCoder encodeInteger:_draggedCellIndex forKey:@"draggedCellIndex"];
+ [aCoder encodeBool:_isDragging forKey:@"isDragging"];
+ [aCoder encodeObject:_animationTimer forKey:@"animationTimer"];
+ [aCoder encodeObject:_sineCurveWidths forKey:@"sineCurveWidths"];
+ [aCoder encodePoint:_currentMouseLoc forKey:@"currentMouseLoc"];
+ [aCoder encodeObject:_targetCell forKey:@"targetCell"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ //self = [super initWithCoder:aDecoder];
+ //if (self) {
+ if ([aDecoder allowsKeyedCoding]) {
+ _sourceTabBar = [aDecoder decodeObjectForKey:@"sourceTabBar"];
+ _destinationTabBar = [aDecoder decodeObjectForKey:@"destinationTabBar"];
+ _participatingTabBars = [aDecoder decodeObjectForKey:@"participatingTabBars"];
+ _draggedCell = [aDecoder decodeObjectForKey:@"draggedCell"];
+ _draggedCellIndex = [aDecoder decodeIntegerForKey:@"draggedCellIndex"];
+ _isDragging = [aDecoder decodeBoolForKey:@"isDragging"];
+ _animationTimer = [aDecoder decodeObjectForKey:@"animationTimer"];
+ _sineCurveWidths = [aDecoder decodeObjectForKey:@"sineCurveWidths"];
+ _currentMouseLoc = [aDecoder decodePointForKey:@"currentMouseLoc"];
+ _targetCell = [aDecoder decodeObjectForKey:@"targetCell"];
+ }
+ //}
+ return self;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragView.h b/frontends/cocoa/PSMTabBarControl/PSMTabDragView.h
new file mode 100644
index 000000000..d106f5106
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragView.h
@@ -0,0 +1,21 @@
+//
+// PSMTabDragView.h
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/17/07.
+// Copyright 2007 Kent Sutherland. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface PSMTabDragView : NSView {
+ NSImage *_image;
+ NSImage *_alternateImage;
+ CGFloat _alpha;
+}
+- (void)setFadeValue:(CGFloat)value;
+- (NSImage *)image;
+- (void)setImage:(NSImage *)image;
+- (NSImage *)alternateImage;
+- (void)setAlternateImage:(NSImage *)image;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragView.m b/frontends/cocoa/PSMTabBarControl/PSMTabDragView.m
new file mode 100644
index 000000000..4f6ce9131
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragView.m
@@ -0,0 +1,60 @@
+//
+// PSMTabDragView.m
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/17/07.
+// Copyright 2007 Kent Sutherland. All rights reserved.
+//
+
+#import "PSMTabDragView.h"
+
+@implementation PSMTabDragView
+
+- (id)initWithFrame:(NSRect)frame
+{
+ if ((self = [super initWithFrame:frame])) {
+ _alpha = 1.0;
+ }
+ return self;
+}
+
+- (void)drawRect:(NSRect)rect
+{
+ //1.0 fade means show the primary image
+ //0.0 fade means show the secondary image
+ CGFloat primaryAlpha = _alpha + 0.001f, alternateAlpha = 1.001f - _alpha;
+ NSRect srcRect;
+ srcRect.origin = NSZeroPoint;
+ srcRect.size = [_image size];
+
+ [_image drawInRect:[self bounds] fromRect:srcRect operation:NSCompositingOperationSourceOver fraction:primaryAlpha];
+ srcRect.size = [_alternateImage size];
+ [_alternateImage drawInRect:[self bounds] fromRect:srcRect operation:NSCompositingOperationSourceOver fraction:alternateAlpha];
+}
+
+- (void)setFadeValue:(CGFloat)value
+{
+ _alpha = value;
+}
+
+- (NSImage *)image
+{
+ return _image;
+}
+
+- (void)setImage:(NSImage *)image
+{
+ _image = image;
+}
+
+- (NSImage *)alternateImage
+{
+ return _alternateImage;
+}
+
+- (void)setAlternateImage:(NSImage *)image
+{
+ _alternateImage = image;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.h b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.h
new file mode 100644
index 000000000..15d066236
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.h
@@ -0,0 +1,20 @@
+//
+// PSMTabDragWindow.h
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/1/06.
+// Copyright 2006 Kent Sutherland. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@class PSMTabDragView;
+
+@interface PSMTabDragWindow : NSWindow {
+ PSMTabDragView *_dragView;
+}
++ (PSMTabDragWindow *)dragWindowWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask;
+
+- (id)initWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask;
+- (PSMTabDragView *)dragView;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.m b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.m
new file mode 100644
index 000000000..cae9280f1
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindow.m
@@ -0,0 +1,51 @@
+//
+// PSMTabDragWindow.m
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/1/06.
+// Copyright 2006 Kent Sutherland. All rights reserved.
+//
+
+#import "PSMTabDragWindow.h"
+#import "PSMTabDragView.h"
+
+@implementation PSMTabDragWindow
+
++ (PSMTabDragWindow *)dragWindowWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask
+{
+ return [[PSMTabDragWindow alloc] initWithImage:image styleMask:styleMask];
+}
+
+- (id)initWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask
+{
+ NSSize size = [image size];
+
+ if ((self = [super initWithContentRect:NSMakeRect(0, 0, size.width, size.height) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO])) {
+ _dragView = [[PSMTabDragView alloc] initWithFrame:NSMakeRect(0, 0, size.width, size.height)];
+ [self setContentView:_dragView];
+ [self setLevel:NSStatusWindowLevel];
+ [self setIgnoresMouseEvents:YES];
+ [self setOpaque:NO];
+
+ [_dragView setImage:image];
+
+ //Set the size of the window to be the exact size of the drag image
+ NSRect windowFrame = [self frame];
+ windowFrame.origin.y += windowFrame.size.height - size.height;
+ windowFrame.size = size;
+
+ if (styleMask | NSWindowStyleMaskBorderless) {
+ windowFrame.size.height += 22;
+ }
+
+ [self setFrame:windowFrame display:YES];
+ }
+ return self;
+}
+
+- (PSMTabDragView *)dragView
+{
+ return _dragView;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.h b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.h
new file mode 100644
index 000000000..bc67622e7
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.h
@@ -0,0 +1,33 @@
+//
+// PSMTabDragWindowController.h
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/18/07.
+// Copyright 2007 Kent Sutherland. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "PSMTabBarControl.h"
+
+#define kPSMTabDragWindowAlpha 0.75
+#define kPSMTabDragAlphaInterval 0.15
+
+@class PSMTabDragView;
+
+@interface PSMTabDragWindowController : NSWindowController {
+ PSMTabBarTearOffStyle _tearOffStyle;
+ PSMTabDragView *_view;
+ NSAnimation *_animation;
+ NSTimer *_timer;
+
+ BOOL _showingAlternate;
+ NSRect _originalWindowFrame;
+}
+- (id)initWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask tearOffStyle:(PSMTabBarTearOffStyle)tearOffStyle;
+
+- (NSImage *)image;
+- (NSImage *)alternateImage;
+- (void)setAlternateImage:(NSImage *)image;
+- (BOOL)isAnimating;
+- (void)switchImages;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.m b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.m
new file mode 100644
index 000000000..78b0fcb2c
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabDragWindowController.m
@@ -0,0 +1,109 @@
+//
+// PSMTabDragWindowController.m
+// PSMTabBarControl
+//
+// Created by Kent Sutherland on 6/18/07.
+// Copyright 2007 Kent Sutherland. All rights reserved.
+//
+
+#import "PSMTabDragWindowController.h"
+#import "PSMTabDragWindow.h"
+#import "PSMTabDragView.h"
+
+@implementation PSMTabDragWindowController
+
+- (id)initWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask tearOffStyle:(PSMTabBarTearOffStyle)tearOffStyle
+{
+ PSMTabDragWindow *window = [PSMTabDragWindow dragWindowWithImage:image styleMask:styleMask];
+ if ((self = [super initWithWindow:window])) {
+ _view = [window dragView];
+ _tearOffStyle = tearOffStyle;
+
+ if (tearOffStyle == PSMTabBarTearOffMiniwindow) {
+ [window setBackgroundColor:[NSColor clearColor]];
+ [window setHasShadow:YES];
+ }
+
+ [window setAlphaValue:kPSMTabDragWindowAlpha];
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [_timer invalidate];
+}
+
+- (NSImage *)image
+{
+ return [_view image];
+}
+
+- (NSImage *)alternateImage
+{
+ return [_view alternateImage];
+}
+
+- (void)setAlternateImage:(NSImage *)image
+{
+ [_view setAlternateImage:image];
+}
+
+- (BOOL)isAnimating
+{
+ return _animation != nil;
+}
+
+- (void)switchImages
+{
+ if (_tearOffStyle != PSMTabBarTearOffMiniwindow || ![_view alternateImage]) {
+ return;
+ }
+
+ CGFloat progress = 0;
+ _showingAlternate = !_showingAlternate;
+
+ if (_animation) {
+ //An animation already exists, get the current progress
+ progress = 1.0f - [_animation currentProgress];
+ [_animation stopAnimation];
+ }
+
+ //begin animating
+ _animation = [[NSAnimation alloc] initWithDuration:0.25 animationCurve:NSAnimationEaseInOut];
+ [_animation setAnimationBlockingMode:NSAnimationNonblocking];
+ [_animation setCurrentProgress:progress];
+ [_animation startAnimation];
+
+ _originalWindowFrame = [[self window] frame];
+
+ if (_timer) {
+ [_timer invalidate];
+ }
+ _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f / 30.0f target:self selector:@selector(animateTimer:) userInfo:nil repeats:YES];
+}
+
+- (void)animateTimer:(NSTimer *)timer
+{
+ NSRect frame = _originalWindowFrame;
+ NSImage *currentImage = _showingAlternate ? [_view alternateImage] : [_view image];
+ NSSize size = [currentImage size];
+ NSPoint mousePoint = [NSEvent mouseLocation];
+ CGFloat animationValue = [_animation currentValue];
+
+ frame.size.width = _originalWindowFrame.size.width + (size.width - _originalWindowFrame.size.width) * animationValue;
+ frame.size.height = _originalWindowFrame.size.height + (size.height - _originalWindowFrame.size.height) * animationValue;
+ frame.origin.x = mousePoint.x - (frame.size.width / 2);
+ frame.origin.y = mousePoint.y - (frame.size.height / 2);
+
+ [_view setFadeValue:_showingAlternate ? 1.0f - animationValue : animationValue];
+ [[self window] setFrame:frame display:YES];
+
+ if (![_animation isAnimating]) {
+ _animation = nil;
+ [timer invalidate];
+ _timer = nil;
+ }
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMTabStyle.h b/frontends/cocoa/PSMTabBarControl/PSMTabStyle.h
new file mode 100644
index 000000000..ca3717435
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMTabStyle.h
@@ -0,0 +1,57 @@
+//
+// PSMTabStyle.h
+// PSMTabBarControl
+//
+// Created by John Pannell on 2/17/06.
+// Copyright 2006 Positive Spin Media. All rights reserved.
+//
+
+/*
+ Protocol to be observed by all style delegate objects. These objects handle the drawing responsibilities for PSMTabBarCell; once the control has been assigned a style, the background and cells draw consistent with that style. Design pattern and implementation by David Smith, Seth Willits, and Chris Forsythe, all touch up and errors by John P. :-)
+ */
+
+#import "PSMTabBarCell.h"
+#import "PSMTabBarControl.h"
+
+@protocol PSMTabStyle <NSObject>
+
+// identity
+- (NSString *)name;
+
+// control specific parameters
+- (CGFloat)leftMarginForTabBarControl;
+- (CGFloat)rightMarginForTabBarControl;
+- (CGFloat)topMarginForTabBarControl;
+- (void)setOrientation:(PSMTabBarOrientation)value;
+
+// add tab button
+- (NSImage *)addTabButtonImage;
+- (NSImage *)addTabButtonPressedImage;
+- (NSImage *)addTabButtonRolloverImage;
+
+// cell specific parameters
+- (NSRect)dragRectForTabCell:(PSMTabBarCell *)cell orientation:(PSMTabBarOrientation)orientation;
+- (NSRect)closeButtonRectForTabCell:(PSMTabBarCell *)cell withFrame:(NSRect)cellFrame;
+- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell;
+- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell;
+- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell;
+- (CGFloat)minimumWidthOfTabCell:(PSMTabBarCell *)cell;
+- (CGFloat)desiredWidthOfTabCell:(PSMTabBarCell *)cell;
+- (CGFloat)tabCellHeight;
+
+// cell values
+- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell;
+- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell;
+
+// drawing
+- (void)drawTabCell:(PSMTabBarCell *)cell;
+- (void)drawBackgroundInRect:(NSRect)rect;
+- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect;
+
+@end
+
+@interface PSMTabBarControl (StyleAccessors)
+
+- (NSMutableArray *)cells;
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.h b/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.h
new file mode 100644
index 000000000..319fd729d
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.h
@@ -0,0 +1,29 @@
+//
+// PSMUnifiedTabStyle.h
+// --------------------
+//
+// Created by Keith Blount on 30/04/2006.
+// Copyright 2006 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "PSMTabStyle.h"
+
+@interface PSMUnifiedTabStyle : NSObject <PSMTabStyle> {
+ NSImage *unifiedCloseButton;
+ NSImage *unifiedCloseButtonDown;
+ NSImage *unifiedCloseButtonOver;
+ NSImage *unifiedCloseDirtyButton;
+ NSImage *unifiedCloseDirtyButtonDown;
+ NSImage *unifiedCloseDirtyButtonOver;
+ NSImage *_addTabButtonImage;
+ NSImage *_addTabButtonPressedImage;
+ NSImage *_addTabButtonRolloverImage;
+
+ NSDictionary *_objectCountStringAttributes;
+
+ CGFloat leftMargin;
+ PSMTabBarControl *tabBar;
+}
+- (void)setLeftMarginForTabBarControl:(CGFloat)margin;
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.m b/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.m
new file mode 100644
index 000000000..687c7792c
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/PSMUnifiedTabStyle.m
@@ -0,0 +1,581 @@
+//
+// PSMUnifiedTabStyle.m
+// --------------------
+//
+// Created by Keith Blount on 30/04/2006.
+// Copyright 2006 __MyCompanyName__. All rights reserved.
+//
+
+#import "PSMUnifiedTabStyle.h"
+#import "PSMTabBarCell.h"
+#import "PSMTabBarControl.h"
+#import "NSBezierPath_AMShading.h"
+
+#define kPSMUnifiedObjectCounterRadius 7.0
+#define kPSMUnifiedCounterMinWidth 20
+
+@interface PSMUnifiedTabStyle (Private)
+- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView *)controlView;
+@end
+
+@implementation PSMUnifiedTabStyle
+
+- (NSString *)name
+{
+ return @"Unified";
+}
+
+#pragma mark -
+#pragma mark Creation/Destruction
+
+- (id)init
+{
+ if ((self = [super init])) {
+ unifiedCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front"]];
+ unifiedCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Pressed"]];
+ unifiedCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Rollover"]];
+
+ unifiedCloseDirtyButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front"]];
+ unifiedCloseDirtyButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front_Pressed"]];
+ unifiedCloseDirtyButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front_Rollover"]];
+
+ _addTabButtonImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNew"]];
+ _addTabButtonPressedImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewPressed"]];
+ _addTabButtonRolloverImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewRollover"]];
+
+ _objectCountStringAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:[[NSFontManager sharedFontManager] convertFont:[NSFont fontWithName:@"Helvetica" size:11.0] toHaveTrait:NSBoldFontMask], NSFontAttributeName,
+ [[NSColor whiteColor] colorWithAlphaComponent:0.85], NSForegroundColorAttributeName,
+ nil, nil];
+
+ leftMargin = 5.0;
+ }
+ return self;
+}
+
+#pragma mark -
+#pragma mark Control Specific
+
+- (void)setLeftMarginForTabBarControl:(CGFloat)margin
+{
+ leftMargin = margin;
+}
+
+- (CGFloat)leftMarginForTabBarControl
+{
+ return leftMargin;
+}
+
+- (CGFloat)rightMarginForTabBarControl
+{
+ return 24.0f;
+}
+
+- (CGFloat)topMarginForTabBarControl
+{
+ return 10.0f;
+}
+
+- (void)setOrientation:(PSMTabBarOrientation)value
+{
+}
+
+#pragma mark -
+#pragma mark Add Tab Button
+
+- (NSImage *)addTabButtonImage
+{
+ return _addTabButtonImage;
+}
+
+- (NSImage *)addTabButtonPressedImage
+{
+ return _addTabButtonPressedImage;
+}
+
+- (NSImage *)addTabButtonRolloverImage
+{
+ return _addTabButtonRolloverImage;
+}
+
+#pragma mark -
+#pragma mark Cell Specific
+
+- (NSRect)dragRectForTabCell:(PSMTabBarCell *)cell orientation:(PSMTabBarOrientation)orientation
+{
+ NSRect dragRect = [cell frame];
+ dragRect.size.width++;
+ return dragRect;
+}
+
+- (NSRect)closeButtonRectForTabCell:(PSMTabBarCell *)cell withFrame:(NSRect)cellFrame
+{
+ if ([cell hasCloseButton] == NO) {
+ return NSZeroRect;
+ }
+
+ NSRect result;
+ result.size = [unifiedCloseButton size];
+ result.origin.x = cellFrame.origin.x + MARGIN_X;
+ result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0;
+
+ return result;
+}
+
+- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell
+{
+ NSRect cellFrame = [cell frame];
+
+ if ([cell hasIcon] == NO) {
+ return NSZeroRect;
+ }
+
+ NSRect result;
+ result.size = NSMakeSize(kPSMTabBarIconWidth, kPSMTabBarIconWidth);
+ result.origin.x = cellFrame.origin.x + MARGIN_X;
+ result.origin.y = cellFrame.origin.y + MARGIN_Y - 1.0;
+
+ if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
+ result.origin.x += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
+ }
+
+ return result;
+}
+
+- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell
+{
+ NSRect cellFrame = [cell frame];
+
+ if ([[cell indicator] isHidden]) {
+ return NSZeroRect;
+ }
+
+ NSRect result;
+ result.size = NSMakeSize(kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth);
+ result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - kPSMTabBarIndicatorWidth;
+ result.origin.y = cellFrame.origin.y + MARGIN_Y - 1.0;
+
+ return result;
+}
+
+- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell
+{
+ NSRect cellFrame = [cell frame];
+
+ if ([cell count] == 0) {
+ return NSZeroRect;
+ }
+
+ CGFloat countWidth = [[self attributedObjectCountValueForTabCell:cell] size].width;
+ countWidth += (2 * kPSMUnifiedObjectCounterRadius - 6.0);
+ if (countWidth < kPSMUnifiedCounterMinWidth) {
+ countWidth = kPSMUnifiedCounterMinWidth;
+ }
+
+ NSRect result;
+ result.size = NSMakeSize(countWidth, 2 * kPSMUnifiedObjectCounterRadius); // temp
+ result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - result.size.width;
+ result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0;
+
+ if (![[cell indicator] isHidden]) {
+ result.origin.x -= kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding;
+ }
+
+ return result;
+}
+
+- (CGFloat)minimumWidthOfTabCell:(PSMTabBarCell *)cell
+{
+ CGFloat resultWidth = 0.0;
+
+ // left margin
+ resultWidth = MARGIN_X;
+
+ // close button?
+ if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
+ resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
+ }
+
+ // icon?
+ if ([cell hasIcon]) {
+ resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding;
+ }
+
+ // the label
+ resultWidth += kPSMMinimumTitleWidth;
+
+ // object counter?
+ if ([cell count] > 0) {
+ resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding;
+ }
+
+ // indicator?
+ if ([[cell indicator] isHidden] == NO) {
+ resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth;
+ }
+
+ // right margin
+ resultWidth += MARGIN_X;
+
+ return ceil(resultWidth);
+}
+
+- (CGFloat)desiredWidthOfTabCell:(PSMTabBarCell *)cell
+{
+ CGFloat resultWidth = 0.0;
+
+ // left margin
+ resultWidth = MARGIN_X;
+
+ // close button?
+ if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
+ resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
+ }
+
+ // icon?
+ if ([cell hasIcon]) {
+ resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding;
+ }
+
+ // the label
+ resultWidth += [[cell attributedStringValue] size].width;
+
+ // object counter?
+ if ([cell count] > 0) {
+ resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding;
+ }
+
+ // indicator?
+ if ([[cell indicator] isHidden] == NO) {
+ resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth;
+ }
+
+ // right margin
+ resultWidth += MARGIN_X;
+
+ return ceil(resultWidth);
+}
+
+- (CGFloat)tabCellHeight
+{
+ return kPSMTabBarControlHeight;
+}
+
+#pragma mark -
+#pragma mark Cell Values
+
+- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell
+{
+ NSString *contents = [NSString stringWithFormat:@"%lu", (unsigned long)[cell count]];
+ return [[NSMutableAttributedString alloc] initWithString:contents attributes:_objectCountStringAttributes];
+}
+
+- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell
+{
+ NSMutableAttributedString *attrStr;
+ NSString *contents = [cell stringValue];
+ attrStr = [[NSMutableAttributedString alloc] initWithString:contents];
+ NSRange range = NSMakeRange(0, [contents length]);
+
+ [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range];
+
+ // Paragraph Style for Truncating Long Text
+ static NSMutableParagraphStyle *TruncatingTailParagraphStyle = nil;
+ if (!TruncatingTailParagraphStyle) {
+ TruncatingTailParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
+ [TruncatingTailParagraphStyle setLineBreakMode:NSLineBreakByTruncatingTail];
+ }
+ [attrStr addAttribute:NSParagraphStyleAttributeName value:TruncatingTailParagraphStyle range:range];
+
+ return attrStr;
+}
+
+#pragma mark -
+#pragma mark---- drawing ----
+
+- (void)drawTabCell:(PSMTabBarCell *)cell
+{
+ NSRect cellFrame = [cell frame];
+
+ NSToolbar *toolbar = [[[cell controlView] window] toolbar];
+ BOOL showsBaselineSeparator = (toolbar && [toolbar respondsToSelector:@selector(showsBaselineSeparator)] && [toolbar showsBaselineSeparator]);
+ if (!showsBaselineSeparator) {
+ cellFrame.origin.y += 1.0;
+ cellFrame.size.height -= 1.0;
+ }
+
+ NSColor *lineColor = nil;
+ NSBezierPath *bezier = [NSBezierPath bezierPath];
+ lineColor = [NSColor colorWithCalibratedWhite:0.576 alpha:1.0];
+
+ if (!showsBaselineSeparator || [cell state] == NSOnState) {
+ // selected tab
+ NSRect aRect = NSMakeRect(cellFrame.origin.x + 0.5, cellFrame.origin.y - 0.5, cellFrame.size.width, cellFrame.size.height);
+
+ // frame
+ CGFloat radius = MIN(6.0, 0.5f * MIN(NSWidth(aRect), NSHeight(aRect)));
+ NSRect rect = NSInsetRect(aRect, radius, radius);
+
+ [bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:radius startAngle:180.0 endAngle:270.0];
+
+ [bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(rect), NSMinY(rect)) radius:radius startAngle:270.0 endAngle:360.0];
+
+ NSPoint cornerPoint = NSMakePoint(NSMaxX(aRect), NSMaxY(aRect));
+ [bezier appendBezierPathWithPoints:&cornerPoint count:1];
+
+ cornerPoint = NSMakePoint(NSMinX(aRect), NSMaxY(aRect));
+ [bezier appendBezierPathWithPoints:&cornerPoint count:1];
+
+ [bezier closePath];
+
+ //[[NSColor windowBackgroundColor] set];
+ //[bezier fill];
+ if ([NSApp isActive]) {
+ if ([cell state] == NSOnState) {
+ [bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.99 alpha:1.0]
+ endColor:[NSColor colorWithCalibratedWhite:0.941 alpha:1.0]];
+ } else if ([cell isHighlighted]) {
+ [bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.80 alpha:1.0]
+ endColor:[NSColor colorWithCalibratedWhite:0.80 alpha:1.0]];
+ } else {
+ [bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.835 alpha:1.0]
+ endColor:[NSColor colorWithCalibratedWhite:0.843 alpha:1.0]];
+ }
+ }
+
+ [lineColor set];
+ [bezier stroke];
+ } else {
+ // unselected tab
+ NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height);
+ aRect.origin.y += 0.5;
+ aRect.origin.x += 1.5;
+ aRect.size.width -= 1;
+
+ aRect.origin.x -= 1;
+ aRect.size.width += 1;
+
+ // rollover
+ if ([cell isHighlighted]) {
+ [[NSColor colorWithCalibratedWhite:0.0 alpha:0.1] set];
+ NSRectFillUsingOperation(aRect, NSCompositingOperationSourceAtop);
+ }
+
+ // frame
+
+ [lineColor set];
+ [bezier moveToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y - 0.5)];
+ if (!([cell tabState] & PSMTab_RightIsSelectedMask)) {
+ [bezier lineToPoint:NSMakePoint(NSMaxX(aRect), NSMaxY(aRect))];
+ }
+
+ [bezier stroke];
+
+ // Create a thin lighter line next to the dividing line for a bezel effect
+ if (!([cell tabState] & PSMTab_RightIsSelectedMask)) {
+ [[[NSColor whiteColor] colorWithAlphaComponent:0.5] set];
+ [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(aRect) + 1.0, aRect.origin.y - 0.5)
+ toPoint:NSMakePoint(NSMaxX(aRect) + 1.0, NSMaxY(aRect) - 2.5)];
+ }
+
+ // If this is the leftmost tab, we want to draw a line on the left, too
+ if ([cell tabState] & PSMTab_PositionLeftMask) {
+ [lineColor set];
+ [NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x, aRect.origin.y - 0.5)
+ toPoint:NSMakePoint(aRect.origin.x, NSMaxY(aRect) - 2.5)];
+ [[[NSColor whiteColor] colorWithAlphaComponent:0.5] set];
+ [NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x + 1.0, aRect.origin.y - 0.5)
+ toPoint:NSMakePoint(aRect.origin.x + 1.0, NSMaxY(aRect) - 2.5)];
+ }
+ }
+
+ [self drawInteriorWithTabCell:cell inView:[cell controlView]];
+}
+
+- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView *)controlView
+{
+ NSRect cellFrame = [cell frame];
+ CGFloat labelPosition = cellFrame.origin.x + MARGIN_X;
+
+ // close button
+ if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
+ NSSize closeButtonSize = NSZeroSize;
+ NSRect closeButtonRect = [cell closeButtonRectForFrame:cellFrame];
+ NSImage *closeButton = nil;
+
+ closeButton = [cell isEdited] ? unifiedCloseDirtyButton : unifiedCloseButton;
+
+ if ([cell closeButtonOver]) {
+ closeButton = [cell isEdited] ? unifiedCloseDirtyButtonOver : unifiedCloseButtonOver;
+ }
+ if ([cell closeButtonPressed]) {
+ closeButton = [cell isEdited] ? unifiedCloseDirtyButtonDown : unifiedCloseButtonDown;
+ }
+
+ closeButtonSize = [closeButton size];
+ if ([controlView isFlipped]) {
+ closeButtonRect.origin.y += closeButtonRect.size.height;
+ }
+
+ [closeButton drawAtPoint:closeButtonRect.origin fromRect:CGRectZero operation:NSCompositingOperationSourceOver fraction:1.0];
+
+ // scoot label over
+ labelPosition += closeButtonSize.width + kPSMTabBarCellPadding;
+ }
+
+ // icon
+ if ([cell hasIcon]) {
+ NSRect iconRect = [self iconRectForTabCell:cell];
+ NSImage *icon = [[[cell representedObject] identifier] icon];
+ if ([controlView isFlipped]) {
+ iconRect.origin.y += iconRect.size.height;
+ }
+
+ // center in available space (in case icon image is smaller than kPSMTabBarIconWidth)
+ if ([icon size].width < kPSMTabBarIconWidth) {
+ iconRect.origin.x += (kPSMTabBarIconWidth - [icon size].width) / 2.0;
+ }
+ if ([icon size].height < kPSMTabBarIconWidth) {
+ iconRect.origin.y -= (kPSMTabBarIconWidth - [icon size].height) / 2.0;
+ }
+
+ [icon drawAtPoint:iconRect.origin fromRect:NSZeroRect operation:NSCompositingOperationSourceOver fraction:1.0];
+
+ // scoot label over
+ labelPosition += iconRect.size.width + kPSMTabBarCellPadding;
+ }
+
+ // label rect
+ NSRect labelRect;
+ labelRect.origin.x = labelPosition;
+ labelRect.size.width = cellFrame.size.width - (labelRect.origin.x - cellFrame.origin.x) - kPSMTabBarCellPadding;
+ NSSize s = [[cell attributedStringValue] size];
+ labelRect.origin.y = cellFrame.origin.y + (cellFrame.size.height - s.height) / 2.0 - 1.0;
+ labelRect.size.height = s.height;
+
+ if (![[cell indicator] isHidden]) {
+ labelRect.size.width -= (kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding);
+ }
+
+ // object counter
+ if ([cell count] > 0) {
+ [[cell countColor] ?: [NSColor colorWithCalibratedWhite:0.3 alpha:0.6] set];
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ NSRect myRect = [self objectCounterRectForTabCell:cell];
+ myRect.origin.y -= 1.0;
+ [path moveToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y)];
+ [path lineToPoint:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y)];
+ [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:270.0 endAngle:90.0];
+ [path lineToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + myRect.size.height)];
+ [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:90.0 endAngle:270.0];
+ [path fill];
+
+ // draw attributed string centered in area
+ NSRect counterStringRect;
+ NSAttributedString *counterString = [self attributedObjectCountValueForTabCell:cell];
+ counterStringRect.size = [counterString size];
+ counterStringRect.origin.x = myRect.origin.x + ((myRect.size.width - counterStringRect.size.width) / 2.0) + 0.25;
+ counterStringRect.origin.y = myRect.origin.y + ((myRect.size.height - counterStringRect.size.height) / 2.0) + 0.5;
+ [counterString drawInRect:counterStringRect];
+
+ labelRect.size.width -= myRect.size.width + kPSMTabBarCellPadding;
+ }
+
+ // label
+ [[cell attributedStringValue] drawInRect:labelRect];
+}
+
+- (void)drawBackgroundInRect:(NSRect)rect
+{
+ //Draw for our whole bounds; it'll be automatically clipped to fit the appropriate drawing area
+ rect = [tabBar bounds];
+
+ NSRect gradientRect = rect;
+ gradientRect.size.height -= 1.0;
+
+ NSBezierPath *path = [NSBezierPath bezierPathWithRect:gradientRect];
+ [path linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.835 alpha:1.0]
+ endColor:[NSColor colorWithCalibratedWhite:0.843 alpha:1.0]];
+ [[NSColor colorWithCalibratedWhite:0.576 alpha:1.0] set];
+ [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x, NSMaxY(rect) - 0.5)
+ toPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect) - 0.5)];
+
+ if (![[[tabBar tabView] window] isKeyWindow]) {
+ [[NSColor windowBackgroundColor] set];
+ NSRectFill(gradientRect);
+ }
+}
+
+- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect
+{
+ tabBar = bar;
+ [self drawBackgroundInRect:rect];
+
+ // no tab view == not connected
+ if (![bar tabView]) {
+ NSRect labelRect = rect;
+ labelRect.size.height -= 4.0;
+ labelRect.origin.y += 4.0;
+ NSMutableAttributedString *attrStr;
+ NSString *contents = @"PSMTabBarControl";
+ attrStr = [[NSMutableAttributedString alloc] initWithString:contents];
+ NSRange range = NSMakeRange(0, [contents length]);
+ [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range];
+ NSMutableParagraphStyle *centeredParagraphStyle = nil;
+ if (!centeredParagraphStyle) {
+ centeredParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
+ [centeredParagraphStyle setAlignment:NSTextAlignmentCenter];
+ }
+ [attrStr addAttribute:NSParagraphStyleAttributeName value:centeredParagraphStyle range:range];
+ [attrStr drawInRect:labelRect];
+ return;
+ }
+
+ // draw cells
+ NSEnumerator *e = [[bar cells] objectEnumerator];
+ PSMTabBarCell *cell;
+ while ((cell = [e nextObject])) {
+ if ([bar isAnimating] || (![cell isInOverflowMenu] && NSIntersectsRect([cell frame], rect))) {
+ [cell drawWithFrame:[cell frame] inView:bar];
+ }
+ }
+}
+
+#pragma mark -
+#pragma mark Archiving
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ //[super encodeWithCoder:aCoder];
+ if ([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:unifiedCloseButton forKey:@"unifiedCloseButton"];
+ [aCoder encodeObject:unifiedCloseButtonDown forKey:@"unifiedCloseButtonDown"];
+ [aCoder encodeObject:unifiedCloseButtonOver forKey:@"unifiedCloseButtonOver"];
+ [aCoder encodeObject:unifiedCloseDirtyButton forKey:@"unifiedCloseDirtyButton"];
+ [aCoder encodeObject:unifiedCloseDirtyButtonDown forKey:@"unifiedCloseDirtyButtonDown"];
+ [aCoder encodeObject:unifiedCloseDirtyButtonOver forKey:@"unifiedCloseDirtyButtonOver"];
+ [aCoder encodeObject:_addTabButtonImage forKey:@"addTabButtonImage"];
+ [aCoder encodeObject:_addTabButtonPressedImage forKey:@"addTabButtonPressedImage"];
+ [aCoder encodeObject:_addTabButtonRolloverImage forKey:@"addTabButtonRolloverImage"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ // self = [super initWithCoder:aDecoder];
+ //if (self) {
+ if ([aDecoder allowsKeyedCoding]) {
+ unifiedCloseButton = [aDecoder decodeObjectForKey:@"unifiedCloseButton"];
+ unifiedCloseButtonDown = [aDecoder decodeObjectForKey:@"unifiedCloseButtonDown"];
+ unifiedCloseButtonOver = [aDecoder decodeObjectForKey:@"unifiedCloseButtonOver"];
+ unifiedCloseDirtyButton = [aDecoder decodeObjectForKey:@"unifiedCloseDirtyButton"];
+ unifiedCloseDirtyButtonDown = [aDecoder decodeObjectForKey:@"unifiedCloseDirtyButtonDown"];
+ unifiedCloseDirtyButtonOver = [aDecoder decodeObjectForKey:@"unifiedCloseDirtyButtonOver"];
+ _addTabButtonImage = [aDecoder decodeObjectForKey:@"addTabButtonImage"];
+ _addTabButtonPressedImage = [aDecoder decodeObjectForKey:@"addTabButtonPressedImage"];
+ _addTabButtonRolloverImage = [aDecoder decodeObjectForKey:@"addTabButtonRolloverImage"];
+ }
+ //}
+ return self;
+}
+
+@end
diff --git a/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/TXT.rtf b/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/TXT.rtf
new file mode 100644
index 000000000..acd9372a2
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/TXT.rtf
@@ -0,0 +1,186 @@
+{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf380
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique;
+\f3\fnil\fcharset77 Monaco;}
+{\colortbl;\red255\green255\blue255;\red118\green15\blue80;\red0\green0\blue255;\red35\green110\blue37;
+}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
+
+\f0\b\fs24 \cf0 \
+PSMTabBarControl (and related classes)\
+
+\f1\b0 developed by John Pannell, Positive Spin Media\
+\
+as seen in the super-cool app...\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
+\cf0 {{\NeXTGraphic startpage.gif \width7200 \height2820
+}¬}\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
+\cf0 \
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+\cf0 This source code and all related materials are released under the BSD license, which is explained at the end of this document, along with some other legalese. I've made my best effort to make everything bug free, but please let me know of any bugs found or suggestions you have: johnp@positivespinmedia.com.\
+\
+
+\f0\b Purpose
+\f1\b0 \
+\
+PSMTabBarControl seeks to provide developers with a high-quality, easy to use GUI to manage an NSTabView (or subclasses) in a manner similar to Safari's tabbed browsing implementation. It attempts to add a few features as well. Here's what you get:\
+\
+
+\f0\b The look:
+\f1\b0 a control/cell architecture that draws the expected tab appearance below a toolbar or similar view. Included styles work consistently in Aqua, Metal, or customized metal variations by basing fills on the window's background color. Includes drawing of a close button, and rollover states for the close button and tab cell. Also provides pop-up button and menu when tabs overflow available space, and support for individual tab progress indicators, icons, and object counters. Tabs can be drawn sized to fit the string content of the label, or uniformly sized.\
+\
+
+\f0\b The functionality:
+\f1\b0 Close button removes tabs, click on a tab cell selects. Indicators start, stop, and hide if things are hooked up correctly.\
+\
+
+\f0\b Extras:
+\f1\b0 Supports multi-window drag-and-drop reordering of the tabs with aqua-licious animation.\
+\
+
+\f0\b Files
+\f1\b0 \
+\
+Your project will need the files in the "Framework" folder of the project. The actual framework packages these (and some images) up nicely for you, if desired. Please look over the "TabBarControlDemo" target of the source code project to see exactly what is needed to get everything to build. Building and playing with the demo is also a good way to get a feel for the features provided by these classes.\
+\
+
+\f0\b Usage
+\f1\b0 \
+\
+Simply drag a custom view object from the views palette in IB, read the PSMTabBarControl class into IB, and set the view's custom class to PSMTabBarControl. Then connect the control's tabview outlet to the tab view being controlled, and make the control the delegate of the tab view. You can also connect the control's "partner view" outlet to another view that will resize in response to the hide/show behavior of the control.\
+\
+Alternately, you can build the Palette subproject and add the built IB palette to Interface Builder. In this case, creating and configuring an instance is as easy and drag, drop, and a few clicks. A demo movie and the built palette are available in a separate download from my website: http://www.positivespinmedia.com/dev/PSMTabBarControl.html\
+\
+
+\f2\i Please read the PSMTabBarControlDoc.html file in the documentation folder of this project. It provides an Apple-ish page describing the interface and usage of this object.
+\f1\i0 \
+\
+
+\f0\b Patterns of Use
+\f1\b0 \
+\
+There are a few random notes I can think of for usage guidelines...\
+\
+- You may see a line between the toolbar and the control in your app; it is part of the toolbar. In Tiger, you can eliminate the appearance of this line:\
+\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f3\fs20 \cf0 \CocoaLigature0 SInt32 MacVersion;\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+\cf2 if\cf0 (Gestalt(gestaltSystemVersion, &MacVersion) == noErr)\{\
+ \cf2 if\cf0 (MacVersion >= \cf3 0x1040\cf0 )\{\
+ \cf4 // this call is Tiger only\cf0 \
+ [toolbar setShowsBaselineSeparator:\cf2 NO\cf0 ];\
+ \}\
+\}\
+\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f1\fs24 \cf0 - In general, there is no reason for your app objects to communicate (outside of configuration) with the PSMTabBarControl at all. Changes made to the NSTabView instance programmatically should be directed at the NSTabView instance itself, and the control will update to reflect the changes made.\
+\
+- Your app might want to receive tab view delegate notifications in order to perform some actions. No problem, simply make the desired object the delegate of the PSMTabBarControl instance... it passes along all tab view notifications. Note that it uses these notifications to make changes itself - read the source code to make sure you aren't tripping over something.\
+\
+- The control creates bindings between each cell's progress indicator and the represented NSTabViewItem's identifier object, if it can. In my app design, I set an instance of NSObjectController as the NSTabViewItem's identifier, and then bind to the "isProcessing" key of the controller's content object. All of this can be seen in the source of the demo app...\
+\
+- The control can be set to hide itself when there is only a single tab, and can also be told to hide/show on demand. It can animate to appear and disappear, and will resize something to compensate for the missing window real estate. By default, it will resize the window, but you can also connect the "partnerView" outlet in IB to specify another view to resize to take up the missing space. Note that this takes some attention to sizing springs and wires to get right, and complex views may need a container view to achieve the desired effect.\
+\
+- The control can be configured to draw an attractive "Add Tab" button at the end of the tab cells. Unfortunately, the button is all looks and no brains - it has no idea what your app wants to do when adding a tab. If you configure your app to show the add tab button, you need to hook up the add tab button to the proper target with the proper selector. Something like this will do nicely in your app controller's awakeFromNib:\
+\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f3\fs20 \cf4 // hook up add tab button\cf0 \
+[[tabBar addTabButton] setTarget:\cf2 self\cf0 ];\
+[[tabBar addTabButton] setAction:\cf2 @selector\cf0 (addNewTab:)];
+\f1\fs24 \
+\
+- The tabs have some sizing options: You can specify the minimum width, maximum width, and optimum width, as well as spcifying if the tabs should size to fit their label or not. The sizing bahavior of the tabs is as follows: If "size to fit" is specified, then tabs will be generated to fit the label, but will never exceed the specified max or min widths. Once the end of the control is reached, the overflow menu will appear as tabs are added; the last tab will squeeze in if it can, or the remaining tabs will stretch to occupy the full control. If "size to fit" is not specified, then all successive tabs will appear at the optimum width. Once the end of the control is reached, adding new tabs will cause all tabs to shrink to accomodate, until the minumum width is reached, and then the overflow menu will be used; max width is ignored in this case. Hopefully that all makes sense :-)\
+\
+- PSMTabBarControl will load the existing tabs from the tabView outlet at startup. However, many of the advanced features (icon display, progress indicator, object count) rely on binding to a controller that is likely not set up in IB. Solution? Nuke the existing tabs in the NSTabView and add new ones, configured the way you like. The demo app does this in the awakeFromNib: method of the app controller.\
+\
+- As a design choice, I elected to keep a cell object around until its tab was closed, instead of "churning" cell objects in each update cycle. Each cell keeps its NSTabViewItem as its representedObject and maintains reference that way, rather than by any index. As a result of this, drag-and-drop reordering of tabs does not change the underlying NSTabView instance at all. All that to say: don't rely on numerical indices if communicating with both the control and the tab view - the indices may not correlate if the user moved some tabs around (and remember - you shouldn't need to communicate with the control anyway :-). The Shiira Project, from which I gained much insight and inspiration from for this UI element, elected to scrap and rebuild the array of cells each time through the update cycle, and rely on indices to correlate between cells and NSTabViewItems. I felt the representedObject route was cleaner, and preferred not to churn objects.\
+\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f0\b \cf0 Improvements?
+\f1\b0 \
+\
+Pipe up if you think of something you'd like to see; here's my current list:\
+\
+- "Pop-up" tabs - like pop-up folders in the finder, in case you want to drag to a destination in another tab.\
+- Support for the
+\f3\fs22 \CocoaLigature1 NSUnifiedTitleAndToolbarWindowMask
+\f1\fs24 \CocoaLigature0 "unified" window appearance. (Help! I really searched around to try to make this work... the color pattern of the title and toolbar seem to be top secret! The new "unified" style is an excellent replication of a unified look, but isn't "built from" the unified appearance like the metal is.)\
+- During multi-window drag, having a "drag window/image" that shows the represented view getting moved to the other window.\
+- During multi-window drag, support for dragging out solo tabs to consolidate in another window, removing the source window in the process.\
+- Support vertical as well as horizontal alignment.\
+\
+
+\f0\b Version History
+\f1\b0 \
+\
+Version 1.3 (May 29, 2006)\
+- new feature: Unified tab style, compliments of Keith Blount\
+- new feature: allow multi-window drag config option (again from Keith).\
+- fixed bug: Palette installation/usage instructions were wrong.\
+- enhancement: exposed the
+\f3\fs20 representedTabViewItems
+\f1\fs24 method, which can be used to retrieve the order of the tabs as displayed in the control, since the underlying NSTabView does not get reordered during drag and drop rearrangement.\
+\
+Version 1.2 (April 20, 2006)\
+- new feature: multi-window drag and drop support.\
+- bug fixed: zombie issue with tabView:didCloseTabViewItem\
+- bugs fixed: some drawing issues around the progress indicators in tabs, and the add tab button.\
+- enhancement: the hide/show animation has been improved with less "flickering" of progress indicators during the hide and show.\
+\
+Version 1.1.2 (April 5, 2006)\
+- fixed bug: tabs of non-integer width resulted in occasional anti-aliased drawing issues of dividers between tabs in the Metal style (Thanks, Kent).\
+- added feature: delegate can now respond to -tabView:shouldCloseTabViewItem: and -tabView:willCloseTabViewItem:, and -tabView:didCloseTabViewItem: messages, so your app can take care of any needed setup/cleanup for these actions.\
+- fixed bug: tab close buttons now show down state when pressed down.\
+\
+Version 1.1.1 (March 16, 2006)\
+- fixed bug: Palette inspector would not reflect state of previously instantiated control. This has been fixed (Thanks, Guillaume).\
+- enhancement: Overflow button now highlights when mouse down (Thanks, Kent).\
+- fixed bug: when set to not close a solo tab, the close button would be hidden for the tab, but could still be closed if you clicked the tab in the right location. This has been fixed (Thanks, malcom).\
+\
+Version 1.1 (March 10, 2006)\
+- Bound the "title" of the cell to the "label" of the source tabview item. Just in case you wanted to change the label on the tab during the running of your application.\
+- PSMTabBarCell factored to support new tab "styles", or appearances in drawing. Now supported are the existing "Metal" style and a new "Aqua" style. Many thanks to David Smith, Seth Willits, and Chris Forsythe for their contributions!\
+- Control can be configured to "Hide for single tab", so it doesn't appear unless there are more than a single tab view present. Features animated show/hide behavior (that can be called anytime, and is called automatically in the case that a single tab exists). The show/hide behavior can also be set up to resize either the window (default) or a selected "partner view" to compensate for the lost height of the tab bar.\
+- Control can be configured for "Can close only tab" behavior. If set to NO, no close button will appear on a lone tab.\
+- Cells can be set to "size to fit", or given uniform min/max/optimum sizes.\
+- Added support for display of an icon and an object count, if the proper app design pattern is followed.\
+- Sweet animated drag-and-drop drawing!\
+- A few drawing bugs surrounding the progress indicators in cells were squished.\
+- New documentation, in case you found this read me a little pithy.\
+\
+Version 1.0 (December 2005)\
+Initial release of safari-like tab implementation.\
+\
+
+\f0\b The standard disavowal of this beautiful mess
+\f1\b0 \
+\
+I should note that portions of this source code were inspired by the Shiira project's implementation of Safari-style tabs. While I made some different design decisions, the drawing and some other aspects are only slight modifications of their excellent work. As such, I note their copyright under their BSD licence:\
+\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f3\fs20 \cf4 Portions of this software Copyright 2004 The Shiira Project. All rights reserved.\
+\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
+
+\f1\fs24 \cf0 Check them out at: http://hmdt-web.net/shiira/\
+\
+This source code is provided under BSD license, the conditions of which are listed below. I hope you'll make note somewhere in your about window or ReadMe stating the sweet coding goodness of Positive Spin Media and link to the fascinating and informative website at www.positivespinmedia.com\
+\
+\pard\pardeftab720\sa320\ql\qnatural
+\cf0 \CocoaLigature1 Copyright (c) 2005, Positive Spin Media\uc0\u8232 All rights reserved.\
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
+\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural
+\ls1\ilvl0\cf0 {\listtext \'a5 }Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\
+{\listtext \'a5 }Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\
+{\listtext \'a5 }Neither the name of Positive Spin Media nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\
+ \
+\pard\pardeftab720\sa320\ql\qnatural
+\cf0 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\CocoaLigature0 \
+} \ No newline at end of file
diff --git a/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/startpage.gif b/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/startpage.gif
new file mode 100644
index 000000000..8707a77ab
--- /dev/null
+++ b/frontends/cocoa/PSMTabBarControl/ReadMe.rtfd/startpage.gif
Binary files differ
diff --git a/frontends/cocoa/PreferencesWindowController.h b/frontends/cocoa/PreferencesWindowController.h
new file mode 100644
index 000000000..02fb530a0
--- /dev/null
+++ b/frontends/cocoa/PreferencesWindowController.h
@@ -0,0 +1,27 @@
+/*
+ * 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>
+
+@interface PreferencesWindowController : NSWindowController
+
+@property (readwrite, copy, nonatomic) NSString *homepageURL;
+
+- (IBAction)useCurrentPageAsHomepage:(id)sender;
+
+@end
diff --git a/frontends/cocoa/PreferencesWindowController.m b/frontends/cocoa/PreferencesWindowController.m
new file mode 100644
index 000000000..d65425355
--- /dev/null
+++ b/frontends/cocoa/PreferencesWindowController.m
@@ -0,0 +1,57 @@
+/*
+ * 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 "utils/nsoption.h"
+#import "utils/nsurl.h"
+#import "netsurf/browser_window.h"
+
+#import "cocoa/PreferencesWindowController.h"
+#import "cocoa/NetsurfApp.h"
+#import "cocoa/gui.h"
+#import "cocoa/BrowserViewController.h"
+
+@implementation PreferencesWindowController
+
+- (instancetype)init
+{
+ if ((self = [super initWithWindowNibName:@"PreferencesWindow"]) == nil)
+ return nil;
+
+ return self;
+}
+
+- (IBAction)useCurrentPageAsHomepage:(id)sender
+{
+ struct browser_window *bw = [[(NetSurfApp *)NSApp frontTab] browser];
+ const char *url = nsurl_access(browser_window_get_url(bw));
+ [self setHomepageURL:[NSString stringWithUTF8String:url]];
+}
+
+- (void)setHomepageURL:(NSString *)newUrl
+{
+ nsoption_set_charp(homepage_url, strdup([newUrl UTF8String]));
+ [[NSUserDefaults standardUserDefaults] setObject:newUrl forKey:kHomepageURLOption];
+ [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (NSString *)homepageURL
+{
+ return [NSString stringWithUTF8String:nsoption_charp(homepage_url)];
+}
+
+@end
diff --git a/frontends/cocoa/Prefix.pch b/frontends/cocoa/Prefix.pch
new file mode 100644
index 000000000..7fa2c0547
--- /dev/null
+++ b/frontends/cocoa/Prefix.pch
@@ -0,0 +1,11 @@
+#include <Carbon/Carbon.h>
+
+#ifdef __OBJC__
+#import <Cocoa/Cocoa.h>
+#endif
+
+#undef offsetof
+
+#define HISTORY_COLOUR_BACKGROUND 0x000000
+#define HISTORY_COLOUR_FOREGROUND 0xFFFFFF
+#define HISTORY_COLOUR_SELECTED 0xFF6D27 \ No newline at end of file
diff --git a/frontends/cocoa/ScrollableView.h b/frontends/cocoa/ScrollableView.h
new file mode 100644
index 000000000..f8605f137
--- /dev/null
+++ b/frontends/cocoa/ScrollableView.h
@@ -0,0 +1,27 @@
+/*
+ * 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>
+
+@interface ScrollableView : NSView
+
+@property (nonatomic) NSSize minimumSize;
+
+- (void)adjustFrame;
+
+@end
diff --git a/frontends/cocoa/ScrollableView.m b/frontends/cocoa/ScrollableView.m
new file mode 100644
index 000000000..6f20bfe28
--- /dev/null
+++ b/frontends/cocoa/ScrollableView.m
@@ -0,0 +1,75 @@
+/*
+ * 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/ScrollableView.h"
+
+@interface ScrollableView ()
+
+@property (weak, nonatomic) NSView *observedSuperview;
+
+- (void)frameChangeNotification:(NSNotification *)note;
+
+@end
+
+@implementation ScrollableView
+
+- (void)setMinimumSize:(NSSize)newSize
+{
+ if (!CGSizeEqualToSize(_minimumSize, newSize)) {
+ _minimumSize = newSize;
+ [self adjustFrame];
+ }
+}
+
+- (void)adjustFrame
+{
+ NSSize frameSize = self.enclosingScrollView.contentSize;
+ [self setFrameSize:NSMakeSize(MAX(self.minimumSize.width, frameSize.width),
+ MAX(self.minimumSize.height, frameSize.height))];
+}
+
+- (void)frameChangeNotification:(NSNotification *)note
+{
+ [self adjustFrame];
+}
+
+- (void)viewDidMoveToSuperview
+{
+ NSView *oldSuperview = _observedSuperview;
+ _observedSuperview = nil;
+ if (oldSuperview) {
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:NSViewFrameDidChangeNotification
+ object:oldSuperview];
+ }
+
+ NSView *newSuperView = [self superview];
+
+ if (nil != newSuperView) {
+ _observedSuperview = newSuperView;
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(frameChangeNotification:)
+ name:NSViewFrameDidChangeNotification
+ object:newSuperView];
+ newSuperView.postsFrameChangedNotifications = YES;
+ }
+}
+
+@end
diff --git a/frontends/cocoa/SearchWindowController.h b/frontends/cocoa/SearchWindowController.h
new file mode 100644
index 000000000..a1e84c364
--- /dev/null
+++ b/frontends/cocoa/SearchWindowController.h
@@ -0,0 +1,46 @@
+/*
+ * 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>
+
+@class BrowserViewController;
+
+typedef enum {
+ SearchBackward,
+ SearchForward
+} SearchDirection;
+
+@interface SearchWindowController : NSWindowController
+
+@property (nonatomic) BOOL caseSensitive;
+@property (nonatomic) BOOL selectAll;
+@property (nonatomic) BOOL canGoBack;
+@property (nonatomic) BOOL canGoForward;
+@property (copy, nonatomic) NSString *searchString;
+@property (nonatomic) BrowserViewController *browser;
+
+- (IBAction)searchNext:(id)sender;
+- (IBAction)searchPrevious:(id)sender;
+
+- (IBAction)searchStringDidChange:(id)sender;
+
+- (void)search:(SearchDirection)direction;
+
+@end
+
+extern struct gui_search_table *cocoa_search_table;
diff --git a/frontends/cocoa/SearchWindowController.m b/frontends/cocoa/SearchWindowController.m
new file mode 100644
index 000000000..347fb1cb9
--- /dev/null
+++ b/frontends/cocoa/SearchWindowController.m
@@ -0,0 +1,118 @@
+/*
+ * 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/SearchWindowController.h"
+#import "cocoa/BrowserViewController.h"
+
+#import "netsurf/search.h"
+#import "netsurf/browser_window.h"
+#import "desktop/search.h"
+
+static void cocoa_search_set_back(bool active, void *p);
+static void cocoa_search_set_forward(bool active, void *p);
+
+static struct gui_search_table search_table = {
+ .forward_state = cocoa_search_set_forward,
+ .back_state = cocoa_search_set_back,
+};
+
+struct gui_search_table *cocoa_search_table = &search_table;
+
+@implementation SearchWindowController
+
+- (instancetype)init
+{
+ if ((self = [super initWithWindowNibName:@"SearchWindow"]) == nil)
+ return nil;
+
+ [self bind:@"browser" toObject:NSApp withKeyPath:@"frontTab" options:nil];
+ _canGoBack = YES;
+ _canGoForward = YES;
+
+ return self;
+}
+
+- (void)dealloc
+{
+ [self unbind:@"browser"];
+}
+
+- (IBAction)searchNext:(id)sender
+{
+ [self search:SearchForward];
+}
+
+- (IBAction)searchPrevious:(id)sender
+{
+ [self search:SearchBackward];
+}
+
+- (void)search:(SearchDirection)direction
+{
+ search_flags_t flags = (direction == SearchForward) ? SEARCH_FLAG_FORWARDS : 0;
+
+ if (self.caseSensitive) {
+ flags |= SEARCH_FLAG_CASE_SENSITIVE;
+ }
+
+ if (self.selectAll) {
+ flags |= SEARCH_FLAG_SHOWALL;
+ }
+
+ struct browser_window *bw = self.browser.browser;
+ browser_window_search(bw, (__bridge void *)self, flags, self.searchString.UTF8String);
+}
+
+- (IBAction)searchStringDidChange:(id)sender
+{
+ struct browser_window *bw = self.browser.browser;
+ browser_window_search_clear(bw);
+
+ [self setCanGoBack:YES];
+ [self setCanGoForward:YES];
+}
+
+- (void)setCaseSensitive:(BOOL)newValue
+{
+ if (_caseSensitive != newValue) {
+ _caseSensitive = newValue;
+ self.canGoBack = YES;
+ self.canGoForward = YES;
+ }
+}
+
+- (void)setSelectAll:(BOOL)newValue
+{
+ if (_selectAll != newValue) {
+ _selectAll = newValue;
+ self.canGoBack = YES;
+ self.canGoForward = YES;
+ }
+}
+
+static void cocoa_search_set_back(bool active, void *p)
+{
+ [(__bridge SearchWindowController *)p setCanGoBack:active];
+}
+
+static void cocoa_search_set_forward(bool active, void *p)
+{
+ [(__bridge SearchWindowController *)p setCanGoForward:active];
+}
+
+@end
diff --git a/frontends/cocoa/Tree.h b/frontends/cocoa/Tree.h
new file mode 100644
index 000000000..d898f4e4b
--- /dev/null
+++ b/frontends/cocoa/Tree.h
@@ -0,0 +1,52 @@
+/*
+ * 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 "cocoa/desktop-tree.h"
+
+@class Tree;
+
+@protocol TreeDelegate
+
+- (void)tree:(Tree *)tree requestedRedrawInRect:(NSRect)rect;
+- (void)tree:(Tree *)tree resized:(NSSize)size;
+- (void)tree:(Tree *)tree scrollPoint:(NSPoint)point;
+- (NSSize)treeWindowSize:(Tree *)tree;
+
+@end
+
+@interface Tree : NSObject
+
+@property (weak, nonatomic) id<TreeDelegate> delegate;
+@property (readonly) struct tree *tree;
+
+- (instancetype)initWithFlags:(unsigned int)flags;
+
+- (void)setRedrawing:(BOOL)newRedrawing;
+
+@end
+
+@interface Tree (ViewInterface)
+
+- (void)drawRect:(NSRect)rect inView:(NSView *)view;
+- (void)mouseAction:(browser_mouse_state)state atPoint:(NSPoint)point;
+- (void)mouseDragEnd:(browser_mouse_state)state fromPoint:(NSPoint)p0 toPoint:(NSPoint)p1;
+- (void)keyPress:(uint32_t)key;
+
+@end
diff --git a/frontends/cocoa/Tree.m b/frontends/cocoa/Tree.m
new file mode 100644
index 000000000..1b834691e
--- /dev/null
+++ b/frontends/cocoa/Tree.m
@@ -0,0 +1,143 @@
+/*
+ * 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/Tree.h"
+#import "cocoa/coordinates.h"
+#import "cocoa/font.h"
+#import "cocoa/plotter.h"
+
+#import "utils/errors.h"
+#import "netsurf/plotters.h"
+#import "cocoa/desktop-tree.h"
+
+@implementation Tree
+
+static void tree_redraw_request(int x, int y, int w, int h, void *data);
+static void tree_resized(struct tree *tree, int w, int h, void *data);
+static void tree_scroll_visible(int y, int height, void *data);
+static void tree_get_window_dimensions(int *width, int *height, void *data);
+
+static const struct treeview_table cocoa_tree_callbacks = {
+ .redraw_request = tree_redraw_request,
+ .resized = tree_resized,
+ .scroll_visible = tree_scroll_visible,
+ .get_window_dimensions = tree_get_window_dimensions
+};
+
+- (instancetype)initWithFlags:(unsigned int)flags
+{
+ if ((self = [super init]) == nil)
+ return nil;
+
+ _tree = tree_create(flags, &cocoa_tree_callbacks, (__bridge void *)self);
+ if (_tree == NULL) {
+ return nil;
+ }
+
+ return self;
+}
+
+- (void)dealloc
+{
+ tree_delete(_tree);
+}
+
+- (void)setRedrawing:(BOOL)newRedrawing
+{
+}
+
+//MARK: -
+//MARK: Callbacks
+
+static void tree_redraw_request(int x, int y, int w, int h, void *data)
+{
+ Tree *tree = (__bridge Tree *)data;
+ [tree.delegate tree:tree requestedRedrawInRect:cocoa_rect_wh(x, y, w, h)];
+}
+
+static void tree_resized(struct tree *tree, int w, int h, void *data)
+{
+ Tree *cocoaTree = (__bridge Tree *)data;
+ [cocoaTree.delegate tree:cocoaTree resized:cocoa_size(w, h)];
+}
+
+static void tree_scroll_visible(int y, int height, void *data)
+{
+ Tree *tree = (__bridge Tree *)data;
+ [tree.delegate tree:tree scrollPoint:cocoa_point(0, y)];
+}
+
+static void tree_get_window_dimensions(int *width, int *height, void *data)
+{
+ Tree *tree = (__bridge Tree *)data;
+ id<TreeDelegate> delegate = tree.delegate;
+
+ if (delegate == nil) {
+ return;
+ }
+
+ NSSize size = [delegate treeWindowSize:tree];
+
+ if (width != NULL) {
+ *width = cocoa_pt_to_px(size.width);
+ }
+
+ if (height != NULL) {
+ *height = cocoa_pt_to_px(size.height);
+ }
+}
+
+@end
+
+@implementation Tree (ViewInterface)
+
+- (void)drawRect:(NSRect)rect inView:(NSView *)view
+{
+ struct redraw_context ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &cocoa_plotters
+ };
+
+ tree_draw(self.tree, 0, 0,
+ cocoa_pt_to_px(NSMinX(rect)),
+ cocoa_pt_to_px(NSMinY(rect)),
+ cocoa_pt_to_px(NSWidth(rect)),
+ cocoa_pt_to_px(NSHeight(rect)),
+ &ctx);
+}
+
+- (void)mouseAction:(browser_mouse_state)state atPoint:(NSPoint)point
+{
+ tree_mouse_action(self.tree, state,
+ cocoa_pt_to_px(point.x), cocoa_pt_to_px(point.y));
+}
+
+- (void)mouseDragEnd:(browser_mouse_state)state fromPoint:(NSPoint)p0 toPoint:(NSPoint)p1
+{
+ tree_drag_end(self.tree, state,
+ cocoa_pt_to_px(p0.x), cocoa_pt_to_px(p0.y),
+ cocoa_pt_to_px(p1.x), cocoa_pt_to_px(p1.y));
+}
+
+- (void)keyPress:(uint32_t)key
+{
+ tree_keypress(self.tree, key);
+}
+
+@end
diff --git a/frontends/cocoa/TreeView.h b/frontends/cocoa/TreeView.h
new file mode 100644
index 000000000..518bf5c69
--- /dev/null
+++ b/frontends/cocoa/TreeView.h
@@ -0,0 +1,28 @@
+/*
+ * 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 "cocoa/ScrollableView.h"
+@class Tree;
+
+@interface TreeView : ScrollableView
+
+@property (nonatomic) Tree *tree;
+
+@end
diff --git a/frontends/cocoa/TreeView.m b/frontends/cocoa/TreeView.m
new file mode 100644
index 000000000..8fe3767fb
--- /dev/null
+++ b/frontends/cocoa/TreeView.m
@@ -0,0 +1,247 @@
+/*
+ * 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/TreeView.h"
+#import "cocoa/Tree.h"
+
+#import "utils/errors.h"
+
+#import "netsurf/plotters.h"
+#import "netsurf/keypress.h"
+#import "Tree.h"
+
+@interface TreeView () <TreeDelegate>
+
+@property (nonatomic) BOOL isDragging;
+@property (nonatomic) CGPoint dragStart;
+
+@end
+
+@implementation TreeView
+
+- (void)drawRect:(NSRect)dirtyRect
+{
+ [self.tree drawRect:dirtyRect inView:self];
+}
+
+- (BOOL)isFlipped
+{
+ return YES;
+}
+
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- (void)setTree:(Tree *)newTree
+{
+ if (_tree != newTree) {
+ _tree.redrawing = NO;
+ _tree.delegate = nil;
+
+ _tree = newTree;
+ _tree.delegate = self;
+ _tree.redrawing = YES;
+
+ [self setNeedsDisplay:YES];
+ }
+}
+
+//MARK: -
+//MARK: Event handlers
+
+- (void)mouseDown:(NSEvent *)event
+{
+ self.isDragging = NO;
+ self.dragStart = [self convertPoint:[event locationInWindow] fromView:nil];
+ [self.tree mouseAction:BROWSER_MOUSE_PRESS_1 atPoint:self.dragStart];
+}
+
+#define squared(x) ((x) * (x))
+#define MinDragDistance (5.0)
+
+- (void)mouseDragged:(NSEvent *)event
+{
+ const NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
+
+ if (!self.isDragging) {
+ const CGFloat distance = squared(self.dragStart.x - point.x) + squared(self.dragStart.y - point.y);
+ if (distance >= squared(MinDragDistance)) {
+ self.isDragging = YES;
+ }
+ }
+}
+
+- (void)mouseUp:(NSEvent *)event
+{
+ const NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
+
+ browser_mouse_state modifierFlags = 0;
+
+ if (self.isDragging) {
+ self.isDragging = NO;
+ [self.tree mouseDragEnd:modifierFlags fromPoint:self.dragStart toPoint:point];
+ } else {
+ modifierFlags |= BROWSER_MOUSE_CLICK_1;
+ if ([event clickCount] == 2) {
+ modifierFlags |= BROWSER_MOUSE_DOUBLE_CLICK;
+ }
+ [self.tree mouseAction:modifierFlags atPoint:point];
+ }
+}
+
+//MARK: Keyboard events
+
+- (void)keyDown:(NSEvent *)theEvent
+{
+ [self interpretKeyEvents:@[ theEvent ]];
+}
+
+- (void)insertText:(id)string
+{
+ for (NSUInteger i = 0, length = [string length]; i < length; i++) {
+ unichar ch = [string characterAtIndex:i];
+ [self.tree keyPress:ch];
+ }
+}
+
+- (void)moveLeft:(id)sender
+{
+ [self.tree keyPress:NS_KEY_LEFT];
+}
+
+- (void)moveRight:(id)sender
+{
+ [self.tree keyPress:NS_KEY_RIGHT];
+}
+
+- (void)moveUp:(id)sender
+{
+ [self.tree keyPress:NS_KEY_UP];
+}
+
+- (void)moveDown:(id)sender
+{
+ [self.tree keyPress:NS_KEY_DOWN];
+}
+
+- (void)deleteBackward:(id)sender
+{
+ [self.tree keyPress:NS_KEY_DELETE_LEFT];
+}
+
+- (void)deleteForward:(id)sender
+{
+ [self.tree keyPress:NS_KEY_DELETE_RIGHT];
+}
+
+- (void)cancelOperation:(id)sender
+{
+ [self.tree keyPress:NS_KEY_ESCAPE];
+}
+
+- (void)scrollPageUp:(id)sender
+{
+ [self.tree keyPress:NS_KEY_PAGE_UP];
+}
+
+- (void)scrollPageDown:(id)sender
+{
+ [self.tree keyPress:NS_KEY_PAGE_DOWN];
+}
+
+- (void)insertTab:(id)sender
+{
+ [self.tree keyPress:NS_KEY_TAB];
+}
+
+- (void)insertBacktab:(id)sender
+{
+ [self.tree keyPress:NS_KEY_SHIFT_TAB];
+}
+
+- (void)moveToBeginningOfLine:(id)sender
+{
+ [self.tree keyPress:NS_KEY_LINE_START];
+}
+
+- (void)moveToEndOfLine:(id)sender
+{
+ [self.tree keyPress:NS_KEY_LINE_END];
+}
+
+- (void)moveToBeginningOfDocument:(id)sender
+{
+ [self.tree keyPress:NS_KEY_TEXT_START];
+}
+
+- (void)moveToEndOfDocument:(id)sender
+{
+ [self.tree keyPress:NS_KEY_TEXT_END];
+}
+
+- (void)insertNewline:(id)sender
+{
+ [self.tree keyPress:NS_KEY_NL];
+}
+
+- (void)selectAll:(id)sender
+{
+ [self.tree keyPress:NS_KEY_SELECT_ALL];
+}
+
+- (void)copy:(id)sender
+{
+ [self.tree keyPress:NS_KEY_COPY_SELECTION];
+}
+
+- (void)cut:(id)sender
+{
+ [self.tree keyPress:NS_KEY_CUT_SELECTION];
+}
+
+- (void)paste:(id)sender
+{
+ [self.tree keyPress:NS_KEY_PASTE];
+}
+
+//MARK: -
+//MARK: Tree delegate methods
+
+- (void)tree:(Tree *)t requestedRedrawInRect:(NSRect)rect
+{
+ [self setNeedsDisplayInRect:rect];
+}
+
+- (void)tree:(Tree *)t resized:(NSSize)size
+{
+ self.minimumSize = size;
+}
+
+- (void)tree:(Tree *)t scrollPoint:(NSPoint)point
+{
+ [self scrollPoint:point];
+}
+
+- (NSSize)treeWindowSize:(Tree *)t
+{
+ return self.frame.size;
+}
+
+@end
diff --git a/frontends/cocoa/URLFieldCell.h b/frontends/cocoa/URLFieldCell.h
new file mode 100644
index 000000000..c7e35f04e
--- /dev/null
+++ b/frontends/cocoa/URLFieldCell.h
@@ -0,0 +1,27 @@
+/*
+ * 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>
+
+@interface URLFieldCell : NSTextFieldCell
+
+@property (nonatomic) SEL refreshAction;
+@property (nonatomic) id refreshTarget;
+@property (nonatomic) NSImage *favicon;
+
+@end
diff --git a/frontends/cocoa/URLFieldCell.m b/frontends/cocoa/URLFieldCell.m
new file mode 100644
index 000000000..54b240d02
--- /dev/null
+++ b/frontends/cocoa/URLFieldCell.m
@@ -0,0 +1,254 @@
+/*
+ * 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/URLFieldCell.h"
+
+#import "utils/nsurl.h"
+#import "netsurf/url_db.h"
+
+@interface URLFieldCell () <
+ NSPasteboardWriting,
+ NSDraggingSource
+>
+
+@property (nonatomic) NSButtonCell *refreshCell;
+
+- (NSRect)buttonFrame:(NSRect)cellFrame;
+- (NSRect)urlFrame:(NSRect)cellFrame;
+- (NSRect)iconFrame:(NSRect)cellFrame;
+
+@end
+
+@implementation URLFieldCell
+
+@synthesize refreshCell = _refreshCell;
+
+- (void)setFavicon:(NSImage *)newIcon
+{
+ if (_favicon != newIcon) {
+ _favicon = newIcon;
+ [self.controlView setNeedsDisplay:YES];
+ }
+}
+
+#define BUTTON_SIZE 32
+#define PADDING 2
+
+- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
+{
+ [self.favicon drawInRect:[self iconFrame:cellFrame]
+ fromRect:NSZeroRect
+ operation:NSCompositingOperationSourceOver
+ fraction:1.0];
+
+ [super drawInteriorWithFrame:[self urlFrame:cellFrame] inView:controlView];
+
+ [[self refreshCell] drawInteriorWithFrame:[self buttonFrame:cellFrame]
+ inView:controlView];
+}
+
+- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj
+ delegate:(id)anObject
+ start:(NSInteger)selStart
+ length:(NSInteger)selLength
+{
+ const NSRect textFrame = [self urlFrame:aRect];
+ [super selectWithFrame:textFrame
+ inView:controlView
+ editor:textObj
+ delegate:anObject
+ start:selStart
+ length:selLength];
+}
+
+- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj
+ delegate:(id)anObject
+ event:(NSEvent *)theEvent
+{
+ const NSRect textFrame = [self urlFrame:aRect];
+ [super editWithFrame:textFrame
+ inView:controlView
+ editor:textObj
+ delegate:anObject
+ event:theEvent];
+}
+
+- (void)startDragURLAt:(NSPoint)point inView:(NSView *)view
+{
+ NSString *url = [self stringValue];
+ NSString *title = url;
+ nsurl *nsurl;
+
+ if (nsurl_create([url UTF8String], &nsurl) != NSERROR_OK)
+ return;
+
+ const struct url_data *data = urldb_get_url_data(nsurl);
+
+ nsurl_unref(nsurl);
+
+ if (data && data->title)
+ title = [NSString stringWithUTF8String:data->title];
+
+ NSPasteboard *pb = [NSPasteboard pasteboardWithName:NSDragPboard];
+ [pb declareTypes:[NSArray arrayWithObjects:NSStringPboardType, NSURLPboardType,
+ @"public.url", @"public.url-name", nil]
+ owner:nil];
+ [pb setString:url forType:NSStringPboardType];
+ [pb setString:url forType:@"public.url"];
+ [pb setString:title forType:@"public.url-name"];
+ [[NSURL URLWithString:url] writeToPasteboard:pb];
+
+ NSRect urlBounds = NSZeroRect;
+ urlBounds.size = [title sizeWithAttributes:nil];
+ urlBounds.size.width += urlBounds.size.height + 2;
+
+ NSImage *image = [[NSImage alloc] initWithSize:urlBounds.size];
+
+ [image lockFocus];
+ [self.favicon drawInRect:NSMakeRect(urlBounds.origin.x, urlBounds.origin.y, urlBounds.size.height, urlBounds.size.height)
+ fromRect:NSZeroRect
+ operation:NSCompositingOperationCopy
+ fraction:1.0];
+ urlBounds.origin.x += urlBounds.size.height + 2;
+ [title drawInRect:urlBounds withAttributes:nil];
+ [image unlockFocus];
+
+ point.x -= urlBounds.size.height / 2;
+ point.y += urlBounds.size.height / 2;
+
+ NSDraggingItem *item = [[NSDraggingItem alloc] initWithPasteboardWriter: self];
+ item.imageComponentsProvider = ^NSArray<NSDraggingImageComponent *> * _Nonnull{
+ NSDraggingImageComponent *component = [NSDraggingImageComponent draggingImageComponentWithKey: NSDraggingImageComponentIconKey];
+ component.contents = image;
+ return @[component];
+ };
+
+ [view beginDraggingSessionWithItems:@[item] event:NSApp.currentEvent source:self];
+}
+
+- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
+{
+ return NSDragOperationCopy | NSDragOperationGeneric;
+}
+
+- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag
+{
+ const NSPoint point = [controlView convertPoint:[theEvent locationInWindow] fromView:nil];
+ const NSRect buttonRect = [self buttonFrame:cellFrame];
+ if (NSPointInRect(point, [self iconFrame:cellFrame])) {
+ [self startDragURLAt:point inView:controlView];
+ return NO;
+ } else if (NSPointInRect(point, buttonRect)) {
+ return [[self refreshCell] trackMouse:theEvent
+ inRect:buttonRect
+ ofView:controlView
+ untilMouseUp:flag];
+ } else {
+ cellFrame.size.width -= BUTTON_SIZE + PADDING;
+ return [super trackMouse:theEvent inRect:cellFrame ofView:controlView untilMouseUp:YES];
+ }
+}
+
+- (NSRect)buttonFrame:(NSRect)cellFrame
+{
+ NSRect buttonRect = cellFrame;
+ buttonRect.origin.x = NSMaxX(cellFrame) - BUTTON_SIZE;
+ buttonRect.size.width = BUTTON_SIZE;
+ return buttonRect;
+}
+
+- (NSRect)urlFrame:(NSRect)cellFrame
+{
+ NSRect textFrame = cellFrame;
+ textFrame.origin.x += cellFrame.size.height;
+ textFrame.size.width -= cellFrame.size.height + BUTTON_SIZE + PADDING;
+ return textFrame;
+}
+
+- (NSRect)iconFrame:(NSRect)cellFrame
+{
+ NSRect iconFrame = {
+ .origin = {
+ .x = cellFrame.origin.x + PADDING,
+ .y = cellFrame.origin.y,
+ },
+ .size = NSMakeSize(NSHeight(cellFrame), NSHeight(cellFrame))
+ };
+ return NSInsetRect(iconFrame, 2 * PADDING, 2 * PADDING);
+}
+
+- (NSButtonCell *)refreshCell
+{
+ if (nil == _refreshCell) {
+ _refreshCell = [[NSButtonCell alloc] initImageCell:[NSImage imageNamed:NSImageNameRefreshTemplate]];
+ _refreshCell.buttonType = NSMomentaryPushInButton;
+ _refreshCell.bordered = NO;
+ }
+
+ return _refreshCell;
+}
+
+- (void)setRefreshTarget:(id)newTarget
+{
+ self.refreshCell.target = newTarget;
+}
+
+- (id)refreshTarget
+{
+ return self.refreshCell.target;
+}
+
+- (void)setRefreshAction:(SEL)newAction
+{
+ self.refreshCell.action = newAction;
+}
+
+- (SEL)refreshAction
+{
+ return self.refreshCell.action;
+}
+
+- (nullable id) pasteboardPropertyListForType:(nonnull NSPasteboardType)type {
+ if ([type isEqualToString: NSPasteboardTypeString] || [type isEqualToString: @"public.url"]) {
+ return self.stringValue;
+ } else if ([type isEqualToString: @"public.url-name"]) {
+ nsurl *nsurl;
+
+ if (nsurl_create(self.stringValue.UTF8String, &nsurl) == NSERROR_OK) {
+
+ const struct url_data *data = urldb_get_url_data(nsurl);
+ nsurl_unref(nsurl);
+
+ if (data && data->title) {
+ return @(data->title);
+ }
+ }
+ }
+
+ return nil;
+}
+
+- (nonnull NSArray<NSPasteboardType> *) writableTypesForPasteboard:(nonnull NSPasteboard *)pasteboard {
+ return @[NSPasteboardTypeString, @"public.url", @"public.url-name"];
+}
+
+- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
+ return NSDragOperationCopy;
+}
+
+@end
diff --git a/frontends/cocoa/apple_image.h b/frontends/cocoa/apple_image.h
new file mode 100644
index 000000000..4f3b54593
--- /dev/null
+++ b/frontends/cocoa/apple_image.h
@@ -0,0 +1,38 @@
+/*
+ * 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/>.
+ */
+
+#ifndef _NETSURF_COCOA_APPLE_IMAGE_H_
+#define _NETSURF_COCOA_APPLE_IMAGE_H_
+
+#include "utils/config.h"
+#include "utils/errors.h"
+
+#ifdef WITH_APPLE_IMAGE
+
+/**
+ * Initialise apple image handlers instead of generic core ones.
+ */
+nserror apple_image_init(void);
+
+#else
+
+#define apple_image_init() NSERROR_OK
+
+#endif /* WITH_APPLE_IMAGE */
+
+#endif
diff --git a/frontends/cocoa/apple_image.m b/frontends/cocoa/apple_image.m
new file mode 100644
index 000000000..596340965
--- /dev/null
+++ b/frontends/cocoa/apple_image.m
@@ -0,0 +1,257 @@
+/*
+ * 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/>.
+ */
+
+#ifdef WITH_APPLE_IMAGE
+
+#import "cocoa/apple_image.h"
+
+#include "utils/config.h"
+#include "utils/utils.h"
+#include "netsurf/bitmap.h"
+#include "netsurf/plotters.h"
+#include "netsurf/content.h"
+#include "content/llcache.h"
+#include "content/content_protected.h"
+
+#import "cocoa/schedule.h"
+#import "cocoa/bitmap.h"
+
+typedef struct apple_image_content {
+ struct content base;
+
+ struct bitmap *bitmap; /**< Created NetSurf bitmap */
+
+ NSUInteger frames;
+ NSUInteger currentFrame;
+ int *frameTimes;
+} apple_image_content;
+
+static void *apple_image_get_internal(const struct content *c, void *context)
+{
+ apple_image_content *ai_c = (apple_image_content *)c;
+ return ai_c->bitmap;
+}
+
+static nserror apple_image_create(const content_handler *handler,
+ lwc_string *imime_type, const struct http_parameter *params,
+ llcache_handle *llcache, const char *fallback_charset,
+ bool quirks, struct content **c)
+{
+ apple_image_content *ai;
+ nserror error;
+
+ ai = calloc(1, sizeof(apple_image_content));
+ if (ai == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__init(&ai->base, handler, imime_type, params,
+ llcache, fallback_charset, quirks);
+ if (error != NSERROR_OK) {
+ free(ai);
+ return error;
+ }
+
+ *c = (struct content *)ai;
+
+ return NSERROR_OK;
+}
+
+static void animate_image_cb(void *ptr)
+{
+ struct apple_image_content *ai = ptr;
+ ++ai->currentFrame;
+ if (ai->currentFrame >= ai->frames)
+ ai->currentFrame = 0;
+
+ [(__bridge NSBitmapImageRep *)ai->bitmap setProperty:NSImageCurrentFrame withValue:[NSNumber numberWithUnsignedInteger:ai->currentFrame]];
+ cocoa_bitmap_modified(ai->bitmap);
+
+ union content_msg_data data;
+ data.redraw.full_redraw = true;
+ data.redraw.x = data.redraw.object_x = 0;
+ data.redraw.y = data.redraw.object_y = 0;
+ data.redraw.width = data.redraw.object_width = ai->base.width;
+ data.redraw.height = data.redraw.object_height = ai->base.height;
+ data.redraw.object = &ai->base;
+ content_broadcast(&ai->base, CONTENT_MSG_REDRAW, &data);
+
+ cocoa_schedule(ai->frameTimes[ai->currentFrame], animate_image_cb, ai);
+}
+
+/**
+ * Convert a CONTENT_APPLE_IMAGE for display.
+ */
+static bool apple_image_convert(struct content *c)
+{
+ apple_image_content *ai_c = (apple_image_content *)c;
+ unsigned long size;
+ const char *bytes = content__get_source_data(c, &size);
+
+ NSData *data = [NSData dataWithBytesNoCopy:(char *)bytes length:size freeWhenDone:NO];
+ NSBitmapImageRep *image = [NSBitmapImageRep imageRepWithData:data];
+
+ if (image == nil) {
+ union content_msg_data msg_data;
+ msg_data.error = "cannot decode image";
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
+ return false;
+ }
+
+ c->width = [image pixelsWide];
+ c->height = [image pixelsHigh];
+ ai_c->bitmap = (__bridge_retained void *)image;
+
+ NSString *url = [NSString stringWithUTF8String:nsurl_access(llcache_handle_get_url(content_get_llcache_handle(c)))];
+ NSString *title = [NSString stringWithFormat:@"%@ (%dx%d)", [url lastPathComponent], c->width, c->height];
+ content__set_title(c, [title UTF8String]);
+
+ content_set_ready(c);
+ content_set_done(c);
+ content_set_status(c, "");
+
+ struct apple_image_content *ai = (struct apple_image_content *)c;
+ NSUInteger frames = [[image valueForProperty:NSImageFrameCount] unsignedIntegerValue];
+ if (frames > 1) {
+ ai->frames = frames;
+ ai->currentFrame = 0;
+ ai->frameTimes = calloc(ai->frames, sizeof(int));
+ for (NSUInteger i = 0; i < frames; i++) {
+ [image setProperty:NSImageCurrentFrame withValue:[NSNumber numberWithUnsignedInteger:i]];
+ ai->frameTimes[i] = 1000 * [[image valueForProperty:NSImageCurrentFrameDuration] floatValue];
+ }
+ [image setProperty:NSImageCurrentFrame withValue:[NSNumber numberWithUnsignedInteger:0]];
+ cocoa_schedule(ai->frameTimes[0], animate_image_cb, ai);
+ }
+
+ return true;
+}
+
+static void apple_image_destroy(struct content *c)
+{
+ apple_image_content *ai_c = (apple_image_content *)c;
+
+ id bitmap = (__bridge_transfer id)ai_c->bitmap;
+ bitmap = nil;
+
+ ai_c->bitmap = NULL;
+ cocoa_schedule(-1, animate_image_cb, c);
+}
+
+static nserror apple_image_clone(const struct content *old, struct content **newc)
+{
+ apple_image_content *ai;
+ apple_image_content *ai_old = (apple_image_content *)old;
+ nserror error;
+
+ ai = calloc(1, sizeof(apple_image_content));
+ if (ai == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__clone(old, &ai->base);
+ if (error != NSERROR_OK) {
+ content_destroy(&ai->base);
+ return error;
+ }
+
+ if (old->status == CONTENT_STATUS_READY || old->status == CONTENT_STATUS_DONE) {
+ ai->base.width = old->width;
+ ai->base.height = old->height;
+ ai->bitmap = (__bridge_retained void *)((__bridge id)ai_old->bitmap);
+ }
+
+ *newc = (struct content *)ai;
+
+ return NSERROR_OK;
+}
+
+static content_type apple_image_content_type(void)
+{
+ return CONTENT_IMAGE;
+}
+
+/**
+ * Redraw a CONTENT_APPLE_IMAGE with appropriate tiling.
+ */
+static bool apple_image_redraw(struct content *c, struct content_redraw_data *data,
+ const struct rect *clip, const struct redraw_context *ctx)
+{
+ apple_image_content *ai_c = (apple_image_content *)c;
+ bitmap_flags_t flags = BITMAPF_NONE;
+
+ if (data->repeat_x)
+ flags |= BITMAPF_REPEAT_X;
+ if (data->repeat_y)
+ flags |= BITMAPF_REPEAT_Y;
+
+ return ctx->plot->bitmap(ctx, ai_c->bitmap, data->x, data->y, data->width, data->height,
+ data->background_colour, flags) == NSERROR_OK;
+}
+
+static const content_handler apple_image_content_handler = {
+ .create = apple_image_create,
+ .data_complete = apple_image_convert,
+ .destroy = apple_image_destroy,
+ .redraw = apple_image_redraw,
+ .clone = apple_image_clone,
+ .get_internal = apple_image_get_internal,
+ .type = apple_image_content_type,
+ .no_share = false
+};
+
+static nserror register_for_type(NSString *mime)
+{
+ const char *type = [mime UTF8String];
+/* nsgif has priority since it supports animated GIF */
+#ifdef WITH_GIF
+ if (strcmp(type, "image/gif") == 0)
+ return NSERROR_OK;
+#endif
+
+ nserror error = content_factory_register_handler(type, &apple_image_content_handler);
+ if (error != NSERROR_OK)
+ return error;
+
+ return NSERROR_OK;
+}
+
+/* exported interface documented in cocoa/apple_image.h */
+nserror apple_image_init(void)
+{
+ NSArray *utis = [NSBitmapImageRep imageTypes];
+ for (NSString *uti in utis) {
+ NSDictionary *declaration = (__bridge_transfer NSDictionary *)UTTypeCopyDeclaration((__bridge CFStringRef)uti);
+ id mimeTypes = [[declaration objectForKey:(NSString *)kUTTypeTagSpecificationKey] objectForKey:(NSString *)kUTTagClassMIMEType];
+
+ if (mimeTypes == nil)
+ continue;
+
+ if (![mimeTypes isKindOfClass:[NSArray class]]) {
+ mimeTypes = [NSArray arrayWithObject:mimeTypes];
+ }
+
+ for (NSString *mime in mimeTypes) {
+ nserror error = register_for_type(mime);
+ if (error != NSERROR_OK)
+ return error;
+ }
+ }
+
+ return NSERROR_OK;
+}
+
+#endif /* WITH_APPLE_IMAGE */
diff --git a/frontends/cocoa/arc.h b/frontends/cocoa/arc.h
new file mode 100644
index 000000000..bfdf31c5c
--- /dev/null
+++ b/frontends/cocoa/arc.h
@@ -0,0 +1,22 @@
+#ifndef arc_h
+#define arc_h
+
+/**
+ * Retains an Objective-C object and returns a pointer that can be passed to C.
+ * @param object The object to retain
+ * @return Pointer suitable to be stored in C code.
+ */
+static inline void *arc_retain(id object) {
+ return (__bridge_retained void *)object;
+}
+
+/**
+ * Releases the Objective-C object pointed to by a C pointer.
+ * @param pointer Object pointer to release.
+ */
+static inline void arc_release(void *pointer) {
+ id object = (__bridge_transfer id)pointer;
+ object = nil;
+}
+
+#endif
diff --git a/frontends/cocoa/bitmap.h b/frontends/cocoa/bitmap.h
new file mode 100644
index 000000000..ebc6a20f4
--- /dev/null
+++ b/frontends/cocoa/bitmap.h
@@ -0,0 +1,28 @@
+/*
+ * 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/>.
+ */
+
+#ifndef COCOA_BITMAP_H
+#define COCOA_BITMAP_H
+
+CGImageRef cocoa_get_cgimage(void *bitmap);
+
+void cocoa_bitmap_modified(void *bitmap);
+
+struct gui_bitmap_table *cocoa_bitmap_table;
+
+#endif
diff --git a/frontends/cocoa/bitmap.m b/frontends/cocoa/bitmap.m
new file mode 100644
index 000000000..089870e8a
--- /dev/null
+++ b/frontends/cocoa/bitmap.m
@@ -0,0 +1,264 @@
+/*
+ * 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/>.
+ */
+
+/**
+ * \file
+ * Cocoa implementation of bitmap operations.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#import "netsurf/browser_window.h"
+#import "netsurf/plotters.h"
+#import "netsurf/bitmap.h"
+#import "netsurf/content.h"
+
+#import "cocoa/plotter.h"
+#import "cocoa/bitmap.h"
+
+#import "cocoa/arc.h"
+
+#define BITS_PER_SAMPLE (8)
+#define SAMPLES_PER_PIXEL (4)
+#define BITS_PER_PIXEL (BITS_PER_SAMPLE * SAMPLES_PER_PIXEL)
+#define BYTES_PER_PIXEL (BITS_PER_PIXEL / 8)
+#define RED_OFFSET (0)
+#define GREEN_OFFSET (1)
+#define BLUE_OFFSET (2)
+#define ALPHA_OFFSET (3)
+
+static CGImageRef cocoa_prepare_bitmap(void *bitmap);
+
+static inline NSMapTable *cocoa_get_bitmap_cache(void)
+{
+ static NSMapTable *cache = nil;
+ if (cache == nil) {
+ cache = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0);
+ }
+ return cache;
+}
+
+static inline NSBitmapImageRep *get_bitmap(void *bitmap) {
+ NSCParameterAssert(bitmap);
+ return (__bridge NSBitmapImageRep *)bitmap;
+}
+
+static int bitmap_get_width(void *bitmap)
+{
+ return (int)get_bitmap(bitmap).pixelsWide;
+}
+
+static int bitmap_get_height(void *bitmap)
+{
+ return (int)get_bitmap(bitmap).pixelsHigh;
+}
+
+static bool bitmap_get_opaque(void *bitmap)
+{
+ return get_bitmap(bitmap).isOpaque;
+}
+
+static void bitmap_destroy(void *bitmap)
+{
+ NSCParameterAssert(NULL != bitmap);
+
+ cocoa_bitmap_modified(bitmap);
+ arc_release(bitmap);
+}
+
+static void *bitmap_create(int width, int height, unsigned int state)
+{
+ NSBitmapImageRep *bmp = [[NSBitmapImageRep alloc]
+ initWithBitmapDataPlanes:NULL
+ pixelsWide:width
+ pixelsHigh:height
+ bitsPerSample:BITS_PER_SAMPLE
+ samplesPerPixel:SAMPLES_PER_PIXEL
+ hasAlpha:YES
+ isPlanar:NO
+ colorSpaceName:NSDeviceRGBColorSpace
+ bitmapFormat:NSAlphaNonpremultipliedBitmapFormat
+ bytesPerRow:BYTES_PER_PIXEL * width
+ bitsPerPixel:BITS_PER_PIXEL];
+
+ return arc_retain(bmp);
+}
+
+static void bitmap_set_opaque(void *bitmap, bool opaque)
+{
+ get_bitmap(bitmap).opaque = opaque ? YES : NO;
+}
+
+static unsigned char *bitmap_get_buffer(void *bitmap)
+{
+ return get_bitmap(bitmap).bitmapData;
+}
+
+static size_t bitmap_get_rowstride(void *bitmap)
+{
+ return get_bitmap(bitmap).bytesPerRow;
+}
+
+static size_t bitmap_get_bpp(void *bitmap)
+{
+ return get_bitmap(bitmap).bitsPerPixel / 8;
+}
+
+static bool bitmap_test_opaque(void *bitmap)
+{
+ NSCParameterAssert(bitmap_get_bpp(bitmap) == BYTES_PER_PIXEL);
+
+ unsigned char *buf = bitmap_get_buffer(bitmap);
+
+ const size_t height = bitmap_get_height(bitmap);
+ const size_t width = bitmap_get_width(bitmap);
+
+ const size_t line_step = bitmap_get_rowstride(bitmap) - BYTES_PER_PIXEL * width;
+
+ for (size_t y = 0; y < height; y++) {
+ for (size_t x = 0; x < height; x++) {
+ if (buf[ALPHA_OFFSET] != 0xFF)
+ return false;
+ buf += BYTES_PER_PIXEL;
+ }
+ buf += line_step;
+ }
+
+ return true;
+}
+
+static bool bitmap_save(void *bitmap, const char *path, unsigned flags)
+{
+ NSData *tiff = get_bitmap(bitmap).TIFFRepresentation;
+ return [tiff writeToFile:@(path) atomically:YES];
+}
+
+void cocoa_bitmap_modified(void *bitmap)
+{
+ NSMapTable *cache = cocoa_get_bitmap_cache();
+ CGImageRef image = NSMapGet(cache, bitmap);
+ if (NULL != image) {
+ CGImageRelease(image);
+ NSMapRemove(cache, bitmap);
+ }
+}
+
+CGImageRef cocoa_get_cgimage(void *bitmap)
+{
+ NSMapTable *cache = cocoa_get_bitmap_cache();
+
+ CGImageRef result = NSMapGet(cache, bitmap);
+ if (NULL == result) {
+ result = cocoa_prepare_bitmap(bitmap);
+ NSMapInsertKnownAbsent(cache, bitmap, result);
+ }
+
+ return result;
+}
+
+static CGImageRef cocoa_prepare_bitmap(void *bitmap)
+{
+ NSBitmapImageRep *bmp = get_bitmap(bitmap);
+
+ size_t w = bmp.pixelsWide;
+ size_t h = bmp.pixelsHigh;
+
+ CGImageRef original = bmp.CGImage;
+
+ if (h <= 1) {
+ return CGImageRetain(original);
+ }
+
+ void *data = malloc(4 * w * h);
+
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(data, w, h, BITS_PER_SAMPLE,
+ BYTES_PER_PIXEL * w, colorSpace,
+ [bmp isOpaque] ? kCGImageAlphaNoneSkipLast
+ : kCGImageAlphaPremultipliedLast);
+ CGColorSpaceRelease(colorSpace);
+
+ CGContextTranslateCTM(context, 0.0, h);
+ CGContextScaleCTM(context, 1.0, -1.0);
+
+ CGRect rect = CGRectMake(0, 0, w, h);
+ CGContextClearRect(context, rect);
+ CGContextDrawImage(context, rect, original);
+
+ CGImageRef result = CGBitmapContextCreateImage(context);
+
+ CGContextRelease(context);
+ free(data);
+
+ return result;
+}
+
+static nserror bitmap_render(struct bitmap *bitmap, struct hlcache_handle *content)
+{
+ int bwidth = bitmap_get_width(bitmap);
+ int bheight = bitmap_get_height(bitmap);
+
+ struct redraw_context ctx = {
+ .interactive = false,
+ .background_images = true,
+ .plot = &cocoa_plotters
+ };
+
+ CGColorSpaceRef cspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
+ CGContextRef bitmapContext = CGBitmapContextCreate(bitmap_get_buffer(bitmap),
+ bwidth, bheight,
+ bitmap_get_bpp(bitmap) * 8 / 4,
+ bitmap_get_rowstride(bitmap),
+ cspace, kCGImageAlphaNoneSkipLast);
+ CGColorSpaceRelease(cspace);
+
+ int width = MIN(content_get_width(content), 1024);
+ int height = ((width * bheight) + bwidth / 2) / bwidth;
+
+ CGContextTranslateCTM(bitmapContext, 0, bheight);
+ CGContextScaleCTM(bitmapContext, (CGFloat)bwidth / width, -(CGFloat)bheight / height);
+
+ [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:YES]];
+
+ content_scaled_redraw(content, width, height, &ctx);
+
+ [NSGraphicsContext setCurrentContext:nil];
+ CGContextRelease(bitmapContext);
+
+ cocoa_bitmap_modified(bitmap);
+
+ return NSERROR_OK;
+}
+
+static struct gui_bitmap_table bitmap_table = {
+ .create = bitmap_create,
+ .destroy = bitmap_destroy,
+ .set_opaque = bitmap_set_opaque,
+ .get_opaque = bitmap_get_opaque,
+ .test_opaque = bitmap_test_opaque,
+ .get_buffer = bitmap_get_buffer,
+ .get_rowstride = bitmap_get_rowstride,
+ .get_width = bitmap_get_width,
+ .get_height = bitmap_get_height,
+ .get_bpp = bitmap_get_bpp,
+ .save = bitmap_save,
+ .modified = cocoa_bitmap_modified,
+ .render = bitmap_render,
+};
+
+struct gui_bitmap_table *cocoa_bitmap_table = &bitmap_table;
diff --git a/frontends/cocoa/compile-xib.sh b/frontends/cocoa/compile-xib.sh
new file mode 100755
index 000000000..576f9bfd0
--- /dev/null
+++ b/frontends/cocoa/compile-xib.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+# call: compile-xib.sh [xib file] [language] [(optional output nib file)]
+DIR=`dirname "$1"`
+XIB=`basename -s .xib "$1"`
+
+STRINGS_FILE="$DIR/$2.lproj/$XIB.xib.strings"
+TRANSLATE=""
+if [ -f $STRINGS_FILE ]
+then
+ TRANSLATE="--strings-file $STRINGS_FILE"
+fi
+
+OUTPUT="$2.$XIB.nib"
+
+if [ "x$3" != "x" ]
+then
+ OUTPUT="$3"
+fi
+
+exec /usr/bin/ibtool $TRANSLATE --compile $OUTPUT $1
diff --git a/frontends/cocoa/coordinates.h b/frontends/cocoa/coordinates.h
new file mode 100644
index 000000000..516df437b
--- /dev/null
+++ b/frontends/cocoa/coordinates.h
@@ -0,0 +1,104 @@
+/*
+ * 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/>.
+ */
+
+#ifndef COCOA_COORDINATES_H
+#define COCOA_COORDINATES_H
+
+extern CGFloat cocoa_scale_factor;
+
+static inline CGFloat cocoa_px_to_pt(int location) __attribute__((always_inline, pure));
+static inline CGFloat cocoa_px_to_pt_f(CGFloat location) __attribute__((always_inline, pure));
+
+static inline int cocoa_pt_to_px(CGFloat location) __attribute__((always_inline, pure));
+
+static inline NSPoint cocoa_point(int x, int y) __attribute__((always_inline, pure));
+static inline NSPoint cocoa_scaled_point(CGFloat scale, int x, int y) __attribute__((always_inline, pure));
+
+static inline NSSize cocoa_size(int w, int h) __attribute__((always_inline, pure));
+static inline NSSize cocoa_scaled_size(CGFloat scale, int w, int h) __attribute__((always_inline, pure));
+
+static inline NSRect cocoa_rect(int x0, int y0, int x1, int y1) __attribute__((always_inline, pure));
+static inline NSRect cocoa_rect_wh(int x, int y, int w, int h) __attribute__((always_inline, pure));
+
+static inline NSRect cocoa_scaled_rect(CGFloat scale, int x0, int y0, int x1, int y1) __attribute__((always_inline, pure));
+static inline NSRect cocoa_scaled_rect_wh(CGFloat scale, int x, int y, int w, int h) __attribute__((always_inline, pure));
+
+static inline CGFloat cocoa_px_to_pt(int location)
+{
+ return (CGFloat)location * cocoa_scale_factor;
+}
+
+static inline CGFloat cocoa_px_to_pt_f(CGFloat location)
+{
+ return floor(location) * cocoa_scale_factor;
+}
+
+static inline int cocoa_pt_to_px(CGFloat location)
+{
+ return location / cocoa_scale_factor;
+}
+
+static inline NSPoint cocoa_point(int x, int y)
+{
+ return NSMakePoint(cocoa_px_to_pt(x), cocoa_px_to_pt(y));
+}
+
+static inline NSPoint cocoa_scaled_point(CGFloat scale, int x, int y)
+{
+ return NSMakePoint(cocoa_px_to_pt_f(scale * x), cocoa_px_to_pt_f(scale * y));
+}
+
+static inline NSSize cocoa_size(int w, int h)
+{
+ return NSMakeSize(cocoa_px_to_pt(w), cocoa_px_to_pt(h));
+}
+
+static inline NSSize cocoa_scaled_size(CGFloat scale, int w, int h)
+{
+ return NSMakeSize(cocoa_px_to_pt_f(scale * w), cocoa_px_to_pt_f(scale * h));
+}
+
+static inline NSRect cocoa_rect(int x0, int y0, int x1, int y1)
+{
+ return cocoa_rect_wh(x0, y0, x1 - x0, y1 - y0);
+}
+
+static inline NSRect cocoa_rect_wh(int x, int y, int w, int h)
+{
+ const NSRect result = {
+ .origin = cocoa_point(x, y),
+ .size = cocoa_size(w, h)
+ };
+ return result;
+}
+
+static inline NSRect cocoa_scaled_rect_wh(CGFloat scale, int x, int y, int w, int h)
+{
+ const NSRect result = {
+ .origin = cocoa_scaled_point(scale, x, y),
+ .size = cocoa_scaled_size(scale, w, h)
+ };
+ return result;
+}
+
+static inline NSRect cocoa_scaled_rect(CGFloat scale, int x0, int y0, int x1, int y1)
+{
+ return cocoa_scaled_rect_wh(scale, x0, y0, x1 - x0, y1 - y0);
+}
+
+#endif
diff --git a/frontends/cocoa/desktop-tree.h b/frontends/cocoa/desktop-tree.h
new file mode 100644
index 000000000..3a6fee306
--- /dev/null
+++ b/frontends/cocoa/desktop-tree.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net>
+ *
+ * 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/>.
+ */
+
+/** \file
+ * deprecated compatibility layer for new treeview modules. Do not use.
+ */
+
+#ifndef _NETSURF_DESKTOP_TREE_H_
+#define _NETSURF_DESKTOP_TREE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "netsurf/mouse.h"
+
+struct sslcert_session_data;
+struct tree;
+struct redraw_context;
+
+/**
+ * Current ssl session data for treeview
+ *
+ * @todo FIXME global certificate treeview state must go away, this is
+ * just wrong.
+ */
+extern struct sslcert_session_data *ssl_current_session;
+extern const char *tree_hotlist_path;
+
+/* Tree flags */
+enum tree_flags {
+ TREE_HISTORY,
+ TREE_COOKIES,
+ TREE_SSLCERT,
+ TREE_HOTLIST
+};
+
+typedef enum {
+ TREE_NO_DRAG = 0,
+ TREE_SELECT_DRAG,
+ TREE_MOVE_DRAG,
+ TREE_TEXTAREA_DRAG, /** < A drag that is passed to a textarea */
+ TREE_UNKNOWN_DRAG /** < A drag the tree itself won't handle */
+} tree_drag_type;
+
+/** callbacks to perform necessary operations on treeview. */
+struct treeview_table {
+ void (*redraw_request)(int x, int y, int width, int height,
+ void *data); /**< request a redraw. */
+ void (*resized)(struct tree *tree, int width, int height,
+ void *data); /**< resize treeview area. */
+ void (*scroll_visible)(int y, int height, void *data); /**< scroll visible treeview area. */
+ void (*get_window_dimensions)(int *width, int *height, void *data); /**< get dimensions of window */
+};
+
+struct tree *tree_create(unsigned int flags,
+ const struct treeview_table *callbacks,
+ void *client_data);
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+void tree_delete(struct tree *tree);
+tree_drag_type tree_drag_status(struct tree *tree);
+void tree_draw(struct tree *tree, int x, int y,
+ int clip_x, int clip_y, int clip_width, int clip_height,
+ const struct redraw_context *ctx);
+bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse,
+ int x, int y);
+void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0,
+ int x1, int y1);
+bool tree_keypress(struct tree *tree, uint32_t key);
+
+#endif
diff --git a/frontends/cocoa/desktop-tree.m b/frontends/cocoa/desktop-tree.m
new file mode 100644
index 000000000..0874eeef7
--- /dev/null
+++ b/frontends/cocoa/desktop-tree.m
@@ -0,0 +1,351 @@
+/*
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net>
+ *
+ * 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/>.
+ */
+
+/** \file
+ * deprecated compatibility layer for new treeview modules. Do not use.
+ */
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
+#include "netsurf/browser_window.h"
+#include "netsurf/core_window.h"
+#include "content/content.h"
+#include "content/hlcache.h"
+
+#import "cocoa/desktop-tree.h"
+
+struct tree {
+ unsigned int flags; /* Tree flags */
+ tree_drag_type drag;
+ const struct treeview_table *callbacks;
+ void *client_data; /* User assigned data for the callbacks */
+};
+
+#include "netsurf/misc.h"
+#include "desktop/gui_internal.h"
+#include "desktop/treeview.h"
+#include "desktop/hotlist.h"
+#include "desktop/cookie_manager.h"
+#include "desktop/global_history.h"
+#include "desktop/sslcert_viewer.h"
+
+struct sslcert_session_data *ssl_current_session = NULL;
+const char *tree_hotlist_path = NULL;
+
+static nserror treeview_test_redraw_request(struct core_window *cw,
+ const struct rect *r)
+{
+ struct tree *tree = (struct tree *)cw;
+
+ tree->callbacks->redraw_request(r->x0, r->y0,
+ r->x1 - r->x0, r->y1 - r->y0,
+ tree->client_data);
+
+ return NSERROR_OK;
+}
+
+static void treeview_test_update_size(struct core_window *cw,
+ int width, int height)
+{
+ struct tree *tree = (struct tree *)cw;
+
+ tree->callbacks->resized(tree, width, height, tree->client_data);
+}
+
+static void treeview_test_scroll_visible(struct core_window *cw,
+ const struct rect *r)
+{
+}
+
+static void treeview_test_get_window_dimensions(struct core_window *cw,
+ int *width, int *height)
+{
+ struct tree *tree = (struct tree *)cw;
+
+ tree->callbacks->get_window_dimensions(width, height,
+ tree->client_data);
+}
+
+static void treeview_test_drag_status(struct core_window *cw,
+ core_window_drag_status ds)
+{
+ struct tree *tree = (struct tree *)cw;
+
+ switch (ds) {
+ case CORE_WINDOW_DRAG_NONE:
+ tree->drag = TREE_NO_DRAG;
+ break;
+
+ case CORE_WINDOW_DRAG_SELECTION:
+ tree->drag = TREE_SELECT_DRAG;
+ break;
+
+ case CORE_WINDOW_DRAG_MOVE:
+ tree->drag = TREE_MOVE_DRAG;
+ break;
+
+ case CORE_WINDOW_DRAG_TEXT_SELECTION:
+ tree->drag = TREE_TEXTAREA_DRAG;
+ break;
+
+ default:
+ break;
+ }
+}
+
+struct core_window_callback_table cw_t = {
+ .invalidate = treeview_test_redraw_request,
+ .update_size = treeview_test_update_size,
+ .scroll_visible = treeview_test_scroll_visible,
+ .get_window_dimensions = treeview_test_get_window_dimensions,
+ .drag_status = treeview_test_drag_status
+};
+
+static bool treeview_test_init(struct tree *tree)
+{
+ nserror err;
+
+ switch (tree->flags) {
+ case TREE_COOKIES:
+ err = cookie_manager_init(&cw_t, (struct core_window *)tree);
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't init new cookie manager.", 0);
+ break;
+ case TREE_HISTORY:
+ err = global_history_init(&cw_t, (struct core_window *)tree);
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't init new global history.", 0);
+ break;
+ case TREE_HOTLIST:
+ err = hotlist_init(tree_hotlist_path, tree_hotlist_path);
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't init new hotlist.", 0);
+ err = hotlist_manager_init(&cw_t, (struct core_window *)tree);
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't init hotlist manager.", 0);
+ break;
+ case TREE_SSLCERT:
+ assert(ssl_current_session == NULL && "Call sslcert_viewer_init directly, "
+ "this compat. layer can't cope with simultanious "
+ "sslcert viewers");
+ err = sslcert_viewer_init(&cw_t, (struct core_window *)tree,
+ ssl_current_session);
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't init new sslcert viewer.", 0);
+ break;
+ }
+
+ return true;
+}
+
+static bool treeview_test_fini(struct tree *tree)
+{
+ nserror err;
+
+ switch (tree->flags) {
+ case TREE_COOKIES:
+ err = cookie_manager_fini();
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't finalise cookie manager.", 0);
+ break;
+ case TREE_HISTORY:
+ err = global_history_fini();
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't finalise cookie manager.", 0);
+ break;
+ case TREE_HOTLIST:
+ err = hotlist_fini();
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't finalise hotlist.", 0);
+ break;
+ case TREE_SSLCERT:
+ assert(ssl_current_session != NULL && "Can't use sslcert window after sslcert_viewer_fini()");
+ err = sslcert_viewer_fini(ssl_current_session);
+ ssl_current_session = NULL;
+ if (err != NSERROR_OK)
+ guit->misc->warning("Couldn't finalise sslcert viewer.", 0);
+ break;
+ }
+
+ return true;
+}
+
+static bool treeview_test_redraw(struct tree *tree, int x, int y,
+ int clip_x, int clip_y, int clip_width, int clip_height,
+ const struct redraw_context *ctx)
+{
+ struct rect clip;
+
+ clip.x0 = clip_x;
+ clip.y0 = clip_y;
+ clip.x1 = clip_x + clip_width;
+ clip.y1 = clip_y + clip_height;
+
+ switch (tree->flags) {
+ case TREE_SSLCERT:
+ if (ssl_current_session != NULL) {
+ sslcert_viewer_redraw(ssl_current_session, x, y, &clip, ctx);
+ }
+ return true;
+ case TREE_COOKIES:
+ cookie_manager_redraw(x, y, &clip, ctx);
+ return true;
+ case TREE_HISTORY:
+ global_history_redraw(x, y, &clip, ctx);
+ return true;
+ case TREE_HOTLIST:
+ hotlist_redraw(x, y, &clip, ctx);
+ return true;
+ }
+
+ return false;
+}
+
+static bool treeview_test_mouse_action(struct tree *tree,
+ browser_mouse_state mouse, int x, int y)
+{
+ switch (tree->flags) {
+ case TREE_SSLCERT:
+ assert(ssl_current_session != NULL && "Can't use sslcert window after sslcert_viewer_fini()");
+ sslcert_viewer_mouse_action(ssl_current_session, mouse, x, y);
+ return true;
+ case TREE_COOKIES:
+ cookie_manager_mouse_action(mouse, x, y);
+ return true;
+ case TREE_HISTORY:
+ global_history_mouse_action(mouse, x, y);
+ return true;
+ case TREE_HOTLIST:
+ hotlist_mouse_action(mouse, x, y);
+ return true;
+ }
+
+ return false;
+}
+
+static bool treeview_test_keypress(struct tree *tree, uint32_t key)
+{
+ switch (tree->flags) {
+ case TREE_SSLCERT:
+ assert(ssl_current_session != NULL && "Can't use sslcert window after sslcert_viewer_fini()");
+ sslcert_viewer_keypress(ssl_current_session, key);
+ return true;
+ case TREE_COOKIES:
+ cookie_manager_keypress(key);
+ return true;
+ case TREE_HISTORY:
+ global_history_keypress(key);
+ return true;
+ case TREE_HOTLIST:
+ hotlist_keypress(key);
+ return true;
+ }
+
+ return false;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+struct tree *tree_create(unsigned int flags,
+ const struct treeview_table *callbacks, void *client_data)
+{
+ struct tree *tree;
+
+ tree = calloc(sizeof(struct tree), 1);
+ if (tree == NULL) {
+ NSLOG(netsurf, INFO, "calloc failed");
+ guit->misc->warning(messages_get_errorcode(NSERROR_NOMEM), 0);
+ return NULL;
+ }
+
+ tree->flags = flags;
+ tree->drag = TREE_NO_DRAG;
+ tree->callbacks = callbacks;
+ tree->client_data = client_data;
+
+ treeview_test_init(tree);
+
+ return tree;
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+void tree_delete(struct tree *tree)
+{
+ treeview_test_fini(tree);
+ free(tree);
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+void tree_draw(struct tree *tree, int x, int y,
+ int clip_x, int clip_y, int clip_width, int clip_height,
+ const struct redraw_context *ctx)
+{
+ assert(tree != NULL);
+
+ treeview_test_redraw(tree, x, y, clip_x, clip_y,
+ clip_width, clip_height, ctx);
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse, int x,
+ int y)
+{
+ assert(tree != NULL);
+
+ if (treeview_test_mouse_action(tree, mouse, x, y)) {
+ return true;
+ }
+
+ return false;
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0,
+ int x1, int y1)
+{
+ assert(tree != NULL);
+
+ treeview_test_mouse_action(tree, BROWSER_MOUSE_HOVER, x1, y1);
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+bool tree_keypress(struct tree *tree, uint32_t key)
+{
+ if (treeview_test_keypress(tree, key)) {
+ return true;
+ }
+
+ return false;
+}
+
+/** deprecated compatibility layer for new treeview modules. Do not use. */
+tree_drag_type tree_drag_status(struct tree *tree)
+{
+ assert(tree != NULL);
+ return tree->drag;
+}
diff --git a/frontends/cocoa/extract-strings.sh b/frontends/cocoa/extract-strings.sh
new file mode 100755
index 000000000..c3f582619
--- /dev/null
+++ b/frontends/cocoa/extract-strings.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+for i in $1/*.xib
+do
+ xib=`basename "$i"`
+ strings="$2/$xib.strings"
+
+ ibtool "$i" --generate-strings-file "$strings"
+done
+
+
diff --git a/frontends/cocoa/fetch.h b/frontends/cocoa/fetch.h
new file mode 100644
index 000000000..1b0991ef5
--- /dev/null
+++ b/frontends/cocoa/fetch.h
@@ -0,0 +1,19 @@
+/*
+ * 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/>.
+ */
+
+extern struct gui_fetch_table *cocoa_fetch_table;
diff --git a/frontends/cocoa/fetch.m b/frontends/cocoa/fetch.m
new file mode 100644
index 000000000..764f25438
--- /dev/null
+++ b/frontends/cocoa/fetch.m
@@ -0,0 +1,131 @@
+/*
+ * 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/log.h"
+#import "utils/nsurl.h"
+#import "netsurf/fetch.h"
+
+#import "cocoa/fetch.h"
+
+static char cocoafiletype[200];
+
+static const char *fetch_filetype(const char *unix_path)
+{
+ NSString *path = @(unix_path);
+ NSString *uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:NULL];
+ if (uti == nil) {
+ // If the file was not found look up the UTI from the file extension.
+ uti = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)path.pathExtension, nil);
+ }
+
+ if (uti == nil) {
+ // We can’t determine the UTI, let’s pretend this is HTML.
+ return "text/html";
+ }
+
+ NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)uti, kUTTagClassMIMEType);
+
+ strncpy(cocoafiletype, [mimeType cStringUsingEncoding: NSUTF8StringEncoding], sizeof cocoafiletype);
+
+ NSLOG(netsurf, INFO, "\tMIME type for '%s' is '%s'", unix_path, cocoafiletype);
+
+ return cocoafiletype;
+}
+
+static NSString *findResource(const char *path) {
+ NSString *pathString = @(path);
+ NSString *nspath = [[NSBundle mainBundle] pathForResource:pathString ofType:@""];
+
+ if (nspath == nil) {
+ nspath = [[NSBundle mainBundle] pathForResource: pathString ofType:@"" inDirectory:nil forLocalization:@"en"];
+ }
+
+ return nspath;
+}
+
+static nsurl *gui_get_resource_url(const char *path)
+{
+ NSString *nspath = findResource(path);
+ if (nspath == nil) {
+ return NULL;
+ }
+
+ nsurl *url = NULL;
+ nsurl_create([[[NSURL fileURLWithPath:nspath] absoluteString] UTF8String], &url);
+ return url;
+}
+
+static nserror cocoa_get_resource_data(const char *path, const uint8_t **data, size_t *data_len)
+{
+ NSString *resourcePath = findResource(path);
+ if (resourcePath == nil) {
+ return NSERROR_NOT_FOUND;
+ }
+
+ int file = open(resourcePath.fileSystemRepresentation, O_RDONLY);
+ if (file < 0) {
+ return NSERROR_NOT_FOUND;
+ }
+
+ int size = lseek(file, 0, SEEK_END);
+ if (size < 0) {
+ close(file);
+ return NSERROR_INVALID;
+ }
+
+ void *buffer = malloc(size);
+ if (buffer == NULL) {
+ close(file);
+ return NSERROR_NOMEM;
+ }
+
+ lseek(file, 0, SEEK_SET);
+ int readAmount = read(file, buffer, size);
+
+ if (size != readAmount) {
+ free(buffer);
+ close(file);
+ return NSERROR_INVALID;
+ }
+
+ *data = buffer;
+ *data_len = size;
+
+ close(file);
+
+ return NSERROR_OK;
+}
+
+static nserror cocoa_release_resource_data(const uint8_t *data)
+{
+ free((void *)data);
+ return NSERROR_OK;
+}
+
+static struct gui_fetch_table fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+
+ .get_resource_data = cocoa_get_resource_data,
+ .release_resource_data = cocoa_release_resource_data,
+};
+
+struct gui_fetch_table *cocoa_fetch_table = &fetch_table;
diff --git a/frontends/cocoa/font.h b/frontends/cocoa/font.h
new file mode 100644
index 000000000..221b885a1
--- /dev/null
+++ b/frontends/cocoa/font.h
@@ -0,0 +1,28 @@
+/*
+ * 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/>.
+ */
+
+#ifndef COCOA_FONT_H
+#define COCOA_FONT_H
+
+#import "netsurf/plot_style.h"
+
+void cocoa_draw_string(CGFloat x, CGFloat y, const char *bytes, size_t length, const struct plot_font_style *style);
+
+struct gui_layout_table *cocoa_layout_table;
+
+#endif
diff --git a/frontends/cocoa/font.m b/frontends/cocoa/font.m
new file mode 100644
index 000000000..daed97fae
--- /dev/null
+++ b/frontends/cocoa/font.m
@@ -0,0 +1,251 @@
+/*
+ * 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 "netsurf/layout.h"
+#import "netsurf/plotters.h"
+
+#import "cocoa/coordinates.h"
+#import "cocoa/plotter.h"
+#import "cocoa/font.h"
+
+static NSLayoutManager *cocoa_prepare_layout_manager(const char *string, size_t length,
+ const plot_font_style_t *style);
+
+static CGFloat cocoa_layout_width(NSLayoutManager *layout);
+static CGFloat cocoa_layout_width_chars(NSLayoutManager *layout, size_t characters);
+static NSUInteger cocoa_glyph_for_location(NSLayoutManager *layout, CGFloat x);
+static size_t cocoa_bytes_for_characters(const char *string, size_t characters);
+static NSDictionary *cocoa_font_attributes(const plot_font_style_t *style);
+
+static NSTextStorage *cocoa_text_storage = nil;
+static NSTextContainer *cocoa_text_container = nil;
+
+static nserror cocoa_font_width(const plot_font_style_t *style,
+ const char *string, size_t length,
+ int *width)
+{
+ NSLayoutManager *layout;
+ layout = cocoa_prepare_layout_manager(string, length, style);
+ *width = cocoa_layout_width(layout);
+ return NSERROR_OK;
+}
+
+static nserror cocoa_font_position(const plot_font_style_t *style,
+ const char *string, size_t length,
+ int x, size_t *char_offset, int *actual_x)
+{
+ NSLayoutManager *layout = cocoa_prepare_layout_manager(string, length, style);
+ if (layout == nil) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ NSUInteger glyphIndex = cocoa_glyph_for_location(layout, x);
+ NSUInteger chars = [layout characterIndexForGlyphAtIndex:glyphIndex];
+
+ if (chars >= [cocoa_text_storage length])
+ *char_offset = length;
+ else
+ *char_offset = cocoa_bytes_for_characters(string, chars);
+
+ *actual_x = cocoa_pt_to_px(NSMaxX([layout boundingRectForGlyphRange:NSMakeRange(glyphIndex - 1, 1)
+ inTextContainer:cocoa_text_container]));
+
+ return NSERROR_OK;
+}
+
+static nserror cocoa_font_split(const plot_font_style_t *style,
+ const char *string, size_t length,
+ int x, size_t *char_offset, int *actual_x)
+{
+ NSLayoutManager *layout = cocoa_prepare_layout_manager(string, length, style);
+ if (layout == nil)
+ return NSERROR_BAD_PARAMETER;
+
+ NSUInteger glyphIndex = cocoa_glyph_for_location(layout, x);
+ NSUInteger chars = [layout characterIndexForGlyphAtIndex:glyphIndex];
+
+ if (chars >= [cocoa_text_storage length]) {
+ *char_offset = length;
+ *actual_x = cocoa_layout_width(layout);
+ return NSERROR_OK;
+ }
+
+ chars = [[cocoa_text_storage string] rangeOfString:@" " options:NSBackwardsSearch range:NSMakeRange(0, chars + 1)].location;
+ if (chars == NSNotFound) {
+ *char_offset = 0;
+ *actual_x = 0;
+ return NSERROR_OK;
+ }
+
+ *char_offset = cocoa_bytes_for_characters(string, chars);
+ *actual_x = cocoa_layout_width_chars(layout, chars);
+
+ return NSERROR_OK;
+}
+
+static struct gui_layout_table layout_table = {
+ .width = cocoa_font_width,
+ .position = cocoa_font_position,
+ .split = cocoa_font_split,
+};
+
+struct gui_layout_table *cocoa_layout_table = &layout_table;
+
+#pragma mark -
+
+void cocoa_draw_string(CGFloat x, CGFloat y, const char *bytes, size_t length, const plot_font_style_t *style)
+{
+ NSLayoutManager *layout = cocoa_prepare_layout_manager(bytes, length, style);
+ if (layout == nil)
+ return;
+
+ NSFont *font = [cocoa_text_storage attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL];
+ CGFloat baseline = [layout defaultLineHeightForFont:font] * 3.0 / 4.0;
+
+ NSRange glyphRange = [layout glyphRangeForTextContainer:cocoa_text_container];
+ [layout drawGlyphsForGlyphRange:glyphRange atPoint:NSMakePoint(x, y - baseline)];
+}
+
+#pragma mark -
+
+static inline CGFloat cocoa_layout_width(NSLayoutManager *layout)
+{
+ if (layout == nil)
+ return 0.0;
+
+ return cocoa_pt_to_px(NSWidth([layout usedRectForTextContainer:cocoa_text_container]));
+}
+
+static inline CGFloat cocoa_layout_width_chars(NSLayoutManager *layout, size_t characters)
+{
+ NSUInteger glyphIndex = [layout glyphIndexForCharacterAtIndex:characters];
+ return cocoa_pt_to_px([layout locationForGlyphAtIndex:glyphIndex].x);
+}
+
+static inline NSUInteger cocoa_glyph_for_location(NSLayoutManager *layout, CGFloat x)
+{
+ CGFloat fraction = 0.0;
+ NSUInteger glyphIndex = [layout glyphIndexForPoint:NSMakePoint(cocoa_px_to_pt(x), 0)
+ inTextContainer:cocoa_text_container
+ fractionOfDistanceThroughGlyph:&fraction];
+ if (fraction >= 1.0)
+ ++glyphIndex;
+ return glyphIndex;
+}
+
+static inline size_t cocoa_bytes_for_characters(const char *string, size_t chars)
+{
+ size_t offset = 0;
+ while (chars-- > 0) {
+ uint8_t ch = ((uint8_t *)string)[offset];
+
+ if (0xC2 <= ch && ch <= 0xDF)
+ offset += 2;
+ else if (0xE0 <= ch && ch <= 0xEF)
+ offset += 3;
+ else if (0xF0 <= ch && ch <= 0xF4)
+ offset += 4;
+ else
+ offset++;
+ }
+ return offset;
+}
+
+static NSLayoutManager *cocoa_prepare_layout_manager(const char *bytes, size_t length,
+ const plot_font_style_t *style)
+{
+ if (NULL == bytes || 0 == length)
+ return nil;
+
+ NSString *string = [[NSString alloc] initWithBytes:bytes length:length encoding:NSUTF8StringEncoding];
+ if (string == nil)
+ return nil;
+
+ static NSLayoutManager *layout = nil;
+ if (nil == layout) {
+ cocoa_text_container = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
+ [cocoa_text_container setLineFragmentPadding:0];
+
+ layout = [[NSLayoutManager alloc] init];
+ [layout addTextContainer:cocoa_text_container];
+ }
+
+ static NSString *oldString = 0;
+ static plot_font_style_t oldStyle = { 0, 0, 0, 0, 0, 0 };
+
+ const bool styleChanged = memcmp(style, &oldStyle, sizeof oldStyle) != 0;
+
+ if ([oldString isEqualToString:string] && !styleChanged) {
+ return layout;
+ }
+
+ oldString = [string copy];
+ oldStyle = *style;
+
+ static NSDictionary *attributes = nil;
+ if (styleChanged || attributes == nil) {
+ attributes = cocoa_font_attributes(style);
+ }
+
+ cocoa_text_storage = [[NSTextStorage alloc] initWithString:string attributes:attributes];
+ [cocoa_text_storage addLayoutManager:layout];
+
+ [layout ensureLayoutForTextContainer:cocoa_text_container];
+
+ return layout;
+}
+
+static NSString *const cocoa_font_families[PLOT_FONT_FAMILY_COUNT] = {
+ [PLOT_FONT_FAMILY_SERIF] = @"Times",
+ [PLOT_FONT_FAMILY_SANS_SERIF] = @"Helvetica",
+ [PLOT_FONT_FAMILY_MONOSPACE] = @"Courier",
+ [PLOT_FONT_FAMILY_CURSIVE] = @"Apple Chancery",
+ [PLOT_FONT_FAMILY_FANTASY] = @"Marker Felt"
+};
+
+static inline NSFont *cocoa_font_get_nsfont(const plot_font_style_t *style)
+{
+ NSFont *font = [NSFont fontWithName:cocoa_font_families[style->family]
+ size:(CGFloat)style->size / FONT_SIZE_SCALE];
+
+ NSFontTraitMask traits = 0;
+ if (style->flags & FONTF_ITALIC || style->flags & FONTF_OBLIQUE)
+ traits |= NSItalicFontMask;
+ if (style->flags & FONTF_SMALLCAPS)
+ traits |= NSSmallCapsFontMask;
+ if (style->weight > 400)
+ traits |= NSBoldFontMask;
+
+ if (0 != traits) {
+ NSFontManager *fm = [NSFontManager sharedFontManager];
+ font = [fm convertFont:font toHaveTrait:traits];
+ }
+
+ return font;
+}
+
+static inline NSDictionary *cocoa_font_attributes(const plot_font_style_t *style)
+{
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ cocoa_font_get_nsfont(style), NSFontAttributeName,
+ cocoa_convert_colour(style->foreground), NSForegroundColorAttributeName,
+ nil];
+}
diff --git a/frontends/cocoa/gui.h b/frontends/cocoa/gui.h
new file mode 100644
index 000000000..3d0009194
--- /dev/null
+++ b/frontends/cocoa/gui.h
@@ -0,0 +1,35 @@
+/*
+ * 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>
+
+extern struct gui_window_table *cocoa_window_table;
+extern struct gui_clipboard_table *cocoa_clipboard_table;
+extern struct gui_misc_table *cocoa_misc_table;
+
+extern NSString *const kCookiesFileOption;
+extern NSString *const kURLsFileOption;
+extern NSString *const kHotlistFileOption;
+extern NSString *const kHomepageURLOption;
+extern NSString *const kOptionsFileOption;
+extern NSString *const kAlwaysCancelDownload;
+extern NSString *const kAlwaysCloseMultipleTabs;
+
+void cocoa_autorelease(void);
+
+nserror cocoa_warning(const char *warning, const char *detail);
diff --git a/frontends/cocoa/gui.m b/frontends/cocoa/gui.m
new file mode 100644
index 000000000..599c3b49e
--- /dev/null
+++ b/frontends/cocoa/gui.m
@@ -0,0 +1,328 @@
+/*
+ * 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 "utils/nsurl.h"
+#import "netsurf/mouse.h"
+#import "netsurf/window.h"
+#import "netsurf/misc.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/content.h"
+
+#import "cocoa/gui.h"
+#import "cocoa/coordinates.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)
+{
+ NSAlert *alert = [[NSAlert alloc] init];
+ alert.messageText = NSLocalizedString(@"Warning",
+ @"Warning title");
+ alert.informativeText = [NSString localizedStringWithFormat:NSLocalizedString(@"Warning %s%s%s", @"Warning message"),
+ warning, detail != NULL ? ": " : "",
+ detail != NULL ? detail : ""];
+
+ [alert addButtonWithTitle:NSLocalizedString(@"OK", @"")];
+
+ [alert runModal];
+
+ 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 = [(__bridge BrowserViewController *)(existing)windowController];
+ }
+
+ result = [[BrowserViewController alloc] initWithBrowser:bw];
+
+ if (!(flags & GW_CREATE_TAB) || nil == window) {
+ window = [[BrowserWindowController alloc] init];
+ [[window window] makeKeyAndOrderFront:nil];
+ }
+ [window addTab:result];
+
+ return (__bridge_retained struct gui_window *)result;
+}
+
+static void gui_window_destroy(struct gui_window *g)
+{
+ BrowserViewController *vc = (__bridge_transfer BrowserViewController *)g;
+ vc = nil;
+}
+
+static void gui_window_set_title(struct gui_window *g, const char *title)
+{
+ [(__bridge BrowserViewController *)g setTitle:[NSString stringWithUTF8String:title]];
+}
+
+static nserror gui_window_update_box(struct gui_window *g, const struct rect *rect)
+{
+ if (rect == NULL) {
+ [[(__bridge BrowserViewController *)g browserView] setNeedsDisplay:YES];
+ return NSERROR_OK;
+ }
+ const NSRect nsrect = cocoa_scaled_rect_wh(
+ browser_window_get_scale([(__bridge BrowserViewController *)g browser]),
+ rect->x0, rect->y0,
+ rect->x1 - rect->x0, rect->y1 - rect->y0);
+ [[(__bridge BrowserViewController *)g browserView] setNeedsDisplayInRect:nsrect];
+ return NSERROR_OK;
+}
+
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+{
+ NSCParameterAssert(g != NULL && sx != NULL && sy != NULL);
+
+ NSRect visible = [[(__bridge BrowserViewController *)g browserView] visibleRect];
+ *sx = cocoa_pt_to_px(NSMinX(visible));
+ *sy = cocoa_pt_to_px(NSMinY(visible));
+ return true;
+}
+
+static nserror gui_window_set_scroll(struct gui_window *g, const struct rect *rect)
+{
+ [[(__bridge BrowserViewController *)g browserView] scrollPoint:cocoa_point(rect->x0, rect->y0)];
+ return NSERROR_OK;
+}
+
+/**
+ * Find the current dimensions of a cocoa browser window content area.
+ *
+ * \param g The gui window to measure content area of.
+ * \param width receives width of window
+ * \param height receives height of window
+ * \param scaled whether to return scaled values
+ * \return NSERROR_OK on sucess and width and height updated
+ * else error code.
+ */
+static nserror gui_window_get_dimensions(struct gui_window *g,
+ int *width, int *height,
+ bool scaled)
+{
+ NSCParameterAssert(width != NULL && height != NULL);
+
+ NSRect frame = [[[(__bridge BrowserViewController *)g browserView] superview] frame];
+ if (scaled) {
+ const CGFloat scale = browser_window_get_scale([(__bridge 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));
+
+ return NSERROR_OK;
+}
+
+static void gui_window_update_extent(struct gui_window *g)
+{
+ BrowserViewController *const window = (__bridge 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)
+{
+ [(__bridge 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)
+{
+ [(__bridge BrowserViewController *)g setUrl:[NSString stringWithUTF8String:nsurl_access(url)]];
+ return NSERROR_OK;
+}
+
+static void gui_window_start_throbber(struct gui_window *g)
+{
+ [(__bridge BrowserViewController *)g setIsProcessing:YES];
+ [(__bridge BrowserViewController *)g updateBackForward];
+}
+
+static void gui_window_stop_throbber(struct gui_window *g)
+{
+ [(__bridge BrowserViewController *)g setIsProcessing:NO];
+ [(__bridge BrowserViewController *)g updateBackForward];
+}
+
+static void gui_window_set_icon(struct gui_window *g, struct hlcache_handle *icon)
+{
+ NSBitmapImageRep *bmp = NULL;
+ NSImage *image = nil;
+
+ if (icon != NULL) {
+ bmp = (__bridge 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];
+
+ [(__bridge BrowserViewController *)g setFavicon:image];
+}
+
+static void
+gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+ const struct rect *clip)
+{
+ [[(__bridge BrowserViewController *)g browserView] addCaretAtX:x Y:y height:height];
+}
+
+static void gui_window_remove_caret(struct gui_window *g)
+{
+ [[(__bridge BrowserViewController *)g browserView] removeCaret];
+}
+
+static void gui_window_new_content(struct gui_window *g)
+{
+ [(__bridge BrowserViewController *)g contentUpdated];
+}
+
+static void gui_create_form_select_menu(struct gui_window *g,
+ struct form_control *control)
+{
+ BrowserViewController *const window = (__bridge BrowserViewController *)g;
+ FormSelectMenu *menu = [[FormSelectMenu alloc]
+ initWithControl:control
+ forWindow:[window browser]];
+ [menu runInView:[window browserView]];
+}
+
+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 nserror
+gui_cert_verify(nsurl *url,
+ const struct ssl_cert_info *certs,
+ unsigned long num,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw)
+{
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .invalidate = 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,
+
+ .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;
diff --git a/frontends/cocoa/plotter.h b/frontends/cocoa/plotter.h
new file mode 100644
index 000000000..be76d0acf
--- /dev/null
+++ b/frontends/cocoa/plotter.h
@@ -0,0 +1,33 @@
+/*
+ * 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/>.
+ */
+
+#ifndef COCOA_PLOTTER_H
+#define COCOA_PLOTTER_H
+
+#import <Cocoa/Cocoa.h>
+#import "netsurf/plot_style.h"
+
+extern const struct plotter_table cocoa_plotters;
+
+NSColor *cocoa_convert_colour(colour clr);
+
+void cocoa_update_scale_factor(void);
+
+void cocoa_set_clip(NSRect rect);
+
+#endif
diff --git a/frontends/cocoa/plotter.m b/frontends/cocoa/plotter.m
new file mode 100644
index 000000000..72577da1a
--- /dev/null
+++ b/frontends/cocoa/plotter.m
@@ -0,0 +1,337 @@
+/*
+ * 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/>.
+ */
+
+#include <Cocoa/Cocoa.h>
+
+#import "utils/log.h"
+#import "utils/utils.h"
+#import "netsurf/browser_window.h"
+#import "netsurf/plotters.h"
+
+#import "cocoa/font.h"
+#import "cocoa/coordinates.h"
+#import "cocoa/plotter.h"
+#import "cocoa/bitmap.h"
+
+static void cocoa_plot_render_path(NSBezierPath *path, const plot_style_t *pstyle);
+static void cocoa_plot_path_set_stroke_pattern(NSBezierPath *path, const plot_style_t *pstyle);
+static inline void cocoa_center_pixel(bool x, bool y);
+
+static NSRect cocoa_plot_clip_rect;
+
+#define colour_red_component(c) (((c) >> 0) & 0xFF)
+#define colour_green_component(c) (((c) >> 8) & 0xFF)
+#define colour_blue_component(c) (((c) >> 16) & 0xFF)
+#define colour_alpha_component(c) (((c) >> 24) & 0xFF)
+#define colour_from_rgba(r, g, b, a) ((((colour)(r)) << 0) | (((colour)(g)) << 8) | (((colour)(b)) << 16) | (((colour)(a)) << 24))
+#define colour_from_rgb(r, g, b) colour_from_rgba((r), (g), (b), 0xFF)
+
+NSColor *cocoa_convert_colour(colour clr)
+{
+ return [NSColor colorWithDeviceRed:(float)colour_red_component(clr) / 0xFF
+ green:(float)colour_green_component(clr) / 0xFF
+ blue:(float)colour_blue_component(clr) / 0xFF
+ alpha:1.0];
+}
+
+static void cocoa_plot_path_set_stroke_pattern(NSBezierPath *path, const plot_style_t *pstyle)
+{
+ static const CGFloat dashed_pattern[2] = { 5.0, 2.0 };
+ static const CGFloat dotted_pattern[2] = { 2.0, 2.0 };
+
+ switch (pstyle->stroke_type) {
+ case PLOT_OP_TYPE_DASH:
+ [path setLineDash:dashed_pattern count:2 phase:0];
+ break;
+
+ case PLOT_OP_TYPE_DOT:
+ [path setLineDash:dotted_pattern count:2 phase:0];
+ break;
+
+ default:
+ // ignore
+ break;
+ }
+
+ [path setLineWidth:cocoa_px_to_pt(pstyle->stroke_width > 0 ? pstyle->stroke_width : 1)];
+}
+
+static nserror plot_line(const struct redraw_context *ctx, const plot_style_t *pstyle, const struct rect *line)
+{
+ if (pstyle->stroke_type == PLOT_OP_TYPE_NONE)
+ return NSERROR_OK;
+
+ [NSGraphicsContext saveGraphicsState];
+ [NSBezierPath clipRect:cocoa_plot_clip_rect];
+
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:cocoa_point(line->x0, line->y0)];
+ [path lineToPoint:cocoa_point(line->x1, line->y1)];
+ cocoa_plot_path_set_stroke_pattern(path, pstyle);
+
+ const bool horizontal = line->y0 == line->y1;
+ const bool vertical = line->x0 == line->x1;
+ const bool oddThickness = pstyle->stroke_width != 0 ? (pstyle->stroke_width % 2) != 0 : true;
+
+ if (oddThickness)
+ cocoa_center_pixel(!horizontal, !vertical);
+
+ [cocoa_convert_colour(pstyle->stroke_colour) set];
+ [path stroke];
+
+ [NSGraphicsContext restoreGraphicsState];
+
+ return NSERROR_OK;
+}
+
+static nserror plot_rectangle(const struct redraw_context *ctx, const plot_style_t *pstyle, const struct rect *r)
+{
+ NSRect rect = cocoa_rect(r->x0, r->y0, r->x1, r->y1);
+ NSBezierPath *path = [NSBezierPath bezierPathWithRect:rect];
+ cocoa_plot_render_path(path, pstyle);
+
+ return NSERROR_OK;
+}
+
+static nserror plot_text(const struct redraw_context *ctx, const plot_font_style_t *fstyle, int x, int y, const char *text, size_t length)
+{
+ [NSGraphicsContext saveGraphicsState];
+ [NSBezierPath clipRect:cocoa_plot_clip_rect];
+
+ cocoa_draw_string(cocoa_px_to_pt(x), cocoa_px_to_pt(y), text, length, fstyle);
+
+ [NSGraphicsContext restoreGraphicsState];
+
+ return NSERROR_OK;
+}
+
+void cocoa_set_clip(NSRect rect)
+{
+ cocoa_plot_clip_rect = rect;
+}
+
+static nserror plot_clip(const struct redraw_context *ctx, const struct rect *clip)
+{
+ cocoa_plot_clip_rect = cocoa_rect(clip->x0, clip->y0, clip->x1, clip->y1);
+ return NSERROR_OK;
+}
+
+void cocoa_plot_render_path(NSBezierPath *path, const plot_style_t *pstyle)
+{
+ // Quick exit if the clip rect has a zero size. Core Graphics doesn’t like that.
+ if (cocoa_plot_clip_rect.size.width == 0 || cocoa_plot_clip_rect.size.height == 0) {
+ return;
+ }
+
+ [NSGraphicsContext saveGraphicsState];
+ [NSBezierPath clipRect:cocoa_plot_clip_rect];
+
+ if (pstyle->fill_type != PLOT_OP_TYPE_NONE) {
+ [cocoa_convert_colour(pstyle->fill_colour) setFill];
+ [path fill];
+ }
+
+ if (pstyle->stroke_type != PLOT_OP_TYPE_NONE) {
+ if (pstyle->stroke_width == 0 || pstyle->stroke_width % 2 != 0)
+ cocoa_center_pixel(true, true);
+
+ cocoa_plot_path_set_stroke_pattern(path, pstyle);
+
+ [cocoa_convert_colour(pstyle->stroke_colour) set];
+
+ [path stroke];
+ }
+
+ [NSGraphicsContext restoreGraphicsState];
+}
+
+static nserror plot_arc(const struct redraw_context *ctx, const plot_style_t *pstyle, int x, int y, int radius, int angle1, int angle2)
+{
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path appendBezierPathWithArcWithCenter:NSMakePoint(x, y)
+ radius:radius
+ startAngle:angle1
+ endAngle:angle2
+ clockwise:NO];
+
+ cocoa_plot_render_path(path, pstyle);
+
+ return NSERROR_OK;
+}
+
+static nserror plot_disc(const struct redraw_context *ctx, const plot_style_t *pstyle, int x, int y, int radius)
+{
+ NSBezierPath *path = [NSBezierPath bezierPathWithOvalInRect:
+ NSMakeRect(x - radius, y - radius, 2 * radius, 2 * radius)];
+
+ cocoa_plot_render_path(path, pstyle);
+
+ return NSERROR_OK;
+}
+
+static nserror plot_polygon(const struct redraw_context *ctx, const plot_style_t *pstyle, const int *p, unsigned int n)
+{
+ if (n <= 1)
+ return NSERROR_OK;
+
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:cocoa_point(p[0], p[1])];
+ for (unsigned i = 1; i < n; i++) {
+ [path lineToPoint:cocoa_point(p[2 * i], p[2 * i + 1])];
+ }
+ [path closePath];
+
+ cocoa_plot_render_path(path, pstyle);
+
+ return NSERROR_OK;
+}
+
+/* complex path (for SVG) */
+static nserror plot_path(const struct redraw_context *ctx, const plot_style_t *pstyle, const float *p, unsigned int n, float width, const float transform[6])
+{
+ if (n == 0)
+ return NSERROR_OK;
+
+ if (*p != PLOTTER_PATH_MOVE) {
+ NSLOG(netsurf, INFO, "Path does not start with move");
+ return NSERROR_INVALID;
+ }
+
+ NSBezierPath *path = [NSBezierPath bezierPath];
+
+#define NEXT_POINT() ({ const float *c = p; p += 2; NSMakePoint( c[0], c[1] ); })
+
+ while (n--) {
+ switch ((int)*p++) {
+ case PLOTTER_PATH_MOVE: {
+ const NSPoint pt = NEXT_POINT();
+ [path moveToPoint:pt];
+ break;
+ }
+
+ case PLOTTER_PATH_LINE: {
+ const NSPoint pt = NEXT_POINT();
+ [path lineToPoint:pt];
+ break;
+ }
+
+ case PLOTTER_PATH_BEZIER: {
+ const NSPoint cp1 = NEXT_POINT();
+ const NSPoint cp2 = NEXT_POINT();
+ const NSPoint ep = NEXT_POINT();
+ [path curveToPoint:ep controlPoint1:cp1 controlPoint2:cp2];
+ break;
+ }
+
+ case PLOTTER_PATH_CLOSE:
+ [path closePath];
+ break;
+
+ default:
+ NSLOG(netsurf, INFO, "Invalid path");
+ return NSERROR_INVALID;
+ }
+ }
+
+#undef NEXT_POINT
+
+ [path setLineWidth:width];
+
+ CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
+ CGContextSaveGState(context);
+
+ CGContextClipToRect(context, NSRectToCGRect(cocoa_plot_clip_rect));
+
+ CGContextConcatCTM(context, CGAffineTransformMake(transform[0], transform[1], transform[2], transform[3], transform[4], transform[5]));
+
+ if (pstyle->fill_colour != NS_TRANSPARENT) {
+ [cocoa_convert_colour(pstyle->fill_colour) setFill];
+ [path fill];
+ }
+
+ if (pstyle->stroke_colour != NS_TRANSPARENT) {
+ cocoa_center_pixel(true, true);
+ [cocoa_convert_colour(pstyle->stroke_colour) set];
+ [path stroke];
+ }
+
+ CGContextRestoreGState(context);
+
+ return true;
+}
+
+/* Image */
+static nserror plot_bitmap(const struct redraw_context *ctx, struct bitmap *bitmap, int x, int y, int width, int height, colour bg, bitmap_flags_t flags)
+{
+ CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
+ CGContextSaveGState(context);
+
+ CGContextClipToRect(context, NSRectToCGRect(cocoa_plot_clip_rect));
+
+ const bool tileX = flags & BITMAPF_REPEAT_X;
+ const bool tileY = flags & BITMAPF_REPEAT_Y;
+
+ CGImageRef img = cocoa_get_cgimage(bitmap);
+
+ CGRect rect = NSRectToCGRect(cocoa_rect_wh(x, y, width, height));
+
+ if (tileX || tileY) {
+ CGContextDrawTiledImage(context, rect, img);
+ } else {
+ CGContextDrawImage(context, rect, img);
+ }
+
+ CGContextRestoreGState(context);
+
+ return NSERROR_OK;
+}
+
+const struct plotter_table cocoa_plotters = {
+ .clip = plot_clip,
+ .arc = plot_arc,
+ .disc = plot_disc,
+ .rectangle = plot_rectangle,
+ .line = plot_line,
+ .polygon = plot_polygon,
+
+ .path = plot_path,
+
+ .bitmap = plot_bitmap,
+
+ .text = plot_text,
+
+ .option_knockout = true
+};
+
+CGFloat cocoa_scale_factor;
+static const CGFloat points_per_inch = 72.0;
+static CGFloat cocoa_half_pixel;
+
+void cocoa_update_scale_factor(void)
+{
+ cocoa_scale_factor = 1.0;
+ cocoa_half_pixel = 0.5 * cocoa_scale_factor;
+ browser_set_dpi(points_per_inch);
+}
+
+static inline void cocoa_center_pixel(bool x, bool y)
+{
+ NSAffineTransform *transform = [NSAffineTransform transform];
+ [transform translateXBy:x ? cocoa_half_pixel : 0.0 yBy:y ? cocoa_half_pixel : 0.0];
+ [transform concat];
+}
diff --git a/frontends/cocoa/res/BookmarksWindow.xib b/frontends/cocoa/res/BookmarksWindow.xib
new file mode 100644
index 000000000..ddae5a0bf
--- /dev/null
+++ b/frontends/cocoa/res/BookmarksWindow.xib
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12120" systemVersion="16F73" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12120"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="BookmarksController">
+ <connections>
+ <outlet property="view" destination="7" id="8"/>
+ <outlet property="window" destination="1" id="3"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application"/>
+ <window title="Bookmarks" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="1">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+ <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+ <rect key="contentRect" x="196" y="80" width="350" height="400"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
+ <value key="minSize" type="size" width="200" height="100"/>
+ <view key="contentView" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="350" height="400"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <scrollView autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="4">
+ <rect key="frame" x="-1" y="39" width="352" height="362"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <clipView key="contentView" id="wPU-ql-jqi">
+ <rect key="frame" x="1" y="1" width="350" height="360"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <customView id="7" customClass="TreeView">
+ <rect key="frame" x="0.0" y="0.0" width="350" height="360"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ </customView>
+ </subviews>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </clipView>
+ <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="6">
+ <rect key="frame" x="1" y="314" width="352" height="15"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="5">
+ <rect key="frame" x="353" y="1" width="15" height="313"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ </scrollView>
+ <button verticalHuggingPriority="750" imageHugsTitle="YES" id="11">
+ <rect key="frame" x="7" y="7" width="29" height="25"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSAddTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="12">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="addFolder:" target="-2" id="17"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="750" imageHugsTitle="YES" id="13">
+ <rect key="frame" x="43" y="7" width="29" height="25"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="14">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="deleteSelected:" target="-2" id="18"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="750" imageHugsTitle="YES" id="15">
+ <rect key="frame" x="80" y="7" width="38" height="25"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <buttonCell key="cell" type="roundTextured" title="Edit" bezelStyle="texturedRounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="16">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="editSelected:" target="-2" id="19"/>
+ </connections>
+ </button>
+ </subviews>
+ </view>
+ <contentBorderThickness minY="39"/>
+ <connections>
+ <outlet property="initialFirstResponder" destination="7" id="20"/>
+ </connections>
+ </window>
+ </objects>
+ <resources>
+ <image name="NSAddTemplate" width="11" height="11"/>
+ <image name="NSRemoveTemplate" width="11" height="11"/>
+ </resources>
+</document>
diff --git a/frontends/cocoa/res/Browser.xib b/frontends/cocoa/res/Browser.xib
new file mode 100644
index 000000000..35ff885b5
--- /dev/null
+++ b/frontends/cocoa/res/Browser.xib
@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10J567</string>
+ <string key="IBDocument.InterfaceBuilderVersion">804</string>
+ <string key="IBDocument.AppKitVersion">1038.35</string>
+ <string key="IBDocument.HIToolboxVersion">462.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">804</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="41"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">BrowserViewController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSView" id="716999560">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSScrollView" id="140458632">
+ <reference key="NSNextResponder" ref="716999560"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="461870317">
+ <reference key="NSNextResponder" ref="140458632"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomView" id="623715071">
+ <reference key="NSNextResponder" ref="461870317"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{691, 631}</string>
+ <reference key="NSSuperview" ref="461870317"/>
+ <string key="NSClassName">BrowserView</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {691, 631}}</string>
+ <reference key="NSSuperview" ref="140458632"/>
+ <reference key="NSNextKeyView" ref="623715071"/>
+ <reference key="NSDocView" ref="623715071"/>
+ <object class="NSColor" key="NSBGColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="411009984">
+ <reference key="NSNextResponder" ref="140458632"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{677, 1}, {15, 616}}</string>
+ <reference key="NSSuperview" ref="140458632"/>
+ <reference key="NSTarget" ref="140458632"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ <double key="NSPercent">0.96363627910614014</double>
+ </object>
+ <object class="NSScroller" id="17116469">
+ <reference key="NSNextResponder" ref="140458632"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{1, 617}, {676, 15}}</string>
+ <reference key="NSSuperview" ref="140458632"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="140458632"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.50602412223815918</double>
+ </object>
+ </object>
+ <string key="NSFrame">{{-1, 0}, {693, 633}}</string>
+ <reference key="NSSuperview" ref="716999560"/>
+ <reference key="NSNextKeyView" ref="461870317"/>
+ <int key="NSsFlags">562</int>
+ <reference key="NSVScroller" ref="411009984"/>
+ <reference key="NSHScroller" ref="17116469"/>
+ <reference key="NSContentView" ref="461870317"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{691, 632}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="716999560"/>
+ </object>
+ <int key="connectionID">52</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">browserView</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="623715071"/>
+ </object>
+ <int key="connectionID">53</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">41</int>
+ <reference key="object" ref="716999560"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="140458632"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">44</int>
+ <reference key="object" ref="140458632"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="623715071"/>
+ <reference ref="17116469"/>
+ <reference ref="411009984"/>
+ </object>
+ <reference key="parent" ref="716999560"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">45</int>
+ <reference key="object" ref="623715071"/>
+ <reference key="parent" ref="140458632"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">46</int>
+ <reference key="object" ref="17116469"/>
+ <reference key="parent" ref="140458632"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">47</int>
+ <reference key="object" ref="411009984"/>
+ <reference key="parent" ref="140458632"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>41.IBEditorWindowLastContentRect</string>
+ <string>41.IBPluginDependency</string>
+ <string>44.IBPluginDependency</string>
+ <string>44.IBViewBoundsToFrameTransform</string>
+ <string>45.IBPluginDependency</string>
+ <string>46.IBPluginDependency</string>
+ <string>47.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{{290, 199}, {691, 632}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAAC/gAAAw5EAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">53</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserView</string>
+ <string key="superclassName">ScrollableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserViewController</string>
+ <string key="superclassName">NSViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>goBack:</string>
+ <string>goForward:</string>
+ <string>navigate:</string>
+ <string>reloadPage:</string>
+ <string>stopLoading:</string>
+ <string>zoomIn:</string>
+ <string>zoomOriginal:</string>
+ <string>zoomOut:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>goBack:</string>
+ <string>goForward:</string>
+ <string>navigate:</string>
+ <string>reloadPage:</string>
+ <string>stopLoading:</string>
+ <string>zoomIn:</string>
+ <string>zoomOriginal:</string>
+ <string>zoomOut:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">goBack:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">goForward:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">navigate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">reloadPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">stopLoading:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomIn:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomOriginal:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomOut:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">browserView</string>
+ <string key="NS.object.0">BrowserView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">browserView</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">browserView</string>
+ <string key="candidateClassName">BrowserView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ScrollableView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ScrollableView.h</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/BrowserWindow.xib b/frontends/cocoa/res/BrowserWindow.xib
new file mode 100644
index 000000000..982144cb8
--- /dev/null
+++ b/frontends/cocoa/res/BrowserWindow.xib
@@ -0,0 +1,1395 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">9L31a</string>
+ <string key="IBDocument.InterfaceBuilderVersion">680</string>
+ <string key="IBDocument.AppKitVersion">949.54</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="1" id="9"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">BrowserWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">4111</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{139, 364}, {774, 554}}</string>
+ <int key="NSWTFlags">1618477056</int>
+ <string key="NSWindowTitle">NetSurf</string>
+ <string key="NSWindowClass">BrowserWindow</string>
+ <object class="NSToolbar" key="NSViewClass" id="71746575">
+ <object class="NSMutableString" key="NSToolbarIdentifier">
+ <characters key="NS.bytes">8335B5EA-A088-4DE8-BF4F-777E98920BB3</characters>
+ </object>
+ <nil key="NSToolbarDelegate"/>
+ <bool key="NSToolbarPrefersToBeShown">YES</bool>
+ <bool key="NSToolbarShowsBaselineSeparator">YES</bool>
+ <bool key="NSToolbarAllowsUserCustomization">YES</bool>
+ <bool key="NSToolbarAutosavesConfiguration">NO</bool>
+ <int key="NSToolbarDisplayMode">2</int>
+ <int key="NSToolbarSizeMode">1</int>
+ <object class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>6D497003-6D4B-4335-ADCE-368C7CD87371</string>
+ <string>9DB83278-4E60-41F8-8A7C-C0B2E00A552B</string>
+ <string>BC5CEBFC-2E3B-420C-A75F-BE0760149C45</string>
+ <string>E2E89C48-DD3F-47A5-9E6C-25985A970F69</string>
+ <string>NSToolbarCustomizeToolbarItem</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>NSToolbarSeparatorItem</string>
+ <string>NSToolbarSpaceItem</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSToolbarItem" id="16676378">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">6D497003-6D4B-4335-ADCE-368C7CD87371</characters>
+ </object>
+ <string key="NSToolbarItemLabel">History</string>
+ <string key="NSToolbarItemPaletteLabel">History</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <object class="NSButton" key="NSToolbarItemView" id="229385913">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{8, 14}, {30, 25}}</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="296571644">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="770988704">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="229385913"/>
+ <int key="NSButtonFlags">919355647</int>
+ <int key="NSButtonFlags2">163</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="235904051">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSIconViewTemplate</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ </object>
+ <reference key="NSToolbarItemImage" ref="235904051"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{22, 25}</string>
+ <string key="NSToolbarItemMaxSize">{32, 25}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">0</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarItem" id="694471322">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">9DB83278-4E60-41F8-8A7C-C0B2E00A552B</characters>
+ </object>
+ <string key="NSToolbarItemLabel">Homepage</string>
+ <string key="NSToolbarItemPaletteLabel">Homepage</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <object class="NSButton" key="NSToolbarItemView" id="518219892">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{18, 14}, {30, 25}}</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="413663381">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="770988704"/>
+ <reference key="NSControlView" ref="518219892"/>
+ <int key="NSButtonFlags">-2033434369</int>
+ <int key="NSButtonFlags2">99</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="967303005">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">HomeTemplate</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ </object>
+ <reference key="NSToolbarItemImage" ref="967303005"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{30, 25}</string>
+ <string key="NSToolbarItemMaxSize">{30, 25}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">0</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarItem" id="685547192">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">BC5CEBFC-2E3B-420C-A75F-BE0760149C45</characters>
+ </object>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">Back/Forward</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <object class="NSSegmentedControl" key="NSToolbarItemView" id="692457026">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{7, 14}, {67, 25}}</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSSegmentedCell" key="NSCell" id="845979064">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="692457026"/>
+ <object class="NSMutableArray" key="NSSegmentImages">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSSegmentItem">
+ <double key="NSSegmentItemWidth">3.000000e+01</double>
+ <object class="NSCustomResource" key="NSSegmentItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSLeftFacingTriangleTemplate</string>
+ </object>
+ <string key="NSSegmentItemLabel"/>
+ <string key="NSSegmentItemTooltip">Back</string>
+ <int key="NSSegmentItemImageScaling">0</int>
+ </object>
+ <object class="NSSegmentItem">
+ <double key="NSSegmentItemWidth">3.000000e+01</double>
+ <object class="NSCustomResource" key="NSSegmentItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSRightFacingTriangleTemplate</string>
+ </object>
+ <string key="NSSegmentItemLabel"/>
+ <string key="NSSegmentItemTooltip">Forward</string>
+ <int key="NSSegmentItemTag">1</int>
+ <int key="NSSegmentItemImageScaling">0</int>
+ </object>
+ </object>
+ <int key="NSSelectedSegment">1</int>
+ <int key="NSTrackingMode">2</int>
+ <int key="NSSegmentStyle">2</int>
+ </object>
+ </object>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{67, 25}</string>
+ <string key="NSToolbarItemMaxSize">{71, 25}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">0</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarItem" id="192029103">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">E2E89C48-DD3F-47A5-9E6C-25985A970F69</characters>
+ </object>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">URL</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <object class="NSTextField" key="NSToolbarItemView" id="77748234">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{0, 14}, {96, 22}}</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1053649244">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">268436480</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="770988704"/>
+ <string key="NSPlaceholderString">Open this URL</string>
+ <reference key="NSControlView" ref="77748234"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <object class="NSColor" key="NSColor" id="733901069">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{96, 22}</string>
+ <string key="NSToolbarItemMaxSize">{10000, 22}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">0</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarItem" id="276197344">
+ <string key="NSToolbarItemIdentifier">NSToolbarCustomizeToolbarItem</string>
+ <string key="NSToolbarItemLabel">Customize</string>
+ <string key="NSToolbarItemPaletteLabel">Customize</string>
+ <string key="NSToolbarItemToolTip">Customize Toolbar</string>
+ <nil key="NSToolbarItemView"/>
+ <object class="NSImage" key="NSToolbarItemImage">
+ <int key="NSImageFlags">683671552</int>
+ <string key="NSSize">{32, 32}</string>
+ <object class="NSMutableArray" key="NSReps">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="0" id="8"/>
+ <object class="NSBitmapImageRep">
+ <object class="NSData" key="NSTIFFRepresentation">
+ <bytes key="NS.bytes">TU0AKgAAEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAICAgbAAAABAAAAAAEBAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAQEBAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAENDQ0dJSUlW11dXbBpaWnDb29vzyAgIGUPDw8xAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAABsbGyUoKChIHh4ePSkpKUonJycsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDCEJCQoWvr6/i9fX1/fX19f7h4eH82dnZ+YODg9sYGBg8
+AAAAAAAAAAAAAAAAAAAAAAAAAAJFRUV6ZGRkvf39/f/+/v7//////0NDQ7QAAAAEAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDx9ISEiH2tra8/7+/v/j4+P/2NjY/7a2tv+ysrL/
+i4uL7j09PeUKCgoSAAAAAAAAAAAAAAAAUVFRlo2NjfTIyMj6x8fH/56env97e3v/ISEhMAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8lRUVFjtDQ0Pb+/v7/4eHh/dDQ0P+NjY3/
+Tk5O6yoqKrIfHx+gGhoarCIiImwAAAABAAAAADg4OGWenp7/y8vL/d3d3f+8vLz/hYWF/0RERE0AAAAA
+AAAAAAAAAAAfHx8sAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj8/P2za2try9/f3/+vr6/7Kysr/
+dnZ2/D4+PvwgICB+EBAQNAICAgcAAAAPERERPQMDAwkQEBASh4eH2MHBwf/o6Oj/39/f/3R0dP88PDxO
+AAAAAAAAAAAAAAAAcnJylkNDQ58HBwcIAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYMfn5+uMvLy/3Hx8f+
+u7u7/5OTk/9CQkL7HRYL7AICAgQAAAAAAAAAAAAAAAAAAAAAAgICBS4uLjOWlpbz6urq/+7u7v+rq6v/
+IyMj0wAAAAAAAAAAAAAAAIGBgZGLi4v/QkJC2Q0NDSYAAAAAAAAAAAAAAAAAAAAAGRkZJF5eXoylpaXz
+pqam/4qKiv91dXX/YWFh+iwkHvojEADrJhcGoAgICA0AAAAAAAAAAAAAAAAAAAAAPj4+RJaWlvr19fX/
+6+vr/7W1tfVaWlrlAwMDbAAAAACKioqcoqKi/7+/v/9HR0fnDg4OJwAAAAAAAAAAHR0dK3V1dZ+pqanC
++vr6/9vb2/99fX3+Y2Nj+EhISOgMCAP4JhIA8jgaAPBxNADsNyMMjgcHBwsAAAAAAAAAAAAAAAAMDAwO
+m5ub+Orq6v/y8vL/0NDQ7ICAgMtkZGTqcHBwzLOzs//Pz8//0tLS/0xMTNoJCQkhAAAAABoaGjZ/f3+4
+//////j4+P/9/f3/9vb2/0dHR/8oKCjkKSkpoAQCAJUNBQDXVSgA5XY5AOuTSADcOiUOewYGBgoAAAAA
+AAAAAB4eHmFlZWX76Ojo/+7u7v/5+fn/5OTk9Li4uO3f39//8PDw/+Hh4f/Ly8v/Ozs7rQICAgMAAAAA
+GBgYL3x8fP///////////7S0tP+np6f/QEBA+xUVFXUJCQkkBAQEDgcFA20jEQC7YzIA3n9BAOiiUwDK
+NiMObgYGBgoTExNIOzs74bGxsf3Dw8P/1dXV////////////////////////////8/Pz/3R0dOcPDw9H
+AAAAAQAAAAAAAAAAVVVVooCAgP/v7+//v7+//2VlZf86OjrLAQEBBgAAAAAAAAAAAAAAABENCVctFwCl
+ZTQA1oZFAOCqWgDAMiMTgzExMcKzs7P4wcHB/5+fn//W1tb///////v7+/v//////////729vfOFhYXy
+IyMjdAAAAAMAAAABAAAAAAAAAAAAAAAASkpKmlpaWv+RkZH/Nzc38hgYGG4AAAABAAAAAAAAAAAAAAAA
+AAAAAAsFAEUwGACbaDcAzXpCAOFnRiLjs7Kx+MTExP+pqan/09PT/3p6evpdXV3rbGxs6l1dXfVXV1fs
+UlJSxykpKWMAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBmiMjI/8cHBysBQUFHQAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAsFAEAuGACfSzAT47y4s/24uLj/lJSU/9TU1P+Dg4PkMzMzzwYGBgw6OjpB
+QEBASQ8PDxYbGxshAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIimgoKCi4AAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAwJBYS9u7n4r6+v/4GBgf/Pz8//iISB6CYmJqoDAwMK
+AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABUwcHB7qurq/9ubm7/zs7O/5yOgPhlPhbf
+MhsCegAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMnCgoKZsvLy++pqan/Wlpa/9LS0v+Nh4Hq
+SCYE4IdDAeSbTgDLNxsAhwAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMOxoaGobV1dXzq6ur/0ZGRv/Z2dn/
+hoaGxQkEAIY6HgCyaDMA2YVAAOuWSQDZPh4AngAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGFEoKCio0tLS86urq/8xMTH/
+4uLi/4+Pj84AAABIAAAAAg8HAGg6HQDKaDIA4YI+APCVRQDsRSEAuAAAABMAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYrNTU1z9ra2vb8/Pz/
+FxcX/+rq6v+amprZAAAASAAAAAIAAAAAAAAAABAIAIY4GwDiaTEA6X46APeVRAD/SyIA0gAAABIAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICBT8/P4asrKz3
+0dHR//39/f/z8/P/paWl5gUFBVkAAAACAAAAAAAAAAAAAAAAAAAAABIJAKUxFgD6bTMA9no4AP9uLwD/
+KxIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcO
+QUFBmpqamv+pqan/+Pj4/7GxsfIXFxeBAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAHAMogDgD/
+WSkA/zwaAPcuEwCyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAEBAQMnJydWUFBQ85aWlvqoqKjfKioqrQEBAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAsFAOUXCQD6IA4AwgQCADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAgICBBR0dHmi4uLnACAgIHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAgDAMwFAgA9AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE
+AAAACQAAABAAAAAYAAAAIAAAACoAAAAxAAAANgAAADkAAAA4AQEBOQAAAC8AAAAnAAAAHQAAABUAAAAO
+AAAACgAAAAsAAAAPAAAAFwAAACAAAAAqAAAAMQAAADQAAAAzAAAALQAAACQAAAAbAAAAEgAAAAsAAAAA
+AAAAAAAAAAQAAAAJAAAAEAAAABgAAAAgAAAAKgAAADEAAAA2AAAAOQAAADgAAAA1AAAALwAAACcAAAAd
+AAAAFQAAAA4AAAAKAAAACwAAAA8AAAAXAAAAIAAAACoAAAAxAAAANAAAADMAAAAtAAAAJAAAABsAAAAS
+AAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0BAAADAAAAAQAgAAABAQADAAAAAQAgAAABAgADAAAABAAA
+EKoBAwADAAAAAQABAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAE
+AAABFgADAAAAAQD8AAABFwAEAAAAAQAAEAABHAADAAAAAQABAAABUgADAAAAAQABAAABUwADAAAABAAA
+ELIAAAAAAAgACAAIAAgAAQABAAEAAQ</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwAA</bytes>
+ </object>
+ </object>
+ <nil key="NSToolbarItemTarget"/>
+ <string key="NSToolbarItemAction">runToolbarCustomizationPalette:</string>
+ <string key="NSToolbarItemMinSize">{0, 0}</string>
+ <string key="NSToolbarItemMaxSize">{0, 0}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarFlexibleSpaceItem" id="568640167">
+ <string key="NSToolbarItemIdentifier">NSToolbarFlexibleSpaceItem</string>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">Flexible Space</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <nil key="NSToolbarItemView"/>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{1, 5}</string>
+ <string key="NSToolbarItemMaxSize">{20000, 32}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="945310746">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="969998504">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSToolbarSeparatorItem" id="1012010237">
+ <string key="NSToolbarItemIdentifier">NSToolbarSeparatorItem</string>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">Separator</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <nil key="NSToolbarItemView"/>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{12, 5}</string>
+ <string key="NSToolbarItemMaxSize">{12, 1000}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="945310746"/>
+ <reference key="NSMixedImage" ref="969998504"/>
+ </object>
+ </object>
+ <object class="NSToolbarSpaceItem" id="661775936">
+ <string key="NSToolbarItemIdentifier">NSToolbarSpaceItem</string>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">Space</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <nil key="NSToolbarItemView"/>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{32, 5}</string>
+ <string key="NSToolbarItemMaxSize">{32, 32}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="945310746"/>
+ <reference key="NSMixedImage" ref="969998504"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSArray" key="NSToolbarIBAllowedItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="685547192"/>
+ <reference ref="694471322"/>
+ <reference ref="16676378"/>
+ <reference ref="192029103"/>
+ <reference ref="1012010237"/>
+ <reference ref="661775936"/>
+ <reference ref="568640167"/>
+ <reference ref="276197344"/>
+ </object>
+ <object class="NSMutableArray" key="NSToolbarIBDefaultItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="685547192"/>
+ <reference ref="694471322"/>
+ <reference ref="16676378"/>
+ <reference ref="192029103"/>
+ </object>
+ <object class="NSMutableArray" key="NSToolbarIBSelectableItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSWindowContentMinSize">{273, 43}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomView" id="720246950">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{0, 532}, {774, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <string key="NSClassName">PSMTabBarControl</string>
+ </object>
+ <object class="NSTextField" id="795357547">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">290</int>
+ <string key="NSFrame">{{25, 3}, {732, 14}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="717772067">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">Status bar</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.100000e+01</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="795357547"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="733901069"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSProgressIndicator" id="528651909">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">1316</int>
+ <object class="NSPSMatrix" key="NSDrawMatrix"/>
+ <string key="NSFrame">{{4, 2}, {16, 16}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <int key="NSpiFlags">28938</int>
+ <double key="NSMaxValue">1.000000e+02</double>
+ </object>
+ <object class="NSTabView" id="477345536">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">18</int>
+ <string key="NSFrame">{{0, 20}, {774, 512}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <object class="NSMutableArray" key="NSTabViewItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="NSFont" ref="770988704"/>
+ <int key="NSTvFlags">6</int>
+ <bool key="NSAllowTruncatedLabels">YES</bool>
+ <bool key="NSDrawsBackground">YES</bool>
+ </object>
+ </object>
+ <string key="NSFrameSize">{774, 554}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMinSize">{273, 97}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSObjectController" id="177599630">
+ <object class="NSMutableArray" key="NSDeclaredKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>URL</string>
+ <string>url</string>
+ <string>status</string>
+ <string>processing</string>
+ <string>title</string>
+ <string>isProcessing</string>
+ <string>browserView.historyVisible</string>
+ </object>
+ <string key="NSObjectClassName">BrowserViewController</string>
+ <bool key="NSEditable">YES</bool>
+ <object class="_NSManagedProxy" key="_NSManagedProxy"/>
+ </object>
+ <object class="NSMenu" id="237938373">
+ <string key="NSTitle">Forward</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMenu" id="353660550">
+ <string key="NSTitle">Back</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">18</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="720246950"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">19</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tabBar</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="720246950"/>
+ </object>
+ <int key="connectionID">20</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tabView</string>
+ <reference key="source" ref="720246950"/>
+ <reference key="destination" ref="477345536"/>
+ </object>
+ <int key="connectionID">42</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="477345536"/>
+ <reference key="destination" ref="720246950"/>
+ </object>
+ <int key="connectionID">43</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tabView</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="477345536"/>
+ </object>
+ <int key="connectionID">56</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">navigate:</string>
+ <reference key="source" ref="1003"/>
+ <reference key="destination" ref="192029103"/>
+ </object>
+ <int key="connectionID">60</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">contentObject: activeBrowser</string>
+ <reference key="source" ref="177599630"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="177599630"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">contentObject: activeBrowser</string>
+ <string key="NSBinding">contentObject</string>
+ <string key="NSKeyPath">activeBrowser</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">62</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: selection.url</string>
+ <reference key="source" ref="77748234"/>
+ <reference key="destination" ref="177599630"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="77748234"/>
+ <reference key="NSDestination" ref="177599630"/>
+ <string key="NSLabel">value: selection.url</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">selection.url</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">64</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: selection.status</string>
+ <reference key="source" ref="795357547"/>
+ <reference key="destination" ref="177599630"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="795357547"/>
+ <reference key="NSDestination" ref="177599630"/>
+ <string key="NSLabel">value: selection.status</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">selection.status</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">65</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">title: selection.title</string>
+ <reference key="source" ref="1005"/>
+ <reference key="destination" ref="177599630"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="1005"/>
+ <reference key="NSDestination" ref="177599630"/>
+ <string key="NSLabel">title: selection.title</string>
+ <string key="NSBinding">title</string>
+ <string key="NSKeyPath">selection.title</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">67</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1005"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">68</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">animate: selection.isProcessing</string>
+ <reference key="source" ref="528651909"/>
+ <reference key="destination" ref="177599630"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="528651909"/>
+ <reference key="NSDestination" ref="177599630"/>
+ <string key="NSLabel">animate: selection.isProcessing</string>
+ <string key="NSBinding">animate</string>
+ <string key="NSKeyPath">selection.isProcessing</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">69</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">urlField</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1053649244"/>
+ </object>
+ <int key="connectionID">70</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">backForwardSelected:</string>
+ <reference key="source" ref="1003"/>
+ <reference key="destination" ref="685547192"/>
+ </object>
+ <int key="connectionID">74</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: selection.browserView.historyVisible</string>
+ <reference key="source" ref="296571644"/>
+ <reference key="destination" ref="177599630"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="296571644"/>
+ <reference key="NSDestination" ref="177599630"/>
+ <string key="NSLabel">value: selection.browserView.historyVisible</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">selection.browserView.historyVisible</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">79</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">activeBrowserController</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="177599630"/>
+ </object>
+ <int key="connectionID">80</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">navigationControl</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="692457026"/>
+ </object>
+ <int key="connectionID">81</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">goHome:</string>
+ <reference key="source" ref="1003"/>
+ <reference key="destination" ref="518219892"/>
+ </object>
+ <int key="connectionID">85</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">partnerView</string>
+ <reference key="source" ref="720246950"/>
+ <reference key="destination" ref="477345536"/>
+ </object>
+ <int key="connectionID">86</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">historyButton</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="229385913"/>
+ </object>
+ <int key="connectionID">87</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">historyForwardMenu</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="237938373"/>
+ </object>
+ <int key="connectionID">96</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">historyBackMenu</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="353660550"/>
+ </object>
+ <int key="connectionID">97</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="237938373"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">98</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="353660550"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">99</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="209349352">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="209349352"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="209349352"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="209349352"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ <reference ref="71746575"/>
+ </object>
+ <reference key="parent" ref="209349352"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="528651909"/>
+ <reference ref="795357547"/>
+ <reference ref="720246950"/>
+ <reference ref="477345536"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">26</int>
+ <reference key="object" ref="795357547"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="717772067"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">27</int>
+ <reference key="object" ref="717772067"/>
+ <reference key="parent" ref="795357547"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">28</int>
+ <reference key="object" ref="528651909"/>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="720246950"/>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">37</int>
+ <reference key="object" ref="477345536"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">44</int>
+ <reference key="object" ref="71746575"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="192029103"/>
+ <reference ref="1012010237"/>
+ <reference ref="276197344"/>
+ <reference ref="568640167"/>
+ <reference ref="661775936"/>
+ <reference ref="685547192"/>
+ <reference ref="16676378"/>
+ <reference ref="694471322"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">49</int>
+ <reference key="object" ref="192029103"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="77748234"/>
+ </object>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">50</int>
+ <reference key="object" ref="1012010237"/>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">51</int>
+ <reference key="object" ref="276197344"/>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">52</int>
+ <reference key="object" ref="568640167"/>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">53</int>
+ <reference key="object" ref="661775936"/>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">54</int>
+ <reference key="object" ref="77748234"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1053649244"/>
+ </object>
+ <reference key="parent" ref="192029103"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">55</int>
+ <reference key="object" ref="1053649244"/>
+ <reference key="parent" ref="77748234"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">61</int>
+ <reference key="object" ref="177599630"/>
+ <reference key="parent" ref="209349352"/>
+ <string key="objectName">Active Browser</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">73</int>
+ <reference key="object" ref="685547192"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="692457026"/>
+ </object>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">71</int>
+ <reference key="object" ref="692457026"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="845979064"/>
+ </object>
+ <reference key="parent" ref="685547192"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">72</int>
+ <reference key="object" ref="845979064"/>
+ <reference key="parent" ref="692457026"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">77</int>
+ <reference key="object" ref="16676378"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="229385913"/>
+ </object>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">75</int>
+ <reference key="object" ref="229385913"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="296571644"/>
+ </object>
+ <reference key="parent" ref="16676378"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">76</int>
+ <reference key="object" ref="296571644"/>
+ <reference key="parent" ref="229385913"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">84</int>
+ <reference key="object" ref="694471322"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="518219892"/>
+ </object>
+ <reference key="parent" ref="71746575"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">82</int>
+ <reference key="object" ref="518219892"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="413663381"/>
+ </object>
+ <reference key="parent" ref="694471322"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">83</int>
+ <reference key="object" ref="413663381"/>
+ <reference key="parent" ref="518219892"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">88</int>
+ <reference key="object" ref="237938373"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="209349352"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="353660550"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="209349352"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>1.windowTemplate.hasMinSize</string>
+ <string>1.windowTemplate.minSize</string>
+ <string>2.IBPluginDependency</string>
+ <string>26.IBPluginDependency</string>
+ <string>26.IBViewBoundsToFrameTransform</string>
+ <string>27.IBPluginDependency</string>
+ <string>28.IBPluginDependency</string>
+ <string>28.IBViewBoundsToFrameTransform</string>
+ <string>3.IBPluginDependency</string>
+ <string>3.IBViewBoundsToFrameTransform</string>
+ <string>37.IBPluginDependency</string>
+ <string>37.IBViewBoundsToFrameTransform</string>
+ <string>44.IBEditorWindowLastContentRect</string>
+ <string>44.IBPluginDependency</string>
+ <string>50.IBPluginDependency</string>
+ <string>51.IBPluginDependency</string>
+ <string>52.IBPluginDependency</string>
+ <string>53.IBPluginDependency</string>
+ <string>54.IBPluginDependency</string>
+ <string>55.CustomClassName</string>
+ <string>55.IBPluginDependency</string>
+ <string>61.IBPluginDependency</string>
+ <string>71.IBPluginDependency</string>
+ <string>72.IBPluginDependency</string>
+ <string>72.IBSegmentedControlInspectorSelectedSegmentMetadataKey</string>
+ <string>75.IBAttributePlaceholdersKey</string>
+ <string>75.IBPluginDependency</string>
+ <string>76.IBPluginDependency</string>
+ <string>82.IBAttributePlaceholdersKey</string>
+ <string>82.IBPluginDependency</string>
+ <string>83.IBPluginDependency</string>
+ <string>88.IBPluginDependency</string>
+ <string>92.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{{103, 62}, {774, 554}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{103, 62}, {774, 554}}</string>
+ <reference ref="9"/>
+ <string>{196, 240}</string>
+ <string>{{202, 428}, {480, 270}}</string>
+ <boolean value="YES"/>
+ <string>{273, 43}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABDCAAAwaAAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABAwAAAwWAAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">AQAAAABEE8AAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABDiwAAxAVAAA</bytes>
+ </object>
+ <string>{{355, 640}, {616, 0}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>URLFieldCell</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="8"/>
+ <object class="NSMutableDictionary">
+ <string key="NS.key.0">ToolTip</string>
+ <object class="IBToolTipAttribute" key="NS.object.0">
+ <string key="name">ToolTip</string>
+ <reference key="object" ref="229385913"/>
+ <string key="toolTip">Show local history</string>
+ </object>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSMutableDictionary">
+ <string key="NS.key.0">ToolTip</string>
+ <object class="IBToolTipAttribute" key="NS.object.0">
+ <string key="name">ToolTip</string>
+ <reference key="object" ref="518219892"/>
+ <string key="toolTip">Go to your homepage</string>
+ </object>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">99</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserView</string>
+ <string key="superclassName">ScrollableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserViewController</string>
+ <string key="superclassName">NSViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>backForwardSelected:</string>
+ <string>goBack:</string>
+ <string>goForward:</string>
+ <string>goHome:</string>
+ <string>navigate:</string>
+ <string>reloadPage:</string>
+ <string>stopLoading:</string>
+ <string>zoomIn:</string>
+ <string>zoomOriginal:</string>
+ <string>zoomOut:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">browserView</string>
+ <string key="NS.object.0">BrowserView</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserWindow</string>
+ <string key="superclassName">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserWindow.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>closeCurrentTab:</string>
+ <string>newTab:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>activeBrowserController</string>
+ <string>historyBackMenu</string>
+ <string>historyButton</string>
+ <string>historyForwardMenu</string>
+ <string>navigationControl</string>
+ <string>tabBar</string>
+ <string>tabView</string>
+ <string>urlField</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSObjectController</string>
+ <string>NSMenu</string>
+ <string>NSButton</string>
+ <string>NSMenu</string>
+ <string>NSSegmentedControl</string>
+ <string>PSMTabBarControl</string>
+ <string>NSTabView</string>
+ <string>URLFieldCell</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserWindowController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="238543186">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="472370996">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="395663776">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <reference key="sourceIdentifier" ref="472370996"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <string key="superclassName">NSControl</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>delegate</string>
+ <string>partnerView</string>
+ <string>style</string>
+ <string>tabView</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>NSTabView</string>
+ </object>
+ </object>
+ <reference key="sourceIdentifier" ref="395663776"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <reference key="sourceIdentifier" ref="238543186"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabStyle.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ScrollableView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ScrollableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">URLFieldCell</string>
+ <string key="superclassName">NSTextFieldCell</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">URLFieldCell.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/DownloadWindow.xib b/frontends/cocoa/res/DownloadWindow.xib
new file mode 100644
index 000000000..039ff1914
--- /dev/null
+++ b/frontends/cocoa/res/DownloadWindow.xib
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10J567</string>
+ <string key="IBDocument.InterfaceBuilderVersion">804</string>
+ <string key="IBDocument.AppKitVersion">1038.35</string>
+ <string key="IBDocument.HIToolboxVersion">462.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">804</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="1"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">DownloadWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 429}, {376, 90}}</string>
+ <int key="NSWTFlags">544735232</int>
+ <string key="NSWindowTitle">Download</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{1000, 90}</string>
+ <string key="NSWindowContentMinSize">{330, 90}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSProgressIndicator" id="663127685">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">1290</int>
+ <object class="NSPSMatrix" key="NSDrawMatrix"/>
+ <string key="NSFrame">{{79, 33}, {279, 20}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <int key="NSpiFlags">16392</int>
+ <double key="NSMaxValue">100</double>
+ </object>
+ <object class="NSImageView" id="454520484">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{17, 17}, {56, 56}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="596224379">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">3</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">NO</bool>
+ </object>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ <object class="NSTextField" id="355449439">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{78, 56}, {261, 17}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="578533771">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Label</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="355449439"/>
+ <object class="NSColor" key="NSBackgroundColor" id="388192080">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="1042936865">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="1027859209">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{78, 17}, {281, 14}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="882473472">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">Label</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="1027859209"/>
+ <reference key="NSBackgroundColor" ref="388192080"/>
+ <reference key="NSTextColor" ref="1042936865"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{376, 90}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMinSize">{330, 112}</string>
+ <string key="NSMaxSize">{1000, 112}</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">maxValue: totalSize</string>
+ <reference key="source" ref="663127685"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector" id="721881472">
+ <reference key="NSSource" ref="663127685"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">maxValue: totalSize</string>
+ <string key="NSBinding">maxValue</string>
+ <string key="NSKeyPath">totalSize</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">6</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: receivedSize</string>
+ <reference key="source" ref="663127685"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="663127685"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">value: receivedSize</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">receivedSize</string>
+ <reference key="NSPreviousConnector" ref="721881472"/>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">7</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: fileName</string>
+ <reference key="source" ref="355449439"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="355449439"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">value: fileName</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">fileName</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">22</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: icon</string>
+ <reference key="source" ref="454520484"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="454520484"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">value: icon</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">icon</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">23</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: statusText</string>
+ <reference key="source" ref="1027859209"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="1027859209"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">value: statusText</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">statusText</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">24</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1005"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">25</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="454520484"/>
+ <reference ref="355449439"/>
+ <reference ref="1027859209"/>
+ <reference ref="663127685"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="663127685"/>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="454520484"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="596224379"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="596224379"/>
+ <reference key="parent" ref="454520484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">16</int>
+ <reference key="object" ref="355449439"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="578533771"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">17</int>
+ <reference key="object" ref="578533771"/>
+ <reference key="parent" ref="355449439"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="1027859209"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="882473472"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="882473472"/>
+ <reference key="parent" ref="1027859209"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>1.windowTemplate.hasMaxSize</string>
+ <string>1.windowTemplate.hasMinSize</string>
+ <string>1.windowTemplate.maxSize</string>
+ <string>1.windowTemplate.minSize</string>
+ <string>14.IBPluginDependency</string>
+ <string>14.IBViewBoundsToFrameTransform</string>
+ <string>15.IBPluginDependency</string>
+ <string>16.IBPluginDependency</string>
+ <string>16.IBViewBoundsToFrameTransform</string>
+ <string>17.IBPluginDependency</string>
+ <string>18.IBPluginDependency</string>
+ <string>18.IBViewBoundsToFrameTransform</string>
+ <string>19.IBPluginDependency</string>
+ <string>2.IBPluginDependency</string>
+ <string>4.IBPluginDependency</string>
+ <string>4.IBViewBoundsToFrameTransform</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{{305, 231}, {376, 90}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{305, 231}, {376, 90}}</string>
+ <integer value="1"/>
+ <string>{196, 240}</string>
+ <string>{{202, 428}, {480, 270}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{1000, 90}</string>
+ <string>{330, 90}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">AUGIAABBiAAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCzAAAwo4AAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCnAAAwgAAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCngAAwkAAAA</bytes>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">25</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">DownloadWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">DownloadWindowController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/HistoryWindow.xib b/frontends/cocoa/res/HistoryWindow.xib
new file mode 100644
index 000000000..a5ec90e1a
--- /dev/null
+++ b/frontends/cocoa/res/HistoryWindow.xib
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1060</int>
+ <string key="IBDocument.SystemVersion">10J567</string>
+ <string key="IBDocument.InterfaceBuilderVersion">804</string>
+ <string key="IBDocument.AppKitVersion">1038.35</string>
+ <string key="IBDocument.HIToolboxVersion">462.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">804</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="1"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">HistoryWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 112}, {327, 398}}</string>
+ <int key="NSWTFlags">1618477056</int>
+ <string key="NSWindowTitle">History</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSScrollView" id="329245506">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="429990844">
+ <reference key="NSNextResponder" ref="329245506"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomView" id="920629225">
+ <reference key="NSNextResponder" ref="429990844"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{312, 383}</string>
+ <reference key="NSSuperview" ref="429990844"/>
+ <string key="NSClassName">TreeView</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {312, 383}}</string>
+ <reference key="NSSuperview" ref="329245506"/>
+ <reference key="NSNextKeyView" ref="920629225"/>
+ <reference key="NSDocView" ref="920629225"/>
+ <object class="NSColor" key="NSBGColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="909448709">
+ <reference key="NSNextResponder" ref="329245506"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{313, 1}, {15, 383}}</string>
+ <reference key="NSSuperview" ref="329245506"/>
+ <reference key="NSTarget" ref="329245506"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ <double key="NSPercent">0.96363627910614014</double>
+ </object>
+ <object class="NSScroller" id="886582390">
+ <reference key="NSNextResponder" ref="329245506"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 384}, {312, 15}}</string>
+ <reference key="NSSuperview" ref="329245506"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="329245506"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.50602412223815918</double>
+ </object>
+ </object>
+ <string key="NSFrame">{{-1, -1}, {329, 400}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <reference key="NSNextKeyView" ref="429990844"/>
+ <int key="NSsFlags">50</int>
+ <reference key="NSVScroller" ref="909448709"/>
+ <reference key="NSHScroller" ref="886582390"/>
+ <reference key="NSContentView" ref="429990844"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{327, 398}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="920629225"/>
+ </object>
+ <int key="connectionID">8</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="329245506"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="329245506"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="909448709"/>
+ <reference ref="886582390"/>
+ <reference ref="920629225"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="909448709"/>
+ <reference key="parent" ref="329245506"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="886582390"/>
+ <reference key="parent" ref="329245506"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">7</int>
+ <reference key="object" ref="920629225"/>
+ <reference key="parent" ref="329245506"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>2.IBPluginDependency</string>
+ <string>4.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>6.IBPluginDependency</string>
+ <string>7.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{{361, 416}, {327, 398}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{361, 416}, {327, 398}}</string>
+ <boolean value="NO"/>
+ <string>{196, 240}</string>
+ <string>{{202, 428}, {480, 270}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">8</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">HistoryWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">view</string>
+ <string key="NS.object.0">TreeView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">view</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">view</string>
+ <string key="candidateClassName">TreeView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">HistoryWindowController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ScrollableView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ScrollableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">TreeView</string>
+ <string key="superclassName">ScrollableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TreeView.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/HomeTemplate.pdf b/frontends/cocoa/res/HomeTemplate.pdf
new file mode 100644
index 000000000..42b88e9eb
--- /dev/null
+++ b/frontends/cocoa/res/HomeTemplate.pdf
@@ -0,0 +1,106 @@
+%PDF-1.5 %âãÏÓ
+1 0 obj <</Metadata 9 0 R/Pages 2 0 R/Type/Catalog>> endobj 9 0 obj <</Subtype/XML/Length 16417/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">HomeTemplate</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool>
+ <xap:CreateDate>2011-02-08T14:59:01+01:00</xap:CreateDate>
+ <xap:ModifyDate>2011-02-08T14:59:01+01:00</xap:ModifyDate>
+ <xap:MetadataDate>2011-02-08T14:59:01+01:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>256</xapGImg:height>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYqwz80/zT8uflz5cfVtWf1bqXkmm6ajAS3MoH2V68UWo5vSijxJAKrv&#xA;ys/NPy5+Y3lxNW0l/SuouKalprsDLbSkfZbpyRqHg9KMPAggKszxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhn5p/mn5c/Lny4+ras/q3UvJNN01G&#xA;AluZQPsr14otRzelFHiSAVXwD5+8/eY/PPmOfXten9W4l+GGFaiKCIElYolJPFVr8ydzUnFXeQfP&#xA;3mPyN5jg17QZ/SuIvhmhapiniJBaKVQRyVqfMHcUIxV9/flZ+aflz8xvLiatpL+ldRcU1LTXYGW2&#xA;lI+y3TkjUPB6UYeBBAVZnirsVflXirsVdirsVfqpirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirDPzT/NPy5+XPlx9W1Z/VupeSabpqMBLcygfZXrxRajm9KKPEkAqvgHz95+8x&#xA;+efMc+va9P6txL8MMK1EUEQJKxRKSeKrX5k7mpOKscxV2Ksj8g+fvMfkbzHBr2gz+lcRfDNC1TFP&#xA;ESC0UqgjkrU+YO4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMttKR9lunJGoeD0ow8CCAqzPFX5&#xA;V4q7FXYq7FX6qYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWGfmn+aflz8ufL&#xA;j6tqz+rdS8k03TUYCW5lA+yvXii1HN6UUeJIBVfAPn7z95j88+Y59e16f1biX4YYVqIoIgSViiUk&#xA;8VWvzJ3NScVY5irsVdirsVZH5B8/eY/I3mODXtBn9K4i+GaFqmKeIkFopVBHJWp8wdxQjFX39+Vn&#xA;5p+XPzG8uJq2kv6V1FxTUtNdgZbaUj7LdOSNQ8HpRh4EEBV4H/zkj/zjd6H1rzr5Ktf3PxTazo0K&#xA;/Y7vcW6D9nu6Dp1G1QFXy1irsVdir9VMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVYZ+af5p+XPy58uPq2rP6t1LyTTdNRgJbmUD7K9eKLUc3pRR4kgFV8A+fvP3mPzz5jn17Xp/VuJ&#xA;fhhhWoigiBJWKJSTxVa/Mnc1JxVjmKuxV2KuxV2KuxVkfkHz95j8jeY4Ne0Gf0riL4ZoWqYp4iQW&#xA;ilUEclanzB3FCMVff35Wfmn5c/Mby4mraS/pXUXFNS012BltpSPst05I1DwelGHgQQFXgf8Azkj/&#xA;AM43eh9a86+SrX9z8U2s6NCv2O73Fug/Z7ug6dRtUBV8tYq7FX6qYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FWGfmn+aflz8ufLj6tqz+rdS8k03TUYCW5lA+yvXii1HN6UUeJIBVfAPn&#xA;7z95j88+Y59e16f1biX4YYVqIoIgSViiUk8VWvzJ3NScVY5irsVdirYBJoNycVV7/T7/AE68lstQ&#xA;tpbS8hIE1tOjRyISKjkjAEbGuKofFXYq7FWR+QfP3mPyN5jg17QZ/SuIvhmhapiniJBaKVQRyVqf&#xA;MHcUIxV9/flZ+aflz8xvLiatpL+ldRcU1LTXYGW2lI+y3TkjUPB6UYeBBAVeB/8AOSP/ADjd6H1r&#xA;zr5Ktf3PxTazo0K/Y7vcW6D9nu6Dp1G1QFXy1ir9VMVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVYZ+af5p+XPy58uPq2rP6t1LyTTdNRgJbmUD7K9eKLUc3pRR4kgFV8A+fvP3mPzz5jn17X&#xA;p/VuJfhhhWoigiBJWKJSTxVa/Mnc1JxVjmKuxV2KtgEmg3JxV9c/843f843DTRa+dPOlrXUTxm0f&#xA;R5l/3n7rPOp/3b3RD9jqfi+yqz/8+fyG0v8AMbSzf2Ajs/NtnHSzvDsk6DcQTkdv5W6qfaoxV8Ja&#xA;xo+qaNqlzpWq20lnqNnIYrm2lFHRx2P6wRsRuMVQeKuxV2Ksj8g+fvMfkbzHBr2gz+lcRfDNC1TF&#xA;PESC0UqgjkrU+YO4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMttKR9lunJGoeD0ow8CCAq8D/5&#xA;yR/5xu9D61518lWv7n4ptZ0aFfsd3uLdB+z3dB06jaoCr6vxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KsM/NP80/Ln5c+XH1bVn9W6l5JpumowEtzKB9levFFqOb0oo8SQCq+AfP3n7zH558xz&#xA;69r0/q3EvwwwrURQRAkrFEpJ4qtfmTuak4qxzFXYq7FWwCTQbk4q+uf+cbv+cbhpotfOnnS1rqJ4&#xA;zaPo8y/7z91nnU/7t7oh+x1PxfZVfTWKuxV5J+fP5DaX+Y2lm/sBHZ+bbOOlneHZJ0G4gnI7fyt1&#xA;U+1Rir4S1jR9U0bVLnStVtpLPUbOQxXNtKKOjjsf1gjYjcYqg8VdirsVZH5B8/eY/I3mODXtBn9K&#xA;4i+GaFqmKeIkFopVBHJWp8wdxQjFX39+Vn5p+XPzG8uJq2kv6V1FxTUtNdgZbaUj7LdOSNQ8HpRh&#xA;4EEBVmYAAoNgOgxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhn5p/mn5c/Lny4+ras/q3UvJN&#xA;N01GAluZQPsr14otRzelFHiSAVXwD5+8/eY/PPmOfXten9W4l+GGFaiKCIElYolJPFVr8ydzUnFW&#xA;OYq7FXYq2ASaDcnFX1z/AM43f843DTRa+dPOlrXUTxm0fR5l/wB5+6zzqf8AdvdEP2Op+L7Kr6ax&#xA;V2KuxV2KvJPz5/IbS/zG0s39gI7PzbZx0s7w7JOg3EE5Hb+Vuqn2qMVfCWsaPqmjapc6VqttJZ6j&#xA;ZyGK5tpRR0cdj+sEbEbjFUHirsVdirI/IPn7zH5G8xwa9oM/pXEXwzQtUxTxEgtFKoI5K1PmDuKE&#xA;Yq+/vys/NPy5+Y3lxNW0l/SuouKalprsDLbSkfZbpyRqHg9KMPAggKszxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxVhn5p/mn5c/Lny4+ras/q3UvJNN01GAluZQPsr14otRzelFHiSAVXwD5+8/eY/PPm&#xA;OfXten9W4l+GGFaiKCIElYolJPFVr8ydzUnFWOYq7FXYq2ASaDcnFX1z/wA43f8AONw00WvnTzpa&#xA;11E8ZtH0eZf95+6zzqf9290Q/Y6n4vsqvprFXYq7FXYq7FXYq8k/Pn8htL/MbSzf2Ajs/NtnHSzv&#xA;Dsk6DcQTkdv5W6qfaoxV8Jaxo+qaNqlzpWq20lnqNnIYrm2lFHRx2P6wRsRuMVQeKuxV2Ksj8g+f&#xA;vMfkbzHBr2gz+lcRfDNC1TFPESC0UqgjkrU+YO4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMtt&#xA;KR9lunJGoeD0ow8CCAqzPFXYq7FXYq7FXYq7FXYq7FXYq7FWGfmn+aflz8ufLj6tqz+rdS8k03TU&#xA;YCW5lA+yvXii1HN6UUeJIBVfAPn7z95j88+Y59e16f1biX4YYVqIoIgSViiUk8VWvzJ3NScVY5ir&#xA;sVdirYBJoNycVfXP/ON3/ONw00WvnTzpa11E8ZtH0eZf95+6zzqf9290Q/Y6n4vsqvprFXYq7FXY&#xA;q7FXYq7FXYq8k/Pn8htL/MbSzf2Ajs/NtnHSzvDsk6DcQTkdv5W6qfaoxV8Jaxo+qaNqlzpWq20l&#xA;nqNnIYrm2lFHRx2P6wRsRuMVQeKuxV2Ksj8g+fvMfkbzHBr2gz+lcRfDNC1TFPESC0UqgjkrU+YO&#xA;4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMttKR9lunJGoeD0ow8CCAqzPFXYq7FXYq7FXYq7FX&#xA;Yq7FWGfmn+aflz8ufLj6tqz+rdS8k03TUYCW5lA+yvXii1HN6UUeJIBVfAPn7z95j88+Y59e16f1&#xA;biX4YYVqIoIgSViiUk8VWvzJ3NScVY5irsVdirYBJoNycVfXP/ON3/ONw00WvnTzpa11E8ZtH0eZ&#xA;f95+6zzqf9290Q/Y6n4vsqvprFXYq7FXYq7FXYq7FXYq7FXYq8k/Pn8htL/MbSzf2Ajs/NtnHSzv&#xA;Dsk6DcQTkdv5W6qfaoxV8Jaxo+qaNqlzpWq20lnqNnIYrm2lFHRx2P6wRsRuMVQeKuxV2Ksj8g+f&#xA;vMfkbzHBr2gz+lcRfDNC1TFPESC0UqgjkrU+YO4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMtt&#xA;KR9lunJGoeD0ow8CCAqzPFXYq7FXYq7FXYq7FWGfmn+aflz8ufLj6tqz+rdS8k03TUYCW5lA+yvX&#xA;ii1HN6UUeJIBVfAPn7z95j88+Y59e16f1biX4YYVqIoIgSViiUk8VWvzJ3NScVY5irsVdirYBJoN&#xA;ycVfXP8Azjd/zjcNNFr5086WtdRPGbR9HmX/AHn7rPOp/wB290Q/Y6n4vsqvprFXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq8k/Pn8htL/MbSzf2Ajs/NtnHSzvDsk6DcQTkdv5W6qfaoxV8Jaxo+qaNqlzpW&#xA;q20lnqNnIYrm2lFHRx2P6wRsRuMVQeKuxV2Ksj8g+fvMfkbzHBr2gz+lcRfDNC1TFPESC0Uqgjkr&#xA;U+YO4oRir7+/Kz80/Ln5jeXE1bSX9K6i4pqWmuwMttKR9lunJGoeD0ow8CCAqzPFXYq7FXYq7FWG&#xA;fmn+aflz8ufLj6tqz+rdS8k03TUYCW5lA+yvXii1HN6UUeJIBVfAPn7z95j88+Y59e16f1biX4YY&#xA;VqIoIgSViiUk8VWvzJ3NScVY5irsVdirYBJoNycVfXP/ADjd/wA43DTRa+dPOlrXUTxm0fR5l/3n&#xA;7rPOp/3b3RD9jqfi+yq+lzPAJ1gMiid1Z0iJHMohAZgvWgLqCfcYqvxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KpNF5v0GTzXceVPrITXbe1jvjaPsXt5GZOcZ/a4stG8NvHFXnv58/kNpf5jaWb+wEdn5ts&#xA;46Wd4dknQbiCcjt/K3VT7VGKvhLWNH1TRtUudK1W2ks9Rs5DFc20oo6OOx/WCNiNxiqDxV2KuxVk&#xA;fkHz95j8jeY4Ne0Gf0riL4ZoWqYp4iQWilUEclanzB3FCMVff35Wfmn5c/Mby4mraS/pXUXFNS01&#xA;2BltpSPst05I1DwelGHgQQFWZ4q7FXYqwz80/wA0/Ln5c+XH1bVn9W6l5JpumowEtzKB9levFFqO&#xA;b0oo8SQCq+AfP3n7zH558xz69r0/q3EvwwwrURQRAkrFEpJ4qtfmTuak4qxzFXYq7FWwCTQbk4q+&#xA;uf8AnG7/AJxuGmi186edLWuonjNo+jzL/vP3WedT/u3uiH7HU/F9lV7x5/8APnl/yN5ZufMGtzcL&#xA;aH4YYV3knmYEpDEO7NT6BUnYHFXzz/zjl+ZXmPz9+e2vazrEpCSaJOLSxViYbeJLy24Rxg+AY1P7&#xA;RqcVfVGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV8X/85V69q+gfnpp+saRdPZ6jZabay29xGaFWEk23&#xA;uCNmB2I2OKvof8kfzo0j8yvL/qfu7TzFZKBqumA9D0E0VdzE5/4E/CexKqW/nz+Q2l/mNpZv7AR2&#xA;fm2zjpZ3h2SdBuIJyO38rdVPtUYq+EtY0fVNG1S50rVbaSz1GzkMVzbSijo47H9YI2I3GKoPFXYq&#xA;7FWR+QfP3mPyN5jg17QZ/SuIvhmhapiniJBaKVQRyVqfMHcUIxV9/flZ+aflz8xvLiatpL+ldRcU&#xA;1LTXYGW2lI+y3TkjUPB6UYeBBAVZnirsVeT/AJ+fkZY/mTpCXdm62vmnToyun3LEiOVKlvq83+SW&#xA;JKt+yfaoxV8H6xo+qaNqlzpWq20lnqNnIYrm2lFHRx2P6wRsRuMVQeKuxVsAk0G5OKvrn/nG7/nG&#xA;4aaLXzp50ta6ieM2j6PMv+8/dZ51P+7e6IfsdT8X2VX0N5n8zaL5Y0K813WrlbXTbJDJNKdz4Kqr&#xA;1ZmOyqOpxV+fv5x/m5rX5k+Zm1C65W+k2vKPSdNr8MMRP2mANDK+3Nvo6AYq9C/5wq/8mnqv/bDu&#xA;P+oy0xV9qYq7FXwB/wA5R/8Ak9vM3/Rj/wB0+3xV5VirsVdir7//AOcXP/JE+Wf+j7/uoXGKvVcV&#xA;dirsVdirsVfEH/OZP/k3If8AtlW3/J2bFXkvk7zjr/k/zDa69oVyba/tWr4pIh+3FKv7SONiP44q&#xA;/QT8pvzU0H8x/LEeracRBexUj1TTGYNJbTeB6ckelUem48CCAqxn8+fyG0v8xtLN/YCOz822cdLO&#xA;8OyToNxBOR2/lbqp9qjFXwlrGj6po2qXOlarbSWeo2chiubaUUdHHY/rBGxG4xVB4q7FU+8keSPM&#xA;XnTzFbaDoNsZ72c1dzURwxgjlLK1DxRa7n6BUkDFX37+Uv5S+Xfy38urp2nKJ9RnCvqmqOoElxIB&#xA;9PGNangldvckkqs5xV2KuxV5J+fP5DaX+Y2lm/sBHZ+bbOOlneHZJ0G4gnI7fyt1U+1Rir4S1jR9&#xA;U0bVLnStVtpLPUbOQxXNtKKOjjsf1gjYjcYqhACTQbk4q+uf+cbv+cbhpotfOnnS1rqJ4zaPo8y/&#xA;7z91nnU/7t7oh+x1PxfZVfSOp6np+l6fcajqNxHaWNpG0tzcysFREUVLMTir4K/Pv877/wDMjXRB&#xA;aF7byrp7n9G2bbNI1KG4mA/bb9kfsrt1LEqvKcVfQH/OFX/k09V/7Ydx/wBRlpir7UxV2KvgD/nK&#xA;P/ye3mb/AKMf+6fb4q8qxV2KuxV9/wD/ADi5/wCSJ8s/9H3/AHULjFXquKuxV2KuxV2KviD/AJzJ&#xA;/wDJuQ/9sq2/5OzYq8KxVlP5b/mL5g8g+Z7fXdGkNUIS8tGNIrmAkF4pOvWmxpVTuMVfoN+Xv5ge&#xA;X/Pflm21/RJeUMo43FsxHq28wHxwygdGX8RQjY4qwn8+fyG0v8xtLN/YCOz822cdLO8OyToNxBOR&#xA;2/lbqp9qjFXwlrGj6po2qXOlarbSWeo2chiubaUUdHHY/rBGxG4xVMvJHkjzF508xW2g6DbGe9nN&#xA;Xc1EcMYI5SytQ8UWu5+gVJAxV9+/lL+Uvl38t/Lq6dpyifUZwr6pqjqBJcSAfTxjWp4JXb3JJKrO&#xA;cVdirsVdirsVeSfnz+Q2l/mNpZv7AR2fm2zjpZ3h2SdBuIJyO38rdVPtUYqwT/nHf/nGaTRLiLzZ&#xA;55tV/S0L8tL0dyrrbsp2nm4llaTaqL0X7X2qcVX0tir4d/5yO/PybzxqL+XfL8zR+UrKT45AafXp&#xA;kO0rCgPpKf7tT1+0d6BVXhuKuxV9Af8AOFX/AJNPVf8Ath3H/UZaYq+1MVdir4A/5yj/APJ7eZv+&#xA;jH/un2+KvKsVdirsVff/APzi5/5Inyz/ANH3/dQuMVeq4q7FXYq7FXYq+IP+cyf/ACbkP/bKtv8A&#xA;k7NirwrFXYqzr8ofzY1z8t/MyanYkz6dcFY9W00miXEIPav2ZEqSjdvkSCq/RrFXk356/kHpP5k2&#xA;C3tk0Wn+a7VQtrqDgiOWMf7puOIZiv8AKwBK+42xVkH5S/lL5d/Lfy6unacon1GcK+qao6gSXEgH&#xA;08Y1qeCV29ySSqznFXYq7FXYq7FXYq7FXYq7FX5V4q7FXYq+gP8AnCr/AMmnqv8A2w7j/qMtMVfa&#xA;mKuxV8Af85R/+T28zf8ARj/3T7fFXlWKuxV2Kvv/AP5xc/8AJE+Wf+j7/uoXGKvVcVdirsVdirsV&#xA;fEn/ADmdA0f5sWbkgibR7d1p2AnuE3+lMVeDYq7FXYq/VTFXYq7FXYq7FXYq7FXYq7FXYq7FXYq/&#xA;KvFXYq7FX0B/zhV/5NPVf+2Hcf8AUZaYq+1MVdir4A/5yj/8nt5m/wCjH/un2+KvKsVdirsVff8A&#xA;/wA4uf8AkifLP/R9/wB1C4xV6rirsVdirsVdir4r/wCc1f8Ayaelf9sO3/6jLvFXz/irsVdir9VM&#xA;VdirsVdirsVdirsVdirsVdirsVdir8q8VdirsVfQH/OFX/k09V/7Ydx/1GWmKvtTFXYq+AP+co//&#xA;ACe3mb/ox/7p9viryrFXYq7FX3//AM4uf+SJ8s/9H3/dQuMVeq4q7FXYq7FXYq+K/wDnNX/yaelf&#xA;9sO3/wCoy7xV8/4q7FXYq/VTFXYq7FXYq7FXYq7FXYq7FXYq7FXYq/KvFXYq7FX0B/zhV/5NPVf+&#xA;2Hcf9Rlpir7UxV2KvgD/AJyj/wDJ7eZv+jH/ALp9viryrFXYq7FX3/8A84uf+SJ8s/8AR9/3ULjF&#xA;XquKuxV2KuxV2Kviv/nNX/yaelf9sO3/AOoy7xV8/wCKuxV2Kv1UxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KvyrxV2KuxV9Af8AOFX/AJNPVf8Ath3H/UZaYq+1MVdir4A/5yj/APJ7eZv+jH/un2+KvKsV&#xA;dirsVff/APzi5/5Inyz/ANH3/dQuMVeq4q7FXYq7FXYq+K/+c1f/ACaelf8AbDt/+oy7xV8/4q7F&#xA;XYq/VTFXYq7FXYq7FXYq7FXYq7FXYq7FXYq/KvFXYq7FXoH5Kfmv/wAqy81XWvfov9L/AFmxksfq&#xA;3r/VuPqTRS8+fpzVp6NKce/XFXtX/Q8//fk/9zT/ALM8Vd/0PP8A9+T/ANzT/szxV3/Q8/8A35P/&#xA;AHNP+zPFXf8AQ8//AH5P/c0/7M8Vd/0PP/35P/c0/wCzPFXf9Dz/APfk/wDc0/7M8Vd/0PP/AN+T&#xA;/wBzT/szxV3/AEPP/wB+T/3NP+zPFXf9Dz/9+T/3NP8AszxV3/Q8/wD35P8A3NP+zPFXf9Dz/wDf&#xA;k/8Ac0/7M8Vd/wBDz/8Afk/9zT/szxV4r+df5r/8rN81Wuvfov8ARH1axjsfq3r/AFnl6c0svPn6&#xA;cNK+tSnHt1xV5/irsVdir9VMVdirsVdirsVdirsVdirsVdirsVdir8q8VdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdir9VMVdirsVdirsVdirsVdirsVdirsVdir8q8VdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdir9VMVdirsVdirsVdirsVdirsVdirsVdir8q8Vdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir9VMVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;ir//2Q==</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
+ <xapMM:DocumentID>uuid:FF364C322635E01192F88CC5416A78CF</xapMM:DocumentID>
+ <xapMM:InstanceID>uuid:be6b4bae-323e-c246-9a75-1280d64495f2</xapMM:InstanceID>
+ <xapMM:DerivedFrom rdf:parseType="Resource"/>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xapG="http://ns.adobe.com/xap/1.0/g/">
+ <xapTPg:NPages>1</xapTPg:NPages>
+ <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency>
+ <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint>
+ <xapTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>16.000000</stDim:w>
+ <stDim:h>16.000000</stDim:h>
+ <stDim:unit>Points</stDim:unit>
+ </xapTPg:MaxPageSize>
+ <xapTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xapTPg:PlateNames>
+ <xapTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:groupName>Default Swatch Group</xapG:groupName>
+ <xapG:groupType>0</xapG:groupType>
+ </rdf:li>
+ </rdf:Seq>
+ </xapTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 8.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 2 0 obj <</Count 1/Type/Pages/Kids[5 0 R]>> endobj 5 0 obj <</Parent 2 0 R/Contents 7 0 R/BleedBox[0.0 0.0 16.0 16.0]/ArtBox[0.0 0.0 15.7812 15.7812]/MediaBox[0.0 0.0 16.0 16.0]/TrimBox[0.0 0.0 16.0 16.0]/Resources<</Properties<</MC0<</Color[20224 32768 65535]/Visible true/Editable true/Dimmed false/Preview true/Printed true/Title(Layer 1)>>>>/ExtGState<</GS0 6 0 R>>>>/Type/Page>> endobj 7 0 obj <</Length 218/Filter/FlateDecode>>stream
+H‰d‘;R1 †{ŸB°V²lÉnI24¤`8Ã@(’"¡âöH»!³q!}–~ëáééõûýÓ~Cð°Ý@"ˆs9¤éñ…àð•ÎÀóƒ¡u6à†TeÀÛiN>¥l(dp5Ç”ŽêÜQ5˜š@.Wôhm&Ž†EgqÑîø‘žW%™p˜*6îº*©(½º{œÝ1 bçØ‘Gƒò3£Igìt‡ÅûåHöNYý©?ÿ7ñ
+0000000016 00000 n
+0000016570 00000 n
+0000000004 00001 f
+0000000000 00000 f
+0000016621 00000 n
+0000017247 00000 n
+0000016961 00000 n
+0000017359 00000 n
+0000000076 00000 n
+trailer <</Size 10/Root 1 0 R/Info 8 0 R/ID[<ADA186DB0F3649B8AC5BA40BFA30D11D><8A6AD6F969574B3A87EA4AAF57E7FEB8>]>> startxref 17534 %%EOF \ No newline at end of file
diff --git a/frontends/cocoa/res/Icons b/frontends/cocoa/res/Icons
new file mode 120000
index 000000000..187efd6f9
--- /dev/null
+++ b/frontends/cocoa/res/Icons
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/Icons/ \ No newline at end of file
diff --git a/frontends/cocoa/res/LocalHistoryPanel.xib b/frontends/cocoa/res/LocalHistoryPanel.xib
new file mode 100644
index 000000000..5f2d68885
--- /dev/null
+++ b/frontends/cocoa/res/LocalHistoryPanel.xib
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13122.19" systemVersion="16F73" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="macosx"/>
+ <development version="8000" identifier="xcode"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13122.19"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="LocalHistoryController">
+ <connections>
+ <outlet property="history" destination="6" id="8"/>
+ <outlet property="window" destination="1" id="7"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application"/>
+ <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1" customClass="ArrowWindow">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+ <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+ <rect key="contentRect" x="196" y="240" width="480" height="270"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
+ <view key="contentView" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <scrollView autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="3">
+ <rect key="frame" x="-1" y="-1" width="482" height="272"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="mPm-ZF-vKt">
+ <rect key="frame" x="1" y="1" width="480" height="270"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <customView id="6" customClass="HistoryView">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </customView>
+ </subviews>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </clipView>
+ <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" arrowsPosition="none" controlSize="small" horizontal="YES" id="5">
+ <rect key="frame" x="1" y="260" width="465" height="11"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" arrowsPosition="none" doubleValue="1" controlSize="small" horizontal="NO" id="4">
+ <rect key="frame" x="470" y="1" width="11" height="255"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ </scrollView>
+ </subviews>
+ </view>
+ </window>
+ </objects>
+</document>
diff --git a/frontends/cocoa/res/MainMenu.xib b/frontends/cocoa/res/MainMenu.xib
new file mode 100644
index 000000000..d38240bfd
--- /dev/null
+++ b/frontends/cocoa/res/MainMenu.xib
@@ -0,0 +1,2369 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10J567</string>
+ <string key="IBDocument.InterfaceBuilderVersion">804</string>
+ <string key="IBDocument.AppKitVersion">1038.35</string>
+ <string key="IBDocument.HIToolboxVersion">462.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">804</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="29"/>
+ <integer value="853"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1021">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSCustomObject" id="1014">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1050">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="649796088">
+ <string key="NSTitle">Main Menu</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="694149608">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">NetSurf</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="756751024">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="908425081">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="110575045">
+ <string key="NSTitle">NetSurf</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="238522557">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">About NetSurf</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="304266470">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="609285721">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Preferences…</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="481834944">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="1046388886">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Services</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="752062318">
+ <string key="NSTitle">Services</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="646227648">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="755159360">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Hide NetSurf</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="342932134">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Hide Others</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="908899353">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Show All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="1056857174">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="632727374">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Quit NetSurf</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="379814623">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">File</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="720053764">
+ <string key="NSTitle">File</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="705341025">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">New Window</string>
+ <string key="NSKeyEquiv">n</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="72022292">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">New Tab</string>
+ <string key="NSKeyEquiv">t</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="722745758">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">Open File…</string>
+ <string key="NSKeyEquiv">o</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="425164168">
+ <reference key="NSMenu" ref="720053764"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="776162233">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">Close</string>
+ <string key="NSKeyEquiv">w</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="117038363">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">Save As…</string>
+ <string key="NSKeyEquiv">s</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="1010469920">
+ <reference key="NSMenu" ref="720053764"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="294629803">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">Page Setup...</string>
+ <string key="NSKeyEquiv">P</string>
+ <int key="NSKeyEquivModMask">1179648</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSToolTip"/>
+ </object>
+ <object class="NSMenuItem" id="49223823">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">Print…</string>
+ <string key="NSKeyEquiv">p</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="584895621">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Edit</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="141080932">
+ <string key="NSTitle">Edit</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="80034836">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Undo</string>
+ <string key="NSKeyEquiv">z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="128588396">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Redo</string>
+ <string key="NSKeyEquiv">Z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="165057028">
+ <reference key="NSMenu" ref="141080932"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="5858980">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Cut</string>
+ <string key="NSKeyEquiv">x</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="704355768">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Copy</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="275307167">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Paste</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="714155551">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Delete</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="197377228">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Select All</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="246962120">
+ <reference key="NSMenu" ref="141080932"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="602982148">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Find</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="930654435">
+ <string key="NSTitle">Find</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="671868626">
+ <reference key="NSMenu" ref="930654435"/>
+ <string key="NSTitle">Find…</string>
+ <string key="NSKeyEquiv">f</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="497741775">
+ <reference key="NSMenu" ref="930654435"/>
+ <string key="NSTitle">Find Next</string>
+ <string key="NSKeyEquiv">g</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <int key="NSTag">2</int>
+ </object>
+ <object class="NSMenuItem" id="285322108">
+ <reference key="NSMenu" ref="930654435"/>
+ <string key="NSTitle">Find Previous</string>
+ <string key="NSKeyEquiv">G</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <int key="NSTag">3</int>
+ </object>
+ <object class="NSMenuItem" id="456308224">
+ <reference key="NSMenu" ref="930654435"/>
+ <string key="NSTitle">Use Selection for Find</string>
+ <string key="NSKeyEquiv">e</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <int key="NSTag">7</int>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="1046338161">
+ <reference key="NSMenu" ref="141080932"/>
+ <string key="NSTitle">Speech</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="390929284">
+ <string key="NSTitle">Speech</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="787796378">
+ <reference key="NSMenu" ref="390929284"/>
+ <string key="NSTitle">Start Speaking</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="831785675">
+ <reference key="NSMenu" ref="390929284"/>
+ <string key="NSTitle">Stop Speaking</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="586577488">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">View</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="466310130">
+ <string key="NSTitle">View</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="102151532">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Show Toolbar</string>
+ <string key="NSKeyEquiv">t</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="237841660">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Customize Toolbar…</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="588542073">
+ <reference key="NSMenu" ref="466310130"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="1008284068">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Stop Loading</string>
+ <string key="NSKeyEquiv">.</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="997106205">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Reload Page</string>
+ <string key="NSKeyEquiv">r</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="403460345">
+ <reference key="NSMenu" ref="466310130"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="924072330">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Original Size</string>
+ <string key="NSKeyEquiv">0</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="157577355">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Zoom In</string>
+ <string key="NSKeyEquiv">+</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="148271458">
+ <reference key="NSMenu" ref="466310130"/>
+ <string key="NSTitle">Zoom Out</string>
+ <string key="NSKeyEquiv">-</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="603467951">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Bookmarks</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="1062528031">
+ <string key="NSTitle">Bookmarks</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="713487014">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Window</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="835318025">
+ <string key="NSTitle">Window</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="1011231497">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Minimize</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="575023229">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Zoom</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="971013910">
+ <reference key="NSMenu" ref="835318025"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="532573582">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">History</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="299356726">
+ <reference key="NSMenu" ref="835318025"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="625202149">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Bring All to Front</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="391199113">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Help</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="374024848">
+ <string key="NSTitle">Help</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="238773614">
+ <reference key="NSMenu" ref="374024848"/>
+ <string key="NSTitle">NetSurf Help</string>
+ <string key="NSKeyEquiv">?</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ <string key="NSName">_NSHelpMenu</string>
+ </object>
+ </object>
+ </object>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="1026802243">
+ <string key="NSClassName">NetSurfAppDelegate</string>
+ </object>
+ <object class="NSCustomObject" id="867741866">
+ <string key="NSClassName">BookmarksController</string>
+ </object>
+ <object class="NSMenu" id="509997857">
+ <string key="NSTitle">Default Bookmark Actions</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="844807595">
+ <reference key="NSMenu" ref="509997857"/>
+ <string key="NSTitle">Add bookmark</string>
+ <string key="NSKeyEquiv">d</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ <object class="NSMenuItem" id="832858329">
+ <reference key="NSMenu" ref="509997857"/>
+ <string key="NSTitle">Show bookmarks...</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="756751024"/>
+ <reference key="NSMixedImage" ref="908425081"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performMiniaturize:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="1011231497"/>
+ </object>
+ <int key="connectionID">37</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">arrangeInFront:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="625202149"/>
+ </object>
+ <int key="connectionID">39</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">print:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="49223823"/>
+ </object>
+ <int key="connectionID">86</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">runPageLayout:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="294629803"/>
+ </object>
+ <int key="connectionID">87</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="1021"/>
+ <reference key="destination" ref="238522557"/>
+ </object>
+ <int key="connectionID">142</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performZoom:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="575023229"/>
+ </object>
+ <int key="connectionID">240</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showHelp:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="238773614"/>
+ </object>
+ <int key="connectionID">360</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">saveDocumentAs:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="117038363"/>
+ </object>
+ <int key="connectionID">363</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">runToolbarCustomizationPalette:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="237841660"/>
+ </object>
+ <int key="connectionID">365</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleToolbarShown:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="102151532"/>
+ </object>
+ <int key="connectionID">366</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="755159360"/>
+ </object>
+ <int key="connectionID">369</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="342932134"/>
+ </object>
+ <int key="connectionID">370</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="908899353"/>
+ </object>
+ <int key="connectionID">372</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="1021"/>
+ <reference key="destination" ref="632727374"/>
+ </object>
+ <int key="connectionID">448</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cut:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="5858980"/>
+ </object>
+ <int key="connectionID">741</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">paste:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="275307167"/>
+ </object>
+ <int key="connectionID">742</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">redo:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="128588396"/>
+ </object>
+ <int key="connectionID">745</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">undo:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="80034836"/>
+ </object>
+ <int key="connectionID">749</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">startSpeaking:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="787796378"/>
+ </object>
+ <int key="connectionID">751</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="704355768"/>
+ </object>
+ <int key="connectionID">755</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">delete:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="714155551"/>
+ </object>
+ <int key="connectionID">756</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectAll:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="197377228"/>
+ </object>
+ <int key="connectionID">758</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">stopSpeaking:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="831785675"/>
+ </object>
+ <int key="connectionID">759</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1050"/>
+ <reference key="destination" ref="1026802243"/>
+ </object>
+ <int key="connectionID">821</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">newDocument:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="705341025"/>
+ </object>
+ <int key="connectionID">823</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">openDocument:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="722745758"/>
+ </object>
+ <int key="connectionID">824</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoomIn:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="157577355"/>
+ </object>
+ <int key="connectionID">829</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoomOut:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="148271458"/>
+ </object>
+ <int key="connectionID">830</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">stopLoading:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="1008284068"/>
+ </object>
+ <int key="connectionID">835</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">reloadPage:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="997106205"/>
+ </object>
+ <int key="connectionID">836</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoomOriginal:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="924072330"/>
+ </object>
+ <int key="connectionID">837</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">newTab:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="72022292"/>
+ </object>
+ <int key="connectionID">839</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showSearchWindow:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="671868626"/>
+ </object>
+ <int key="connectionID">841</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">searchNext:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="497741775"/>
+ </object>
+ <int key="connectionID">842</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">searchPrevious:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="285322108"/>
+ </object>
+ <int key="connectionID">843</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performClose:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="776162233"/>
+ </object>
+ <int key="connectionID">844</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showPreferences:</string>
+ <reference key="source" ref="1026802243"/>
+ <reference key="destination" ref="609285721"/>
+ </object>
+ <int key="connectionID">845</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showGlobalHistory:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="532573582"/>
+ </object>
+ <int key="connectionID">846</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1062528031"/>
+ <reference key="destination" ref="867741866"/>
+ </object>
+ <int key="connectionID">851</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">defaultMenu</string>
+ <reference key="source" ref="867741866"/>
+ <reference key="destination" ref="509997857"/>
+ </object>
+ <int key="connectionID">856</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">addBookmark:</string>
+ <reference key="source" ref="867741866"/>
+ <reference key="destination" ref="844807595"/>
+ </object>
+ <int key="connectionID">857</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showWindow:</string>
+ <reference key="source" ref="867741866"/>
+ <reference key="destination" ref="832858329"/>
+ </object>
+ <int key="connectionID">859</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1048"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1021"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1014"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1050"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="649796088"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="713487014"/>
+ <reference ref="694149608"/>
+ <reference ref="391199113"/>
+ <reference ref="379814623"/>
+ <reference ref="586577488"/>
+ <reference ref="584895621"/>
+ <reference ref="603467951"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="713487014"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="835318025"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="694149608"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="110575045"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">103</int>
+ <reference key="object" ref="391199113"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="374024848"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">83</int>
+ <reference key="object" ref="379814623"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="720053764"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">81</int>
+ <reference key="object" ref="720053764"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="117038363"/>
+ <reference ref="49223823"/>
+ <reference ref="722745758"/>
+ <reference ref="705341025"/>
+ <reference ref="294629803"/>
+ <reference ref="776162233"/>
+ <reference ref="1010469920"/>
+ <reference ref="425164168"/>
+ <reference ref="72022292"/>
+ </object>
+ <reference key="parent" ref="379814623"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">80</int>
+ <reference key="object" ref="117038363"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">78</int>
+ <reference key="object" ref="49223823"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">72</int>
+ <reference key="object" ref="722745758"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">82</int>
+ <reference key="object" ref="705341025"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">77</int>
+ <reference key="object" ref="294629803"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">73</int>
+ <reference key="object" ref="776162233"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">74</int>
+ <reference key="object" ref="1010469920"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">106</int>
+ <reference key="object" ref="374024848"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="238773614"/>
+ </object>
+ <reference key="parent" ref="391199113"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">111</int>
+ <reference key="object" ref="238773614"/>
+ <reference key="parent" ref="374024848"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="110575045"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="238522557"/>
+ <reference ref="755159360"/>
+ <reference ref="908899353"/>
+ <reference ref="632727374"/>
+ <reference ref="646227648"/>
+ <reference ref="609285721"/>
+ <reference ref="481834944"/>
+ <reference ref="304266470"/>
+ <reference ref="1046388886"/>
+ <reference ref="1056857174"/>
+ <reference ref="342932134"/>
+ </object>
+ <reference key="parent" ref="694149608"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="238522557"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="755159360"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="908899353"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="632727374"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="646227648"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="609285721"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="481834944"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">236</int>
+ <reference key="object" ref="304266470"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="1046388886"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="752062318"/>
+ </object>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="1056857174"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="342932134"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="752062318"/>
+ <reference key="parent" ref="1046388886"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="835318025"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="299356726"/>
+ <reference ref="625202149"/>
+ <reference ref="575023229"/>
+ <reference ref="1011231497"/>
+ <reference ref="971013910"/>
+ <reference ref="532573582"/>
+ </object>
+ <reference key="parent" ref="713487014"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="299356726"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="625202149"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">239</int>
+ <reference key="object" ref="575023229"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="1011231497"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">295</int>
+ <reference key="object" ref="586577488"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="466310130"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">296</int>
+ <reference key="object" ref="466310130"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="102151532"/>
+ <reference ref="237841660"/>
+ <reference ref="588542073"/>
+ <reference ref="148271458"/>
+ <reference ref="924072330"/>
+ <reference ref="157577355"/>
+ <reference ref="403460345"/>
+ <reference ref="1008284068"/>
+ <reference ref="997106205"/>
+ </object>
+ <reference key="parent" ref="586577488"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">297</int>
+ <reference key="object" ref="102151532"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">298</int>
+ <reference key="object" ref="237841660"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">79</int>
+ <reference key="object" ref="425164168"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">684</int>
+ <reference key="object" ref="584895621"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="141080932"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">685</int>
+ <reference key="object" ref="141080932"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="80034836"/>
+ <reference ref="128588396"/>
+ <reference ref="165057028"/>
+ <reference ref="5858980"/>
+ <reference ref="704355768"/>
+ <reference ref="275307167"/>
+ <reference ref="714155551"/>
+ <reference ref="197377228"/>
+ <reference ref="246962120"/>
+ <reference ref="602982148"/>
+ <reference ref="1046338161"/>
+ </object>
+ <reference key="parent" ref="584895621"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">686</int>
+ <reference key="object" ref="80034836"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">687</int>
+ <reference key="object" ref="128588396"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">688</int>
+ <reference key="object" ref="165057028"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">689</int>
+ <reference key="object" ref="5858980"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">690</int>
+ <reference key="object" ref="704355768"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">691</int>
+ <reference key="object" ref="275307167"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">693</int>
+ <reference key="object" ref="714155551"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">694</int>
+ <reference key="object" ref="197377228"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">695</int>
+ <reference key="object" ref="246962120"/>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">696</int>
+ <reference key="object" ref="602982148"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="930654435"/>
+ </object>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">700</int>
+ <reference key="object" ref="1046338161"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="390929284"/>
+ </object>
+ <reference key="parent" ref="141080932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">711</int>
+ <reference key="object" ref="390929284"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="787796378"/>
+ <reference ref="831785675"/>
+ </object>
+ <reference key="parent" ref="1046338161"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">712</int>
+ <reference key="object" ref="787796378"/>
+ <reference key="parent" ref="390929284"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">713</int>
+ <reference key="object" ref="831785675"/>
+ <reference key="parent" ref="390929284"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">734</int>
+ <reference key="object" ref="930654435"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="671868626"/>
+ <reference ref="497741775"/>
+ <reference ref="285322108"/>
+ <reference ref="456308224"/>
+ </object>
+ <reference key="parent" ref="602982148"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">735</int>
+ <reference key="object" ref="671868626"/>
+ <reference key="parent" ref="930654435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">736</int>
+ <reference key="object" ref="497741775"/>
+ <reference key="parent" ref="930654435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">737</int>
+ <reference key="object" ref="285322108"/>
+ <reference key="parent" ref="930654435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">738</int>
+ <reference key="object" ref="456308224"/>
+ <reference key="parent" ref="930654435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">817</int>
+ <reference key="object" ref="971013910"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">818</int>
+ <reference key="object" ref="532573582"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">820</int>
+ <reference key="object" ref="1026802243"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">825</int>
+ <reference key="object" ref="588542073"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">826</int>
+ <reference key="object" ref="148271458"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">827</int>
+ <reference key="object" ref="924072330"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">828</int>
+ <reference key="object" ref="157577355"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">832</int>
+ <reference key="object" ref="403460345"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">833</int>
+ <reference key="object" ref="1008284068"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">834</int>
+ <reference key="object" ref="997106205"/>
+ <reference key="parent" ref="466310130"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">838</int>
+ <reference key="object" ref="72022292"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">847</int>
+ <reference key="object" ref="867741866"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">848</int>
+ <reference key="object" ref="603467951"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1062528031"/>
+ </object>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">849</int>
+ <reference key="object" ref="1062528031"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="603467951"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">853</int>
+ <reference key="object" ref="509997857"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="844807595"/>
+ <reference ref="832858329"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">854</int>
+ <reference key="object" ref="844807595"/>
+ <reference key="parent" ref="509997857"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">855</int>
+ <reference key="object" ref="832858329"/>
+ <reference key="parent" ref="509997857"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-3.IBPluginDependency</string>
+ <string>103.IBPluginDependency</string>
+ <string>103.ImportedFromIB2</string>
+ <string>106.IBEditorWindowLastContentRect</string>
+ <string>106.IBPluginDependency</string>
+ <string>106.ImportedFromIB2</string>
+ <string>106.editorWindowContentRectSynchronizationRect</string>
+ <string>111.IBPluginDependency</string>
+ <string>111.ImportedFromIB2</string>
+ <string>129.IBPluginDependency</string>
+ <string>129.ImportedFromIB2</string>
+ <string>130.IBEditorWindowLastContentRect</string>
+ <string>130.IBPluginDependency</string>
+ <string>130.ImportedFromIB2</string>
+ <string>130.editorWindowContentRectSynchronizationRect</string>
+ <string>131.IBPluginDependency</string>
+ <string>131.ImportedFromIB2</string>
+ <string>134.IBPluginDependency</string>
+ <string>134.ImportedFromIB2</string>
+ <string>136.IBPluginDependency</string>
+ <string>136.ImportedFromIB2</string>
+ <string>143.IBPluginDependency</string>
+ <string>143.ImportedFromIB2</string>
+ <string>144.IBPluginDependency</string>
+ <string>144.ImportedFromIB2</string>
+ <string>145.IBPluginDependency</string>
+ <string>145.ImportedFromIB2</string>
+ <string>149.IBPluginDependency</string>
+ <string>149.ImportedFromIB2</string>
+ <string>150.IBPluginDependency</string>
+ <string>150.ImportedFromIB2</string>
+ <string>19.IBPluginDependency</string>
+ <string>19.ImportedFromIB2</string>
+ <string>23.IBPluginDependency</string>
+ <string>23.ImportedFromIB2</string>
+ <string>236.IBPluginDependency</string>
+ <string>236.ImportedFromIB2</string>
+ <string>239.IBPluginDependency</string>
+ <string>239.ImportedFromIB2</string>
+ <string>24.IBEditorWindowLastContentRect</string>
+ <string>24.IBPluginDependency</string>
+ <string>24.ImportedFromIB2</string>
+ <string>24.editorWindowContentRectSynchronizationRect</string>
+ <string>29.IBEditorWindowLastContentRect</string>
+ <string>29.IBPluginDependency</string>
+ <string>29.ImportedFromIB2</string>
+ <string>29.WindowOrigin</string>
+ <string>29.editorWindowContentRectSynchronizationRect</string>
+ <string>295.IBPluginDependency</string>
+ <string>296.IBEditorWindowLastContentRect</string>
+ <string>296.IBPluginDependency</string>
+ <string>296.editorWindowContentRectSynchronizationRect</string>
+ <string>297.IBPluginDependency</string>
+ <string>298.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>5.ImportedFromIB2</string>
+ <string>56.IBPluginDependency</string>
+ <string>56.ImportedFromIB2</string>
+ <string>57.IBEditorWindowLastContentRect</string>
+ <string>57.IBPluginDependency</string>
+ <string>57.ImportedFromIB2</string>
+ <string>57.editorWindowContentRectSynchronizationRect</string>
+ <string>58.IBPluginDependency</string>
+ <string>58.ImportedFromIB2</string>
+ <string>684.IBPluginDependency</string>
+ <string>685.IBEditorWindowLastContentRect</string>
+ <string>685.IBPluginDependency</string>
+ <string>686.IBPluginDependency</string>
+ <string>687.IBPluginDependency</string>
+ <string>688.IBPluginDependency</string>
+ <string>689.IBPluginDependency</string>
+ <string>690.IBPluginDependency</string>
+ <string>691.IBPluginDependency</string>
+ <string>693.IBPluginDependency</string>
+ <string>694.IBPluginDependency</string>
+ <string>695.IBPluginDependency</string>
+ <string>696.IBPluginDependency</string>
+ <string>700.IBPluginDependency</string>
+ <string>711.IBEditorWindowLastContentRect</string>
+ <string>711.IBPluginDependency</string>
+ <string>712.IBPluginDependency</string>
+ <string>713.IBPluginDependency</string>
+ <string>72.IBPluginDependency</string>
+ <string>72.ImportedFromIB2</string>
+ <string>73.IBPluginDependency</string>
+ <string>73.ImportedFromIB2</string>
+ <string>734.IBEditorWindowLastContentRect</string>
+ <string>734.IBPluginDependency</string>
+ <string>735.IBPluginDependency</string>
+ <string>736.IBPluginDependency</string>
+ <string>737.IBPluginDependency</string>
+ <string>738.IBPluginDependency</string>
+ <string>74.IBPluginDependency</string>
+ <string>74.ImportedFromIB2</string>
+ <string>77.IBPluginDependency</string>
+ <string>77.ImportedFromIB2</string>
+ <string>78.IBPluginDependency</string>
+ <string>78.ImportedFromIB2</string>
+ <string>79.IBPluginDependency</string>
+ <string>79.ImportedFromIB2</string>
+ <string>80.IBPluginDependency</string>
+ <string>80.ImportedFromIB2</string>
+ <string>81.IBEditorWindowLastContentRect</string>
+ <string>81.IBPluginDependency</string>
+ <string>81.ImportedFromIB2</string>
+ <string>81.editorWindowContentRectSynchronizationRect</string>
+ <string>817.IBPluginDependency</string>
+ <string>818.IBPluginDependency</string>
+ <string>82.IBPluginDependency</string>
+ <string>82.ImportedFromIB2</string>
+ <string>820.IBPluginDependency</string>
+ <string>825.IBPluginDependency</string>
+ <string>826.IBPluginDependency</string>
+ <string>827.IBPluginDependency</string>
+ <string>828.IBPluginDependency</string>
+ <string>83.IBPluginDependency</string>
+ <string>83.ImportedFromIB2</string>
+ <string>832.IBPluginDependency</string>
+ <string>833.IBPluginDependency</string>
+ <string>834.IBPluginDependency</string>
+ <string>838.IBPluginDependency</string>
+ <string>847.IBPluginDependency</string>
+ <string>848.IBPluginDependency</string>
+ <string>849.IBEditorWindowLastContentRect</string>
+ <string>849.IBPluginDependency</string>
+ <string>853.IBEditorWindowLastContentRect</string>
+ <string>853.IBPluginDependency</string>
+ <string>854.IBPluginDependency</string>
+ <string>855.IBPluginDependency</string>
+ <string>92.IBPluginDependency</string>
+ <string>92.ImportedFromIB2</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{881, 774}, {157, 23}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{596, 852}, {216, 23}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{509, 573}, {64, 6}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{436, 809}, {64, 6}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{876, 712}, {194, 103}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{525, 802}, {197, 73}}</string>
+ <string>{{604, 815}, {446, 20}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{74, 862}</string>
+ <string>{{11, 977}, {478, 20}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{823, 465}, {234, 163}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{475, 832}, {234, 43}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{668, 632}, {186, 183}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{23, 794}, {245, 183}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{782, 612}, {151, 203}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{933, 592}, {150, 43}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{933, 572}, {238, 83}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{740, 652}, {179, 163}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{323, 672}, {199, 203}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{824, 809}, {64, 6}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{616, 718}, {206, 43}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">859</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">BookmarksController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>addBookmark:</string>
+ <string>openBookmarkURL:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>addBookmark:</string>
+ <string>openBookmarkURL:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">addBookmark:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">openBookmarkURL:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">defaultMenu</string>
+ <string key="NS.object.0">NSMenu</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">defaultMenu</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">defaultMenu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BookmarksController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserView</string>
+ <string key="superclassName">ScrollableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserViewController</string>
+ <string key="superclassName">NSViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>backForwardSelected:</string>
+ <string>goBack:</string>
+ <string>goForward:</string>
+ <string>goHome:</string>
+ <string>navigate:</string>
+ <string>reloadPage:</string>
+ <string>stopLoading:</string>
+ <string>zoomIn:</string>
+ <string>zoomOriginal:</string>
+ <string>zoomOut:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>backForwardSelected:</string>
+ <string>goBack:</string>
+ <string>goForward:</string>
+ <string>goHome:</string>
+ <string>navigate:</string>
+ <string>reloadPage:</string>
+ <string>stopLoading:</string>
+ <string>zoomIn:</string>
+ <string>zoomOriginal:</string>
+ <string>zoomOut:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">backForwardSelected:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">goBack:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">goForward:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">goHome:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">navigate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">reloadPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">stopLoading:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomIn:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomOriginal:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">zoomOut:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">browserView</string>
+ <string key="NS.object.0">BrowserView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">browserView</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">browserView</string>
+ <string key="candidateClassName">BrowserView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">BrowserWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>closeCurrentTab:</string>
+ <string>newTab:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>closeCurrentTab:</string>
+ <string>newTab:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">closeCurrentTab:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">newTab:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>activeBrowserController</string>
+ <string>navigationControl</string>
+ <string>tabBar</string>
+ <string>tabView</string>
+ <string>urlField</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSObjectController</string>
+ <string>NSSegmentedControl</string>
+ <string>PSMTabBarControl</string>
+ <string>NSTabView</string>
+ <string>URLFieldCell</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>activeBrowserController</string>
+ <string>navigationControl</string>
+ <string>tabBar</string>
+ <string>tabView</string>
+ <string>urlField</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBToOneOutletInfo">
+ <string key="name">activeBrowserController</string>
+ <string key="candidateClassName">NSObjectController</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">navigationControl</string>
+ <string key="candidateClassName">NSSegmentedControl</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">tabBar</string>
+ <string key="candidateClassName">PSMTabBarControl</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">tabView</string>
+ <string key="candidateClassName">NSTabView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">urlField</string>
+ <string key="candidateClassName">URLFieldCell</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">BrowserWindowController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="294109393">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="831067236">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="354078772">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NetSurfAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>searchBackward:</string>
+ <string>searchForward:</string>
+ <string>showGlobalHistory:</string>
+ <string>showPreferences:</string>
+ <string>showSearchWindow:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>searchBackward:</string>
+ <string>searchForward:</string>
+ <string>showGlobalHistory:</string>
+ <string>showPreferences:</string>
+ <string>showSearchWindow:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">searchBackward:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">searchForward:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showGlobalHistory:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showPreferences:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showSearchWindow:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">NetSurfAppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <reference key="sourceIdentifier" ref="831067236"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <string key="superclassName">NSControl</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>delegate</string>
+ <string>partnerView</string>
+ <string>style</string>
+ <string>tabView</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>NSTabView</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>delegate</string>
+ <string>partnerView</string>
+ <string>style</string>
+ <string>tabView</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBToOneOutletInfo">
+ <string key="name">delegate</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">partnerView</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">style</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">tabView</string>
+ <string key="candidateClassName">NSTabView</string>
+ </object>
+ </object>
+ </object>
+ <reference key="sourceIdentifier" ref="354078772"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <reference key="sourceIdentifier" ref="294109393"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PSMTabBarControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabStyle.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ScrollableView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ScrollableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">SearchWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>searchNext:</string>
+ <string>searchPrevious:</string>
+ <string>searchStringDidChange:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>searchNext:</string>
+ <string>searchPrevious:</string>
+ <string>searchStringDidChange:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">searchNext:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">searchPrevious:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">searchStringDidChange:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">SearchWindowController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">URLFieldCell</string>
+ <string key="superclassName">NSTextFieldCell</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">URLFieldCell.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSMenuCheckmark</string>
+ <string>NSMenuMixedState</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{9, 8}</string>
+ <string>{7, 2}</string>
+ </object>
+ </object>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/NetSurf-Info.plist b/frontends/cocoa/res/NetSurf-Info.plist
new file mode 100644
index 000000000..60bf6820e
--- /dev/null
+++ b/frontends/cocoa/res/NetSurf-Info.plist
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array/>
+ <key>CFBundleTypeMIMETypes</key>
+ <array/>
+ <key>CFBundleTypeName</key>
+ <string>HTML</string>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>public.html</string>
+ </array>
+ </dict>
+ </array>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>NetSurf</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.netsurf-browser.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${NETSURF_VERSION}</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleURLTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleURLName</key>
+ <string>org.netsurf-browser.NetSurf.URI</string>
+ <key>CFBundleURLSchemes</key>
+ <array>
+ <string>http</string>
+ <string>https</string>
+ </array>
+ </dict>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>${NETSURF_SHORT_VERSION}</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NetSurfApp</string>
+ <key>NSServices</key>
+ <array/>
+ <key>UTExportedTypeDeclarations</key>
+ <array/>
+ <key>UTImportedTypeDeclarations</key>
+ <array>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.text</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>HTML</string>
+ <key>UTTypeIdentifier</key>
+ <string>public.html</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>html</string>
+ <string>htm</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>text/html</string>
+ </array>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.source-code</string>
+ </array>
+ <key>UTTypeDescription</key>
+ <string>CSS</string>
+ <key>UTTypeIdentifier</key>
+ <string>org.w3.css</string>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>css</string>
+ </array>
+ <key>public.mime-type</key>
+ <array>
+ <string>text/css</string>
+ </array>
+ </dict>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/frontends/cocoa/res/NetSurf.icns b/frontends/cocoa/res/NetSurf.icns
new file mode 100644
index 000000000..654942373
--- /dev/null
+++ b/frontends/cocoa/res/NetSurf.icns
Binary files differ
diff --git a/frontends/cocoa/res/PreferencesWindow.xib b/frontends/cocoa/res/PreferencesWindow.xib
new file mode 100644
index 000000000..c4ea6b3b6
--- /dev/null
+++ b/frontends/cocoa/res/PreferencesWindow.xib
@@ -0,0 +1,512 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">1060</int>
+ <string key="IBDocument.SystemVersion">9L31a</string>
+ <string key="IBDocument.InterfaceBuilderVersion">680</string>
+ <string key="IBDocument.AppKitVersion">949.54</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="2"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">PreferencesWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">7</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 362}, {455, 148}}</string>
+ <int key="NSWTFlags">1618477056</int>
+ <string key="NSWindowTitle">Preferences</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="343066491">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{98, 106}, {337, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="218234675">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="1015231142">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="343066491"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <object class="NSColor" key="NSColor" id="751207648">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="662601838">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 108}, {76, 17}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="633183289">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Homepage:</string>
+ <reference key="NSSupport" ref="1015231142"/>
+ <reference key="NSControlView" ref="662601838"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="751207648"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSButton" id="272890940">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{222, 70}, {219, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="136693114">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Use current page</string>
+ <reference key="NSSupport" ref="1015231142"/>
+ <reference key="NSControlView" ref="272890940"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="748375959">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{96, 38}, {341, 18}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="497902592">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Cancel downloads without asking</string>
+ <reference key="NSSupport" ref="1015231142"/>
+ <reference key="NSControlView" ref="748375959"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="118883570">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="21608943">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="832107887">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{96, 18}, {341, 18}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="616812964">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Close multiple tabs without asking</string>
+ <reference key="NSSupport" ref="1015231142"/>
+ <reference key="NSControlView" ref="832107887"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="118883570"/>
+ <reference key="NSAlternateImage" ref="21608943"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{455, 148}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSUserDefaultsController" id="562818373">
+ <bool key="NSSharedInstance">YES</bool>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.AlwaysCancelDownload</string>
+ <reference key="source" ref="748375959"/>
+ <reference key="destination" ref="562818373"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="748375959"/>
+ <reference key="NSDestination" ref="562818373"/>
+ <string key="NSLabel">value: values.AlwaysCancelDownload</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.AlwaysCancelDownload</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">21</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.AlwaysCloseMultipleTabs</string>
+ <reference key="source" ref="832107887"/>
+ <reference key="destination" ref="562818373"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="832107887"/>
+ <reference key="NSDestination" ref="562818373"/>
+ <string key="NSLabel">value: values.AlwaysCloseMultipleTabs</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.AlwaysCloseMultipleTabs</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">22</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">useCurrentPageAsHomepage:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="272890940"/>
+ </object>
+ <int key="connectionID">23</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: homepageURL</string>
+ <reference key="source" ref="343066491"/>
+ <reference key="destination" ref="1001"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="343066491"/>
+ <reference key="NSDestination" ref="1001"/>
+ <string key="NSLabel">value: homepageURL</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">homepageURL</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">25</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="854144324">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="854144324"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="854144324"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="854144324"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="854144324"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="343066491"/>
+ <reference ref="662601838"/>
+ <reference ref="272890940"/>
+ <reference ref="748375959"/>
+ <reference ref="832107887"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="343066491"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="218234675"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">10</int>
+ <reference key="object" ref="218234675"/>
+ <reference key="parent" ref="343066491"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="662601838"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="633183289"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">12</int>
+ <reference key="object" ref="633183289"/>
+ <reference key="parent" ref="662601838"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="272890940"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="136693114"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="136693114"/>
+ <reference key="parent" ref="272890940"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="748375959"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="497902592"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">16</int>
+ <reference key="object" ref="497902592"/>
+ <reference key="parent" ref="748375959"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">17</int>
+ <reference key="object" ref="832107887"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="616812964"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="616812964"/>
+ <reference key="parent" ref="832107887"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="562818373"/>
+ <reference key="parent" ref="854144324"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>10.IBPluginDependency</string>
+ <string>11.IBPluginDependency</string>
+ <string>11.IBViewBoundsToFrameTransform</string>
+ <string>12.IBPluginDependency</string>
+ <string>13.IBPluginDependency</string>
+ <string>13.IBViewBoundsToFrameTransform</string>
+ <string>14.IBPluginDependency</string>
+ <string>15.IBPluginDependency</string>
+ <string>16.IBPluginDependency</string>
+ <string>17.IBPluginDependency</string>
+ <string>17.IBViewBoundsToFrameTransform</string>
+ <string>18.IBPluginDependency</string>
+ <string>2.IBPluginDependency</string>
+ <string>9.IBPluginDependency</string>
+ <string>9.IBViewBoundsToFrameTransform</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{{176, 384}, {455, 148}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{176, 384}, {455, 148}}</string>
+ <integer value="1"/>
+ <string>{196, 240}</string>
+ <string>{{202, 428}, {480, 270}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCYAAAw2sAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABClgAAw3wAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCwAAAwggAAA</bytes>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABDSQAAw2sAAA</bytes>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">25</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabDragAssistant.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PSMTabBarControl/PSMTabBarControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PreferencesWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PreferencesWindowController.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../NetSurf.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/frontends/cocoa/res/SearchWindow.xib b/frontends/cocoa/res/SearchWindow.xib
new file mode 100644
index 000000000..8bf2d2bd1
--- /dev/null
+++ b/frontends/cocoa/res/SearchWindow.xib
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12120" systemVersion="16F73" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="macosx"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12120"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="SearchWindowController">
+ <connections>
+ <outlet property="window" destination="1" id="23"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application"/>
+ <window title="Search" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
+ <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+ <rect key="contentRect" x="196" y="354" width="480" height="156"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
+ <view key="contentView" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="156"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" id="3">
+ <rect key="frame" x="67" y="114" width="393" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" continuous="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="4">
+ <font key="font" metaFont="system"/>
+ <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ <connections>
+ <action selector="searchStringDidChange:" target="-2" id="22"/>
+ <binding destination="-2" name="value" keyPath="searchString" id="24"/>
+ </connections>
+ </textField>
+ <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" id="5">
+ <rect key="frame" x="17" y="116" width="45" height="14"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Find:" id="6">
+ <font key="font" metaFont="smallSystem"/>
+ <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ <button verticalHuggingPriority="750" imageHugsTitle="YES" id="7">
+ <rect key="frame" x="370" y="12" width="96" height="32"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <buttonCell key="cell" type="push" title="Next" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+ </buttonCell>
+ <connections>
+ <action selector="searchNext:" target="-2" id="15"/>
+ <binding destination="-2" name="enabled" keyPath="canGoForward" id="17"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="750" imageHugsTitle="YES" id="9">
+ <rect key="frame" x="274" y="12" width="96" height="32"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <buttonCell key="cell" type="push" title="Previous" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="10">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="searchPrevious:" target="-2" id="16"/>
+ <binding destination="-2" name="enabled" keyPath="canGoBack" id="18"/>
+ </connections>
+ </button>
+ <button imageHugsTitle="YES" id="11">
+ <rect key="frame" x="139" y="90" width="323" height="18"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <buttonCell key="cell" type="check" title="Case sensitive" bezelStyle="regularSquare" imagePosition="leading" alignment="left" state="on" inset="2" id="12">
+ <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <binding destination="-2" name="value" keyPath="caseSensitive" id="25"/>
+ </connections>
+ </button>
+ <button imageHugsTitle="YES" id="13">
+ <rect key="frame" x="139" y="70" width="323" height="18"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <buttonCell key="cell" type="check" title="Select all" bezelStyle="regularSquare" imagePosition="leading" alignment="left" state="on" inset="2" id="14">
+ <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <binding destination="-2" name="value" keyPath="selectAll" id="27"/>
+ </connections>
+ </button>
+ </subviews>
+ </view>
+ </window>
+ </objects>
+</document>
diff --git a/frontends/cocoa/res/adblock.css b/frontends/cocoa/res/adblock.css
new file mode 120000
index 000000000..ff2485622
--- /dev/null
+++ b/frontends/cocoa/res/adblock.css
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/AdBlock,f79 \ No newline at end of file
diff --git a/frontends/cocoa/res/ca-bundle b/frontends/cocoa/res/ca-bundle
new file mode 120000
index 000000000..0b0e416ad
--- /dev/null
+++ b/frontends/cocoa/res/ca-bundle
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/ca-bundle \ No newline at end of file
diff --git a/frontends/cocoa/res/de.lproj/BookmarksWindow.xib.strings b/frontends/cocoa/res/de.lproj/BookmarksWindow.xib.strings
new file mode 100644
index 000000000..5fa44a11e
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/BookmarksWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/BrowserWindow.xib.strings b/frontends/cocoa/res/de.lproj/BrowserWindow.xib.strings
new file mode 100644
index 000000000..a0c782cd6
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/BrowserWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/DownloadWindow.xib.strings b/frontends/cocoa/res/de.lproj/DownloadWindow.xib.strings
new file mode 100644
index 000000000..d92040249
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/DownloadWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/HistoryWindow.xib.strings b/frontends/cocoa/res/de.lproj/HistoryWindow.xib.strings
new file mode 100644
index 000000000..c43bc418e
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/HistoryWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/Localizable.strings b/frontends/cocoa/res/de.lproj/Localizable.strings
new file mode 100644
index 000000000..04180f485
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/Localizable.strings
@@ -0,0 +1,78 @@
+/* ... of (total size) */
+" of %@" = " von %@";
+
+/* time remaining: hours, minutes */
+"%2:%02u hours" = "%1$:%2$u Stunden";
+
+/* time remaining */
+"%u seconds" = "%u Sekunden";
+
+/* time remaining: minutes, seconds */
+"%u:%02u minutes" = "%1$u:%2$u Minuten";
+
+/* Context menu */
+"Back" = "Zurück";
+
+/* Download */
+"Cancel download?" = "Download abbrechen?";
+
+/* Context menu */
+"Copy image" = "Bild kopieren";
+
+/* Context menu */
+"Copy link" = "Link kopieren";
+
+/* No comment provided by engineer. */
+"Do you really want to close this window?" = "Wollen Sie dieses Fenster wirklich schließen?";
+
+/* show error */
+"Error" = "Fehler";
+
+/* Context menu */
+"Forward" = "Vorwärts";
+
+/* time remaining */
+"less than 10 seconds" = "weniger als 10 Sekunden";
+
+/* 'No' button */
+"No" = "Nein";
+
+/* 'OK' button */
+"OK" = "OK";
+
+/* Context menu */
+"Open image in new tab" = "Bild in neuem Tab öffnen";
+
+/* Context menu */
+"Open image in new window" = "Bild in neuem Fenster öffnen";
+
+/* Context menu */
+"Open link in new tab" = "Link in neuem Tab öffnen";
+
+/* Context menu */
+"Open link in new window" = "Link in neuem Fenster öffnen";
+
+/* Context menu */
+"Reload" = "Neu laden";
+
+/* Context menu */
+"Save image as" = "Bild speichern";
+
+/* Context menu */
+"Save link target" = "Linkziel speichern";
+
+/* Download */
+"Should the download of '%@' really be cancelled?" = "Soll der Download von '%@' wirklich abgebrochen werden?";
+
+/* No comment provided by engineer. */
+"There are %d tabs open, do you want to close them all?" = "Es sind noch %d tabs offen. Sollen alle geschlossen werden?";
+
+/* Warning title */
+"Warning" = "Warnung";
+
+/* Warning message */
+"Warning %s%s%s" = "Warnung %1$s%2$s%3$s";
+
+/* 'Yes' button */
+"Yes" = "Ja";
+
diff --git a/frontends/cocoa/res/de.lproj/MainMenu.xib.strings b/frontends/cocoa/res/de.lproj/MainMenu.xib.strings
new file mode 100644
index 000000000..3fc91c48c
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/MainMenu.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/Messages b/frontends/cocoa/res/de.lproj/Messages
new file mode 120000
index 000000000..32530a151
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/Messages
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/de/Messages \ No newline at end of file
diff --git a/frontends/cocoa/res/de.lproj/PreferencesWindow.xib.strings b/frontends/cocoa/res/de.lproj/PreferencesWindow.xib.strings
new file mode 100644
index 000000000..fbe9762f2
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/PreferencesWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/SearchWindow.xib.strings b/frontends/cocoa/res/de.lproj/SearchWindow.xib.strings
new file mode 100644
index 000000000..31fdea76b
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/SearchWindow.xib.strings
Binary files differ
diff --git a/frontends/cocoa/res/de.lproj/welcome.html b/frontends/cocoa/res/de.lproj/welcome.html
new file mode 120000
index 000000000..98a53b215
--- /dev/null
+++ b/frontends/cocoa/res/de.lproj/welcome.html
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/de/welcome.html,faf \ No newline at end of file
diff --git a/frontends/cocoa/res/default.css b/frontends/cocoa/res/default.css
new file mode 120000
index 000000000..a8579eb7c
--- /dev/null
+++ b/frontends/cocoa/res/default.css
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/CSS,f79 \ No newline at end of file
diff --git a/frontends/cocoa/res/en.lproj/Localizable.strings b/frontends/cocoa/res/en.lproj/Localizable.strings
new file mode 100644
index 000000000..9ac7a7b4d
--- /dev/null
+++ b/frontends/cocoa/res/en.lproj/Localizable.strings
Binary files differ
diff --git a/frontends/cocoa/res/en.lproj/Messages b/frontends/cocoa/res/en.lproj/Messages
new file mode 120000
index 000000000..a26483244
--- /dev/null
+++ b/frontends/cocoa/res/en.lproj/Messages
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/en/Messages \ No newline at end of file
diff --git a/frontends/cocoa/res/en.lproj/licence.html b/frontends/cocoa/res/en.lproj/licence.html
new file mode 120000
index 000000000..79f73669b
--- /dev/null
+++ b/frontends/cocoa/res/en.lproj/licence.html
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/en/licence.html,faf \ No newline at end of file
diff --git a/frontends/cocoa/res/en.lproj/maps.html b/frontends/cocoa/res/en.lproj/maps.html
new file mode 120000
index 000000000..bb3ffcbe7
--- /dev/null
+++ b/frontends/cocoa/res/en.lproj/maps.html
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/en/maps.html,faf \ No newline at end of file
diff --git a/frontends/cocoa/res/en.lproj/welcome.html b/frontends/cocoa/res/en.lproj/welcome.html
new file mode 120000
index 000000000..601099223
--- /dev/null
+++ b/frontends/cocoa/res/en.lproj/welcome.html
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/en/welcome.html,faf \ No newline at end of file
diff --git a/frontends/cocoa/res/fr.lproj/Localizable.strings b/frontends/cocoa/res/fr.lproj/Localizable.strings
new file mode 100644
index 000000000..9ac7a7b4d
--- /dev/null
+++ b/frontends/cocoa/res/fr.lproj/Localizable.strings
Binary files differ
diff --git a/frontends/cocoa/res/fr.lproj/Messages b/frontends/cocoa/res/fr.lproj/Messages
new file mode 120000
index 000000000..467559b12
--- /dev/null
+++ b/frontends/cocoa/res/fr.lproj/Messages
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/fr/Messages \ No newline at end of file
diff --git a/frontends/cocoa/res/internal.css b/frontends/cocoa/res/internal.css
new file mode 120000
index 000000000..17f9f1504
--- /dev/null
+++ b/frontends/cocoa/res/internal.css
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/internal.css,f79 \ No newline at end of file
diff --git a/frontends/cocoa/res/it.lproj/Localizable.strings b/frontends/cocoa/res/it.lproj/Localizable.strings
new file mode 100644
index 000000000..5927796a6
--- /dev/null
+++ b/frontends/cocoa/res/it.lproj/Localizable.strings
Binary files differ
diff --git a/frontends/cocoa/res/it.lproj/Messages b/frontends/cocoa/res/it.lproj/Messages
new file mode 120000
index 000000000..00fc6d1ed
--- /dev/null
+++ b/frontends/cocoa/res/it.lproj/Messages
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/it/Messages \ No newline at end of file
diff --git a/frontends/cocoa/res/netsurf.png b/frontends/cocoa/res/netsurf.png
new file mode 120000
index 000000000..905512c25
--- /dev/null
+++ b/frontends/cocoa/res/netsurf.png
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/netsurf.png,b60 \ No newline at end of file
diff --git a/frontends/cocoa/res/nl.lproj/Localizable.strings b/frontends/cocoa/res/nl.lproj/Localizable.strings
new file mode 100644
index 000000000..9ac7a7b4d
--- /dev/null
+++ b/frontends/cocoa/res/nl.lproj/Localizable.strings
Binary files differ
diff --git a/frontends/cocoa/res/nl.lproj/Messages b/frontends/cocoa/res/nl.lproj/Messages
new file mode 120000
index 000000000..c8a9cbe81
--- /dev/null
+++ b/frontends/cocoa/res/nl.lproj/Messages
@@ -0,0 +1 @@
+../../../../!NetSurf/Resources/nl/Messages \ No newline at end of file
diff --git a/frontends/cocoa/res/quirks.css b/frontends/cocoa/res/quirks.css
new file mode 120000
index 000000000..88aabe48c
--- /dev/null
+++ b/frontends/cocoa/res/quirks.css
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/Quirks,f79 \ No newline at end of file
diff --git a/frontends/cocoa/schedule.h b/frontends/cocoa/schedule.h
new file mode 100644
index 000000000..43b2c1462
--- /dev/null
+++ b/frontends/cocoa/schedule.h
@@ -0,0 +1,19 @@
+/*
+ * 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/>.
+ */
+
+nserror cocoa_schedule(int t, void (*callback)(void *p), void *p);
diff --git a/frontends/cocoa/schedule.m b/frontends/cocoa/schedule.m
new file mode 100644
index 000000000..0fc55efbd
--- /dev/null
+++ b/frontends/cocoa/schedule.m
@@ -0,0 +1,91 @@
+/*
+ * 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/errors.h"
+
+#import "cocoa/schedule.h"
+
+@interface ScheduledCallback : NSObject {
+ void (*callback)(void *userData);
+ void *userData;
+}
+
+- (instancetype)initWithCallback:(void (*)(void *))cb userData:(void *)ud;
+- (void)schedule:(NSTimeInterval)ti;
+
+@end
+
+@implementation ScheduledCallback
+
+- (instancetype)initWithCallback:(void (*)(void *))cb userData:(void *)ud
+{
+ callback = cb;
+ userData = ud;
+
+ return self;
+}
+
+static NSMutableSet *timerSet = nil;
+
+- (void)schedule:(NSTimeInterval)ti
+{
+ if (nil == timerSet) {
+ timerSet = [[NSMutableSet alloc] init];
+ }
+
+ [self performSelector:@selector(timerFired) withObject:nil afterDelay:ti];
+ [timerSet addObject:self];
+}
+
+- (void)timerFired
+{
+ if ([timerSet containsObject:self]) {
+ [timerSet removeObject:self];
+ callback(userData);
+ }
+}
+
+- (BOOL)isEqual:(id)object
+{
+ if (object == self)
+ return YES;
+ if ([object class] != [self class])
+ return NO;
+ return ((ScheduledCallback *)object)->callback == callback && ((ScheduledCallback *)object)->userData == userData;
+}
+
+- (NSUInteger)hash
+{
+ return (NSUInteger)callback + (NSUInteger)userData;
+}
+
+@end
+
+/* exported interface documented in cocoa/schedule.h */
+nserror cocoa_schedule(int t, void (*callback)(void *p), void *p)
+{
+ ScheduledCallback *cb = [[ScheduledCallback alloc] initWithCallback:callback userData:p];
+ [timerSet removeObject:cb];
+ if (t >= 0) {
+ [cb schedule:(NSTimeInterval)t / 1000];
+ }
+
+ return NSERROR_OK;
+}
diff --git a/frontends/cocoa/selection.h b/frontends/cocoa/selection.h
new file mode 100644
index 000000000..67331ea83
--- /dev/null
+++ b/frontends/cocoa/selection.h
@@ -0,0 +1,19 @@
+/*
+ * 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/>.
+ */
+
+struct gui_clipboard_table *cocoa_clipboard_table;
diff --git a/frontends/cocoa/selection.m b/frontends/cocoa/selection.m
new file mode 100644
index 000000000..58c645c4a
--- /dev/null
+++ b/frontends/cocoa/selection.m
@@ -0,0 +1,99 @@
+/*
+ * 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 "cocoa/BrowserViewController.h"
+#import "cocoa/selection.h"
+
+#import "netsurf/clipboard.h"
+
+static NSMutableString *cocoa_clipboard_string;
+
+/**
+ * Core asks front end for clipboard contents.
+ *
+ * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
+ * \param length Byte length of UTF-8 text in buffer
+ */
+static void gui_get_clipboard(char **buffer, size_t *length)
+{
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+ NSString *string = [pb stringForType:NSStringPboardType];
+
+ *buffer = NULL;
+ *length = 0;
+
+ if (string) {
+ const char *text = [string UTF8String];
+ *length = strlen(text);
+
+ *buffer = malloc(*length);
+
+ if (*buffer != NULL) {
+ memcpy(*buffer, text, *length);
+ } else {
+ *length = 0;
+ }
+ }
+}
+
+/**
+ * Core tells front end to put given text in clipboard
+ *
+ * \param buffer UTF-8 text, owned by core
+ * \param length Byte length of UTF-8 text in buffer
+ * \param styles Array of styles given to text runs, owned by core, or NULL
+ * \param n_styles Number of text run styles in array
+ */
+static void gui_set_clipboard(const char *buffer, size_t length,
+ nsclipboard_styles styles[], int n_styles)
+{
+ /* Empty clipboard string */
+ if (nil == cocoa_clipboard_string) {
+ cocoa_clipboard_string = [[NSMutableString alloc] init];
+ } else {
+ [cocoa_clipboard_string setString:@""];
+ }
+
+ [cocoa_clipboard_string appendString:[[NSString alloc]
+ initWithBytes:buffer
+ length:length
+ encoding:NSUTF8StringEncoding]];
+
+ /* Stick it on the pasteboard */
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+ [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
+ bool result = [pb setString:cocoa_clipboard_string forType:NSStringPboardType];
+
+ if (result) {
+ /* Empty clipboard string */
+ if (nil == cocoa_clipboard_string) {
+ cocoa_clipboard_string = [[NSMutableString alloc] init];
+ } else {
+ [cocoa_clipboard_string setString:@""];
+ }
+ }
+}
+
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *cocoa_clipboard_table = &clipboard_table;
diff --git a/frontends/framebuffer/bitmap.c b/frontends/framebuffer/bitmap.c
index 027e0122b..1fc9f46a2 100644
--- a/frontends/framebuffer/bitmap.c
+++ b/frontends/framebuffer/bitmap.c
@@ -51,7 +51,8 @@ static void *bitmap_create(int width, int height, unsigned int state)
{
nsfb_t *bm;
- LOG("width %d, height %d, state %u", width, height, state);
+ NSLOG(netsurf, INFO, "width %d, height %d, state %u", width, height,
+ state);
bm = nsfb_new(NSFB_SURFACE_RAM);
if (bm == NULL) {
@@ -69,7 +70,7 @@ static void *bitmap_create(int width, int height, unsigned int state)
return NULL;
}
- LOG("bitmap %p", bm);
+ NSLOG(netsurf, INFO, "bitmap %p", bm);
return bm;
}
@@ -197,11 +198,11 @@ static bool bitmap_test_opaque(void *bitmap)
while (tst-- > 0) {
if (bmpptr[(tst << 2) + 3] != 0xff) {
- LOG("bitmap %p has transparency", bm);
+ NSLOG(netsurf, INFO, "bitmap %p has transparency", bm);
return false;
}
}
- LOG("bitmap %p is opaque", bm);
+ NSLOG(netsurf, INFO, "bitmap %p is opaque", bm);
return true;
}
@@ -282,14 +283,14 @@ bitmap_render(struct bitmap *bitmap,
nsfb_get_geometry(tbm, &width, &height, NULL);
- LOG("width %d, height %d", width, height);
+ NSLOG(netsurf, INFO, "width %d, height %d", width, height);
/* Calculate size of buffer to render the content into */
- /* We get the width from the content width, unless it exceeds 1024,
- * in which case we use 1024. This means we never create excessively
- * large render buffers for huge contents, which would eat memory and
- * cripple performance. */
- cwidth = min(content_get_width(content), 1024);
+ /* We get the width from the largest of the bitmap width and the content
+ * width, unless it exceeds 1024, in which case we use 1024. This means
+ * we never create excessively large render buffers for huge contents,
+ * which would eat memory and cripple performance. */
+ cwidth = max(width, min(content_get_width(content), 1024));
/* The height is set in proportion with the width, according to the
* aspect ratio of the required thumbnail. */
cheight = ((cwidth * height) + (width / 2)) / width;
diff --git a/frontends/framebuffer/clipboard.c b/frontends/framebuffer/clipboard.c
index 1254c36f3..20a00e038 100644
--- a/frontends/framebuffer/clipboard.c
+++ b/frontends/framebuffer/clipboard.c
@@ -53,8 +53,8 @@ static void gui_get_clipboard(char **buffer, size_t *length)
if (gui_clipboard.length > 0) {
assert(gui_clipboard.buffer != NULL);
- LOG("Pasting %zd bytes: \"%s\"\n",
- gui_clipboard.length, gui_clipboard.buffer);
+ NSLOG(netsurf, INFO, "Pasting %zd bytes: \"%s\"\n",
+ gui_clipboard.length, gui_clipboard.buffer);
*buffer = malloc(gui_clipboard.length);
diff --git a/frontends/framebuffer/fbtk.h b/frontends/framebuffer/fbtk.h
index 3cc326cef..86bdc864b 100644
--- a/frontends/framebuffer/fbtk.h
+++ b/frontends/framebuffer/fbtk.h
@@ -21,12 +21,6 @@
#include "netsurf/types.h"
-#ifdef FBTK_LOGGING
-#define FBTK_LOG(x) LOG(x)
-#else
-#define FBTK_LOG(x)
-#endif
-
#define FB_SCROLL_COLOUR 0xFFAAAAAA
#define FB_FRAME_COLOUR 0xFFDDDDDD
#define FB_COLOUR_BLACK 0xFF000000
diff --git a/frontends/framebuffer/fbtk/event.c b/frontends/framebuffer/fbtk/event.c
index a48e63809..84c6c3791 100644
--- a/frontends/framebuffer/fbtk/event.c
+++ b/frontends/framebuffer/fbtk/event.c
@@ -51,7 +51,7 @@ fbtk_input(fbtk_widget_t *root, nsfb_event_t *event)
/* obtain widget with input focus */
input = root->u.root.input;
if (input == NULL) {
- LOG("No widget has input focus.");
+ NSLOG(netsurf, INFO, "No widget has input focus.");
return; /* no widget with input */
}
@@ -84,7 +84,7 @@ fbtk_click(fbtk_widget_t *widget, nsfb_event_t *event)
x = fbtk_get_absx(clicked);
y = fbtk_get_absy(clicked);
- LOG("clicked %p at %d,%d", clicked, x, y);
+ NSLOG(netsurf, INFO, "clicked %p at %d,%d", clicked, x, y);
/* post the click */
fbtk_post_callback(clicked, FBTK_CBT_CLICK, event, cloc.x0 - x, cloc.y0 - y);
diff --git a/frontends/framebuffer/fbtk/fbtk.c b/frontends/framebuffer/fbtk/fbtk.c
index c63a6d8c9..91f6e2570 100644
--- a/frontends/framebuffer/fbtk/fbtk.c
+++ b/frontends/framebuffer/fbtk/fbtk.c
@@ -53,7 +53,7 @@ dump_tk_tree(fbtk_widget_t *widget)
int indent = 0;
while (widget != NULL) {
- LOG("%*s%p", indent, "", widget);
+ NSLOG(fbtk, DEBUG, "%*s%p", indent, "", widget);
if (widget->first_child != NULL) {
widget = widget->first_child;
indent += 6;
@@ -100,9 +100,13 @@ fbtk_request_redraw(fbtk_widget_t *widget)
widget->redraw.width = widget->width;
widget->redraw.height = widget->height;
-#ifdef FBTK_LOGGING
- LOG("redrawing %p %d,%d %d,%d", widget, widget->redraw.x, widget->redraw.y, widget->redraw.width, widget->redraw.height);
-#endif
+ NSLOG(fbtk, DEBUG,
+ "redrawing %p %d,%d %d,%d",
+ widget,
+ widget->redraw.x,
+ widget->redraw.y,
+ widget->redraw.width,
+ widget->redraw.height);
cwidget = widget->last_child;
while (cwidget != NULL) {
@@ -122,7 +126,7 @@ fbtk_request_redraw(fbtk_widget_t *widget)
int
fbtk_set_mapping(fbtk_widget_t *widget, bool map)
{
- LOG("setting mapping on %p to %d", widget, map);
+ NSLOG(netsurf, INFO, "setting mapping on %p to %d", widget, map);
widget->mapped = map;
if (map) {
fbtk_request_redraw(widget);
@@ -132,9 +136,11 @@ fbtk_set_mapping(fbtk_widget_t *widget, bool map)
return 0;
}
-/** swap the widget given with the next sibling.
- *
+
+/**
* Swap a sibling widget with the next deepest in the hierachy
+ *
+ * \param lw The widget to swap
*/
static void
swap_siblings(fbtk_widget_t *lw)
@@ -145,7 +151,7 @@ swap_siblings(fbtk_widget_t *lw)
assert(rw != NULL);
- LOG("Swapping %p with %p", lw, rw);
+ NSLOG(netsurf, INFO, "Swapping %p with %p", lw, rw);
before = lw->prev;
after = rw->next;
@@ -401,7 +407,6 @@ fbtk_set_ptr(fbtk_widget_t *widget, fbtk_callback_info *cbi)
}
-
/* internally exported function documented in widget.h */
fbtk_widget_t *
fbtk_get_root_widget(fbtk_widget_t *widget)
@@ -411,7 +416,8 @@ fbtk_get_root_widget(fbtk_widget_t *widget)
/* check root widget was found */
if (widget->type != FB_WIDGET_TYPE_ROOT) {
- LOG("Widget with null parent that is not the root widget!");
+ NSLOG(netsurf, INFO,
+ "Widget with null parent that is not the root widget!");
return NULL;
}
@@ -433,6 +439,7 @@ fbtk_get_absx(fbtk_widget_t *widget)
return x;
}
+
/* exported function documented in fbtk.h */
int
fbtk_get_absy(fbtk_widget_t *widget)
@@ -447,6 +454,7 @@ fbtk_get_absy(fbtk_widget_t *widget)
return y;
}
+
/* exported function documented in fbtk.h */
int
fbtk_get_height(fbtk_widget_t *widget)
@@ -551,9 +559,7 @@ fbtk_widget_new(fbtk_widget_t *parent,
if (neww == NULL)
return NULL;
-#ifdef FBTK_LOGGING
- LOG("creating %p %d,%d %d,%d", neww, x, y, width, height);
-#endif
+ NSLOG(fbtk, DEBUG, "creating %p %d,%d %d,%d", neww, x, y, width, height);
/* make new window fit inside parent */
if (width == 0) {
@@ -574,9 +580,8 @@ fbtk_widget_new(fbtk_widget_t *parent,
height = parent->height - y;
}
-#ifdef FBTK_LOGGING
- LOG("using %p %d,%d %d,%d", neww, x, y, width, height);
-#endif
+ NSLOG(fbtk, DEBUG, "using %p %d,%d %d,%d", neww, x, y, width, height);
+
/* set values */
neww->type = type;
neww->x = x;
@@ -634,9 +639,12 @@ do_redraw(nsfb_t *nsfb, fbtk_widget_t *widget)
plot_ctx.x1 = plot_ctx.x0 + widget->redraw.width;
plot_ctx.y1 = plot_ctx.y0 + widget->redraw.height;
-#ifdef FBTK_LOGGING
- LOG("clipping %p %d,%d %d,%d", widget, plot_ctx.x0, plot_ctx.y0, plot_ctx.x1, plot_ctx.y1);
-#endif
+ NSLOG(fbtk, DEBUG,
+ "clipping %p %d,%d %d,%d",
+ widget,
+ plot_ctx.x0, plot_ctx.y0,
+ plot_ctx.x1, plot_ctx.y1);
+
if (nsfb_plot_set_clip(nsfb, &plot_ctx) == true) {
fbtk_post_callback(widget, FBTK_CBT_REDRAW);
}
diff --git a/frontends/framebuffer/fbtk/scroll.c b/frontends/framebuffer/fbtk/scroll.c
index cc98fb2dd..b056ac81f 100644
--- a/frontends/framebuffer/fbtk/scroll.c
+++ b/frontends/framebuffer/fbtk/scroll.c
@@ -334,7 +334,7 @@ hscroll_redraw(fbtk_widget_t *widget, fbtk_callback_info *cbi)
hpos = 0;
}
- LOG("hscroll %d", hscroll);
+ NSLOG(netsurf, INFO, "hscroll %d", hscroll);
rect.x0 = bbox.x0 + 3 + hpos;
rect.y0 = bbox.y0 + 5;
@@ -362,7 +362,7 @@ hscrolll_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
newpos = scrollw->u.scroll.minimum;
if (newpos == scrollw->u.scroll.position) {
- LOG("horiz scroll was the same %d", newpos);
+ NSLOG(netsurf, INFO, "horiz scroll was the same %d", newpos);
return 0;
}
diff --git a/frontends/framebuffer/fbtk/text.c b/frontends/framebuffer/fbtk/text.c
index 31417c2e0..4f3a2385d 100644
--- a/frontends/framebuffer/fbtk/text.c
+++ b/frontends/framebuffer/fbtk/text.c
@@ -388,6 +388,22 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
}
break;
+ case NSFB_KEY_HOME:
+ if (widget->u.text.idx > 0) {
+ widget->u.text.idx = 0;
+
+ caret_moved = true;
+ }
+ break;
+
+ case NSFB_KEY_END:
+ if (widget->u.text.idx < widget->u.text.len) {
+ widget->u.text.idx = widget->u.text.len;
+
+ caret_moved = true;
+ }
+ break;
+
case NSFB_KEY_PAGEUP:
case NSFB_KEY_PAGEDOWN:
case NSFB_KEY_UP:
diff --git a/frontends/framebuffer/fetch.c b/frontends/framebuffer/fetch.c
index 801b87a74..23cbb4f21 100644
--- a/frontends/framebuffer/fetch.c
+++ b/frontends/framebuffer/fetch.c
@@ -65,7 +65,7 @@ static nsurl *get_resource_url(const char *path)
static const char *fetch_filetype(const char *unix_path)
{
int l;
- LOG("unix path %s", unix_path);
+ NSLOG(netsurf, INFO, "unix path %s", unix_path);
l = strlen(unix_path);
if (2 < l && strcasecmp(unix_path + l - 3, "css") == 0)
return "text/css";
diff --git a/frontends/framebuffer/font_freetype.c b/frontends/framebuffer/font_freetype.c
index e7c07f5ff..9e47e4b99 100644
--- a/frontends/framebuffer/font_freetype.c
+++ b/frontends/framebuffer/font_freetype.c
@@ -90,12 +90,13 @@ ft_face_requester(FTC_FaceID face_id,
error = FT_New_Face(library, fb_face->fontfile, fb_face->index, face);
if (error) {
- LOG("Could not find font (code %d)", error);
+ NSLOG(netsurf, INFO, "Could not find font (code %d)", error);
} else {
error = FT_Select_Charmap(*face, FT_ENCODING_UNICODE);
if (error) {
- LOG("Could not select charmap (code %d)", error);
+ NSLOG(netsurf, INFO,
+ "Could not select charmap (code %d)", error);
} else {
for (cidx = 0; cidx < (*face)->num_charmaps; cidx++) {
if ((*face)->charmap == (*face)->charmaps[cidx]) {
@@ -105,7 +106,7 @@ ft_face_requester(FTC_FaceID face_id,
}
}
}
- LOG("Loaded face from %s", fb_face->fontfile);
+ NSLOG(netsurf, INFO, "Loaded face from %s", fb_face->fontfile);
return error;
}
@@ -132,7 +133,8 @@ fb_new_face(const char *option, const char *resname, const char *fontname)
error = FTC_Manager_LookupFace(ft_cmanager, (FTC_FaceID)newf, &aface);
if (error) {
- LOG("Could not find font face %s (code %d)", fontname, error);
+ NSLOG(netsurf, INFO, "Could not find font face %s (code %d)",
+ fontname, error);
free(newf->fontfile);
free(newf);
newf = NULL;
@@ -152,7 +154,8 @@ bool fb_font_init(void)
/* freetype library initialise */
error = FT_Init_FreeType( &library );
if (error) {
- LOG("Freetype could not initialised (code %d)", error);
+ NSLOG(netsurf, INFO,
+ "Freetype could not initialised (code %d)", error);
return false;
}
@@ -172,7 +175,9 @@ bool fb_font_init(void)
NULL,
&ft_cmanager);
if (error) {
- LOG("Freetype could not initialise cache manager (code %d)", error);
+ NSLOG(netsurf, INFO,
+ "Freetype could not initialise cache manager (code %d)",
+ error);
FT_Done_FreeType(library);
return false;
}
@@ -189,7 +194,7 @@ bool fb_font_init(void)
NETSURF_FB_FONT_SANS_SERIF);
if (fb_face == NULL) {
/* The sans serif font is the default and must be found. */
- LOG("Could not find the default font");
+ NSLOG(netsurf, INFO, "Could not find the default font");
FTC_Manager_Done(ft_cmanager);
FT_Done_FreeType(library);
return false;
diff --git a/frontends/framebuffer/font_internal.c b/frontends/framebuffer/font_internal.c
index 3b8a1c43f..ff3471d1d 100644
--- a/frontends/framebuffer/font_internal.c
+++ b/frontends/framebuffer/font_internal.c
@@ -270,6 +270,7 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
+ /* Fall through. */
case FB_BOLD:
section = fb_bold_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -280,6 +281,7 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
+ /* Fall through. */
case FB_ITALIC:
section = fb_italic_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -290,6 +292,7 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
+ /* Fall through. */
case FB_REGULAR:
section = fb_regular_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -300,6 +303,7 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
+ /* Fall through. */
default:
glyph_data = get_codepoint(ucs4, style & FB_ITALIC);
break;
diff --git a/frontends/framebuffer/framebuffer.c b/frontends/framebuffer/framebuffer.c
index de8a3695d..2ccc75062 100644
--- a/frontends/framebuffer/framebuffer.c
+++ b/frontends/framebuffer/framebuffer.c
@@ -271,7 +271,7 @@ framebuffer_plot_path(const struct redraw_context *ctx,
float width,
const float transform[6])
{
- LOG("path unimplemented");
+ NSLOG(netsurf, INFO, "path unimplemented");
return NSERROR_OK;
}
@@ -564,7 +564,7 @@ static bool framebuffer_format_from_bpp(int bpp, enum nsfb_format_e *fmt)
break;
default:
- LOG("Bad bits per pixel (%d)\n", bpp);
+ NSLOG(netsurf, INFO, "Bad bits per pixel (%d)\n", bpp);
return false;
}
@@ -586,18 +586,19 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp)
fbtype = nsfb_type_from_name(fename);
if (fbtype == NSFB_SURFACE_NONE) {
- LOG("The %s surface is not available from libnsfb\n", fename);
+ NSLOG(netsurf, INFO,
+ "The %s surface is not available from libnsfb\n", fename);
return NULL;
}
nsfb = nsfb_new(fbtype);
if (nsfb == NULL) {
- LOG("Unable to create %s fb surface\n", fename);
+ NSLOG(netsurf, INFO, "Unable to create %s fb surface\n", fename);
return NULL;
}
if (nsfb_set_geometry(nsfb, width, height, fbfmt) == -1) {
- LOG("Unable to set surface geometry\n");
+ NSLOG(netsurf, INFO, "Unable to set surface geometry\n");
nsfb_free(nsfb);
return NULL;
}
@@ -605,7 +606,7 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp)
nsfb_cursor_init(nsfb);
if (nsfb_init(nsfb) == -1) {
- LOG("Unable to initialise nsfb surface\n");
+ NSLOG(netsurf, INFO, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return NULL;
}
@@ -625,7 +626,7 @@ framebuffer_resize(nsfb_t *nsfb, int width, int height, int bpp)
}
if (nsfb_set_geometry(nsfb, width, height, fbfmt) == -1) {
- LOG("Unable to change surface geometry\n");
+ NSLOG(netsurf, INFO, "Unable to change surface geometry\n");
return false;
}
diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
index 1460c77f6..8bbaedc22 100644
--- a/frontends/framebuffer/gui.c
+++ b/frontends/framebuffer/gui.c
@@ -120,7 +120,7 @@ static void die(const char *error)
*/
static nserror fb_warn_user(const char *warning, const char *detail)
{
- LOG("%s %s", warning, detail);
+ NSLOG(netsurf, INFO, "%s %s", warning, detail);
return NSERROR_OK;
}
@@ -153,7 +153,7 @@ widget_scroll_y(struct gui_window *gw, int y, bool abs)
int content_width, content_height;
int height;
- LOG("window scroll");
+ NSLOG(netsurf, INFO, "window scroll");
if (abs) {
bwidget->pany = y - bwidget->scrolly;
} else {
@@ -237,7 +237,7 @@ fb_pan(fbtk_widget_t *widget,
height = fbtk_get_height(widget);
width = fbtk_get_width(widget);
- LOG("panning %d, %d", bwidget->panx, bwidget->pany);
+ NSLOG(netsurf, INFO, "panning %d, %d", bwidget->panx, bwidget->pany);
x = fbtk_get_absx(widget);
y = fbtk_get_absy(widget);
@@ -413,7 +413,8 @@ fb_browser_window_redraw(fbtk_widget_t *widget, fbtk_callback_info *cbi)
bwidget = fbtk_get_userpw(widget);
if (bwidget == NULL) {
- LOG("browser widget from widget %p was null", widget);
+ NSLOG(netsurf, INFO,
+ "browser widget from widget %p was null", widget);
return -1;
}
@@ -465,7 +466,7 @@ process_cmdline(int argc, char** argv)
{0, 0, 0, 0 }
}; /* no long options */
- LOG("argc %d, argv %p", argc, argv);
+ NSLOG(netsurf, INFO, "argc %d, argv %p", argc, argv);
fename = "sdl";
febpp = 32;
@@ -534,7 +535,7 @@ static nserror set_defaults(struct nsoption_s *defaults)
if (nsoption_charp(cookie_file) == NULL ||
nsoption_charp(cookie_jar) == NULL) {
- LOG("Failed initialising cookie options");
+ NSLOG(netsurf, INFO, "Failed initialising cookie options");
return NSERROR_BAD_PARAMETER;
}
@@ -612,7 +613,7 @@ static void framebuffer_run(void)
static void gui_quit(void)
{
- LOG("gui_quit");
+ NSLOG(netsurf, INFO, "gui_quit");
urldb_save_cookies(nsoption_charp(cookie_jar));
@@ -639,7 +640,8 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
cbi->event->type != NSFB_EVENT_KEY_UP)
return 0;
- LOG("browser window clicked at %d,%d", cbi->x, cbi->y);
+ NSLOG(netsurf, INFO, "browser window clicked at %d,%d", cbi->x,
+ cbi->y);
switch (cbi->event->type) {
case NSFB_EVENT_KEY_DOWN:
@@ -824,7 +826,7 @@ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
static fbtk_modifier_type modifier = FBTK_MOD_CLEAR;
int ucs4 = -1;
- LOG("got value %d", cbi->event->value.keycode);
+ NSLOG(netsurf, INFO, "got value %d", cbi->event->value.keycode);
switch (cbi->event->type) {
case NSFB_EVENT_KEY_DOWN:
@@ -949,8 +951,7 @@ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
browser_window_key_press(gw->bw, NS_KEY_REDO);
break;
}
- /* Z or Y pressed but not undo or redo;
- * Fall through to default handling */
+ /* Z or Y pressed but not undo or redo; Fall through */
default:
ucs4 = fbtk_keycode_to_ucs4(cbi->event->value.keycode,
@@ -1200,7 +1201,7 @@ create_toolbar(struct gui_window *gw,
toolbar_layout = NSFB_TOOLBAR_DEFAULT_LAYOUT;
}
- LOG("Using toolbar layout %s", toolbar_layout);
+ NSLOG(netsurf, INFO, "Using toolbar layout %s", toolbar_layout);
itmtype = toolbar_layout;
@@ -1234,7 +1235,7 @@ create_toolbar(struct gui_window *gw,
(*itmtype != 0) &&
(xdir !=0)) {
- LOG("toolbar adding %c", *itmtype);
+ NSLOG(netsurf, INFO, "toolbar adding %c", *itmtype);
switch (*itmtype) {
@@ -1376,7 +1377,9 @@ create_toolbar(struct gui_window *gw,
default:
widget = NULL;
xdir = 0;
- LOG("Unknown element %c in toolbar layout", *itmtype);
+ NSLOG(netsurf, INFO,
+ "Unknown element %c in toolbar layout",
+ *itmtype);
break;
}
@@ -1385,7 +1388,7 @@ create_toolbar(struct gui_window *gw,
xpos += (xdir * (fbtk_get_width(widget) + padding));
}
- LOG("xpos is %d", xpos);
+ NSLOG(netsurf, INFO, "xpos is %d", xpos);
itmtype += xdir;
}
@@ -1595,7 +1598,7 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
int statusbar_width = 0;
int toolbar_height = nsoption_int(fb_toolbar_size);
- LOG("Normal window");
+ NSLOG(netsurf, INFO, "Normal window");
gw->window = fbtk_create_window(fbtk, 0, 0, 0, 0, 0);
@@ -1626,7 +1629,8 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
false);
fbtk_set_handler(gw->status, FBTK_CBT_POINTERENTER, set_ptr_default_move, NULL);
- LOG("status bar %p at %d,%d", gw->status, fbtk_get_absx(gw->status), fbtk_get_absy(gw->status));
+ NSLOG(netsurf, INFO, "status bar %p at %d,%d", gw->status,
+ fbtk_get_absx(gw->status), fbtk_get_absy(gw->status));
/* create horizontal scrollbar */
gw->hscroll = fbtk_create_hscroll(gw->window,
@@ -2183,7 +2187,7 @@ main(int argc, char** argv)
/* create an initial browser window */
- LOG("calling browser_window_create");
+ NSLOG(netsurf, INFO, "calling browser_window_create");
ret = nsurl_create(feurl, &url);
if (ret == NSERROR_OK) {
@@ -2205,11 +2209,14 @@ main(int argc, char** argv)
netsurf_exit();
if (fb_font_finalise() == false)
- LOG("Font finalisation failed.");
+ NSLOG(netsurf, INFO, "Font finalisation failed.");
/* finalise options */
nsoption_finalise(nsoptions, nsoptions_default);
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/framebuffer/schedule.c b/frontends/framebuffer/schedule.c
index 581ad72f1..6d1711236 100644
--- a/frontends/framebuffer/schedule.c
+++ b/frontends/framebuffer/schedule.c
@@ -24,12 +24,6 @@
#include "framebuffer/schedule.h"
-#ifdef DEBUG_SCHEDULER
-#define SRLOG(x...) LOG(x)
-#else
-#define SRLOG(x...) ((void) 0)
-#endif
-
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -63,7 +57,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
return NSERROR_OK;
}
- SRLOG("removing %p, %p", callback, p);
+ NSLOG(schedule, DEBUG, "removing %p, %p", callback, p);
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -73,7 +67,8 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- SRLOG("callback entry %p removing %p(%p)",
+ NSLOG(schedule, DEBUG,
+ "callback entry %p removing %p(%p)",
cur_nscb, cur_nscb->callback, cur_nscb->p);
/* remove callback */
@@ -109,7 +104,7 @@ nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p)
return ret;
}
- SRLOG("Adding %p(%p) in %d", callback, p, tival);
+ NSLOG(schedule, DEBUG, "Adding %p(%p) in %d", callback, p, tival);
tv.tv_sec = tival / 1000; /* miliseconds to seconds */
tv.tv_usec = (tival % 1000) * 1000; /* remainder to microseconds */
@@ -190,7 +185,9 @@ int schedule_run(void)
/* make rettime relative to now */
timersub(&nexttime, &tv, &rettime);
- SRLOG("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000));
+ NSLOG(schedule, DEBUG,
+ "returning time to next event as %ldms",
+ (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000));
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
@@ -203,12 +200,14 @@ void list_schedule(void)
gettimeofday(&tv, NULL);
- LOG("schedule list at %ld:%ld", tv.tv_sec, tv.tv_usec);
+ NSLOG(netsurf, INFO, "schedule list at %ld:%ld", tv.tv_sec,
+ tv.tv_usec);
cur_nscb = schedule_list;
while (cur_nscb != NULL) {
- LOG("Schedule %p at %ld:%ld", cur_nscb, cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec);
+ NSLOG(netsurf, INFO, "Schedule %p at %ld:%ld", cur_nscb,
+ cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec);
cur_nscb = cur_nscb->next;
}
}
diff --git a/frontends/gtk/cookies.c b/frontends/gtk/cookies.c
index 500cd07f6..1f7833cca 100644
--- a/frontends/gtk/cookies.c
+++ b/frontends/gtk/cookies.c
@@ -164,8 +164,9 @@ static void nsgtk_cookies_init_menu(struct nsgtk_cookie_window *ncwin)
w = GTK_WIDGET(gtk_builder_get_object(ncwin->builder,
event->widget));
if (w == NULL) {
- LOG("Unable to connect menu widget ""%s""",
- event->widget);
+ NSLOG(netsurf, INFO,
+ "Unable to connect menu widget ""%s""",
+ event->widget);
} else {
g_signal_connect(G_OBJECT(w),
"activate",
@@ -253,7 +254,7 @@ static nserror nsgtk_cookies_init(void)
res = nsgtk_builder_new_from_resname("cookies", &ncwin->builder);
if (res != NSERROR_OK) {
- LOG("Cookie UI builder init failed");
+ NSLOG(netsurf, INFO, "Cookie UI builder init failed");
free(ncwin);
return res;
}
diff --git a/frontends/gtk/corewindow.c b/frontends/gtk/corewindow.c
index ddc61c717..6ca5d228f 100644
--- a/frontends/gtk/corewindow.c
+++ b/frontends/gtk/corewindow.c
@@ -145,6 +145,7 @@ nsgtk_cw_button_release_event(GtkWidget *widget,
{
struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)g;
struct nsgtk_corewindow_mouse *mouse = &nsgtk_cw->mouse_state;
+ bool was_drag = false;
/* only button 1 clicks are considered double clicks. If the
* mouse state is PRESS then we are waiting for a release to
@@ -168,9 +169,11 @@ nsgtk_cw_button_release_event(GtkWidget *widget,
} else if (mouse->state & BROWSER_MOUSE_HOLDING_1) {
mouse->state ^= (BROWSER_MOUSE_HOLDING_1 |
BROWSER_MOUSE_DRAG_ON);
+ was_drag = true;
} else if (mouse->state & BROWSER_MOUSE_HOLDING_2) {
mouse->state ^= (BROWSER_MOUSE_HOLDING_2 |
BROWSER_MOUSE_DRAG_ON);
+ was_drag = true;
}
/* Handle modifiers being removed */
@@ -188,9 +191,10 @@ nsgtk_cw_button_release_event(GtkWidget *widget,
}
/* end drag with modifiers */
- if (mouse->state & (BROWSER_MOUSE_MOD_1 |
- BROWSER_MOUSE_MOD_2 |
- BROWSER_MOUSE_MOD_3)) {
+ if (was_drag && (mouse->state & (
+ BROWSER_MOUSE_MOD_1 |
+ BROWSER_MOUSE_MOD_2 |
+ BROWSER_MOUSE_MOD_3))) {
mouse->state = BROWSER_MOUSE_HOVER;
}
@@ -413,14 +417,14 @@ nsgtk_cw_keypress_event(GtkWidget *widget, GdkEventKey *event, gpointer g)
if (res == NSERROR_OK) {
return TRUE;
} else if (res != NSERROR_NOT_IMPLEMENTED) {
- LOG("%s", messages_get_errorcode(res));
+ NSLOG(netsurf, INFO, "%s", messages_get_errorcode(res));
return FALSE;
}
/* deal with unprocessed keypress */
res = nsgtk_cw_key(nsgtk_cw, nskey);
if (res != NSERROR_OK) {
- LOG("%s", messages_get_errorcode(res));
+ NSLOG(netsurf, INFO, "%s", messages_get_errorcode(res));
return FALSE;
}
return TRUE;
diff --git a/frontends/gtk/download.c b/frontends/gtk/download.c
index 8c8161459..d11036ea8 100644
--- a/frontends/gtk/download.c
+++ b/frontends/gtk/download.c
@@ -331,6 +331,7 @@ static gboolean nsgtk_download_update(gboolean force_update)
switch (dl->status) {
case NSGTK_DOWNLOAD_WORKING:
pulse_mode = TRUE;
+ /* Fall through */
case NSGTK_DOWNLOAD_NONE:
dl->speed = dl->size_downloaded /
@@ -347,6 +348,7 @@ static gboolean nsgtk_download_update(gboolean force_update)
nsgtk_downloads_num_active++;
update = TRUE;
+ /* Fall through */
case NSGTK_DOWNLOAD_COMPLETE:
downloaded += dl->size_downloaded;
@@ -475,7 +477,7 @@ nserror nsgtk_download_init(void)
res = nsgtk_builder_new_from_resname("downloads", &builder);
if (res != NSERROR_OK) {
- LOG("Download UI builder init failed");
+ NSLOG(netsurf, INFO, "Download UI builder init failed");
return res;
}
diff --git a/frontends/gtk/fetch.c b/frontends/gtk/fetch.c
index 154f43708..7286aec34 100644
--- a/frontends/gtk/fetch.c
+++ b/frontends/gtk/fetch.c
@@ -90,7 +90,8 @@ void gtk_fetch_filetype_init(const char *mimefile)
fh = fopen(mimefile, "r");
if (fh == NULL) {
- LOG("Unable to open a mime.types file, so using a minimal one for you.");
+ NSLOG(netsurf, INFO,
+ "Unable to open a mime.types file, so using a minimal one for you.");
return;
}
diff --git a/frontends/gtk/gdk.c b/frontends/gtk/gdk.c
index 9ed90bd8e..fd82af5b2 100644
--- a/frontends/gtk/gdk.c
+++ b/frontends/gtk/gdk.c
@@ -86,7 +86,7 @@ nsgdk_pixbuf_get_from_surface(cairo_surface_t *surface, int scwidth, int scheigh
if (cairo_surface_status(scsurface) != CAIRO_STATUS_SUCCESS) {
cairo_surface_destroy(scsurface);
g_object_unref(pixbuf);
- LOG("Surface creation failed");
+ NSLOG(netsurf, INFO, "Surface creation failed");
return NULL;
}
diff --git a/frontends/gtk/global_history.c b/frontends/gtk/global_history.c
index 360eb4e1a..f204168d0 100644
--- a/frontends/gtk/global_history.c
+++ b/frontends/gtk/global_history.c
@@ -214,8 +214,9 @@ nsgtk_global_history_init_menu(struct nsgtk_global_history_window *ghwin)
w = GTK_WIDGET(gtk_builder_get_object(ghwin->builder,
event->widget));
if (w == NULL) {
- LOG("Unable to connect menu widget ""%s""",
- event->widget);
+ NSLOG(netsurf, INFO,
+ "Unable to connect menu widget ""%s""",
+ event->widget);
} else {
g_signal_connect(G_OBJECT(w),
"activate",
@@ -306,7 +307,7 @@ static nserror nsgtk_global_history_init(void)
res = nsgtk_builder_new_from_resname("globalhistory", &ncwin->builder);
if (res != NSERROR_OK) {
- LOG("History UI builder init failed");
+ NSLOG(netsurf, INFO, "History UI builder init failed");
free(ncwin);
return res;
}
diff --git a/frontends/gtk/gui.c b/frontends/gtk/gui.c
index a183e521f..0f79a1b8e 100644
--- a/frontends/gtk/gui.c
+++ b/frontends/gtk/gui.c
@@ -208,7 +208,8 @@ static nserror set_defaults(struct nsoption_s *defaults)
(nsoption_charp(hotlist_path) == NULL) ||
(nsoption_charp(downloads_directory) == NULL) ||
(nsoption_charp(ca_path) == NULL)) {
- LOG("Failed initialising default resource paths");
+ NSLOG(netsurf, INFO,
+ "Failed initialising default resource paths");
return NSERROR_BAD_PARAMETER;
}
@@ -238,7 +239,7 @@ static nserror nsgtk_init(int argc, char** argv, char **respath)
error = nsgtk_builder_new_from_resname("warning", &warning_builder);
if (error != NSERROR_OK) {
- LOG("Unable to initialise warning dialog");
+ NSLOG(netsurf, INFO, "Unable to initialise warning dialog");
return error;
}
@@ -248,7 +249,7 @@ static nserror nsgtk_init(int argc, char** argv, char **respath)
error = nsgdk_pixbuf_new_from_resname("netsurf.xpm",
&win_default_icon_pixbuf);
if (error == NSERROR_OK) {
- LOG("Seting default window icon");
+ NSLOG(netsurf, INFO, "Seting default window icon");
gtk_window_set_default_icon(win_default_icon_pixbuf);
}
@@ -256,7 +257,8 @@ static nserror nsgtk_init(int argc, char** argv, char **respath)
resource_filename = filepath_find(respath, "SearchEngines");
search_web_init(resource_filename);
if (resource_filename != NULL) {
- LOG("Using '%s' as Search Engines file", resource_filename);
+ NSLOG(netsurf, INFO, "Using '%s' as Search Engines file",
+ resource_filename);
free(resource_filename);
}
@@ -278,13 +280,20 @@ static nserror nsgtk_init(int argc, char** argv, char **respath)
/* initialise throbber */
error = nsgtk_throbber_init();
if (error != NSERROR_OK) {
- LOG("Unable to initialise throbber.");
+ NSLOG(netsurf, INFO, "Unable to initialise throbber.");
return error;
}
/* Initialise completions - cannot fail */
nsgtk_completion_init();
+ /* The tree view system needs to know the screen's DPI, so we
+ * find that out here, rather than when we create a first browser
+ * window.
+ */
+ browser_set_dpi(gdk_screen_get_resolution(gdk_screen_get_default()));
+ NSLOG(netsurf, INFO, "Set CSS DPI to %d", browser_get_dpi());
+
filepath_sfinddef(respath, buf, "mime.types", "/etc/");
gtk_fetch_filetype_init(buf);
@@ -295,17 +304,10 @@ static nserror nsgtk_init(int argc, char** argv, char **respath)
hotlist_init(nsoption_charp(hotlist_path),
nsoption_charp(hotlist_path));
- /* The tree view system needs to know the screen's DPI, so we
- * find that out here, rather than when we create a first browser
- * window.
- */
- browser_set_dpi(gdk_screen_get_resolution(gdk_screen_get_default()));
- LOG("Set CSS DPI to %d", browser_get_dpi());
-
/* Initialise top level UI elements */
error = nsgtk_download_init();
if (error != NSERROR_OK) {
- LOG("Unable to initialise download window.");
+ NSLOG(netsurf, INFO, "Unable to initialise download window.");
return error;
}
@@ -426,7 +428,7 @@ static void gui_quit(void)
{
nserror res;
- LOG("Quitting GUI");
+ NSLOG(netsurf, INFO, "Quitting GUI");
/* Ensure all scaffoldings are destroyed before we go into exit */
nsgtk_download_destroy();
@@ -435,32 +437,34 @@ static void gui_quit(void)
res = nsgtk_cookies_destroy();
if (res != NSERROR_OK) {
- LOG("Error finalising cookie viewer: %s",
- messages_get_errorcode(res));
+ NSLOG(netsurf, INFO, "Error finalising cookie viewer: %s",
+ messages_get_errorcode(res));
}
res = nsgtk_local_history_destroy();
if (res != NSERROR_OK) {
- LOG("Error finalising local history viewer: %s",
- messages_get_errorcode(res));
+ NSLOG(netsurf, INFO,
+ "Error finalising local history viewer: %s",
+ messages_get_errorcode(res));
}
res = nsgtk_global_history_destroy();
if (res != NSERROR_OK) {
- LOG("Error finalising global history viewer: %s",
- messages_get_errorcode(res));
+ NSLOG(netsurf, INFO,
+ "Error finalising global history viewer: %s",
+ messages_get_errorcode(res));
}
res = nsgtk_hotlist_destroy();
if (res != NSERROR_OK) {
- LOG("Error finalising hotlist viewer: %s",
- messages_get_errorcode(res));
+ NSLOG(netsurf, INFO, "Error finalising hotlist viewer: %s",
+ messages_get_errorcode(res));
}
res = hotlist_fini();
if (res != NSERROR_OK) {
- LOG("Error finalising hotlist: %s",
- messages_get_errorcode(res));
+ NSLOG(netsurf, INFO, "Error finalising hotlist: %s",
+ messages_get_errorcode(res));
}
free(nsgtk_config_home);
@@ -492,7 +496,7 @@ nserror nsgtk_warning(const char *warning, const char *detail)
static GtkWindow *nsgtk_warning_window;
GtkLabel *WarningLabel;
- LOG("%s %s", warning, detail ? detail : "");
+ NSLOG(netsurf, INFO, "%s %s", warning, detail ? detail : "");
fflush(stdout);
nsgtk_warning_window = GTK_WINDOW(gtk_builder_get_object(warning_builder, "wndWarning"));
@@ -600,7 +604,7 @@ static void nsgtk_pdf_password(char **owner_pass, char **user_pass, char *path)
res = nsgtk_builder_new_from_resname("password", &password_builder);
if (res != NSERROR_OK) {
- LOG("Password UI builder init failed");
+ NSLOG(netsurf, INFO, "Password UI builder init failed");
return;
}
@@ -821,7 +825,7 @@ static nserror get_config_home(char **config_home_out)
if (home_dir != NULL) {
ret = check_dirname(home_dir, ".netsurf", &config_home);
if (ret == NSERROR_OK) {
- LOG("\"%s\"", config_home);
+ NSLOG(netsurf, INFO, "\"%s\"", config_home);
*config_home_out = config_home;
return ret;
}
@@ -861,7 +865,7 @@ static nserror get_config_home(char **config_home_out)
}
}
- LOG("\"%s\"", config_home);
+ NSLOG(netsurf, INFO, "\"%s\"", config_home);
*config_home_out = config_home;
return NSERROR_OK;
@@ -874,7 +878,7 @@ static nserror create_config_home(char **config_home_out)
char *xdg_config_dir;
nserror ret;
- LOG("Attempting to create configuration directory");
+ NSLOG(netsurf, INFO, "Attempting to create configuration directory");
/* $XDG_CONFIG_HOME defines the base directory
* relative to which user specific configuration files
@@ -910,7 +914,7 @@ static nserror create_config_home(char **config_home_out)
/* strip the trailing separator */
config_home[strlen(config_home) - 1] = 0;
- LOG("\"%s\"", config_home);
+ NSLOG(netsurf, INFO, "\"%s\"", config_home);
*config_home_out = config_home;
@@ -959,7 +963,7 @@ static nserror get_cache_home(char **cache_home_out)
}
}
- LOG("\"%s\"", cache_home);
+ NSLOG(netsurf, INFO, "\"%s\"", cache_home);
*cache_home_out = cache_home;
return NSERROR_OK;
@@ -972,7 +976,7 @@ static nserror create_cache_home(char **cache_home_out)
char *xdg_cache_dir;
nserror ret;
- LOG("Attempting to create configuration directory");
+ NSLOG(netsurf, INFO, "Attempting to create configuration directory");
/* $XDG_CACHE_HOME defines the base directory
* relative to which user specific cache files
@@ -1008,7 +1012,7 @@ static nserror create_cache_home(char **cache_home_out)
/* strip the trailing separator */
cache_home[strlen(cache_home) - 1] = 0;
- LOG("\"%s\"", cache_home);
+ NSLOG(netsurf, INFO, "\"%s\"", cache_home);
*cache_home_out = cache_home;
@@ -1115,7 +1119,8 @@ int main(int argc, char** argv)
ret = create_config_home(&nsgtk_config_home);
}
if (ret != NSERROR_OK) {
- LOG("Unable to locate a configuration directory.");
+ NSLOG(netsurf, INFO,
+ "Unable to locate a configuration directory.");
nsgtk_config_home = NULL;
}
@@ -1155,7 +1160,7 @@ int main(int argc, char** argv)
if (ret != NSERROR_OK) {
fprintf(stderr, "Unable to load translated messages (%s)\n",
messages_get_errorcode(ret));
- LOG("Unable to load translated messages");
+ NSLOG(netsurf, INFO, "Unable to load translated messages");
/** \todo decide if message load faliure should be fatal */
}
@@ -1166,7 +1171,7 @@ int main(int argc, char** argv)
ret = create_cache_home(&cache_home);
}
if (ret != NSERROR_OK) {
- LOG("Unable to locate a cache directory.");
+ NSLOG(netsurf, INFO, "Unable to locate a cache directory.");
}
/* core initialisation */
@@ -1193,5 +1198,8 @@ int main(int argc, char** argv)
/* finalise options */
nsoption_finalise(nsoptions, nsoptions_default);
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/gtk/hotlist.c b/frontends/gtk/hotlist.c
index 936573a0b..843e47736 100644
--- a/frontends/gtk/hotlist.c
+++ b/frontends/gtk/hotlist.c
@@ -236,8 +236,9 @@ static void nsgtk_hotlist_init_menu(struct nsgtk_hotlist_window *hlwin)
w = GTK_WIDGET(gtk_builder_get_object(hlwin->builder,
event->widget));
if (w == NULL) {
- LOG("Unable to connect menu widget ""%s""",
- event->widget);
+ NSLOG(netsurf, INFO,
+ "Unable to connect menu widget ""%s""",
+ event->widget);
} else {
g_signal_connect(G_OBJECT(w),
"activate",
@@ -326,7 +327,7 @@ static nserror nsgtk_hotlist_init(void)
res = nsgtk_builder_new_from_resname("hotlist", &ncwin->builder);
if (res != NSERROR_OK) {
- LOG("Hotlist UI builder init failed");
+ NSLOG(netsurf, INFO, "Hotlist UI builder init failed");
free(ncwin);
return res;
}
diff --git a/frontends/gtk/layout_pango.c b/frontends/gtk/layout_pango.c
index fb065b127..a5964eb37 100644
--- a/frontends/gtk/layout_pango.c
+++ b/frontends/gtk/layout_pango.c
@@ -30,6 +30,7 @@
#include "utils/log.h"
#include "utils/nsoption.h"
+#include "netsurf/inttypes.h"
#include "netsurf/layout.h"
#include "netsurf/plot_style.h"
@@ -42,12 +43,12 @@ static PangoLayout *nsfont_pango_layout = NULL;
static inline void nsfont_pango_check(void)
{
if (nsfont_pango_context == NULL) {
- LOG("Creating nsfont_pango_context.");
+ NSLOG(netsurf, INFO, "Creating nsfont_pango_context.");
nsfont_pango_context = gdk_pango_context_get();
}
if (nsfont_pango_layout == NULL) {
- LOG("Creating nsfont_pango_layout.");
+ NSLOG(netsurf, INFO, "Creating nsfont_pango_layout.");
nsfont_pango_layout = pango_layout_new(nsfont_pango_context);
}
}
@@ -84,9 +85,10 @@ nsfont_width(const plot_font_style_t *fstyle,
pango_layout_get_pixel_size(nsfont_pango_layout, width, 0);
- /* LOG("fstyle: %p string:\"%.*s\", length: %u, width: %dpx",
- fstyle, length, string, length, *width);
- */
+ NSLOG(netsurf, DEEPDEBUG,
+ "fstyle: %p string:\"%.*s\", length: %" PRIsizet ", width: %dpx",
+ fstyle, (int)length, string, length, *width);
+
return NSERROR_OK;
}
diff --git a/frontends/gtk/local_history.c b/frontends/gtk/local_history.c
index cc9580130..35b7a4ad6 100644
--- a/frontends/gtk/local_history.c
+++ b/frontends/gtk/local_history.c
@@ -148,7 +148,7 @@ nsgtk_local_history_init(struct browser_window *bw,
res = nsgtk_builder_new_from_resname("localhistory", &ncwin->builder);
if (res != NSERROR_OK) {
- LOG("Local history UI builder init failed");
+ NSLOG(netsurf, INFO, "Local history UI builder init failed");
free(ncwin);
return res;
}
diff --git a/frontends/gtk/login.c b/frontends/gtk/login.c
index 3e29903fe..91d8b37f0 100644
--- a/frontends/gtk/login.c
+++ b/frontends/gtk/login.c
@@ -222,7 +222,7 @@ void gui_401login_open(nsurl *url,
res = create_login_window(url, host, realm, cb, cbpw);
if (res != NSERROR_OK) {
- LOG("Login init failed");
+ NSLOG(netsurf, INFO, "Login init failed");
/* creating login failed so cancel navigation */
cb(false, cbpw);
diff --git a/frontends/gtk/plotters.c b/frontends/gtk/plotters.c
index c57b03294..88e7760c6 100644
--- a/frontends/gtk/plotters.c
+++ b/frontends/gtk/plotters.c
@@ -413,7 +413,7 @@ nsgtk_plot_path(const struct redraw_context *ctx,
return NSERROR_OK;
if (p[0] != PLOTTER_PATH_MOVE) {
- LOG("Path does not start with move");
+ NSLOG(netsurf, INFO, "Path does not start with move");
return NSERROR_INVALID;
}
@@ -451,7 +451,7 @@ nsgtk_plot_path(const struct redraw_context *ctx,
p[i+5], p[i+6]);
i += 7;
} else {
- LOG("bad path command %f", p[i]);
+ NSLOG(netsurf, INFO, "bad path command %f", p[i]);
/* Reset matrix for safety */
cairo_set_matrix(current_cr, &old_ctm);
return NSERROR_INVALID;
diff --git a/frontends/gtk/preferences.c b/frontends/gtk/preferences.c
index e51e77014..65f41ed27 100644
--- a/frontends/gtk/preferences.c
+++ b/frontends/gtk/preferences.c
@@ -621,7 +621,7 @@ comboboxLanguage_add_from_file(GtkListStore *liststore,
gtk_list_store_clear(liststore);
- LOG("Used %s for languages", file_location);
+ NSLOG(netsurf, INFO, "Used %s for languages", file_location);
while (fgets(buf, sizeof(buf), fp)) {
/* Ignore blank lines */
if (buf[0] == '\0')
@@ -668,7 +668,7 @@ nsgtk_preferences_comboboxLanguage_realize(GtkWidget *widget,
const char *accept_language;
if (priv->content_language == NULL) {
- LOG("content language list store unavailable");
+ NSLOG(netsurf, INFO, "content language list store unavailable");
return;
}
@@ -697,7 +697,7 @@ nsgtk_preferences_comboboxLanguage_realize(GtkWidget *widget,
}
}
if (res != NSERROR_OK) {
- LOG("error populatiung languages combo");
+ NSLOG(netsurf, INFO, "error populatiung languages combo");
}
}
@@ -989,14 +989,15 @@ GtkWidget* nsgtk_preferences(struct browser_window *bw, GtkWindow *parent)
res = nsgtk_builder_new_from_resname("options", &preferences_builder);
if (res != NSERROR_OK) {
- LOG("Preferences UI builder init failed");
+ NSLOG(netsurf, INFO, "Preferences UI builder init failed");
return NULL;
}
priv->dialog = gtk_builder_get_object(preferences_builder,
"dialogPreferences");
if (priv->dialog == NULL) {
- LOG("Unable to get object for preferences dialog");
+ NSLOG(netsurf, INFO,
+ "Unable to get object for preferences dialog");
/* release builder as were done with it */
g_object_unref(G_OBJECT(preferences_builder));
return NULL;
diff --git a/frontends/gtk/print.c b/frontends/gtk/print.c
index 54edeee61..8f71230a6 100644
--- a/frontends/gtk/print.c
+++ b/frontends/gtk/print.c
@@ -145,8 +145,9 @@ static inline void nsgtk_print_set_dashed(void)
static nserror
nsgtk_print_plot_clip(const struct redraw_context *ctx, const struct rect *clip)
{
- LOG("Clipping. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i",
- clip->x0, clip->y0, clip->x1, clip->y1);
+ NSLOG(netsurf, INFO,
+ "Clipping. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", clip->x0,
+ clip->y0, clip->x1, clip->y1);
/* Normalize cllipping area - to prevent overflows.
* See comment in pdf_plot_fill. */
@@ -324,8 +325,8 @@ nsgtk_print_plot_rectangle(const struct redraw_context *ctx,
const plot_style_t *style,
const struct rect *rect)
{
- LOG("x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i",
- rect->x0, rect->y0, rect->x1, rect->y1);
+ NSLOG(netsurf, INFO, "x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i",
+ rect->x0, rect->y0, rect->x1, rect->y1);
if (style->fill_type != PLOT_OP_TYPE_NONE) {
int x0,y0,x1,y1;
@@ -395,7 +396,7 @@ nsgtk_print_plot_polygon(const struct redraw_context *ctx,
{
unsigned int i;
- LOG("Plotting polygon.");
+ NSLOG(netsurf, INFO, "Plotting polygon.");
nsgtk_print_set_colour(style->fill_colour);
nsgtk_print_set_solid();
@@ -403,11 +404,12 @@ nsgtk_print_plot_polygon(const struct redraw_context *ctx,
cairo_set_line_width(gtk_print_current_cr, 0);
cairo_move_to(gtk_print_current_cr, p[0], p[1]);
- LOG("Starting line at: %i\t%i", p[0], p[1]);
+ NSLOG(netsurf, INFO, "Starting line at: %i\t%i", p[0], p[1]);
for (i = 1; i != n; i++) {
cairo_line_to(gtk_print_current_cr, p[i * 2], p[i * 2 + 1]);
- LOG("Drawing line to: %i\t%i", p[i * 2], p[i * 2 + 1]);
+ NSLOG(netsurf, INFO, "Drawing line to: %i\t%i", p[i * 2],
+ p[i * 2 + 1]);
}
cairo_fill(gtk_print_current_cr);
@@ -700,7 +702,7 @@ void gtk_print_signal_begin_print (GtkPrintOperation *operation,
int page_number;
double height_on_page, height_to_print;
- LOG("Begin print");
+ NSLOG(netsurf, INFO, "Begin print");
settings = user_data;
@@ -719,7 +721,11 @@ void gtk_print_signal_begin_print (GtkPrintOperation *operation,
} else {
- LOG("page_width: %f ;page_height: %f; content height: %lf", settings->page_width, settings->page_height, height_to_print);
+ NSLOG(netsurf, INFO,
+ "page_width: %f ;page_height: %f; content height: %lf",
+ settings->page_width,
+ settings->page_height,
+ height_to_print);
height_on_page = settings->page_height;
height_on_page = height_on_page -
@@ -743,7 +749,7 @@ void gtk_print_signal_begin_print (GtkPrintOperation *operation,
void gtk_print_signal_draw_page(GtkPrintOperation *operation,
GtkPrintContext *context, gint page_nr, gpointer user_data)
{
- LOG("Draw Page");
+ NSLOG(netsurf, INFO, "Draw Page");
gtk_print_current_cr = gtk_print_context_get_cairo_context(context);
print_draw_next_page(&gtk_printer, settings);
}
@@ -755,7 +761,7 @@ void gtk_print_signal_draw_page(GtkPrintOperation *operation,
void gtk_print_signal_end_print(GtkPrintOperation *operation,
GtkPrintContext *context, gpointer user_data)
{
- LOG("End print");
+ NSLOG(netsurf, INFO, "End print");
print_cleanup(content_to_print, &gtk_printer, user_data);
}
diff --git a/frontends/gtk/res/options.gtk2.ui b/frontends/gtk/res/options.gtk2.ui
index d5542ba5d..a1162585d 100644
--- a/frontends/gtk/res/options.gtk2.ui
+++ b/frontends/gtk/res/options.gtk2.ui
@@ -2,6 +2,297 @@
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
+ <object class="GtkAdjustment" id="adjustment_animation_time">
+ <property name="lower">0.10000000000000001</property>
+ <property name="upper">10</property>
+ <property name="value">0.10000000000000001</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_cache_disc_size">
+ <property name="upper">4096</property>
+ <property name="value">1024</property>
+ <property name="step_increment">32</property>
+ <property name="page_increment">256</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_cache_memory_size">
+ <property name="upper">2048</property>
+ <property name="value">16</property>
+ <property name="step_increment">4</property>
+ <property name="page_increment">16</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_disc_cache_age">
+ <property name="upper">999</property>
+ <property name="value">28</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_fetching_cached">
+ <property name="upper">100</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_fetching_max">
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="value">10</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_fetching_perhost">
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_font_default_size">
+ <property name="lower">1</property>
+ <property name="upper">99.900000000000006</property>
+ <property name="value">16</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">2</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_history_age">
+ <property name="upper">999</property>
+ <property name="value">28</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">28</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_pdf_lmargin">
+ <property name="upper">999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_pdf_scale">
+ <property name="lower">1</property>
+ <property name="upper">1000</property>
+ <property name="value">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_proxy_port">
+ <property name="lower">1</property>
+ <property name="upper">65535</property>
+ <property name="value">3128</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xpad">3</property>
+ <property name="stock">gtk-apply</property>
+ </object>
+ <object class="GtkListStore" id="liststore_content_language">
+ <columns>
+ <!-- column-name Code -->
+ <column type="gchararray"/>
+ <!-- column-name Description -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">en</col>
+ <col id="1" translatable="yes">English</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_defaultfont">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesFonttypeSans</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesFonttypeSerif</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesFonttypeMonospace</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesFonttypeCursive</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesFonttypeFantasy</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_developer_view">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewWindow</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewTab</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewEditor</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_image_loading">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesImageLoadBoth</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesImageLoadFore</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesImageLoadBack</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesImageLoadNone</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_proxy_type">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesProxyTypeDirect</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesProxyTypeManual</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesProxyTypeBasic</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesProxyTypeNLTM</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesProxyTypeSystem</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_search_provider">
+ <columns>
+ <!-- column-name Provider -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">Google</col>
+ </row>
+ <row>
+ <col id="0">Yahoo!</col>
+ </row>
+ <row>
+ <col id="0">Microsoft Live</col>
+ </row>
+ <row>
+ <col id="0">Buisiness.com</col>
+ </row>
+ <row>
+ <col id="0">Omgili</col>
+ </row>
+ <row>
+ <col id="0">BBC News</col>
+ </row>
+ <row>
+ <col id="0">Ubuntu Packages</col>
+ </row>
+ <row>
+ <col id="0">Creative Commons</col>
+ </row>
+ <row>
+ <col id="0">Ask</col>
+ </row>
+ <row>
+ <col id="0">Answers</col>
+ </row>
+ <row>
+ <col id="0">Dictionary.com</col>
+ </row>
+ <row>
+ <col id="0">YouTube</col>
+ </row>
+ <row>
+ <col id="0">AeroMP3</col>
+ </row>
+ <row>
+ <col id="0">AOL</col>
+ </row>
+ <row>
+ <col id="0">Baidu</col>
+ </row>
+ <row>
+ <col id="0">Amazon</col>
+ </row>
+ <row>
+ <col id="0">Ebay</col>
+ </row>
+ <row>
+ <col id="0">IMBD</col>
+ </row>
+ <row>
+ <col id="0">ESPN</col>
+ </row>
+ <row>
+ <col id="0">Wikipedia</col>
+ </row>
+ <row>
+ <col id="0">DuckDuckGo</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_tab_position">
+ <columns>
+ <!-- column-name Position -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesTabLocTop</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesTabLocLeft</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesTabLocRight</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesTabLocBottom</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore_toolbar_buttontype">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesButtonTypeSmall</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesButtonTypeLarge</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesButtonTypeLargeText</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesButtonTypeText</col>
+ </row>
+ </data>
+ </object>
<object class="GtkDialog" id="dialogPreferences">
<property name="can_focus">False</property>
<property name="border_width">5</property>
@@ -2178,7 +2469,6 @@
</child>
<child>
<object class="GtkVBox" id="vbox_pdfexport">
- <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
@@ -2583,6 +2873,12 @@
<property name="x_options">GTK_EXPAND</property>
</packing>
</child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
</object>
<packing>
<property name="expand">True</property>
@@ -2710,295 +3006,4 @@
<action-widget response="-7">close</action-widget>
</action-widgets>
</object>
- <object class="GtkListStore" id="liststore_search_provider">
- <columns>
- <!-- column-name Provider -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0">Google</col>
- </row>
- <row>
- <col id="0">Yahoo!</col>
- </row>
- <row>
- <col id="0">Microsoft Live</col>
- </row>
- <row>
- <col id="0">Buisiness.com</col>
- </row>
- <row>
- <col id="0">Omgili</col>
- </row>
- <row>
- <col id="0">BBC News</col>
- </row>
- <row>
- <col id="0">Ubuntu Packages</col>
- </row>
- <row>
- <col id="0">Creative Commons</col>
- </row>
- <row>
- <col id="0">Ask</col>
- </row>
- <row>
- <col id="0">Answers</col>
- </row>
- <row>
- <col id="0">Dictionary.com</col>
- </row>
- <row>
- <col id="0">YouTube</col>
- </row>
- <row>
- <col id="0">AeroMP3</col>
- </row>
- <row>
- <col id="0">AOL</col>
- </row>
- <row>
- <col id="0">Baidu</col>
- </row>
- <row>
- <col id="0">Amazon</col>
- </row>
- <row>
- <col id="0">Ebay</col>
- </row>
- <row>
- <col id="0">IMBD</col>
- </row>
- <row>
- <col id="0">ESPN</col>
- </row>
- <row>
- <col id="0">Wikipedia</col>
- </row>
- <row>
- <col id="0">DuckDuckGo</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore_tab_position">
- <columns>
- <!-- column-name Position -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesTabLocTop</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesTabLocLeft</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesTabLocRight</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesTabLocBottom</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore_toolbar_buttontype">
- <columns>
- <!-- column-name Type -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesButtonTypeSmall</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesButtonTypeLarge</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesButtonTypeLargeText</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesButtonTypeText</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore_image_loading">
- <columns>
- <!-- column-name Type -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesImageLoadBoth</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesImageLoadFore</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesImageLoadBack</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesImageLoadNone</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore_defaultfont">
- <columns>
- <!-- column-name Type -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesFonttypeSans</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesFonttypeSerif</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesFonttypeMonospace</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesFonttypeCursive</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesFonttypeFantasy</col>
- </row>
- </data>
- </object>
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xpad">3</property>
- <property name="stock">gtk-apply</property>
- </object>
- <object class="GtkListStore" id="liststore_proxy_type">
- <columns>
- <!-- column-name Type -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesProxyTypeDirect</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesProxyTypeManual</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesProxyTypeBasic</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesProxyTypeNLTM</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesProxyTypeSystem</col>
- </row>
- </data>
- </object>
- <object class="GtkAdjustment" id="adjustment_animation_time">
- <property name="value">0.10000000000000001</property>
- <property name="lower">0.10000000000000001</property>
- <property name="upper">10</property>
- <property name="step_increment">0.10000000000000001</property>
- <property name="page_increment">1</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_font_default_size">
- <property name="value">16</property>
- <property name="lower">1</property>
- <property name="upper">99.900000000000006</property>
- <property name="step_increment">0.10000000000000001</property>
- <property name="page_increment">2</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_history_age">
- <property name="value">28</property>
- <property name="upper">999</property>
- <property name="step_increment">1</property>
- <property name="page_increment">28</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_cache_memory_size">
- <property name="value">16</property>
- <property name="upper">2048</property>
- <property name="step_increment">4</property>
- <property name="page_increment">16</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_cache_disc_size">
- <property name="value">1024</property>
- <property name="upper">4096</property>
- <property name="step_increment">32</property>
- <property name="page_increment">256</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_disc_cache_age">
- <property name="value">28</property>
- <property name="upper">999</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_proxy_port">
- <property name="value">3128</property>
- <property name="lower">1</property>
- <property name="upper">65535</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_fetching_max">
- <property name="value">10</property>
- <property name="lower">1</property>
- <property name="upper">100</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_fetching_perhost">
- <property name="value">1</property>
- <property name="lower">1</property>
- <property name="upper">100</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_fetching_cached">
- <property name="value">1</property>
- <property name="upper">100</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_pdf_scale">
- <property name="value">100</property>
- <property name="lower">1</property>
- <property name="upper">1000</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_pdf_lmargin">
- <property name="upper">999</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkListStore" id="liststore_content_language">
- <columns>
- <!-- column-name Code -->
- <column type="gchararray"/>
- <!-- column-name Description -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">en</col>
- <col id="1" translatable="yes">English</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="liststore_developer_view">
- <columns>
- <!-- column-name Type -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">preferencesDeveloperViewWindow</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesDeveloperViewTab</col>
- </row>
- <row>
- <col id="0" translatable="yes">preferencesDeveloperViewEditor</col>
- </row>
- </data>
- </object>
</interface>
diff --git a/frontends/gtk/res/toolbar.gtk2.ui b/frontends/gtk/res/toolbar.gtk2.ui
index d84db5c8c..4e8805a6f 100644
--- a/frontends/gtk/res/toolbar.gtk2.ui
+++ b/frontends/gtk/res/toolbar.gtk2.ui
@@ -1,67 +1,84 @@
-<?xml version="1.0"?>
-<!--*- mode: xml -*-->
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
- <object class="GtkWindow" id="toolbarwindow">
+ <!-- interface-requires gtk+ 2.12 -->
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkDialog" id="dialogToolbar">
<property name="width_request">700</property>
<property name="height_request">450</property>
- <property name="title" translatable="yes"/>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <child>
- <object class="GtkVBox" id="windowvbox">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">gtkToolBarTitle</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
<child>
- <object class="GtkLabel" id="toolbarlabel">
+ <object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="label" translatable="yes">Move items from store to toolbar Rearrange items in toolbar Move items from toolbar to store</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move items from store to toolbar</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Rearrange items in toolbar</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move items from toolbar to store</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <property name="can_focus">False</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkViewport" id="viewport1">
<property name="visible">True</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="can_focus">False</property>
<child>
<object class="GtkVBox" id="widgetvbox">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
<child>
<placeholder/>
</child>
@@ -71,119 +88,85 @@
</child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
+ <property name="position">1</property>
</packing>
</child>
- <child>
- <object class="GtkHBox" id="buttonhbox">
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
<child>
- <object class="GtkButton" id="resetbutton">
+ <object class="GtkButton" id="reset">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
+ <property name="receives_default">False</property>
<child>
<object class="GtkHBox" id="button1hbox">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="stock">gtk-refresh</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="refreshbuttonlabel">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">Reset to defaults</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
- <property name="padding">10</property>
<property name="expand">False</property>
<property name="fill">True</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <object class="GtkButton" id="okbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </object>
- <packing>
<property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="cancelbutton">
+ <object class="GtkButton" id="close">
+ <property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
+ <property name="receives_default">True</property>
<property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
</child>
+ <action-widgets>
+ <action-widget response="0">reset</action-widget>
+ <action-widget response="0">close</action-widget>
+ </action-widgets>
</object>
</interface>
diff --git a/frontends/gtk/res/toolbar.gtk3.ui b/frontends/gtk/res/toolbar.gtk3.ui
index d84db5c8c..1f1148703 100644
--- a/frontends/gtk/res/toolbar.gtk3.ui
+++ b/frontends/gtk/res/toolbar.gtk3.ui
@@ -1,186 +1,134 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
<!--*- mode: xml -*-->
<interface>
- <object class="GtkWindow" id="toolbarwindow">
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-refresh</property>
+ </object>
+ <object class="GtkDialog" id="dialogToolbar">
<property name="width_request">700</property>
<property name="height_request">450</property>
- <property name="title" translatable="yes"/>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <child>
- <object class="GtkVBox" id="windowvbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="toolbarlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Move items from store to toolbar Rearrange items in toolbar Move items from toolbar to store</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">gtkToolBarTitle</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
<child>
- <object class="GtkViewport" id="viewport1">
+ <object class="GtkButton" id="reset">
+ <property name="label" translatable="yes">Reset To Defaults</property>
<property name="visible">True</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <object class="GtkVBox" id="widgetvbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">image2</property>
+ <property name="yalign">0.52999997138977051</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="close">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
- <object class="GtkHBox" id="buttonhbox">
+ <object class="GtkGrid" id="grid1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
+ <property name="column_homogeneous">True</property>
<child>
- <object class="GtkButton" id="resetbutton">
+ <object class="GtkLabel" id="label1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <child>
- <object class="GtkHBox" id="button1hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="stock">gtk-refresh</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="refreshbuttonlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Reset to defaults</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move items from store to toolbar</property>
</object>
<packing>
- <property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
- <placeholder/>
- </child>
- <child>
- <object class="GtkButton" id="okbutton">
+ <object class="GtkLabel" id="label2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_focus">True</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Rearrange items in toolbar</property>
</object>
<packing>
- <property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="cancelbutton">
+ <object class="GtkLabel" id="label3">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move items from toolbar to store</property>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="widgetvbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
diff --git a/frontends/gtk/resources.c b/frontends/gtk/resources.c
index 4f9afb034..ef92fefc8 100644
--- a/frontends/gtk/resources.c
+++ b/frontends/gtk/resources.c
@@ -198,10 +198,12 @@ init_resource(char **respath, struct nsgtk_resource_s *resource)
/* found an entry in the resources */
resource->path = resname;
resource->type = NSGTK_RESOURCE_GLIB;
- LOG("Found gresource path %s", resource->path);
+ NSLOG(netsurf, INFO, "Found gresource path %s",
+ resource->path);
return NSERROR_OK;
}
- /*LOG("gresource \"%s\" not found", resname);*/
+ NSLOG(netsurf, DEEPDEBUG,
+ "gresource \"%s\" not found", resname);
free(resname);
langc++;
@@ -221,18 +223,20 @@ init_resource(char **respath, struct nsgtk_resource_s *resource)
/* found an entry in the resources */
resource->path = resname;
resource->type = NSGTK_RESOURCE_GLIB;
- LOG("Found gresource path %s", resource->path);
+ NSLOG(netsurf, INFO, "Found gresource path %s",
+ resource->path);
return NSERROR_OK;
}
- /*LOG("gresource \"%s\" not found", resname);*/
+ NSLOG(netsurf, DEEPDEBUG, "gresource \"%s\" not found", resname);
free(resname);
#endif
resname = filepath_find(respath, resource->name);
if (resname == NULL) {
- LOG("Unable to find resource %s on resource path",
- resource->name);
+ NSLOG(netsurf, INFO,
+ "Unable to find resource %s on resource path",
+ resource->name);
return NSERROR_NOT_FOUND;
}
@@ -240,7 +244,7 @@ init_resource(char **respath, struct nsgtk_resource_s *resource)
resource->path = resname;
resource->type = NSGTK_RESOURCE_FILE;
- LOG("Found file resource path %s", resource->path);
+ NSLOG(netsurf, INFO, "Found file resource path %s", resource->path);
return NSERROR_OK;
}
@@ -295,21 +299,21 @@ init_pixbuf_resource(char **respath, struct nsgtk_resource_s *resource)
if (strncmp(resource->name, "menu_cursor.png", resource->len) == 0) {
resource->path = (char *)&menu_cursor_pixdata[0];
resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
+ NSLOG(netsurf, INFO, "Found builtin for %s", resource->name);
return NSERROR_OK;
}
if (strncmp(resource->name, "netsurf.xpm", resource->len) == 0) {
resource->path = (char *)&netsurf_pixdata[0];
resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
+ NSLOG(netsurf, INFO, "Found builtin for %s", resource->name);
return NSERROR_OK;
}
if (strncmp(resource->name, "favicon.png", resource->len) == 0) {
resource->path = (char *)&favicon_pixdata[0];
resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
+ NSLOG(netsurf, INFO, "Found builtin for %s", resource->name);
return NSERROR_OK;
}
#endif
@@ -389,13 +393,13 @@ static void list_gresource(void)
G_RESOURCE_LOOKUP_FLAGS_NONE,
&gerror);
if (gerror) {
- LOG("gerror %s", gerror->message);
+ NSLOG(netsurf, INFO, "gerror %s", gerror->message);
g_error_free(gerror);
} else {
cur = reslist;
while (cur != NULL && *cur != NULL) {
- LOG("gres %s", *cur);
+ NSLOG(netsurf, INFO, "gres %s", *cur);
cur++;
}
g_strfreev(reslist);
@@ -488,12 +492,17 @@ nsgdk_pixbuf_new_from_resname(const char *resname, GdkPixbuf **pixbuf_out)
if (new_pixbuf == NULL) {
if (error != NULL) {
- LOG("Unable to create pixbuf from file for %s with path %s \"%s\"",
- resource->name, resource->path, error->message);
+ NSLOG(netsurf, INFO,
+ "Unable to create pixbuf from file for %s with path %s \"%s\"",
+ resource->name,
+ resource->path,
+ error->message);
g_error_free(error);
} else {
- LOG("Unable to create pixbuf from file for %s with path %s",
- resource->name, resource->path);
+ NSLOG(netsurf, INFO,
+ "Unable to create pixbuf from file for %s with path %s",
+ resource->name,
+ resource->path);
}
return NSERROR_INIT_FAILED;
}
@@ -521,8 +530,11 @@ nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out)
if (!gtk_builder_add_from_file(new_builder,
ui_res->path,
&error)) {
- LOG("Unable to add UI builder from file for %s with path %s \"%s\"",
- ui_res->name, ui_res->path, error->message);
+ NSLOG(netsurf, INFO,
+ "Unable to add UI builder from file for %s with path %s \"%s\"",
+ ui_res->name,
+ ui_res->path,
+ error->message);
g_error_free(error);
g_object_unref(G_OBJECT(new_builder));
return NSERROR_INIT_FAILED;
@@ -531,8 +543,11 @@ nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out)
if (!nsgtk_builder_add_from_resource(new_builder,
ui_res->path,
&error)) {
- LOG("Unable to add UI builder from resource for %s with path %s \"%s\"",
- ui_res->name, ui_res->path, error->message);
+ NSLOG(netsurf, INFO,
+ "Unable to add UI builder from resource for %s with path %s \"%s\"",
+ ui_res->name,
+ ui_res->path,
+ error->message);
g_error_free(error);
g_object_unref(G_OBJECT(new_builder));
return NSERROR_INIT_FAILED;
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 25f36c5d3..6f81e91db 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -269,7 +269,7 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
{
struct nsgtk_scaffolding *gs = data;
- LOG("scaffold:%p", gs);
+ NSLOG(netsurf, INFO, "scaffold:%p", gs);
nsgtk_local_history_hide();
@@ -282,7 +282,7 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
gs->next->prev = gs->prev;
}
- LOG("scaffold list head: %p", scaf_list);
+ NSLOG(netsurf, INFO, "scaffold list head: %p", scaf_list);
if (scaf_list == NULL) {
/* no more open windows - stop the browser */
@@ -805,7 +805,10 @@ MULTIHANDLER(savepage)
path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
d = opendir(path);
if (d == NULL) {
- LOG("Unable to open directory %s for complete save: %s", path, strerror(errno));
+ NSLOG(netsurf, INFO,
+ "Unable to open directory %s for complete save: %s",
+ path,
+ strerror(errno));
if (errno == ENOTDIR)
nsgtk_warning("NoDirError", path);
else
@@ -837,7 +840,7 @@ MULTIHANDLER(pdf)
char *url_name;
nserror res;
- LOG("Print preview (generating PDF) started.");
+ NSLOG(netsurf, INFO, "Print preview (generating PDF) started.");
res = nsurl_nice(browser_window_get_url(bw), &url_name, true);
if (res != NSERROR_OK) {
@@ -1221,10 +1224,10 @@ MULTIHANDLER(selectall)
struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
if (nsgtk_widget_has_focus(GTK_WIDGET(g->url_bar))) {
- LOG("Selecting all URL bar text");
+ NSLOG(netsurf, INFO, "Selecting all URL bar text");
gtk_editable_select_region(GTK_EDITABLE(g->url_bar), 0, -1);
} else {
- LOG("Selecting all document text");
+ NSLOG(netsurf, INFO, "Selecting all document text");
browser_window_key_press(bw, NS_KEY_SELECT_ALL);
}
@@ -1590,7 +1593,8 @@ MULTIHANDLER(localhistory)
res = nsgtk_local_history_present(g->window, bw);
if (res != NSERROR_OK) {
- LOG("Unable to initialise local history window.");
+ NSLOG(netsurf, INFO,
+ "Unable to initialise local history window.");
}
return TRUE;
}
@@ -1600,7 +1604,8 @@ MULTIHANDLER(globalhistory)
nserror res;
res = nsgtk_global_history_present();
if (res != NSERROR_OK) {
- LOG("Unable to initialise global history window.");
+ NSLOG(netsurf, INFO,
+ "Unable to initialise global history window.");
}
return TRUE;
}
@@ -1620,7 +1625,7 @@ MULTIHANDLER(showbookmarks)
nserror res;
res = nsgtk_hotlist_present();
if (res != NSERROR_OK) {
- LOG("Unable to initialise bookmark window.");
+ NSLOG(netsurf, INFO, "Unable to initialise bookmark window.");
}
return TRUE;
}
@@ -1630,7 +1635,7 @@ MULTIHANDLER(showcookies)
nserror res;
res = nsgtk_cookies_present();
if (res != NSERROR_OK) {
- LOG("Unable to initialise cookies window.");
+ NSLOG(netsurf, INFO, "Unable to initialise cookies window.");
}
return TRUE;
}
@@ -2068,12 +2073,13 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
int i;
GtkAccelGroup *group;
- gs = malloc(sizeof(*gs));
+ gs = calloc(1, sizeof(*gs));
if (gs == NULL) {
return NULL;
}
- LOG("Constructing a scaffold of %p for gui_window %p", gs, toplevel);
+ NSLOG(netsurf, INFO,
+ "Constructing a scaffold of %p for gui_window %p", gs, toplevel);
gs->top_level = toplevel;
@@ -2278,7 +2284,7 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
/* finally, show the window. */
gtk_widget_show(GTK_WIDGET(gs->window));
- LOG("creation complete");
+ NSLOG(netsurf, INFO, "creation complete");
return gs;
}
@@ -2466,7 +2472,8 @@ gui_search_web_provider_update(const char *provider_name,
GdkPixbuf *srch_pixbuf = NULL;
char *searchcontent;
- LOG("name:%s bitmap %p", provider_name, provider_bitmap);
+ NSLOG(netsurf, INFO, "name:%s bitmap %p", provider_name,
+ provider_bitmap);
if (provider_bitmap != NULL) {
srch_pixbuf = nsgdk_pixbuf_get_from_surface(provider_bitmap->surface, 16, 16);
@@ -2484,7 +2491,11 @@ gui_search_web_provider_update(const char *provider_name,
/* set the search provider parameters up in each scaffold */
for (current = scaf_list; current != NULL; current = current->next) {
- /* add ico to each window's toolbar */
+ if (current->webSearchEntry == NULL) {
+ continue;
+ }
+
+ /* add ico to each window's toolbar */
if (srch_pixbuf != NULL) {
nsgtk_entry_set_icon_from_pixbuf(current->webSearchEntry,
GTK_ENTRY_ICON_PRIMARY,
diff --git a/frontends/gtk/schedule.c b/frontends/gtk/schedule.c
index cf0333388..d5b45674b 100644
--- a/frontends/gtk/schedule.c
+++ b/frontends/gtk/schedule.c
@@ -21,14 +21,10 @@
#include <stdbool.h>
#include "utils/errors.h"
+#include "utils/log.h"
#include "gtk/schedule.h"
-#ifdef DEBUG_GTK_SCHEDULE
-#include "utils/log.h"
-#else
-#define LOG(format, args...) ((void) 0)
-#endif
/** Killable callback closure embodiment. */
typedef struct {
@@ -50,7 +46,7 @@ nsgtk_schedule_generic_callback(gpointer data)
_nsgtk_callback_t *cb = (_nsgtk_callback_t *)(data);
if (cb->callback_killed) {
/* This callback instance has been killed. */
- LOG("CB at %p already dead.", cb);
+ NSLOG(schedule, DEBUG, "CB at %p already dead.", cb);
}
queued_callbacks = g_list_remove(queued_callbacks, cb);
pending_callbacks = g_list_append(pending_callbacks, cb);
@@ -64,7 +60,9 @@ nsgtk_schedule_kill_callback(void *_target, void *_match)
_nsgtk_callback_t *match = (_nsgtk_callback_t *)_match;
if ((target->callback == match->callback) &&
(target->context == match->context)) {
- LOG("Found match for %p(%p), killing.", target->callback, target->context);
+ NSLOG(schedule, DEBUG,
+ "Found match for %p(%p), killing.",
+ target->callback, target->context);
target->callback = NULL;
target->context = NULL;
target->callback_killed = true;
@@ -122,7 +120,9 @@ schedule_run(void)
/* Clear the pending list. */
pending_callbacks = NULL;
- LOG("Captured a run of %d callbacks to fire.", g_list_length(this_run));
+ NSLOG(schedule, DEBUG,
+ "Captured a run of %d callbacks to fire.",
+ g_list_length(this_run));
/* Run all the callbacks which made it this far. */
while (this_run != NULL) {
diff --git a/frontends/gtk/ssl_cert.c b/frontends/gtk/ssl_cert.c
index 5388f0194..9d98db1f6 100644
--- a/frontends/gtk/ssl_cert.c
+++ b/frontends/gtk/ssl_cert.c
@@ -183,7 +183,7 @@ nserror gtk_cert_verify(struct nsurl *url,
res = nsgtk_builder_new_from_resname("ssl", &ncwin->builder);
if (res != NSERROR_OK) {
- LOG("SSL UI builder init failed");
+ NSLOG(netsurf, INFO, "SSL UI builder init failed");
free(ncwin);
return res;
}
diff --git a/frontends/gtk/tabs.c b/frontends/gtk/tabs.c
index 6adce3a06..dbe9d405b 100644
--- a/frontends/gtk/tabs.c
+++ b/frontends/gtk/tabs.c
@@ -147,18 +147,20 @@ nsgtk_tab_switch_page_after(GtkNotebook *notebook,
if ((srcpagenum != -1) &&
(srcpagenum != (gint)selpagenum)) {
/* ensure the add tab is not actually selected */
- LOG("src %d sel %d", srcpagenum, selpagenum);
+ NSLOG(netsurf, INFO, "src %d sel %d", srcpagenum,
+ selpagenum);
srcpage = gtk_notebook_get_nth_page(notebook, srcpagenum);
gw = g_object_get_data(G_OBJECT(srcpage), "gui_window");
if ((gw != NULL) && (nsgtk_get_scaffold(gw) != NULL)) {
error = nsgtk_scaffolding_new_tab(gw);
if (error != NSERROR_OK) {
- LOG("Failed to open new tab.");
+ NSLOG(netsurf, INFO,
+ "Failed to open new tab.");
}
}
}
} else {
- LOG("sel %d", selpagenum);
+ NSLOG(netsurf, INFO, "sel %d", selpagenum);
/* tab with page in it */
gw = g_object_get_data(G_OBJECT(selpage), "gui_window");
if (gw != NULL) {
diff --git a/frontends/gtk/throbber.c b/frontends/gtk/throbber.c
index 9392c3909..b8efceca1 100644
--- a/frontends/gtk/throbber.c
+++ b/frontends/gtk/throbber.c
@@ -59,12 +59,14 @@ nserror nsgtk_throbber_init(void)
if (res != NSERROR_OK) {
break;
}
- LOG("%s",resname);
+ NSLOG(netsurf, INFO, "%s", resname);
}
if (frame < 1) {
/* we need at least two frames - one for idle, one for active */
- LOG("Insufficent number of frames (%d) in throbber animation.", frame);
+ NSLOG(netsurf, INFO,
+ "Insufficent number of frames (%d) in throbber animation.",
+ frame);
res = NSERROR_INIT_FAILED;
}
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 1f8dbbb7c..e93bd49f9 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -26,6 +26,7 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/nsoption.h"
+#include "utils/file.h"
#include "gtk/gui.h"
#include "gtk/warn.h"
@@ -44,7 +45,7 @@ static bool edit_mode = false;
struct nsgtk_toolbar_custom_store {
GtkWidget *window;
- GtkWidget *store_buttons[PLACEHOLDER_BUTTON];
+ GtkWidget *store_buttons[PLACEHOLDER_BUTTON];
GtkWidget *widgetvbox;
GtkWidget *currentbar;
char numberh; /* current horizontal location while adding */
@@ -107,13 +108,13 @@ static char *remove_underscores(const char *s, bool replacespace)
ret = malloc(len + 1);
if (ret == NULL) {
return NULL;
- }
+ }
for (i = 0, ii = 0; i < len; i++) {
if (s[i] != '_') {
ret[ii++] = s[i];
- } else if (replacespace) {
+ } else if (replacespace) {
ret[ii++] = ' ';
- }
+ }
}
ret[ii] = '\0';
return ret;
@@ -208,18 +209,18 @@ nsgtk_theme_searchimage_default(nsgtk_search_buttons tbbutton,
switch (tbbutton) {
case (SEARCH_BACK_BUTTON):
- image = GTK_IMAGE(nsgtk_image_new_from_stock(NSGTK_STOCK_GO_BACK,
- iconsize));
+ image = GTK_IMAGE(nsgtk_image_new_from_stock(
+ NSGTK_STOCK_GO_BACK, iconsize));
break;
case (SEARCH_FORWARD_BUTTON):
- image = GTK_IMAGE(nsgtk_image_new_from_stock(NSGTK_STOCK_GO_FORWARD,
- iconsize));
+ image = GTK_IMAGE(nsgtk_image_new_from_stock(
+ NSGTK_STOCK_GO_FORWARD, iconsize));
break;
case (SEARCH_CLOSE_BUTTON):
- image = GTK_IMAGE(nsgtk_image_new_from_stock(NSGTK_STOCK_CLOSE,
- iconsize));
+ image = GTK_IMAGE(nsgtk_image_new_from_stock(
+ NSGTK_STOCK_CLOSE, iconsize));
break;
default:
@@ -227,7 +228,8 @@ nsgtk_theme_searchimage_default(nsgtk_search_buttons tbbutton,
}
if (usedef && (image == NULL)) {
- image = GTK_IMAGE(nsgtk_image_new_from_stock("gtk-missing-image", iconsize));
+ image = GTK_IMAGE(nsgtk_image_new_from_stock(
+ "gtk-missing-image", iconsize));
}
return image;
@@ -255,7 +257,6 @@ static struct nsgtk_theme *nsgtk_theme_load(GtkIconSize iconsize, bool usedef)
theme->image[btnloop] = nsgtk_theme_image_default(btnloop,
iconsize,
usedef);
-
}
for (btnloop = SEARCH_BACK_BUTTON;
@@ -823,8 +824,9 @@ static void nsgtk_toolbar_close(struct nsgtk_scaffolding *g)
*/
static gboolean nsgtk_toolbar_cancel_clicked(GtkWidget *widget, gpointer data)
{
- edit_mode = false;
struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+
+ edit_mode = false;
/* reset g->buttons->location */
for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
nsgtk_scaffolding_button(g, i)->location =
@@ -950,6 +952,7 @@ void nsgtk_toolbar_customization_load(struct nsgtk_scaffolding *g)
*/
static nserror nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g)
{
+ char *choices = NULL;
char *order;
int order_len = PLACEHOLDER_BUTTON * 12; /* length of order buffer */
int tbidx;
@@ -971,7 +974,8 @@ static nserror nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g)
nsgtk_scaffolding_button(g, tbidx)->location);
if (plen == order_len) {
/* ran out of space, bail early */
- LOG("toolbar ordering exceeded available space");
+ NSLOG(netsurf, INFO,
+ "toolbar ordering exceeded available space");
break;
}
cur += plen;
@@ -980,6 +984,13 @@ static nserror nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g)
nsoption_set_charp(toolbar_order, order);
+ /* ensure choices are saved */
+ netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (choices != NULL) {
+ nsoption_write(choices, NULL, NULL);
+ free(choices);
+ }
+
return NSERROR_OK;
}
@@ -989,8 +1000,9 @@ static nserror nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g)
*/
static gboolean nsgtk_toolbar_persist(GtkWidget *widget, gpointer data)
{
- edit_mode = false;
struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+
+ edit_mode = false;
/* save state to file, update toolbars for all windows */
nsgtk_toolbar_customization_save(g);
nsgtk_toolbar_cast(g);
@@ -1097,7 +1109,6 @@ nsgtk_toolbar_store_action(GtkWidget *widget, GdkDragContext *gdc,
*/
static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
{
- int x = 0, y = 0;
struct nsgtk_theme *theme;
nserror res;
@@ -1110,8 +1121,8 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
res = nsgtk_builder_new_from_resname("toolbar", &window->builder);
if (res != NSERROR_OK) {
- LOG("Toolbar UI builder init failed");
- nsgtk_warning(messages_get("NoMemory"), 0);
+ NSLOG(netsurf, INFO, "Toolbar UI builder init failed");
+ nsgtk_warning("Toolbar UI builder init failed", 0);
nsgtk_toolbar_cancel_clicked(NULL, g);
free(theme);
return;
@@ -1119,8 +1130,8 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
gtk_builder_connect_signals(window->builder, NULL);
- window->window = GTK_WIDGET(gtk_builder_get_object(window->builder,
- "toolbarwindow"));
+ window->window = GTK_WIDGET(gtk_builder_get_object(
+ window->builder, "dialogToolbar"));
if (window->window == NULL) {
nsgtk_warning(messages_get("NoMemory"), 0);
nsgtk_toolbar_cancel_clicked(NULL, g);
@@ -1128,8 +1139,11 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
return;
}
- window->widgetvbox = GTK_WIDGET(gtk_builder_get_object(window->builder,
- "widgetvbox"));
+ gtk_window_set_transient_for(GTK_WINDOW(window->window),
+ nsgtk_scaffolding_window(g));
+
+ window->widgetvbox = GTK_WIDGET(gtk_builder_get_object(
+ window->builder, "widgetvbox"));
if (window->widgetvbox == NULL) {
nsgtk_warning(messages_get("NoMemory"), 0);
nsgtk_toolbar_cancel_clicked(NULL, g);
@@ -1137,9 +1151,12 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
return;
}
- window->numberh = NSGTK_STORE_WIDTH; /* preset to width [in buttons] of */
+ /* preset to width [in buttons] of */
+ window->numberh = NSGTK_STORE_WIDTH;
+
/* store to cause creation of a new toolbar */
window->currentbutton = -1;
+
/* load toolbuttons */
/* add toolbuttons to window */
/* set event handlers */
@@ -1159,33 +1176,20 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
}
free(theme);
- gtk_window_set_transient_for(GTK_WINDOW(window->window),
- nsgtk_scaffolding_window(g));
- gtk_window_set_title(GTK_WINDOW(window->window), messages_get(
- "gtkToolBarTitle"));
+
gtk_window_set_accept_focus(GTK_WINDOW(window->window), FALSE);
+
gtk_drag_dest_set(GTK_WIDGET(window->window), GTK_DEST_DEFAULT_MOTION |
GTK_DEST_DEFAULT_DROP, &entry, 1, GDK_ACTION_COPY);
- gtk_widget_show_all(window->window);
- gtk_window_set_position(GTK_WINDOW(window->window),
- GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_get_position(nsgtk_scaffolding_window(g), &x, &y);
- gtk_window_move(GTK_WINDOW(window->window), x, y + 100);
-
- g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder,
- "cancelbutton")),
- "clicked",
- G_CALLBACK(nsgtk_toolbar_cancel_clicked),
- g);
- g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder,
- "okbutton")),
+ g_signal_connect(GTK_WIDGET(gtk_builder_get_object(
+ window->builder, "close")),
"clicked",
G_CALLBACK(nsgtk_toolbar_persist),
g);
- g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder,
- "resetbutton")),
+ g_signal_connect(GTK_WIDGET(gtk_builder_get_object(
+ window->builder, "reset")),
"clicked",
G_CALLBACK(nsgtk_toolbar_reset),
g);
@@ -1198,6 +1202,8 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
g_signal_connect(window->window, "drag-motion",
G_CALLBACK(nsgtk_toolbar_store_action), g);
+
+ gtk_widget_show_all(window->window);
}
/**
@@ -1341,33 +1347,37 @@ nsgtk_toolbar_set_handler(struct nsgtk_scaffolding *g, nsgtk_toolbar_button i)
case URL_BAR_ITEM:
nsgtk_scaffolding_update_url_bar_ref(g);
g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_urlbar(g)),
- "activate", G_CALLBACK(
- nsgtk_window_url_activate_event), g);
+ "activate", G_CALLBACK(
+ nsgtk_window_url_activate_event), g);
g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_urlbar(g)),
- "changed", G_CALLBACK(
- nsgtk_window_url_changed), g);
+ "changed", G_CALLBACK(
+ nsgtk_window_url_changed), g);
break;
+
case THROBBER_ITEM:
nsgtk_scaffolding_update_throbber_ref(g);
break;
+
case WEBSEARCH_ITEM:
nsgtk_scaffolding_update_websearch_ref(g);
g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_websearch(g)),
- "activate", G_CALLBACK(
- nsgtk_websearch_activate), g);
+ "activate", G_CALLBACK(
+ nsgtk_websearch_activate), g);
g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_websearch(g)),
- "button-press-event", G_CALLBACK(
- nsgtk_websearch_clear), g);
+ "button-press-event", G_CALLBACK(
+ nsgtk_websearch_clear), g);
break;
+
default:
if ((nsgtk_scaffolding_button(g, i)->bhandler != NULL) &&
- (nsgtk_scaffolding_button(g, i)->button
- != NULL))
- g_signal_connect(nsgtk_scaffolding_button(g, i)->
- button, "clicked",
- G_CALLBACK(nsgtk_scaffolding_button(g,
- i)->bhandler), g);
- break;
+ (nsgtk_scaffolding_button(g, i)->button != NULL)) {
+ g_signal_connect(
+ nsgtk_scaffolding_button(g, i)->button,
+ "clicked",
+ G_CALLBACK(nsgtk_scaffolding_button(
+ g, i)->bhandler), g);
+ }
+ break;
}
}
@@ -1459,7 +1469,8 @@ DATAHANDLER(prevtab, PREVTAB, window)
DATAHANDLER(guide, GUIDE, window)
DATAHANDLER(info, INFO, window)
#undef DATAHANDLER
-#define DATAHANDLER(p, q, r)\
+
+#define DATAHANDLER(p, q, r) \
gboolean nsgtk_toolbar_##p##_button_data(GtkWidget *widget, GdkDragContext\
*cont, GtkSelectionData *selection, guint info, guint time,\
gpointer data)\
@@ -1480,5 +1491,3 @@ gboolean nsgtk_toolbar_##p##_toolbar_button_data(GtkWidget *widget,\
DATAHANDLER(throbber, THROBBER, window)
DATAHANDLER(websearch, WEBSEARCH, window)
#undef DATAHANDLER
-
-
diff --git a/frontends/gtk/viewdata.c b/frontends/gtk/viewdata.c
index 6ed9dd9ac..d633238d0 100644
--- a/frontends/gtk/viewdata.c
+++ b/frontends/gtk/viewdata.c
@@ -371,7 +371,7 @@ window_init(const char *title,
res = nsgtk_builder_new_from_resname("viewdata", &newctx->builder);
if (res != NSERROR_OK) {
- LOG("Viewdata UI builder init failed");
+ NSLOG(netsurf, INFO, "Viewdata UI builder init failed");
free(newctx);
return res;
}
@@ -381,7 +381,7 @@ window_init(const char *title,
window = GTK_WINDOW(gtk_builder_get_object(newctx->builder,
"ViewDataWindow"));
if (window == NULL) {
- LOG("Unable to find window in builder ");
+ NSLOG(netsurf, INFO, "Unable to find window in builder ");
/* free the builder */
g_object_unref(G_OBJECT(newctx->builder));
@@ -616,7 +616,7 @@ static char** xdg_data_strvec(void)
xdg_data_home, xdg_data_dirs);
}
- LOG("%s", xdg_data_path);
+ NSLOG(netsurf, INFO, "%s", xdg_data_path);
svec = filepath_path_to_strvec(xdg_data_path);
free(xdg_data_path);
@@ -651,7 +651,7 @@ static char *xdg_get_default_app(const char *path, const char *mimetype)
fname = malloc(fname_len);
snprintf(fname, fname_len, "%s/applications/defaults.list", path);
- LOG("Checking %s", fname);
+ NSLOG(netsurf, INFO, "Checking %s", fname);
fp = fopen(fname, "r");
free(fname);
@@ -674,8 +674,11 @@ static char *xdg_get_default_app(const char *path, const char *mimetype)
ret = strdup(line + mimetype_len + 1);
- LOG("Found line match for %s length %zu\n", mimetype, rd);
- LOG("Result %s", ret);
+ NSLOG(netsurf, INFO,
+ "Found line match for %s length %zu\n",
+ mimetype,
+ rd);
+ NSLOG(netsurf, INFO, "Result %s", ret);
break;
}
@@ -714,7 +717,7 @@ static char *xdg_get_exec_cmd(const char *path, const char *desktop)
fname = malloc(fname_len);
snprintf(fname, fname_len, "%s/applications/%s", path, desktop);
- LOG("Checking %s", fname);
+ NSLOG(netsurf, INFO, "Checking %s", fname);
fp = fopen(fname, "r");
free(fname);
@@ -735,8 +738,8 @@ static char *xdg_get_exec_cmd(const char *path, const char *desktop)
ret = strdup(line + SLEN("Exec="));
- LOG("Found Exec length %zu", rd);
- LOG("Result %s", ret);
+ NSLOG(netsurf, INFO, "Found Exec length %zu", rd);
+ NSLOG(netsurf, INFO, "Result %s", ret);
break;
}
@@ -801,7 +804,7 @@ static char **build_exec_argv(const char *fname, const char *exec_cmd)
argv[aidx] = exec_arg(start, cur - start, fname);
if (argv[aidx] != NULL) {
- LOG("adding \"%s\"", argv[aidx]);
+ NSLOG(netsurf, INFO, "adding \"%s\"", argv[aidx]);
aidx++;
}
}
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index de5311e2e..7f24d40ac 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -42,7 +42,6 @@
#include "netsurf/plotters.h"
#include "netsurf/form.h"
#include "netsurf/keypress.h"
-#include "desktop/textarea.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
@@ -355,6 +354,7 @@ static gboolean nsgtk_window_button_press_event(GtkWidget *widget,
break;
case 3: /* Right button, usually. Action button, context menu. */
+ /** \todo determine if hiding the caret here is necessary */
browser_window_remove_caret(g->bw, true);
nsgtk_scaffolding_context_menu(g->scaffold,
g->mouse.pressed_x,
@@ -458,7 +458,7 @@ nsgtk_window_scroll_event(GtkWidget *widget,
break;
#endif
default:
- LOG("Unhandled mouse scroll direction");
+ NSLOG(netsurf, INFO, "Unhandled mouse scroll direction");
return TRUE;
}
@@ -741,7 +741,7 @@ gui_window_create(struct browser_window *bw,
res = nsgtk_builder_new_from_resname("tabcontents", &tab_builder);
if (res != NSERROR_OK) {
- LOG("Tab contents UI builder init failed");
+ NSLOG(netsurf, INFO, "Tab contents UI builder init failed");
return NULL;
}
@@ -754,7 +754,8 @@ gui_window_create(struct browser_window *bw,
return NULL;
}
- LOG("Creating gui window %p for browser window %p", g, bw);
+ NSLOG(netsurf, INFO, "Creating gui window %p for browser window %p",
+ g, bw);
g->bw = bw;
g->mouse.state = 0;
@@ -903,10 +904,10 @@ void nsgtk_window_destroy_browser(struct gui_window *gw)
static void gui_window_destroy(struct gui_window *g)
{
- LOG("gui_window: %p", g);
+ NSLOG(netsurf, INFO, "gui_window: %p", g);
assert(g != NULL);
assert(g->bw != NULL);
- LOG("scaffolding: %p", g->scaffold);
+ NSLOG(netsurf, INFO, "scaffolding: %p", g->scaffold);
if (g->prev) {
g->prev->next = g->next;
@@ -918,7 +919,7 @@ static void gui_window_destroy(struct gui_window *g)
g->next->prev = g->prev;
}
- LOG("window list head: %p", window_list);
+ NSLOG(netsurf, INFO, "window list head: %p", window_list);
}
/**
@@ -940,13 +941,13 @@ static void gui_window_set_icon(struct gui_window *gw, struct hlcache_handle *ic
if (icon != NULL) {
icon_bitmap = content_get_bitmap(icon);
if (icon_bitmap != NULL) {
- LOG("Using %p bitmap", icon_bitmap);
+ NSLOG(netsurf, INFO, "Using %p bitmap", icon_bitmap);
gw->icon = nsgdk_pixbuf_get_from_surface(icon_bitmap->surface, 16, 16);
}
}
if (gw->icon == NULL) {
- LOG("Using default favicon");
+ NSLOG(netsurf, INFO, "Using default favicon");
g_object_ref(favicon_pixbuf);
gw->icon = favicon_pixbuf;
}
@@ -1236,7 +1237,7 @@ gui_window_get_dimensions(struct gui_window *gw,
*width /= scale;
*height /= scale;
}
- LOG("gw:%p width:%i height:%i", gw, *width, *height);
+ NSLOG(netsurf, INFO, "gw:%p width:%i height:%i", gw, *width, *height);
return NSERROR_OK;
}
@@ -1269,8 +1270,8 @@ static void gui_window_create_form_select_menu(struct gui_window *g,
item = 0;
option = form_select_get_option(control, item);
while (option != NULL) {
- LOG("Item %"PRIdPTR" option %p text %s",
- item, option, option->text);
+ NSLOG(netsurf, INFO, "Item %"PRIdPTR" option %p text %s",
+ item, option, option->text);
menu_item = gtk_check_menu_item_new_with_label(option->text);
if (option->selected) {
gtk_check_menu_item_set_active(
@@ -1313,10 +1314,10 @@ gui_window_file_gadget_open(struct gui_window *g,
NSGTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL);
- LOG("*** open dialog: %p", dialog);
+ NSLOG(netsurf, INFO, "*** open dialog: %p", dialog);
int ret = gtk_dialog_run(GTK_DIALOG(dialog));
- LOG("*** return value: %d", ret);
+ NSLOG(netsurf, INFO, "*** return value: %d", ret);
if (ret == GTK_RESPONSE_ACCEPT) {
char *filename;
diff --git a/frontends/monkey/browser.c b/frontends/monkey/browser.c
index 16d33010d..1fbbbf0b1 100644
--- a/frontends/monkey/browser.c
+++ b/frontends/monkey/browser.c
@@ -471,7 +471,7 @@ monkey_window_handle_redraw(int argc, char **argv)
clip.y1 = atoi(argv[6]);
}
- LOG("Issue redraw");
+ NSLOG(netsurf, INFO, "Issue redraw");
fprintf(stdout, "WINDOW REDRAW WIN %d START\n", atoi(argv[2]));
browser_window_redraw(gw->bw, gw->scrollx, gw->scrolly, &clip, &ctx);
fprintf(stdout, "WINDOW REDRAW WIN %d STOP\n", atoi(argv[2]));
diff --git a/frontends/monkey/dispatch.c b/frontends/monkey/dispatch.c
index b531f05f9..e60325cf1 100644
--- a/frontends/monkey/dispatch.c
+++ b/frontends/monkey/dispatch.c
@@ -40,7 +40,7 @@ monkey_register_handler(const char *cmd, handle_command_fn fn)
{
monkey_cmdhandler_t *ret = calloc(sizeof(*ret), 1);
if (ret == NULL) {
- LOG("Unable to allocate handler");
+ NSLOG(netsurf, INFO, "Unable to allocate handler");
return NSERROR_NOMEM;
}
ret->cmd = strdup(cmd);
diff --git a/frontends/monkey/filetype.c b/frontends/monkey/filetype.c
index 20bd1edad..979796baf 100644
--- a/frontends/monkey/filetype.c
+++ b/frontends/monkey/filetype.c
@@ -85,7 +85,8 @@ void monkey_fetch_filetype_init(const char *mimefile)
fh = fopen(mimefile, "r");
if (fh == NULL) {
- LOG("Unable to open a mime.types file, so using a minimal one for you.");
+ NSLOG(netsurf, INFO,
+ "Unable to open a mime.types file, so using a minimal one for you.");
return;
}
diff --git a/frontends/monkey/main.c b/frontends/monkey/main.c
index 1bea02471..53cde5a72 100644
--- a/frontends/monkey/main.c
+++ b/frontends/monkey/main.c
@@ -278,20 +278,20 @@ static void monkey_run(void)
/* setup timeout */
switch (schedtm) {
case -1:
- LOG("Iterate blocking");
+ NSLOG(netsurf, INFO, "Iterate blocking");
fprintf(stdout, "GENERIC POLL BLOCKING\n");
timeout = NULL;
break;
case 0:
- LOG("Iterate immediate");
+ NSLOG(netsurf, INFO, "Iterate immediate");
tv.tv_sec = 0;
tv.tv_usec = 0;
timeout = &tv;
break;
default:
- LOG("Iterate non-blocking");
+ NSLOG(netsurf, INFO, "Iterate non-blocking");
fprintf(stdout, "GENERIC POLL TIMED %d\n", schedtm);
tv.tv_sec = schedtm / 1000; /* miliseconds to seconds */
tv.tv_usec = (schedtm % 1000) * 1000; /* remainder to microseconds */
@@ -361,7 +361,7 @@ main(int argc, char **argv)
messages = filepath_find(respaths, "Messages");
ret = messages_add_from_file(messages);
if (ret != NSERROR_OK) {
- LOG("Messages failed to load");
+ NSLOG(netsurf, INFO, "Messages failed to load");
}
/* common initialisation */
@@ -404,5 +404,8 @@ main(int argc, char **argv)
/* finalise options */
nsoption_finalise(nsoptions, nsoptions_default);
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/monkey/schedule.c b/frontends/monkey/schedule.c
index af1144a0e..3d76997f4 100644
--- a/frontends/monkey/schedule.c
+++ b/frontends/monkey/schedule.c
@@ -24,12 +24,6 @@
#include "monkey/schedule.h"
-#ifdef DEBUG_SCHEDULER
-#define SRLOG(x...) LOG(x)
-#else
-#define SRLOG(x...) ((void) 0)
-#endif
-
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -63,7 +57,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
return NSERROR_OK;
}
- SRLOG("removing %p, %p", callback, p);
+ NSLOG(schedule, DEBUG, "removing %p, %p", callback, p);
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -73,7 +67,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- SRLOG("callback entry %p removing %p(%p)",
+ NSLOG(schedule, DEBUG, "callback entry %p removing %p(%p)",
cur_nscb, cur_nscb->callback, cur_nscb->p);
/* remove callback */
@@ -109,7 +103,7 @@ nserror monkey_schedule(int tival, void (*callback)(void *p), void *p)
return ret;
}
- SRLOG("Adding %p(%p) in %d", callback, p, tival);
+ NSLOG(schedule, DEBUG, "Adding %p(%p) in %d", callback, p, tival);
tv.tv_sec = tival / 1000; /* miliseconds to seconds */
tv.tv_usec = (tival % 1000) * 1000; /* remainder to microseconds */
@@ -190,8 +184,8 @@ int monkey_schedule_run(void)
/* make rettime relative to now */
timersub(&nexttime, &tv, &rettime);
- SRLOG("returning time to next event as %ldms",
- (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000));
+ NSLOG(schedule, DEBUG, "returning time to next event as %ldms",
+ (long)((rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
@@ -204,13 +198,14 @@ void monkey_schedule_list(void)
gettimeofday(&tv, NULL);
- LOG("schedule list at %lld:%ld", (long long)tv.tv_sec, tv.tv_usec);
+ NSLOG(netsurf, INFO, "schedule list at %lld:%ld",
+ (long long)tv.tv_sec, tv.tv_usec);
cur_nscb = schedule_list;
while (cur_nscb != NULL) {
- LOG("Schedule %p at %lld:%ld",
- cur_nscb, (long long)cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec);
+ NSLOG(netsurf, INFO, "Schedule %p at %lld:%ld", cur_nscb,
+ (long long)cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec);
cur_nscb = cur_nscb->next;
}
}
diff --git a/frontends/riscos/401login.c b/frontends/riscos/401login.c
index a23c01c90..4b2deb16b 100644
--- a/frontends/riscos/401login.c
+++ b/frontends/riscos/401login.c
@@ -191,7 +191,8 @@ void ro_gui_401login_close(wimp_w w)
error = xwimp_delete_window(w);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
ro_gui_wimp_event_finalise(w);
@@ -212,7 +213,7 @@ bool ro_gui_401login_apply(wimp_w w)
auth = malloc(strlen(session->uname) + strlen(session->pwd) + 2);
if (!auth) {
- LOG("calloc failed");
+ NSLOG(netsurf, INFO, "calloc failed");
ro_warn_user("NoMemory", 0);
return false;
}
diff --git a/frontends/riscos/bitmap.c b/frontends/riscos/bitmap.c
index 1a3524633..d554d54b4 100644
--- a/frontends/riscos/bitmap.c
+++ b/frontends/riscos/bitmap.c
@@ -287,7 +287,10 @@ bool riscos_bitmap_save(void *vbitmap, const char *path, unsigned flags)
error = xosspriteop_save_sprite_file(osspriteop_USER_AREA,
(bitmap->sprite_area), path);
if (error) {
- LOG("xosspriteop_save_sprite_file: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_save_sprite_file: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -347,7 +350,8 @@ bool riscos_bitmap_save(void *vbitmap, const char *path, unsigned flags)
error = xosfind_openoutw(0, path, NULL, &fw);
if (error) {
- LOG("xosfind_openoutw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openoutw: 0x%x: %s",
+ error->errnum, error->errmess);
free(chunk_buf);
ro_warn_user("SaveError", error->errmess);
return false;
@@ -361,7 +365,8 @@ bool riscos_bitmap_save(void *vbitmap, const char *path, unsigned flags)
if (!error)
error = xosgbpb_writew(fw, (byte*)p, image_size, NULL);
if (error) {
- LOG("xosgbpb_writew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosgbpb_writew: 0x%x: %s",
+ error->errnum, error->errmess);
free(chunk_buf);
xosfind_closew(fw);
ro_warn_user("SaveError", error->errmess);
@@ -406,7 +411,10 @@ bool riscos_bitmap_save(void *vbitmap, const char *path, unsigned flags)
}
error = xosgbpb_writew(fw, (byte*)chunk_buf, dp-chunk_buf, NULL);
if (error) {
- LOG("xosgbpb_writew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosgbpb_writew: 0x%x: %s",
+ error->errnum,
+ error->errmess);
free(chunk_buf);
xosfind_closew(fw);
ro_warn_user("SaveError", error->errmess);
@@ -416,13 +424,15 @@ bool riscos_bitmap_save(void *vbitmap, const char *path, unsigned flags)
error = xosfind_closew(fw);
if (error) {
- LOG("xosfind_closew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_closew: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
error = xosfile_set_type(path, osfile_TYPE_SPRITE);
if (error) {
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
@@ -509,7 +519,8 @@ void riscos_bitmap_overlay_sprite(struct bitmap *bitmap,
(osspriteop_id)s,
&w, &h, NULL, NULL);
if (error) {
- LOG("xosspriteop_read_sprite_info: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosspriteop_read_sprite_info: 0x%x:%s",
+ error->errnum, error->errmess);
return;
}
sp_offset = ((s->width + 1) * 4) - w;
@@ -591,7 +602,7 @@ static osspriteop_area *thumbnail_create_8bpp(struct bitmap *bitmap)
sprite_area = (osspriteop_area *)malloc(area_size);
if (!sprite_area) {
- LOG("no memory for malloc()");
+ NSLOG(netsurf, INFO, "no memory for malloc()");
return NULL;
}
sprite_area->size = area_size;
@@ -759,7 +770,8 @@ static void thumbnail_test(void)
area_size = sizeof(osspriteop_area) +
sizeof(osspriteop_header) + sizeof(int);
if ((sprite_area = (osspriteop_area *)malloc(area_size)) == NULL) {
- LOG("Insufficient memory to perform sprite test.");
+ NSLOG(netsurf, INFO,
+ "Insufficient memory to perform sprite test.");
return;
}
sprite_area->size = area_size + 1;
@@ -791,7 +803,7 @@ nserror riscos_bitmap_render(struct bitmap *bitmap,
assert(content);
assert(bitmap);
- LOG("content %p in bitmap %p", content, bitmap);
+ NSLOG(netsurf, INFO, "content %p in bitmap %p", content, bitmap);
/* check if we have access to 32bpp sprites natively */
if (thumbnail_32bpp_available == -1) {
diff --git a/frontends/riscos/buffer.c b/frontends/riscos/buffer.c
index 7176c1c1c..c63a270db 100644
--- a/frontends/riscos/buffer.c
+++ b/frontends/riscos/buffer.c
@@ -107,7 +107,12 @@ void ro_gui_buffer_open(wimp_draw *redraw)
*/
if ((clipping.x1 < clipping.x0) ||
(clipping.y1 < clipping.y0)) {
- LOG("Invalid clipping rectangle (%i, %i) to (%i,%i)", clipping.x0, clipping.y0, clipping.x1, clipping.y1);
+ NSLOG(netsurf, INFO,
+ "Invalid clipping rectangle (%i, %i) to (%i,%i)",
+ clipping.x0,
+ clipping.y0,
+ clipping.x1,
+ clipping.y1);
return;
}
@@ -138,7 +143,7 @@ void ro_gui_buffer_open(wimp_draw *redraw)
(word_width * sprite_size.y * 4) + palette_size;
buffer = (osspriteop_area *)malloc(total_size);
if (!buffer) {
- LOG("Failed to allocate memory");
+ NSLOG(netsurf, INFO, "Failed to allocate memory");
ro_gui_buffer_free();
return;
}
@@ -149,7 +154,8 @@ void ro_gui_buffer_open(wimp_draw *redraw)
mode = tinct_SPRITE_MODE;
#else
if ((error = xwimpreadsysinfo_wimp_mode(&mode)) != NULL) {
- LOG("Error reading mode '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Error reading mode '%s'",
+ error->errmess);
ro_gui_buffer_free();
return;
}
@@ -177,7 +183,9 @@ void ro_gui_buffer_open(wimp_draw *redraw)
error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), (int *)&vals);
if (error) {
- LOG("Error reading mode properties '%s'", error->errmess);
+ NSLOG(netsurf, INFO,
+ "Error reading mode properties '%s'",
+ error->errmess);
ro_gui_buffer_free();
return;
}
@@ -233,7 +241,9 @@ void ro_gui_buffer_open(wimp_draw *redraw)
}
break;
default:
- LOG("Unhandled 16bpp format from flags %d", vals.flags);
+ NSLOG(netsurf, INFO,
+ "Unhandled 16bpp format from flags %d",
+ vals.flags);
ro_gui_buffer_free();
return;
}
@@ -261,13 +271,16 @@ void ro_gui_buffer_open(wimp_draw *redraw)
}
break;
default:
- LOG("Unhandled 32bpp data format from flags %d", vals.flags);
+ NSLOG(netsurf, INFO,
+ "Unhandled 32bpp data format from flags %d",
+ vals.flags);
ro_gui_buffer_free();
return;
}
break;
default:
- LOG("Unhandled NCOLOUR value %d", vals.ncolour);
+ NSLOG(netsurf, INFO, "Unhandled NCOLOUR value %d",
+ vals.ncolour);
ro_gui_buffer_free();
return;
}
@@ -305,7 +318,7 @@ void ro_gui_buffer_open(wimp_draw *redraw)
buffer, buffer_name, palette,
clipping.x0, clipping.y0,
clipping.x1, clipping.y1)) != NULL) {
- LOG("Grab error '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Grab error '%s'", error->errmess);
ro_gui_buffer_free();
return;
}
@@ -314,7 +327,7 @@ void ro_gui_buffer_open(wimp_draw *redraw)
*/
if ((error = xosspriteop_read_save_area_size(osspriteop_PTR,
buffer, (osspriteop_id)(buffer + 1), &size)) != NULL) {
- LOG("Save area error '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Save area error '%s'", error->errmess);
ro_gui_buffer_free();
return;
}
@@ -329,7 +342,7 @@ void ro_gui_buffer_open(wimp_draw *redraw)
if ((error = xosspriteop_switch_output_to_sprite(osspriteop_PTR,
buffer, (osspriteop_id)(buffer + 1), save_area,
&context0, &context1, &context2, &context3)) != NULL) {
- LOG("Switching error '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Switching error '%s'", error->errmess);
free(save_area);
ro_gui_buffer_free();
return;
@@ -345,7 +358,8 @@ void ro_gui_buffer_open(wimp_draw *redraw)
*/
if ((error = xos_set_ecf_origin(-ro_plot_origin_x,
-ro_plot_origin_y)) != NULL) {
- LOG("Invalid ECF origin: '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Invalid ECF origin: '%s'",
+ error->errmess);
}
}
diff --git a/frontends/riscos/configure.c b/frontends/riscos/configure.c
index 9d28616ec..f4dced55b 100644
--- a/frontends/riscos/configure.c
+++ b/frontends/riscos/configure.c
@@ -212,7 +212,10 @@ void ro_gui_configure_open_window(wimp_open *open)
y + configure_icon_height -
CONFIGURE_ICON_PADDING_V);
if (error) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_resize_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
}
x += configure_icon_width;
l++;
@@ -225,7 +228,8 @@ void ro_gui_configure_open_window(wimp_open *open)
error = xwimp_force_redraw(configure_window,
0, -16384, 16384, 0);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -248,7 +252,8 @@ void ro_gui_configure_open_window(wimp_open *open)
extent.y0 = -max_height;
error = xwimp_set_extent(open->w, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -259,7 +264,8 @@ void ro_gui_configure_open_window(wimp_open *open)
/* open the window */
error = xwimp_open_window(open);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -276,7 +282,7 @@ void ro_gui_configure_register(const char *window,
/* create our tool */
tool = calloc(sizeof(struct configure_tool), 1);
if (!tool) {
- LOG("Insufficient memory for calloc()");
+ NSLOG(netsurf, INFO, "Insufficient memory for calloc()");
die("Insufficient memory");
return; /* For the benefit of scan-build */
}
@@ -284,7 +290,7 @@ void ro_gui_configure_register(const char *window,
tool->translated[0] = '\0';
tool->validation = malloc(strlen(window) + 2);
if (!tool->validation) {
- LOG("Insufficient memory for malloc()");
+ NSLOG(netsurf, INFO, "Insufficient memory for malloc()");
die("Insufficient memory");
}
sprintf(tool->validation, "S%s", window);
@@ -311,7 +317,8 @@ void ro_gui_configure_register(const char *window,
CONFIGURE_TOOL_TRANSLATED_SIZE;
error = xwimp_create_icon(&new_icon, &tool->i);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
die(error->errmess);
}
@@ -360,7 +367,8 @@ bool ro_gui_configure_translate(void)
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0,
&alphabet);
if (error) {
- LOG("failed reading alphabet: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "failed reading alphabet: 0x%x: %s",
+ error->errnum, error->errmess);
/* assume Latin1 */
alphabet = territory_ALPHABET_LATIN1;
}
@@ -381,7 +389,10 @@ bool ro_gui_configure_translate(void)
error = xwimptextop_string_width(tool->translated,
strlen(tool->translated), &icon_width);
if (error) {
- LOG("xwimptextop_string_width: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimptextop_string_width: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return false;
}
icon_width += CONFIGURE_ICON_PADDING_H;
@@ -395,7 +406,8 @@ bool ro_gui_configure_translate(void)
configure_icon_width,
0);
if (error) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
diff --git a/frontends/riscos/configure/con_image.c b/frontends/riscos/configure/con_image.c
index 49dd4f76d..c7fc7f314 100644
--- a/frontends/riscos/configure/con_image.c
+++ b/frontends/riscos/configure/con_image.c
@@ -150,8 +150,9 @@ void ro_gui_options_image_redraw(wimp_draw *redraw)
icon_state.i = IMAGE_CURRENT_DISPLAY;
error = xwimp_get_icon_state(&icon_state);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
return;
}
diff --git a/frontends/riscos/configure/con_language.c b/frontends/riscos/configure/con_language.c
index 2030c65c0..77e4f6cb4 100644
--- a/frontends/riscos/configure/con_language.c
+++ b/frontends/riscos/configure/con_language.c
@@ -98,7 +98,8 @@ bool ro_gui_options_language_ok(wimp_w w)
if (temp) {
nsoption_set_charp(language, temp);
} else {
- LOG("No memory to duplicate language code");
+ NSLOG(netsurf, INFO,
+ "No memory to duplicate language code");
ro_warn_user("NoMemory", 0);
}
}
@@ -113,7 +114,8 @@ bool ro_gui_options_language_ok(wimp_w w)
if (temp) {
nsoption_set_charp(accept_language,temp);
} else {
- LOG("No memory to duplicate language code");
+ NSLOG(netsurf, INFO,
+ "No memory to duplicate language code");
ro_warn_user("NoMemory", 0);
}
}
diff --git a/frontends/riscos/configure/con_theme.c b/frontends/riscos/configure/con_theme.c
index fb0d3dfb0..28195dea9 100644
--- a/frontends/riscos/configure/con_theme.c
+++ b/frontends/riscos/configure/con_theme.c
@@ -104,20 +104,23 @@ bool ro_gui_options_theme_initialise(wimp_w w)
return false;
error = xwimp_create_window(&theme_pane_definition, &theme_pane);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
state.w = w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
icon_state.w = w;
icon_state.i = THEME_PANE_AREA;
error = xwimp_get_icon_state(&icon_state);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
state.w = theme_pane;
@@ -126,7 +129,8 @@ bool ro_gui_options_theme_initialise(wimp_w w)
state.visible.x0 += icon_state.icon.extent.x0 + 16;
state.visible.y0 = state.visible.y1 + icon_state.icon.extent.y0 + 16;
state.visible.y1 += icon_state.icon.extent.y1 - 28;
- LOG("Y0 = %i, y1 = %i", icon_state.icon.extent.y0, icon_state.icon.extent.y1);
+ NSLOG(netsurf, INFO, "Y0 = %i, y1 = %i", icon_state.icon.extent.y0,
+ icon_state.icon.extent.y1);
error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), w,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT |
@@ -141,7 +145,8 @@ bool ro_gui_options_theme_initialise(wimp_w w)
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -176,7 +181,8 @@ void ro_gui_options_theme_finalise(wimp_w w)
ro_gui_wimp_event_finalise(theme_pane);
error = xwimp_delete_window(theme_pane);
if (error) {
- LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
theme_pane = 0;
@@ -269,7 +275,7 @@ void ro_gui_options_theme_load(void)
ro_toolbar_rebuild(toolbar);
toolbar_display = calloc(sizeof(struct toolbar_display), 1);
if (!toolbar_display) {
- LOG("No memory for calloc()");
+ NSLOG(netsurf, INFO, "No memory for calloc()");
ro_warn_user("NoMemory", 0);
return;
}
@@ -291,7 +297,8 @@ void ro_gui_options_theme_load(void)
state.w = theme_pane;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
diff --git a/frontends/riscos/content-handlers/artworks.c b/frontends/riscos/content-handlers/artworks.c
index 7a7d79cb7..8ec4edcae 100644
--- a/frontends/riscos/content-handlers/artworks.c
+++ b/frontends/riscos/content-handlers/artworks.c
@@ -183,18 +183,19 @@ bool artworks_convert(struct content *c)
xos_read_var_val_size("Alias$LoadArtWorksModules", 0, os_VARTYPE_STRING,
&used, NULL, NULL);
if (used >= 0) {
- LOG("Alias$LoadArtWorksModules not defined");
+ NSLOG(netsurf, INFO, "Alias$LoadArtWorksModules not defined");
msg_data.error = messages_get("AWNotSeen");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
/* load the modules, or do nothing if they're already loaded */
error = xos_cli("LoadArtWorksModules");
if (error) {
- LOG("xos_cli: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_cli: 0x%x: %s", error->errnum,
+ error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -202,9 +203,10 @@ bool artworks_convert(struct content *c)
error = (os_error*)_swix(AWRender_FileInitAddress, _OUT(0) | _OUT(1),
&init_routine, &init_workspace);
if (error) {
- LOG("AWRender_FileInitAddress: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "AWRender_FileInitAddress: 0x%x: %s",
+ error->errnum, error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -212,9 +214,10 @@ bool artworks_convert(struct content *c)
&aw->render_routine,
&aw->render_workspace);
if (error) {
- LOG("AWRender_RenderAddress: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "AWRender_RenderAddress: 0x%x: %s",
+ error->errnum, error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -224,9 +227,10 @@ bool artworks_convert(struct content *c)
error = awrender_init(&source_data, &source_size,
init_routine, init_workspace);
if (error) {
- LOG("awrender_init: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "awrender_init: 0x%x : %s",
+ error->errnum, error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -239,13 +243,15 @@ bool artworks_convert(struct content *c)
&aw->y1);
if (error) {
- LOG("AWRender_DocBounds: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "AWRender_DocBounds: 0x%x: %s",
+ error->errnum, error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
- LOG("bounding box: %d,%d,%d,%d", aw->x0, aw->y0, aw->x1, aw->y1);
+ NSLOG(netsurf, INFO, "bounding box: %d,%d,%d,%d", aw->x0, aw->y0,
+ aw->x1, aw->y1);
/* create the resizable workspace required by the
ArtWorksRenderer rendering routine */
@@ -253,9 +259,10 @@ bool artworks_convert(struct content *c)
aw->size = INITIAL_BLOCK_SIZE;
aw->block = malloc(INITIAL_BLOCK_SIZE);
if (!aw->block) {
- LOG("failed to create block for ArtworksRenderer");
+ NSLOG(netsurf, INFO,
+ "failed to create block for ArtworksRenderer");
msg_data.error = messages_get("NoMemory");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -368,13 +375,15 @@ bool artworks_redraw(struct content *c, struct content_redraw_data *data,
error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals);
if (error) {
- LOG("xos_read_vdu_variables: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_read_vdu_variables: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
error = xwimp_read_palette((os_palette*)&vals[3]);
if (error) {
- LOG("xwimp_read_palette: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_read_palette: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -393,7 +402,8 @@ bool artworks_redraw(struct content *c, struct content_redraw_data *data,
aw->render_workspace);
if (error) {
- LOG("awrender_render: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "awrender_render: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
diff --git a/frontends/riscos/content-handlers/draw.c b/frontends/riscos/content-handlers/draw.c
index 0c84de866..bb66f9dbb 100644
--- a/frontends/riscos/content-handlers/draw.c
+++ b/frontends/riscos/content-handlers/draw.c
@@ -126,9 +126,10 @@ bool draw_convert(struct content *c)
error = xdrawfile_bbox(0, (drawfile_diagram *) data,
(int) source_size, 0, &bbox);
if (error) {
- LOG("xdrawfile_bbox: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdrawfile_bbox: 0x%x: %s",
+ error->errnum, error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -208,7 +209,8 @@ bool draw_redraw(struct content *c, struct content_redraw_data *data,
error = xdrawfile_render(0, (drawfile_diagram *) src_data,
(int) source_size, &matrix, 0, 0);
if (error) {
- LOG("xdrawfile_render: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdrawfile_render: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
diff --git a/frontends/riscos/content-handlers/sprite.c b/frontends/riscos/content-handlers/sprite.c
index 02976e48e..3556aa555 100644
--- a/frontends/riscos/content-handlers/sprite.c
+++ b/frontends/riscos/content-handlers/sprite.c
@@ -126,7 +126,7 @@ bool sprite_convert(struct content *c)
/* check for bad data */
if ((int)source_size + 4 != area->used) {
msg_data.error = messages_get("BadSprite");
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
@@ -135,9 +135,12 @@ bool sprite_convert(struct content *c)
(osspriteop_id) ((char *) area + area->first),
&w, &h, NULL, NULL);
if (error) {
- LOG("xosspriteop_read_sprite_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_read_sprite_info: 0x%x: %s",
+ error->errnum,
+ error->errmess);
msg_data.error = error->errmess;
- content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
return false;
}
diff --git a/frontends/riscos/cookies.c b/frontends/riscos/cookies.c
index 614bc3d10..125d04356 100644
--- a/frontends/riscos/cookies.c
+++ b/frontends/riscos/cookies.c
@@ -445,12 +445,12 @@ nserror ro_gui_cookies_present(void)
res = ro_cookie_init();
if (res == NSERROR_OK) {
- LOG("Presenting");
+ NSLOG(netsurf, INFO, "Presenting");
ro_gui_dialog_open_top(cookie_window->core.wh,
cookie_window->core.toolbar,
600, 800);
} else {
- LOG("Failed presenting code %d", res);
+ NSLOG(netsurf, INFO, "Failed presenting code %d", res);
}
return res;
diff --git a/frontends/riscos/corewindow.c b/frontends/riscos/corewindow.c
index 77dd1c375..84177aa90 100644
--- a/frontends/riscos/corewindow.c
+++ b/frontends/riscos/corewindow.c
@@ -63,22 +63,22 @@ static void update_scrollbars(struct ro_corewindow *ro_cw, wimp_open *open)
int extent_height;
os_box extent;
- LOG("RO corewindow context %p", ro_cw);
+ NSLOG(netsurf, INFO, "RO corewindow context %p", ro_cw);
/* extent of content in not smaller than window so start there */
extent_width = open->visible.x1 - open->visible.x0;
extent_height = open->visible.y0 - open->visible.y1;
- LOG("extent w:%d h:%d content w:%d h:%d origin h:%d",
- extent_width, extent_height,
- ro_cw->content_width, ro_cw->content_height, ro_cw->origin_y);
+ NSLOG(netsurf, INFO,
+ "extent w:%d h:%d content w:%d h:%d origin h:%d", extent_width,
+ extent_height, ro_cw->content_width, ro_cw->content_height,
+ ro_cw->origin_y);
if (ro_cw->content_width > extent_width) {
extent_width = ro_cw->content_width;
}
if (extent_height > (ro_cw->origin_y + ro_cw->content_height)) {
extent_height = ro_cw->origin_y + ro_cw->content_height;
}
- LOG("extent w:%d h:%d",
- extent_width, extent_height);
+ NSLOG(netsurf, INFO, "extent w:%d h:%d", extent_width, extent_height);
extent.x0 = 0;
extent.y0 = extent_height;
extent.x1 = extent_width;
@@ -86,15 +86,15 @@ static void update_scrollbars(struct ro_corewindow *ro_cw, wimp_open *open)
error = xwimp_set_extent(ro_cw->wh, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
error = xwimp_open_window(open);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
@@ -130,8 +130,8 @@ static void ro_cw_redraw(wimp_draw *redraw)
error = xwimp_get_rectangle(redraw, &more);
}
if (error != NULL) {
- LOG("xwimp_redraw_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
@@ -145,7 +145,7 @@ static void ro_cw_scroll(wimp_scroll *scroll)
wimp_open open;
ro_cw = (struct ro_corewindow *)ro_gui_wimp_event_get_user_data(scroll->w);
- LOG("RO corewindow context %p", ro_cw);
+ NSLOG(netsurf, INFO, "RO corewindow context %p", ro_cw);
page_x = scroll->visible.x1 - scroll->visible.x0 - 32;
page_y = scroll->visible.y1 - scroll->visible.y0 - 32;
@@ -202,8 +202,8 @@ static void ro_cw_scroll(wimp_scroll *scroll)
error = xwimp_open_window(&open);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
@@ -231,18 +231,18 @@ static void ro_cw_mouse_at(wimp_pointer *pointer, void *data)
ro_cw = (struct ro_corewindow *)ro_gui_wimp_event_get_user_data(pointer->w);
if (ro_cw == NULL) {
- LOG("no corewindow conext for window: 0x%x",
- (unsigned int)pointer->w);
+ NSLOG(netsurf, INFO, "no corewindow conext for window: 0x%x",
+ (unsigned int)pointer->w);
return;
}
- LOG("RO corewindow context %p", ro_cw);
+ NSLOG(netsurf, INFO, "RO corewindow context %p", ro_cw);
/* Not a Menu click. */
state.w = pointer->w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -285,14 +285,15 @@ static void ro_cw_drag_end(wimp_dragged *drag, void *data)
error = xwimp_drag_box((wimp_drag *) -1);
if (error) {
- LOG("xwimp_drag_box: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_auto_scroll(0, NULL, NULL);
if (error) {
- LOG("xwimp_auto_scroll: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_auto_scroll: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -345,12 +346,13 @@ ro_cw_drag_start(struct ro_corewindow *ro_cw,
break;
}
- LOG("Drag start...");
+ NSLOG(netsurf, INFO, "Drag start...");
error = xwimp_drag_box_with_flags(&drag,
wimp_DRAG_BOX_KEEP_IN_LINE | wimp_DRAG_BOX_CLIP);
if (error) {
- LOG("xwimp_drag_box: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
} else {
auto_scroll.w = ro_cw->wh;
@@ -364,7 +366,8 @@ ro_cw_drag_start(struct ro_corewindow *ro_cw,
error = xwimp_auto_scroll(wimp_AUTO_SCROLL_ENABLE_VERTICAL,
&auto_scroll, NULL);
if (error) {
- LOG("xwimp_auto_scroll: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_auto_scroll: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -388,8 +391,8 @@ static void ro_cw_pointer_leaving(wimp_leaving *leaving, void *data)
ro_cw = (struct ro_corewindow *)ro_gui_wimp_event_get_user_data(leaving->w);
if (ro_cw == NULL) {
- LOG("no corewindow conext for window: 0x%x",
- (unsigned int)leaving->w);
+ NSLOG(netsurf, INFO, "no corewindow conext for window: 0x%x",
+ (unsigned int)leaving->w);
return;
}
@@ -439,14 +442,14 @@ static bool ro_cw_mouse_click(wimp_pointer *pointer)
struct ro_corewindow *ro_cw;
ro_cw = (struct ro_corewindow *)ro_gui_wimp_event_get_user_data(pointer->w);
- LOG("RO corewindow context %p", ro_cw);
+ NSLOG(netsurf, INFO, "RO corewindow context %p", ro_cw);
state.w = ro_cw->wh;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -517,7 +520,7 @@ static bool ro_cw_keypress(wimp_key *key)
nserror res;
ro_cw = (struct ro_corewindow *)ro_gui_wimp_event_get_user_data(key->w);
- LOG("RO corewindow context %p", ro_cw);
+ NSLOG(netsurf, INFO, "RO corewindow context %p", ro_cw);
c = (uint32_t) key->c;
@@ -640,8 +643,8 @@ static void cw_tb_size(void *ctx)
state.w = ro_cw->wh;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -649,8 +652,8 @@ static void cw_tb_size(void *ctx)
0, state.visible.y0 - state.visible.y1,
state.visible.x1 - state.visible.x0, 0);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
@@ -759,8 +762,10 @@ ro_cw_invalidate(struct core_window *cw, const struct rect *r)
info.w = ro_cw->wh;
error = xwimp_get_window_info_header_only(&info);
if (error) {
- LOG("xwimp_get_window_info_header_only: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_info_header_only: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
} else {
@@ -775,8 +780,8 @@ ro_cw_invalidate(struct core_window *cw, const struct rect *r)
info.extent.x0, info.extent.y0,
info.extent.x1, info.extent.y1);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
return NSERROR_OK;
@@ -794,8 +799,8 @@ ro_cw_update_size(struct core_window *cw, int width, int height)
wimp_window_state state;
os_error *error;
- LOG("content resize from w:%d h:%d to w:%d h:%d",
- ro_cw->content_width, ro_cw->content_height, width, height);
+ NSLOG(netsurf, INFO, "content resize from w:%d h:%d to w:%d h:%d",
+ ro_cw->content_width, ro_cw->content_height, width, height);
ro_cw->content_width = width * 2;
ro_cw->content_height = -(2 * height);
@@ -803,8 +808,8 @@ ro_cw_update_size(struct core_window *cw, int width, int height)
state.w = ro_cw->wh;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -848,8 +853,8 @@ ro_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
state.w = ro_cw->wh;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
diff --git a/frontends/riscos/dialog.c b/frontends/riscos/dialog.c
index 6414778db..a50d1289b 100644
--- a/frontends/riscos/dialog.c
+++ b/frontends/riscos/dialog.c
@@ -220,7 +220,8 @@ wimp_w ro_gui_dialog_create(const char *template_name)
window->sprite_area = gui_sprites;
error = xwimp_create_window(window, &w);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
}
@@ -259,12 +260,13 @@ wimp_window * ro_gui_dialog_load_template(const char *template_name)
error = xwimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS,
name, 0, &window_size, &data_size, &context);
if (error) {
- LOG("xwimp_load_template: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_load_template: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
}
if (!context) {
- LOG("template '%s' missing", template_name);
+ NSLOG(netsurf, INFO, "template '%s' missing", template_name);
xwimp_close_template();
die("Template");
}
@@ -281,7 +283,8 @@ wimp_window * ro_gui_dialog_load_template(const char *template_name)
error = xwimp_load_template(window, data, data + data_size,
wimp_NO_FONTS, name, 0, 0, 0, 0);
if (error) {
- LOG("xwimp_load_template: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_load_template: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
}
@@ -309,7 +312,8 @@ void ro_gui_dialog_open(wimp_w w)
state.w = w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -356,7 +360,8 @@ void ro_gui_dialog_close(wimp_w close)
*/
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
} else if (caret.w == close) {
/* Check if we are a persistent window */
@@ -367,7 +372,10 @@ void ro_gui_dialog_close(wimp_w close)
32, -1);
/* parent may have been closed first */
if ((error) && (error->errnum != 0x287)) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -375,7 +383,8 @@ void ro_gui_dialog_close(wimp_w close)
error = xwimp_close_window(close);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -460,7 +469,8 @@ void ro_gui_dialog_open_at_pointer(wimp_w w)
/* get the pointer position */
error = xwimp_get_pointer_info(&ptr);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -483,7 +493,8 @@ void ro_gui_dialog_open_xy(wimp_w w, int x, int y)
state.w = w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -498,7 +509,8 @@ void ro_gui_dialog_open_xy(wimp_w w, int x, int y)
* on screen */
error = xwimp_close_window(w);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -527,7 +539,10 @@ static void ro_gui_dialog_open_centre_parent(wimp_w parent, wimp_w child)
state.w = parent;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -544,7 +559,8 @@ static void ro_gui_dialog_open_centre_parent(wimp_w parent, wimp_w child)
state.w = child;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -607,7 +623,7 @@ void ro_gui_dialog_add_persistent(wimp_w parent, wimp_w w) {
return;
}
}
- LOG("Unable to map persistent dialog to parent.");
+ NSLOG(netsurf, INFO, "Unable to map persistent dialog to parent.");
return;
}
@@ -636,7 +652,9 @@ void ro_gui_dialog_close_persistent(wimp_w parent) {
w = persistent_dialog[i].dialog;
ro_gui_dialog_close(w);
if (ro_gui_wimp_event_close_window(w))
- LOG("Persistent dialog close event: 0x%x", (unsigned)w);
+ NSLOG(netsurf, INFO,
+ "Persistent dialog close event: 0x%x",
+ (unsigned)w);
persistent_dialog[i].parent = NULL;
persistent_dialog[i].dialog = NULL;
}
@@ -713,7 +731,7 @@ static bool ro_gui_dialog_open_url_init(void)
if ((definition->icons[ICON_OPENURL_URL].flags & wimp_ICON_INDIRECTED)
== 0) {
- LOG("open_url URL icon not indirected");
+ NSLOG(netsurf, INFO, "open_url URL icon not indirected");
xwimp_close_template();
die("Template");
}
@@ -731,7 +749,8 @@ static bool ro_gui_dialog_open_url_init(void)
error = xwimp_create_window(definition, &dialog_openurl);
if (error != NULL) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
}
diff --git a/frontends/riscos/download.c b/frontends/riscos/download.c
index 561409ed1..bdc705426 100644
--- a/frontends/riscos/download.c
+++ b/frontends/riscos/download.c
@@ -261,7 +261,10 @@ static nserror download_ro_filetype(download_context *ctx, bits *ftype_out)
mime_type = download_context_get_mime_type(ctx);
error = xmimemaptranslate_mime_type_to_filetype(mime_type, &ftype);
if (error) {
- LOG("xmimemaptranslate_mime_type_to_filetype: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xmimemaptranslate_mime_type_to_filetype: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
ftype = 0xffd;
}
@@ -339,7 +342,8 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
error = xosfind_openoutw(osfind_NO_PATH | osfind_ERROR_IF_DIR,
temp_name, 0, &dw->file);
if (error) {
- LOG("xosfind_openoutw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openoutw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
free(dw);
return 0;
@@ -372,7 +376,7 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
filename = strdup(temp_name);
if (filename == NULL) {
- LOG("Failed to establish download filename.");
+ NSLOG(netsurf, INFO, "Failed to establish download filename.");
ro_warn_user("SaveError", error->errmess);
free(dw);
return 0;
@@ -404,7 +408,7 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
if (err != NSERROR_OK) {
/* badenc should never happen */
assert(err !=NSERROR_BAD_ENCODING);
- LOG("utf8_to_local_encoding failed");
+ NSLOG(netsurf, INFO, "utf8_to_local_encoding failed");
ro_warn_user("NoMemory", 0);
free(dw);
return 0;
@@ -430,7 +434,8 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
/* create and open the download window */
error = xwimp_create_window(download_template, &dw->window);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
free(dw);
return 0;
@@ -485,7 +490,8 @@ static void gui_download_window_error(struct gui_download_window *dw,
wimp_COLOUR_RED << wimp_ICON_FG_COLOUR_SHIFT,
wimp_ICON_FG_COLOUR);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -493,7 +499,8 @@ static void gui_download_window_error(struct gui_download_window *dw,
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH,
wimp_ICON_SHADED, 0);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -501,7 +508,8 @@ static void gui_download_window_error(struct gui_download_window *dw,
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON,
wimp_ICON_SHADED, wimp_ICON_SHADED);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -528,11 +536,13 @@ static nserror gui_download_window_data(struct gui_download_window *dw,
error = xosgbpb_writew(dw->file, (const byte *) data, size,
&unwritten);
if (error) {
- LOG("xosgbpb_writew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosgbpb_writew: 0x%x: %s",
+ error->errnum, error->errmess);
msg = error->errmess;
} else if (unwritten) {
- LOG("xosgbpb_writew: unwritten %i", unwritten);
+ NSLOG(netsurf, INFO, "xosgbpb_writew: unwritten %i",
+ unwritten);
msg = messages_get("Unwritten");
}
else {
@@ -555,20 +565,29 @@ static nserror gui_download_window_data(struct gui_download_window *dw,
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON,
wimp_ICON_SHADED, 0);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_DESTINATION,
wimp_ICON_DELETED, wimp_ICON_DELETED);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_set_icon_state(dw->window,
ICON_DOWNLOAD_PATH, wimp_ICON_DELETED, 0);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -717,13 +736,15 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
download_progress_x0 + width,
download_progress_y1);
if (error) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_STATUS, 0, 0);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -759,13 +780,17 @@ void ro_gui_download_window_hide_caret(struct gui_download_window *dw)
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
else if (caret.w == dw->window) {
error = xwimp_set_caret_position(dw->window, (wimp_i)-1, 0, 0, 1 << 25, -1);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_caret_position: 0x%x : %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -791,7 +816,8 @@ static void gui_download_window_done(struct gui_download_window *dw)
error = xosfind_closew(dw->file);
if (error) {
- LOG("xosfind_closew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_closew: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
dw->file = 0;
@@ -800,7 +826,8 @@ static void gui_download_window_done(struct gui_download_window *dw)
error = xosfile_set_type(dw->path,
dw->file_type);
if (error) {
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
@@ -856,7 +883,8 @@ bool ro_gui_download_click(wimp_pointer *pointer)
*dot = 0;
error = xos_cli(command);
if (error) {
- LOG("xos_cli: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_cli: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
}
}
@@ -929,7 +957,8 @@ static void ro_gui_download_drag_end(wimp_dragged *drag, void *data)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -959,7 +988,10 @@ static void ro_gui_download_drag_end(wimp_dragged *drag, void *data)
error = xwimp_send_message_to_window(wimp_USER_MESSAGE, &message,
pointer.w, pointer.i, 0);
if (error) {
- LOG("xwimp_send_message_to_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_send_message_to_window: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -1011,7 +1043,10 @@ char *ro_gui_download_canonicalise(const char *path)
error = xosfscontrol_canonicalise_path(path, NULL, NULL, NULL, 0, &spare);
if (error) {
- LOG("xosfscontrol_canonicalise_path: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfscontrol_canonicalise_path: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NULL;
}
@@ -1020,7 +1055,10 @@ char *ro_gui_download_canonicalise(const char *path)
error = xosfscontrol_canonicalise_path(path, buf, NULL, NULL,
1 - spare, NULL);
if (error) {
- LOG("xosfscontrol_canonicalise_path: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfscontrol_canonicalise_path: 0x%x: %s",
+ error->errnum,
+ error->errmess);
free(buf);
return NULL;
@@ -1065,13 +1103,17 @@ bool ro_gui_download_check_space(struct gui_download_window *dw,
error = xosfscontrol_free_space64(dir, &free_lo, &free_hi,
&max_file, NULL, NULL);
if (error) {
- LOG("xosfscontrol_free_space64: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfscontrol_free_space64: 0x%x: %s",
+ error->errnum, error->errmess);
free_hi = 0;
error = xosfscontrol_free_space(dir, (int*)&free_lo,
&max_file, NULL);
if (error) {
- LOG("xosfscontrol_free_space: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfscontrol_free_space: 0x%x: %s",
+ error->errnum,
+ error->errmess);
/* close our eyes and hope */
free(dir);
return true;
@@ -1108,7 +1150,10 @@ bool ro_gui_download_check_space(struct gui_download_window *dw,
error = xosargs_read_allocation(dw->file,
&allocation);
if (error) {
- LOG("xosargs_read_allocation: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosargs_read_allocation: 0x%x : %s",
+ error->errnum,
+ error->errmess);
}
else {
space += allocation;
@@ -1147,7 +1192,8 @@ os_error *ro_gui_download_move(struct gui_download_window *dw,
error = xosfind_closew(dw->file);
dw->file = 0;
if (error) {
- LOG("xosfind_closew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_closew: 0x%x: %s",
+ error->errnum, error->errmess);
return error;
}
}
@@ -1165,11 +1211,13 @@ os_error *ro_gui_download_move(struct gui_download_window *dw,
osfscontrol_COPY_LOOK,
0, 0, 0, 0, 0);
if (error) {
- LOG("xosfscontrol_copy: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfscontrol_copy: 0x%x: %s",
+ error->errnum, error->errmess);
return error;
}
} else if (error) {
- LOG("xosfscontrol_rename: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfscontrol_rename: 0x%x: %s",
+ error->errnum, error->errmess);
return error;
}
@@ -1179,20 +1227,23 @@ os_error *ro_gui_download_move(struct gui_download_window *dw,
fileswitch_ATTR_OWNER_READ |
fileswitch_ATTR_OWNER_WRITE);
if (error) {
- LOG("xosfile_write: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_write: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
error = xosfind_openupw(osfind_NO_PATH | osfind_ERROR_IF_DIR,
dest_file, 0, &dw->file);
if (error) {
- LOG("xosfind_openupw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openupw: 0x%x: %s",
+ error->errnum, error->errmess);
return error;
}
error = xosargs_set_ptrw(dw->file, dw->received);
if (error) {
- LOG("xosargs_set_ptrw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosargs_set_ptrw: 0x%x: %s",
+ error->errnum, error->errmess);
return error;
}
@@ -1201,7 +1252,8 @@ os_error *ro_gui_download_move(struct gui_download_window *dw,
error = xosfile_set_type(dest_file,
dw->file_type);
if (error) {
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
}
@@ -1273,7 +1325,8 @@ bool ro_gui_download_save(struct gui_download_window *dw,
error = xosfile_read_stamped(file_name, &obj_type,
NULL, NULL, NULL, NULL, NULL);
if (error) {
- LOG("xosfile_read_stamped: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_read_stamped: 0x%x:%s",
+ error->errnum, error->errmess);
return false;
}
@@ -1309,12 +1362,16 @@ bool ro_gui_download_save(struct gui_download_window *dw,
error = xosfind_openupw(osfind_NO_PATH | osfind_ERROR_IF_DIR,
temp_name, 0, &dw->file);
if (error) {
- LOG("xosfind_openupw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openupw: 0x%x: %s",
+ error->errnum, error->errmess);
} else {
error = xosargs_set_ptrw(dw->file, dw->received);
if (error) {
- LOG("xosargs_set_ptrw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosargs_set_ptrw: 0x%x: %s",
+ error->errnum,
+ error->errmess);
}
}
@@ -1336,7 +1393,8 @@ bool ro_gui_download_save(struct gui_download_window *dw,
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON,
wimp_ICON_SHADED, wimp_ICON_SHADED);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -1349,13 +1407,15 @@ bool ro_gui_download_save(struct gui_download_window *dw,
error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH,
wimp_ICON_DELETED, wimp_ICON_DELETED);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_set_icon_state(dw->window,
ICON_DOWNLOAD_DESTINATION, wimp_ICON_DELETED, 0);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -1401,7 +1461,8 @@ void ro_gui_download_send_dataload(struct gui_download_window *dw)
* for the rather depressing details.
*/
if (error && error->errnum != error_WIMP_BAD_HANDLE) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -1482,7 +1543,8 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
/* delete window */
error = xwimp_delete_window(dw->window);
if (error) {
- LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
ro_gui_wimp_event_finalise(dw->window);
@@ -1491,7 +1553,8 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
if (dw->file) {
error = xosfind_closew(dw->file);
if (error) {
- LOG("xosfind_closew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_closew: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
}
@@ -1502,7 +1565,8 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
error = xosfile_delete(temp_name, 0, 0, 0, 0, 0);
if (error) {
- LOG("xosfile_delete: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_delete: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
}
diff --git a/frontends/riscos/filetype.c b/frontends/riscos/filetype.c
index 75ff41414..73651cd63 100644
--- a/frontends/riscos/filetype.c
+++ b/frontends/riscos/filetype.c
@@ -72,7 +72,7 @@ const char *fetch_filetype(const char *unix_path)
int objtype;
if (!path) {
- LOG("Insufficient memory for calloc");
+ NSLOG(netsurf, INFO, "Insufficient memory for calloc");
ro_warn_user("NoMemory", 0);
return "application/riscos";
}
@@ -80,7 +80,7 @@ const char *fetch_filetype(const char *unix_path)
/* convert path to RISC OS format and read file type */
r = __riscosify(unix_path, 0, __RISCOSIFY_NO_SUFFIX, path, len, 0);
if (r == 0) {
- LOG("__riscosify failed");
+ NSLOG(netsurf, INFO, "__riscosify failed");
free(path);
return "application/riscos";
}
@@ -88,7 +88,9 @@ const char *fetch_filetype(const char *unix_path)
error = xosfile_read_stamped_no_path(path, &objtype, 0, 0, 0, 0,
&file_type);
if (error) {
- LOG("xosfile_read_stamped_no_path failed: %s", error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_read_stamped_no_path failed: %s",
+ error->errmess);
free(path);
return "application/riscos";
}
@@ -108,7 +110,10 @@ const char *fetch_filetype(const char *unix_path)
slash+1, &temp);
if (error)
/* ignore error and leave file_type alone */
- LOG("xmimemaptranslate_extension_to_filetype: ""0x%x %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xmimemaptranslate_extension_to_filetype: ""0x%x %s",
+ error->errnum,
+ error->errmess);
else
file_type = temp;
}
@@ -126,7 +131,7 @@ const char *fetch_filetype(const char *unix_path)
/* not in internal table, so ask MimeMap */
error = xmimemaptranslate_filetype_to_mime_type(file_type, type_buf);
if (error) {
- LOG("0x%x %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "0x%x %s", error->errnum, error->errmess);
free(path);
return "application/riscos";
}
@@ -139,7 +144,7 @@ const char *fetch_filetype(const char *unix_path)
free(path);
- LOG("mime type '%s'", type_buf);
+ NSLOG(netsurf, INFO, "mime type '%s'", type_buf);
return (const char *)type_buf;
}
@@ -155,14 +160,15 @@ char *fetch_mimetype(const char *ro_path)
struct type_entry *t;
if (!mime) {
- LOG("Insufficient memory for calloc");
+ NSLOG(netsurf, INFO, "Insufficient memory for calloc");
ro_warn_user("NoMemory", 0);
return 0;
}
e = xosfile_read_no_path(ro_path, &objtype, &load, 0, 0, 0);
if (e) {
- LOG("xosfile_read_no_path: 0x%x: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "xosfile_read_no_path: 0x%x: %s",
+ e->errnum, e->errmess);
free(mime);
return 0;
}
@@ -188,7 +194,7 @@ char *fetch_mimetype(const char *ro_path)
if (e)
/* if we get an error here, simply ignore it and
* leave filetype unchanged */
- LOG("0x%x %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "0x%x %s", e->errnum, e->errmess);
else
filetype = load;
}
@@ -205,7 +211,10 @@ char *fetch_mimetype(const char *ro_path)
/* not in internal table, so ask MimeMap */
e = xmimemaptranslate_filetype_to_mime_type(filetype, mime);
if (e) {
- LOG("xmimemaptranslate_filetype_to_mime_type: 0x%x: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO,
+ "xmimemaptranslate_filetype_to_mime_type: 0x%x: %s",
+ e->errnum,
+ e->errmess);
free(mime);
return 0;
}
@@ -322,7 +331,7 @@ bits ro_filetype_from_unix_path(const char *unix_path)
bits file_type;
if (!path) {
- LOG("Insufficient memory for calloc");
+ NSLOG(netsurf, INFO, "Insufficient memory for calloc");
ro_warn_user("NoMemory", 0);
return osfile_TYPE_DATA;
}
@@ -330,7 +339,7 @@ bits ro_filetype_from_unix_path(const char *unix_path)
/* convert path to RISC OS format and read file type */
r = __riscosify(unix_path, 0, __RISCOSIFY_NO_SUFFIX, path, len, 0);
if (r == 0) {
- LOG("__riscosify failed");
+ NSLOG(netsurf, INFO, "__riscosify failed");
free(path);
return osfile_TYPE_DATA;
}
@@ -338,7 +347,9 @@ bits ro_filetype_from_unix_path(const char *unix_path)
error = xosfile_read_stamped_no_path(path, 0, 0, 0, 0, 0,
&file_type);
if (error) {
- LOG("xosfile_read_stamped_no_path failed: %s", error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_read_stamped_no_path failed: %s",
+ error->errmess);
free(path);
return osfile_TYPE_DATA;
}
diff --git a/frontends/riscos/font.c b/frontends/riscos/font.c
index 560afc785..8913efeeb 100644
--- a/frontends/riscos/font.c
+++ b/frontends/riscos/font.c
@@ -65,7 +65,8 @@ static void nsfont_check_fonts(void)
"<NetSurf$Dir>.FixFonts", 0);
die("FontBadInst");
} else {
- LOG("xfont_find_font: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xfont_find_font: 0x%x: %s",
+ error->errnum, error->errmess);
snprintf(s, sizeof s, messages_get("FontError"),
error->errmess);
die(s);
@@ -74,7 +75,8 @@ static void nsfont_check_fonts(void)
error = xfont_lose_font(font);
if (error) {
- LOG("xfont_lose_font: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xfont_lose_font: 0x%x: %s",
+ error->errnum, error->errmess);
snprintf(s, sizeof s, messages_get("FontError"),
error->errmess);
die(s);
@@ -118,17 +120,20 @@ void nsfont_init(void)
nsfont_check_fonts();
- LOG("Initialise RUfl");
+ NSLOG(netsurf, INFO, "Initialise RUfl");
code = rufl_init();
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_init: rufl_FONT_MANAGER_ERROR: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_init: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_init: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_init: 0x%x", code);
die("The Unicode font library could not be initialized. "
"Please report this to the developers.");
}
- LOG("RUfl initialised");
+ NSLOG(netsurf, INFO, "RUfl initialised");
if (rufl_family_list_entries == 0)
die("No fonts could be found. At least one font must be "
@@ -162,9 +167,10 @@ const char *nsfont_fallback_font(void)
const char *fallback = "Homerton";
if (!nsfont_exists(fallback)) {
- LOG("Homerton not found, dumping RUfl family list");
+ NSLOG(netsurf, INFO,
+ "Homerton not found, dumping RUfl family list");
for (unsigned int i = 0; i < rufl_family_list_entries; i++) {
- LOG("'%s'", rufl_family_list[i]);
+ NSLOG(netsurf, INFO, "'%s'", rufl_family_list[i]);
}
fallback = rufl_family_list[0];
}
@@ -230,9 +236,12 @@ ro_font_width(const plot_font_style_t *fstyle,
width);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_width: rufl_FONT_MANAGER_ERROR: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_width: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_width: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_width: 0x%x", code);
/* ro_warn_user("MiscError", "font error"); */
*width = 0;
return NSERROR_INVALID;
@@ -276,9 +285,12 @@ ro_font_position(const plot_font_style_t *fstyle,
x * 2, char_offset, actual_x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_x_to_offset: rufl_FONT_MANAGER_ERROR: ""0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_x_to_offset: rufl_FONT_MANAGER_ERROR: ""0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_x_to_offset: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_x_to_offset: 0x%x", code);
/* ro_warn_user("MiscError", "font error"); */
*char_offset = 0;
*actual_x = 0;
@@ -335,10 +347,12 @@ ro_font_split(const plot_font_style_t *fstyle,
x * 2, char_offset, actual_x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR) {
- LOG("rufl_split: rufl_FONT_MANAGER_ERROR: ""0x%x: %s",
- rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_split: rufl_FONT_MANAGER_ERROR: ""0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
} else {
- LOG("rufl_split: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_split: 0x%x", code);
}
/* ro_warn_user("MiscError", "font error"); */
*char_offset = 0;
@@ -370,10 +384,12 @@ ro_font_split(const plot_font_style_t *fstyle,
actual_x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR) {
- LOG("rufl_width: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
- rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_width: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
} else {
- LOG("rufl_width: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_width: 0x%x", code);
}
/* ro_warn_user("MiscError", "font error"); */
*char_offset = 0;
@@ -416,9 +432,12 @@ bool nsfont_paint(const plot_font_style_t *fstyle, const char *string,
string, length, x, y, flags);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR) {
- LOG("rufl_paint: rufl_FONT_MANAGER_ERROR: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_paint: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
} else {
- LOG("rufl_paint: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_paint: 0x%x", code);
}
}
@@ -513,7 +532,8 @@ ro_gui_wimp_desktop_font(char *family,
error = xwimpreadsysinfo_font(&font_handle, NULL);
if (error) {
- LOG("xwimpreadsysinfo_font: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimpreadsysinfo_font: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
goto failsafe;
}
@@ -525,20 +545,22 @@ ro_gui_wimp_desktop_font(char *family,
error = xfont_read_identifier(font_handle, NULL, &used);
if (error) {
- LOG("xfont_read_identifier: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xfont_read_identifier: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
goto failsafe;
}
if (family_size < (size_t) used + 1) {
- LOG("desktop font name too long");
+ NSLOG(netsurf, INFO, "desktop font name too long");
goto failsafe;
}
error = xfont_read_defn(font_handle, (byte *) family,
&ptx, &pty, NULL, NULL, NULL, NULL);
if (error) {
- LOG("xfont_read_defn: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xfont_read_defn: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
goto failsafe;
}
@@ -550,7 +572,7 @@ ro_gui_wimp_desktop_font(char *family,
}
}
- LOG("desktop font \"%s\"", family);
+ NSLOG(netsurf, INFO, "desktop font \"%s\"", family);
if (strcasestr(family, ".Medium"))
style = rufl_WEIGHT_500;
@@ -566,7 +588,8 @@ ro_gui_wimp_desktop_font(char *family,
*psize = max(ptx, pty);
*pstyle = style;
- LOG("family \"%s\", size %i, style %i", family, *psize, style);
+ NSLOG(netsurf, INFO, "family \"%s\", size %i, style %i", family,
+ *psize, style);
return;
diff --git a/frontends/riscos/global_history.c b/frontends/riscos/global_history.c
index d122a4d7f..7dfc58317 100644
--- a/frontends/riscos/global_history.c
+++ b/frontends/riscos/global_history.c
@@ -474,12 +474,12 @@ nserror ro_gui_global_history_present(void)
res = ro_global_history_init();
if (res == NSERROR_OK) {
- LOG("Presenting");
+ NSLOG(netsurf, INFO, "Presenting");
ro_gui_dialog_open_top(global_history_window->core.wh,
global_history_window->core.toolbar,
600, 800);
} else {
- LOG("Failed presenting code %d", res);
+ NSLOG(netsurf, INFO, "Failed presenting code %d", res);
}
return res;
diff --git a/frontends/riscos/gui.c b/frontends/riscos/gui.c
index 576e1ff12..be1bc8d9a 100644
--- a/frontends/riscos/gui.c
+++ b/frontends/riscos/gui.c
@@ -195,6 +195,7 @@ static struct
static nsurl *gui_get_resource_url(const char *path)
{
static const char base_url[] = "file:///NetSurf:/Resources/";
+ const char *lang;
size_t path_len, length;
char *raw;
nsurl *url = NULL;
@@ -220,8 +221,12 @@ static nsurl *gui_get_resource_url(const char *path)
path_len = strlen(path);
+ lang = ro_gui_default_language();
+
/* Find max URL length */
- length = SLEN(base_url) + SLEN("xx/") + path_len + 1;
+ length = SLEN(base_url) +
+ strlen(lang) + 1 + /* <lang> + / */
+ path_len + 1; /* + NUL */
raw = malloc(length);
if (raw != NULL) {
@@ -230,13 +235,11 @@ static nsurl *gui_get_resource_url(const char *path)
ptr += SLEN(base_url);
/* Add language directory to URL, for translated files */
- /* TODO: handle non-en langauages
- * handle non-html translated files */
+ /* TODO: handle non-html translated files */
if (path_len > SLEN(".html") &&
strncmp(path + path_len - SLEN(".html"),
".html", SLEN(".html")) == 0) {
- memcpy(ptr, "en/", SLEN("en/"));
- ptr += SLEN("en/");
+ ptr += sprintf(ptr, "%s/", lang);
}
/* Add filename to URL */
@@ -274,8 +277,10 @@ set_colour_from_wimp(struct nsoption_s *opts,
error = xwimp_read_true_palette((os_palette *) &palette);
if (error != NULL) {
- LOG("xwimp_read_palette: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_read_palette: 0x%x: %s",
+ error->errnum,
+ error->errmess);
} else {
/* entries are in B0G0R0LL */
def_colour = palette.entries[wimp] >> 8;
@@ -307,7 +312,7 @@ static nserror set_defaults(struct nsoption_s *defaults)
if (nsoption_charp(ca_bundle) == NULL ||
nsoption_charp(cookie_file) == NULL ||
nsoption_charp(cookie_jar) == NULL) {
- LOG("Failed initialising default options");
+ NSLOG(netsurf, INFO, "Failed initialising default options");
return NSERROR_BAD_PARAMETER;
}
@@ -430,7 +435,7 @@ static void ro_gui_signal(int sig)
if (used) {
int curr_slot;
xwimp_slot_size(-1, -1, &curr_slot, 0, 0);
- LOG("saving WimpSlot, size 0x%x", curr_slot);
+ NSLOG(netsurf, INFO, "saving WimpSlot, size 0x%x", curr_slot);
xosfile_save("$.NetSurf_Slot", 0x8000, 0,
(byte *) 0x8000,
(byte *) 0x8000 + curr_slot);
@@ -440,7 +445,11 @@ static void ro_gui_signal(int sig)
byte *base_address;
xosdynamicarea_read(__dynamic_num, &size,
&base_address, 0, 0, 0, 0, 0);
- LOG("saving DA %i, base %p, size 0x%x", __dynamic_num, base_address, size);
+ NSLOG(netsurf, INFO,
+ "saving DA %i, base %p, size 0x%x",
+ __dynamic_num,
+ base_address,
+ size);
xosfile_save("$.NetSurf_DA",
(bits) base_address, 0,
base_address,
@@ -452,7 +461,7 @@ static void ro_gui_signal(int sig)
* defines a coredump directory. */
const _kernel_oserror *err = __unixlib_write_coredump (NULL);
if (err != NULL)
- LOG("Coredump failed: %s", err->errmess);
+ NSLOG(netsurf, INFO, "Coredump failed: %s", err->errmess);
#endif
xhourglass_colours(old_sand, old_glass, 0, 0);
@@ -536,7 +545,8 @@ static char *ro_gui_uri_file_parse(const char *file_name, char **uri_title)
*uri_title = NULL;
fp = fopen(file_name, "rb");
if (!fp) {
- LOG("fopen(\"%s\", \"rb\"): %i: %s", file_name, errno, strerror(errno));
+ NSLOG(netsurf, INFO, "fopen(\"%s\", \"rb\"): %i: %s",
+ file_name, errno, strerror(errno));
ro_warn_user("LoadError", strerror(errno));
return 0;
}
@@ -597,14 +607,16 @@ static char *ro_gui_url_file_parse(const char *file_name)
fp = fopen(file_name, "r");
if (!fp) {
- LOG("fopen(\"%s\", \"r\"): %i: %s", file_name, errno, strerror(errno));
+ NSLOG(netsurf, INFO, "fopen(\"%s\", \"r\"): %i: %s",
+ file_name, errno, strerror(errno));
ro_warn_user("LoadError", strerror(errno));
return 0;
}
if (!fgets(line, sizeof line, fp)) {
if (ferror(fp)) {
- LOG("fgets: %i: %s", errno, strerror(errno));
+ NSLOG(netsurf, INFO, "fgets: %i: %s", errno,
+ strerror(errno));
ro_warn_user("LoadError", strerror(errno));
} else
ro_warn_user("LoadError", messages_get("EmptyError"));
@@ -641,7 +653,8 @@ static char *ro_gui_ieurl_file_parse(const char *file_name)
fp = fopen(file_name, "r");
if (!fp) {
- LOG("fopen(\"%s\", \"r\"): %i: %s", file_name, errno, strerror(errno));
+ NSLOG(netsurf, INFO, "fopen(\"%s\", \"r\"): %i: %s",
+ file_name, errno, strerror(errno));
ro_warn_user("LoadError", strerror(errno));
return 0;
}
@@ -660,7 +673,7 @@ static char *ro_gui_ieurl_file_parse(const char *file_name)
}
}
if (ferror(fp)) {
- LOG("fgets: %i: %s", errno, strerror(errno));
+ NSLOG(netsurf, INFO, "fgets: %i: %s", errno, strerror(errno));
ro_warn_user("LoadError", strerror(errno));
fclose(fp);
return 0;
@@ -732,7 +745,8 @@ static void ro_msg_dataopen(wimp_message *message)
message->your_ref = message->my_ref;
oserror = xwimp_send_message(wimp_USER_MESSAGE, message, message->sender);
if (oserror) {
- LOG("xwimp_send_message: 0x%x: %s", oserror->errnum, oserror->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ oserror->errnum, oserror->errmess);
ro_warn_user("WimpError", oserror->errmess);
return;
}
@@ -855,7 +869,8 @@ static void ro_msg_dataload(wimp_message *message)
oserror = xwimp_send_message(wimp_USER_MESSAGE, message,
message->sender);
if (oserror) {
- LOG("xwimp_send_message: 0x%x: %s", oserror->errnum, oserror->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ oserror->errnum, oserror->errmess);
ro_warn_user("WimpError", oserror->errmess);
return;
}
@@ -925,7 +940,10 @@ static void ro_msg_datasave(wimp_message *message)
error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)dataxfer, message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_send_message: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -977,7 +995,8 @@ static void ro_msg_prequit(wimp_message *message)
error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
message, message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1003,7 +1022,8 @@ static void ro_msg_save_desktop(wimp_message *message)
}
if (error) {
- LOG("xosgbpb_writew/xos_bputw: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosgbpb_writew/xos_bputw: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
/* we must cancel the save by acknowledging the message */
@@ -1011,7 +1031,8 @@ static void ro_msg_save_desktop(wimp_message *message)
error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
message, message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1062,7 +1083,8 @@ static void ro_gui_get_screen_properties(void)
error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals);
if (error) {
- LOG("xos_read_vdu_variables: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_read_vdu_variables: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
return;
}
@@ -1079,9 +1101,9 @@ static void ro_gui_check_resolvers(void)
char *resolvers;
resolvers = getenv("Inet$Resolvers");
if (resolvers && resolvers[0]) {
- LOG("Inet$Resolvers '%s'", resolvers);
+ NSLOG(netsurf, INFO, "Inet$Resolvers '%s'", resolvers);
} else {
- LOG("Inet$Resolvers not set or empty");
+ NSLOG(netsurf, INFO, "Inet$Resolvers not set or empty");
ro_warn_user("Resolvers", 0);
}
}
@@ -1196,7 +1218,8 @@ static nserror gui_init(int argc, char** argv)
PTR_WIMP_MESSAGE_LIST(&task_messages), 0,
&task_handle);
if (error) {
- LOG("xwimp_initialise: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_initialise: 0x%x: %s",
+ error->errnum, error->errmess);
die(error->errmess);
}
/* Register message handlers */
@@ -1234,7 +1257,8 @@ static nserror gui_init(int argc, char** argv)
die("Failed to locate Templates resource.");
error = xwimp_open_template(path);
if (error) {
- LOG("xwimp_open_template failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_template failed: 0x%x: %s",
+ error->errnum, error->errmess);
die(error->errmess);
}
@@ -1275,7 +1299,7 @@ static nserror gui_init(int argc, char** argv)
/* parse command-line arguments */
if (argc == 2) {
- LOG("parameters: '%s'", argv[1]);
+ NSLOG(netsurf, INFO, "parameters: '%s'", argv[1]);
/* this is needed for launching URI files */
if (strcasecmp(argv[1], "-nowin") == 0) {
return NSERROR_OK;
@@ -1283,7 +1307,8 @@ static nserror gui_init(int argc, char** argv)
ret = nsurl_create(NETSURF_HOMEPAGE, &url);
}
else if (argc == 3) {
- LOG("parameters: '%s' '%s'", argv[1], argv[2]);
+ NSLOG(netsurf, INFO, "parameters: '%s' '%s'", argv[1],
+ argv[2]);
open_window = true;
/* HTML files */
@@ -1294,7 +1319,7 @@ static nserror gui_init(int argc, char** argv)
else if (strcasecmp(argv[1], "-urlf") == 0) {
char *urlf = ro_gui_url_file_parse(argv[2]);
if (!urlf) {
- LOG("allocation failed");
+ NSLOG(netsurf, INFO, "allocation failed");
die("Insufficient memory for URL");
}
ret = nsurl_create(urlf, &url);
@@ -1306,7 +1331,8 @@ static nserror gui_init(int argc, char** argv)
}
/* Unknown => exit here. */
else {
- LOG("Unknown parameters: '%s' '%s'", argv[1], argv[2]);
+ NSLOG(netsurf, INFO, "Unknown parameters: '%s' '%s'",
+ argv[1], argv[2]);
return NSERROR_BAD_PARAMETER;
}
}
@@ -1354,7 +1380,8 @@ const char *ro_gui_default_language(void)
/* choose a language from the configured country number */
error = xosbyte_read(osbyte_VAR_COUNTRY_NUMBER, &country);
if (error) {
- LOG("xosbyte_read failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosbyte_read failed: 0x%x: %s",
+ error->errnum, error->errmess);
country = 1;
}
switch (country) {
@@ -1405,7 +1432,10 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
/* calculate the canonical risc os path */
error = xosfscontrol_canonicalise_path(path, 0, 0, 0, 0, &spare);
if (error) {
- LOG("xosfscontrol_canonicalise_path failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfscontrol_canonicalise_path failed: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("PathToURL", error->errmess);
return NSERROR_NOT_FOUND;
}
@@ -1418,7 +1448,10 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
error = xosfscontrol_canonicalise_path(path, canonical_path, 0, 0, 1 - spare, 0);
if (error) {
- LOG("xosfscontrol_canonicalise_path failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfscontrol_canonicalise_path failed: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("PathToURL", error->errmess);
free(canonical_path);
return NSERROR_NOT_FOUND;
@@ -1428,7 +1461,7 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
unix_path = __unixify(canonical_path, __RISCOSIFY_NO_REVERSE_SUFFIX, NULL, 0, 0);
if (unix_path == NULL) {
- LOG("__unixify failed: %s", canonical_path);
+ NSLOG(netsurf, INFO, "__unixify failed: %s", canonical_path);
free(canonical_path);
return NSERROR_BAD_PARAMETER;
}
@@ -1446,7 +1479,7 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
urllen = strlen(escaped_path) + FILE_SCHEME_PREFIX_LEN + 1;
url = malloc(urllen);
if (url == NULL) {
- LOG("Unable to allocate url");
+ NSLOG(netsurf, INFO, "Unable to allocate url");
free(escaped_path);
return NSERROR_NOMEM;
}
@@ -1596,7 +1629,8 @@ static void ro_gui_keypress_cb(void *pw)
if (ro_gui_wimp_event_keypress(key) == false) {
os_error *error = xwimp_process_key(key->c);
if (error) {
- LOG("xwimp_process_key: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_process_key: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1633,7 +1667,8 @@ static void ro_gui_keypress(wimp_key *key)
} else if (ro_gui_wimp_event_keypress(key) == false) {
os_error *error = xwimp_process_key(key->c);
if (error) {
- LOG("xwimp_process_key: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_process_key: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1905,7 +1940,8 @@ void ro_gui_open_window_request(wimp_open *open)
error = xwimp_open_window(open);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1926,7 +1962,8 @@ static void ro_gui_view_source_bounce(wimp_message *message)
sprintf(command, "@RunType_FFF %s", filename);
error = xwimp_start_task(command, 0);
if (error) {
- LOG("xwimp_start_task failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_start_task failed: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1989,7 +2026,7 @@ void ro_gui_view_source(struct hlcache_handle *c)
r = __riscosify(full_name, 0, __RISCOSIFY_NO_SUFFIX,
message.file_name, 212, 0);
if (r == 0) {
- LOG("__riscosify failed");
+ NSLOG(netsurf, INFO, "__riscosify failed");
return;
}
message.file_name[211] = '\0';
@@ -1999,7 +2036,10 @@ void ro_gui_view_source(struct hlcache_handle *c)
(byte *) source_data,
(byte *) source_data + source_size);
if (error) {
- LOG("xosfile_save_stamped failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_save_stamped failed: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
return;
}
@@ -2069,7 +2109,7 @@ static void ro_gui_choose_language(void)
*/
nserror ro_warn_user(const char *warning, const char *detail)
{
- LOG("%s %s", warning, detail);
+ NSLOG(netsurf, INFO, "%s %s", warning, detail);
if (dialog_warning) {
char warn_buffer[300];
@@ -2113,7 +2153,7 @@ void die(const char * const error)
{
os_error warn_error;
- LOG("%s", error);
+ NSLOG(netsurf, INFO, "%s", error);
warn_error.errnum = 1; /* \todo: reasonable ? */
strncpy(warn_error.errmess, messages_get(error),
@@ -2350,7 +2390,7 @@ void ro_gui_dump_browser_window(struct browser_window *bw)
/* open file for dump */
FILE *stream = fopen("<Wimp$ScrapDir>.WWW.NetSurf.dump", "w");
if (!stream) {
- LOG("fopen: errno %i", errno);
+ NSLOG(netsurf, INFO, "fopen: errno %i", errno);
ro_warn_user("SaveError", strerror(errno));
return;
}
@@ -2363,7 +2403,8 @@ void ro_gui_dump_browser_window(struct browser_window *bw)
error = xwimp_start_task("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.dump",
0);
if (error) {
- LOG("xwimp_start_task failed: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_start_task failed: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -2403,7 +2444,7 @@ static char *get_cachepath(void)
cachedir = getenv("Cache$Dir");
if ((cachedir == NULL) || (cachedir[0] == 0)) {
- LOG("cachedir was null");
+ NSLOG(netsurf, INFO, "cachedir was null");
return NULL;
}
ret = netsurf_mkpath(&cachepath, NULL, 2, cachedir, "NetSurf");
@@ -2519,5 +2560,8 @@ int main(int argc, char** argv)
netsurf_exit();
nsoption_finalise(nsoptions, nsoptions_default);
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/riscos/gui/button_bar.c b/frontends/riscos/gui/button_bar.c
index 6ecd7cffa..34ae39ae5 100644
--- a/frontends/riscos/gui/button_bar.c
+++ b/frontends/riscos/gui/button_bar.c
@@ -138,7 +138,7 @@ struct button_bar *ro_gui_button_bar_create(struct theme_descriptor *theme,
button_bar = malloc(sizeof(struct button_bar));
if (button_bar == NULL) {
- LOG("No memory for malloc()");
+ NSLOG(netsurf, INFO, "No memory for malloc()");
return NULL;
}
@@ -538,7 +538,10 @@ bool ro_gui_button_bar_icon_update(struct button_bar *button_bar)
error = xwimp_create_icon(&icon, &button->icon);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_create_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
button->icon = -1;
return false;
@@ -548,7 +551,10 @@ bool ro_gui_button_bar_icon_update(struct button_bar *button_bar)
error = xwimp_delete_icon(button_bar->window,
button->icon);
if (error != NULL) {
- LOG("xwimp_delete_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_delete_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -598,7 +604,10 @@ bool ro_gui_button_bar_icon_resize(struct button_bar *button_bar)
button->y_pos +
button->y_size);
if (error != NULL) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_resize_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
button->icon = -1;
return false;
@@ -769,7 +778,10 @@ bool ro_gui_button_bar_click(struct button_bar *button_bar,
button_bar->sprites,
sprite, &box, NULL);
if (error)
- LOG("xdragasprite_start: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xdragasprite_start: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_mouse_drag_start(ro_gui_button_bar_drag_end,
NULL, NULL, NULL);
@@ -870,7 +882,8 @@ void ro_gui_button_bar_drag_end(wimp_dragged *drag, void *data)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -880,7 +893,8 @@ void ro_gui_button_bar_drag_end(wimp_dragged *drag, void *data)
state.w = drag_start->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1068,7 +1082,7 @@ char *ro_gui_button_bar_get_config(struct button_bar *button_bar)
config = malloc(size);
if (config == NULL) {
- LOG("No memory for malloc()");
+ NSLOG(netsurf, INFO, "No memory for malloc()");
ro_warn_user("NoMemory", 0);
return NULL;
}
diff --git a/frontends/riscos/gui/progress_bar.c b/frontends/riscos/gui/progress_bar.c
index c47c2af7d..06d89dbf4 100644
--- a/frontends/riscos/gui/progress_bar.c
+++ b/frontends/riscos/gui/progress_bar.c
@@ -137,7 +137,8 @@ struct progress_bar *ro_gui_progress_bar_create(void)
error = xwimp_create_window((wimp_window *)&progress_bar_definition,
&pb->w);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
free(pb);
return NULL;
}
@@ -165,7 +166,8 @@ void ro_gui_progress_bar_destroy(struct progress_bar *pb)
ro_gui_wimp_event_finalise(pb->w);
error = xwimp_delete_window(pb->w);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
free(pb);
@@ -327,7 +329,8 @@ void ro_gui_progress_bar_update(struct progress_bar *pb, int width, int height)
redraw.box.x0 = cur.x1;
error = xwimp_update_window(&redraw, &more);
if (error) {
- LOG("Error getting update window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "Error getting update window: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
if (more)
@@ -351,7 +354,8 @@ void ro_gui_progress_bar_redraw(wimp_draw *redraw)
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
if (more)
@@ -385,7 +389,8 @@ void ro_gui_progress_bar_animate(void *p)
redraw.box = pb->visible;
error = xwimp_update_window(&redraw, &more);
if (error != NULL) {
- LOG("Error getting update window: '%s'", error->errmess);
+ NSLOG(netsurf, INFO, "Error getting update window: '%s'",
+ error->errmess);
return;
}
if (more)
@@ -533,7 +538,8 @@ void ro_gui_progress_bar_redraw_window(wimp_draw *redraw,
}
error = xwimp_get_rectangle(redraw, &more);
if (error) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
diff --git a/frontends/riscos/gui/status_bar.c b/frontends/riscos/gui/status_bar.c
index bcaf3baf9..dd1aab639 100644
--- a/frontends/riscos/gui/status_bar.c
+++ b/frontends/riscos/gui/status_bar.c
@@ -131,7 +131,8 @@ struct status_bar *ro_gui_status_bar_create(wimp_w parent, unsigned int width)
error = xwimp_create_window((wimp_window *)&status_bar_definition,
&sb->w);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
free(sb);
return NULL;
}
@@ -165,7 +166,8 @@ void ro_gui_status_bar_destroy(struct status_bar *sb)
ro_gui_wimp_event_finalise(sb->w);
error = xwimp_delete_window(sb->w);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
ro_gui_progress_bar_destroy(sb->pb);
@@ -222,7 +224,8 @@ void ro_gui_status_bar_set_visible(struct status_bar *sb, bool visible)
} else {
os_error *error = xwimp_close_window(sb->w);
if (error) {
- LOG("xwimp_close_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
}
}
@@ -275,14 +278,15 @@ void ro_gui_status_bar_set_progress_range(struct status_bar *sb,
old_range = ro_gui_progress_bar_get_range(sb->pb);
ro_gui_progress_bar_set_range(sb->pb, range);
- LOG("Ranges are %i vs %i", old_range, range);
+ NSLOG(netsurf, INFO, "Ranges are %i vs %i", old_range, range);
if ((old_range == 0) && (range != 0)) {
ro_gui_status_position_progress_bar(sb);
} else if ((old_range != 0) && (range == 0)) {
os_error *error = xwimp_close_window(
ro_gui_progress_bar_get_window(sb->pb));
if (error) {
- LOG("xwimp_close_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
}
}
@@ -354,7 +358,8 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
state.w = sb->parent;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
window_width = state.visible.x1 - state.visible.x0;
@@ -377,7 +382,8 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
extent.y1 = status_height - 4;
error = xwimp_set_extent(sb->w, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -405,7 +411,10 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
ro_gui_status_position_progress_bar(sb);
@@ -413,7 +422,8 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
status_width - WIDGET_WIDTH, 0,
status_width, status_height - 4);
if (error) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -454,7 +464,8 @@ void ro_gui_status_bar_redraw(wimp_draw *redraw)
/* redraw the window */
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
while (more) {
@@ -463,7 +474,10 @@ void ro_gui_status_bar_redraw(wimp_draw *redraw)
error = xcolourtrans_set_font_colours(font_CURRENT,
0xeeeeee00, 0x00000000, 14, 0, 0, 0);
if (error) {
- LOG("xcolourtrans_set_font_colours: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_font_colours: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
code = rufl_paint(ro_gui_desktop_font_family,
@@ -474,10 +488,13 @@ void ro_gui_status_bar_redraw(wimp_draw *redraw)
rufl_BLEND_FONT);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_FONT_MANAGER_ERROR: 0x%x: %s",
- rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_paint: 0x%x", code);
+ NSLOG(netsurf, INFO,
+ "rufl_paint: 0x%x", code);
}
}
@@ -493,7 +510,8 @@ void ro_gui_status_bar_redraw(wimp_draw *redraw)
error = xwimp_get_rectangle(redraw, &more);
if (error) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
@@ -532,7 +550,10 @@ bool ro_gui_status_bar_click(wimp_pointer *pointer)
drag.initial.y1 = pointer->pos.y;
error = xwimp_drag_box(&drag);
if (error) {
- LOG("xwimp_drag_box: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_drag_box: 0x%x: %s",
+ error->errnum,
+ error->errmess);
}
break;
}
@@ -557,7 +578,8 @@ void ro_gui_status_bar_open(wimp_open *open)
state.w = sb->parent;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
window_width = state.visible.x1 - state.visible.x0;
@@ -596,7 +618,8 @@ void ro_gui_status_position_progress_bar(struct status_bar *sb)
state.w = sb->w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -626,7 +649,8 @@ void ro_gui_status_position_progress_bar(struct status_bar *sb)
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
/* update the progress bar display on non-standard width */
diff --git a/frontends/riscos/gui/throbber.c b/frontends/riscos/gui/throbber.c
index a326f806c..f3b79a68e 100644
--- a/frontends/riscos/gui/throbber.c
+++ b/frontends/riscos/gui/throbber.c
@@ -81,7 +81,7 @@ struct throbber *ro_gui_throbber_create(struct theme_descriptor *theme)
throbber = malloc(sizeof(struct throbber));
if (throbber == NULL) {
- LOG("No memory for malloc()");
+ NSLOG(netsurf, INFO, "No memory for malloc()");
return NULL;
}
@@ -248,7 +248,8 @@ bool ro_gui_throbber_icon_update(struct throbber *throbber)
error = xwimp_create_icon(&icon, &throbber->icon);
if (error != NULL) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
throbber->icon = -1;
return false;
@@ -259,7 +260,8 @@ bool ro_gui_throbber_icon_update(struct throbber *throbber)
} else if (throbber->hidden && throbber->icon != -1) {
error = xwimp_delete_icon(throbber->window, throbber->icon);
if (error != NULL) {
- LOG("xwimp_delete_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -295,7 +297,8 @@ bool ro_gui_throbber_icon_resize(struct throbber *throbber)
throbber->extent.x0, throbber->extent.y0,
throbber->extent.x1, throbber->extent.y1);
if (error != NULL) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
throbber->icon = -1;
return false;
diff --git a/frontends/riscos/gui/url_bar.c b/frontends/riscos/gui/url_bar.c
index a5ec3f8c6..ee5c689df 100644
--- a/frontends/riscos/gui/url_bar.c
+++ b/frontends/riscos/gui/url_bar.c
@@ -140,7 +140,7 @@ struct url_bar *ro_gui_url_bar_create(struct theme_descriptor *theme)
url_bar = malloc(sizeof(struct url_bar));
if (url_bar == NULL) {
- LOG("No memory for malloc()");
+ NSLOG(netsurf, INFO, "No memory for malloc()");
return NULL;
}
@@ -240,7 +240,8 @@ static bool ro_gui_url_bar_icon_resize(struct url_bar *url_bar, bool full)
url_bar->container_icon,
x0, y0, x1, y1);
if (error != NULL) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
url_bar->container_icon = -1;
return false;
@@ -260,7 +261,8 @@ static bool ro_gui_url_bar_icon_resize(struct url_bar *url_bar, bool full)
url_bar->suggest_icon,
x0, y0, x1, y1);
if (error != NULL) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
url_bar->suggest_icon = -1;
return false;
@@ -281,7 +283,8 @@ static bool ro_gui_url_bar_icon_resize(struct url_bar *url_bar, bool full)
url_bar->text_icon,
x0, y0, x1, y1);
if (error != NULL) {
- LOG("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
url_bar->text_icon = -1;
return false;
@@ -362,7 +365,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
wimp_ICON_BUTTON_TYPE_SHIFT);
error = xwimp_create_icon(&icon, &url_bar->container_icon);
if (error != NULL) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
url_bar->container_icon = -1;
return false;
@@ -373,7 +377,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
error = xwimp_delete_icon(url_bar->window,
url_bar->container_icon);
if (error != NULL) {
- LOG("xwimp_delete_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -399,7 +404,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
wimp_ICON_BUTTON_TYPE_SHIFT);
error = xwimp_create_icon(&icon, &url_bar->text_icon);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
url_bar->text_icon = -1;
return false;
@@ -410,7 +416,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
error = xwimp_delete_icon(url_bar->window,
url_bar->text_icon);
if (error != NULL) {
- LOG("xwimp_delete_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -430,7 +437,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
wimp_ICON_BUTTON_TYPE_SHIFT);
error = xwimp_create_icon(&icon, &url_bar->suggest_icon);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -450,7 +458,8 @@ static bool ro_gui_url_bar_icon_update(struct url_bar *url_bar)
error = xwimp_delete_icon(url_bar->window,
url_bar->suggest_icon);
if (error != NULL) {
- LOG("xwimp_delete_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -940,7 +949,8 @@ bool ro_gui_url_bar_take_caret(struct url_bar *url_bar)
error = xwimp_set_caret_position(url_bar->window, url_bar->text_icon,
-1, -1, -1, 0);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
@@ -977,7 +987,7 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
if (err != NSERROR_OK) {
/* A bad encoding should never happen, so assert this */
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
/* Paranoia */
local_text = NULL;
}
@@ -993,7 +1003,8 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
if (strlen(local_url) >= url_bar->text_size) {
url_bar->text_buffer[0] = '\0';
ro_warn_user("LongURL", NULL);
- LOG("Long URL (%zu chars): %s", strlen(url), url);
+ NSLOG(netsurf, INFO, "Long URL (%zu chars): %s", strlen(url),
+ url);
} else {
strncpy(url_bar->text_buffer, local_url,
url_bar->text_size - 1);
@@ -1021,7 +1032,8 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1034,7 +1046,10 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
error = xwimp_set_caret_position(url_bar->window,
url_bar->text_icon, 0, 0, -1, strlen(set_url));
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1123,7 +1138,8 @@ bool ro_gui_url_bar_get_url_extent(struct url_bar *url_bar, os_box *extent)
state.i = url_bar->container_icon;
error = xwimp_get_icon_state(&state);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
diff --git a/frontends/riscos/help.c b/frontends/riscos/help.c
index b6871c5eb..952b3f2d1 100644
--- a/frontends/riscos/help.c
+++ b/frontends/riscos/help.c
@@ -166,7 +166,8 @@ void ro_gui_interactive_help_request(wimp_message *message)
error = xwimp_get_menu_state(wimp_GIVEN_WINDOW_AND_ICON,
&menu_tree, window, icon);
if (error) {
- LOG("xwimp_get_menu_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_menu_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -269,7 +270,8 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message,
error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message *)reply,
reply->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -297,7 +299,10 @@ bool ro_gui_interactive_help_available(void)
error = xtaskmanager_enumerate_tasks(context, &task,
sizeof(taskmanager_task), &context, 0);
if (error) {
- LOG("xtaskmanager_enumerate_tasks: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xtaskmanager_enumerate_tasks: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
}
@@ -334,7 +339,8 @@ void ro_gui_interactive_help_start(void)
if ((help_start) && (help_start[0])) {
error = xwimp_start_task("<Help$Start>", &task);
if (error) {
- LOG("xwimp_start_tast: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_start_tast: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -344,7 +350,8 @@ void ro_gui_interactive_help_start(void)
if (!task) {
error = xwimp_start_task("Resources:$.Apps.!Help", &task);
if (error) {
- LOG("xwimp_start_tast: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_start_tast: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -354,7 +361,10 @@ void ro_gui_interactive_help_start(void)
if (task) {
error = xos_read_monotonic_time(&help_time);
if (error) {
- LOG("xwimp_read_monotonic_time: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_read_monotonic_time: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
diff --git a/frontends/riscos/hotlist.c b/frontends/riscos/hotlist.c
index b055d1bec..b0ed1e2f4 100644
--- a/frontends/riscos/hotlist.c
+++ b/frontends/riscos/hotlist.c
@@ -548,19 +548,20 @@ nserror ro_gui_hotlist_present(void)
return NSERROR_OK;
}
- LOG("xos_cli: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_cli: 0x%x: %s", error->errnum,
+ error->errmess);
ro_warn_user("Failed to launch external hotlist: %s",
error->errmess);
}
res = ro_hotlist_init();
if (res == NSERROR_OK) {
- LOG("Presenting");
+ NSLOG(netsurf, INFO, "Presenting");
ro_gui_dialog_open_top(hotlist_window->core.wh,
hotlist_window->core.toolbar,
600, 800);
} else {
- LOG("Failed presenting code %d", res);
+ NSLOG(netsurf, INFO, "Failed presenting code %d", res);
}
return res;
diff --git a/frontends/riscos/iconbar.c b/frontends/riscos/iconbar.c
index 3430ed2f0..23f97258b 100644
--- a/frontends/riscos/iconbar.c
+++ b/frontends/riscos/iconbar.c
@@ -95,7 +95,8 @@ void ro_gui_iconbar_initialise(void)
{ "!netsurf" } } };
error = xwimp_create_icon(&icon, 0);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
die(error->errmess);
}
@@ -238,7 +239,8 @@ bool ro_gui_iconbar_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
return true;
case APPLICATION_QUIT:
if (ro_gui_prequit()) {
- LOG("QUIT in response to user request");
+ NSLOG(netsurf, INFO,
+ "QUIT in response to user request");
riscos_done = true;
}
return true;
diff --git a/frontends/riscos/image.c b/frontends/riscos/image.c
index acbe62d98..30cb30096 100644
--- a/frontends/riscos/image.c
+++ b/frontends/riscos/image.c
@@ -142,7 +142,8 @@ bool image_redraw_tinct(osspriteop_id header, int x, int y,
}
if (error) {
- LOG("xtinct_plotscaled%s: 0x%x: %s", (alpha ? "alpha" : ""), error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xtinct_plotscaled%s: 0x%x: %s",
+ (alpha ? "alpha" : ""), error->errnum, error->errmess);
return false;
}
@@ -176,13 +177,16 @@ bool image_redraw_os(osspriteop_id header, int x, int y, int req_width,
colourtrans_CURRENT_PALETTE,
0, colourtrans_GIVEN_SPRITE, 0, 0, &size);
if (error) {
- LOG("xcolourtrans_generate_table_for_sprite: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_generate_table_for_sprite: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return false;
}
table = calloc(size, sizeof(char));
if (!table) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
ro_warn_user("NoMemory", 0);
return false;
}
@@ -193,7 +197,10 @@ bool image_redraw_os(osspriteop_id header, int x, int y, int req_width,
colourtrans_CURRENT_PALETTE,
table, colourtrans_GIVEN_SPRITE, 0, 0, 0);
if (error) {
- LOG("xcolourtrans_generate_table_for_sprite: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_generate_table_for_sprite: 0x%x: %s",
+ error->errnum,
+ error->errmess);
free(table);
return false;
}
@@ -208,7 +215,10 @@ bool image_redraw_os(osspriteop_id header, int x, int y, int req_width,
x, (int)(y - req_height),
8, &f, table);
if (error) {
- LOG("xosspriteop_put_sprite_scaled: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_put_sprite_scaled: 0x%x: %s",
+ error->errnum,
+ error->errmess);
free(table);
return false;
}
diff --git a/frontends/riscos/local_history.c b/frontends/riscos/local_history.c
index f9f1f2e01..bbe6a1d12 100644
--- a/frontends/riscos/local_history.c
+++ b/frontends/riscos/local_history.c
@@ -154,8 +154,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
/* not over a tree entry => close tooltip window. */
error = xwimp_close_window(dialog_tooltip);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -167,8 +167,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
nsurl_length(url) > 256 ? 256 : nsurl_length(url),
&width);
if (error) {
- LOG("xwimptextop_string_width: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimptextop_string_width: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
nsurl_unref(url);
return NSERROR_NOMEM;
@@ -182,8 +182,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
ic.i = 0;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -191,8 +191,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
ic.icon.extent.x0, ic.icon.extent.y0,
width + 16, ic.icon.extent.y1);
if (error) {
- LOG("xwimp_resize_icon: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_resize_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -200,8 +200,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
state.w = dialog_tooltip;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -211,15 +211,16 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
box.y0 = -36;
error = xwimp_set_extent(dialog_tooltip, &box);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -233,8 +234,8 @@ ro_local_history_tooltip(struct ro_local_history_window *lhw, int x, int y)
/* open window */
error = xwimp_open_window(PTR_WIMP_OPEN(&state));
if (error) {
- LOG("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -363,8 +364,8 @@ ro_local_history_open(struct ro_local_history_window *lhw, wimp_w parent)
box.y0 = -height;
error = xwimp_set_extent(lhw->core.wh, &box);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -373,8 +374,8 @@ ro_local_history_open(struct ro_local_history_window *lhw, wimp_w parent)
state.w = lhw->core.wh;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -385,8 +386,8 @@ ro_local_history_open(struct ro_local_history_window *lhw, wimp_w parent)
state.next = wimp_HIDDEN;
error = xwimp_open_window(PTR_WIMP_OPEN(&state));
if (error) {
- LOG("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_NOMEM;
}
@@ -403,10 +404,10 @@ nserror ro_gui_local_history_present(wimp_w parent, struct browser_window *bw)
res = ro_local_history_init(bw, &local_history_window);
if (res == NSERROR_OK) {
- LOG("Presenting");
+ NSLOG(netsurf, INFO, "Presenting");
res = ro_local_history_open(local_history_window, parent);
} else {
- LOG("Failed presenting error code %d", res);
+ NSLOG(netsurf, INFO, "Failed presenting error code %d", res);
}
return res;
diff --git a/frontends/riscos/menus.c b/frontends/riscos/menus.c
index d46afa28e..a6e978a6c 100644
--- a/frontends/riscos/menus.c
+++ b/frontends/riscos/menus.c
@@ -232,7 +232,8 @@ void ro_gui_menu_create(wimp_menu *menu, int x, int y, wimp_w w)
current_menu_open = true;
error = xwimp_create_menu(menu, x - 64, y);
if (error) {
- LOG("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_menu: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
ro_gui_menu_closed();
}
@@ -258,14 +259,16 @@ void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i)
icon_state.i = i;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
return;
}
error = xwimp_get_icon_state(&icon_state);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
return;
}
@@ -291,7 +294,8 @@ void ro_gui_menu_destroy(void)
error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0);
if (error) {
- LOG("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_menu: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
}
@@ -354,7 +358,8 @@ void ro_gui_menu_selection(wimp_selection *selection)
/* re-open the menu for Adjust clicks */
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
ro_gui_menu_closed();
return;
@@ -420,7 +425,8 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning)
error = xwimp_create_sub_menu(menu_entry->sub_menu,
warning->pos.x, warning->pos.y);
if (error) {
- LOG("xwimp_create_sub_menu: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_sub_menu: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
}
}
@@ -485,7 +491,8 @@ void ro_gui_menu_refresh(wimp_menu *menu)
os_error *error;
error = xwimp_create_menu(current_menu, 0, 0);
if (error) {
- LOG("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_menu: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
}
}
@@ -851,7 +858,8 @@ int ro_gui_menu_get_checksum(void)
error = xwimp_get_menu_state((wimp_menu_state_flags)0,
&menu_tree, 0, 0);
if (error) {
- LOG("xwimp_get_menu_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_menu_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MenuError", error->errmess);
return 0;
}
@@ -894,7 +902,8 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
/* read current alphabet */
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet);
if (error) {
- LOG("failed reading alphabet: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "failed reading alphabet: 0x%x: %s",
+ error->errnum, error->errmess);
/* assume Latin1 */
alphabet = territory_ALPHABET_LATIN1;
}
@@ -909,7 +918,7 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
0, &translated);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
return false;
}
@@ -926,7 +935,7 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
0, &translated);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
return false;
}
diff --git a/frontends/riscos/message.c b/frontends/riscos/message.c
index 1c54ea0b7..7a0216185 100644
--- a/frontends/riscos/message.c
+++ b/frontends/riscos/message.c
@@ -64,7 +64,8 @@ bool ro_message_send_message(wimp_event_no event, wimp_message *message,
/* send a message */
error = xwimp_send_message(event, message, task);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -101,7 +102,10 @@ bool ro_message_send_message_to_window(wimp_event_no event, wimp_message *messag
/* send a message */
error = xwimp_send_message_to_window(event, message, to_w, to_i, to_t);
if (error) {
- LOG("xwimp_send_message_to_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_send_message_to_window: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
diff --git a/frontends/riscos/mouse.c b/frontends/riscos/mouse.c
index a0cc0e7ce..89184cff3 100644
--- a/frontends/riscos/mouse.c
+++ b/frontends/riscos/mouse.c
@@ -81,7 +81,8 @@ void ro_mouse_poll(void)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -194,7 +195,7 @@ void ro_mouse_track_start(void (*poll_end)(wimp_leaving *leaving, void *data),
ro_mouse_ignore_leaving_event == false)
ro_mouse_poll_end_callback(NULL, ro_mouse_poll_data);
- LOG("Unexpected mouse track termination.");
+ NSLOG(netsurf, INFO, "Unexpected mouse track termination.");
ro_mouse_ignore_leaving_event = false;
ro_mouse_poll_end_callback = NULL;
diff --git a/frontends/riscos/plotters.c b/frontends/riscos/plotters.c
index b459ba1f9..2fbd12aeb 100644
--- a/frontends/riscos/plotters.c
+++ b/frontends/riscos/plotters.c
@@ -79,15 +79,16 @@ ro_plot_draw_path(const draw_path * const path,
error = xcolourtrans_set_gcol(c << 8, 0, os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
error = xdraw_stroke(path, 0, 0, 0, width * 2 * 256,
&line_style, dash_pattern);
if (error) {
- LOG("xdraw_stroke: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdraw_stroke: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
@@ -115,8 +116,8 @@ ro_plot_clip(const struct redraw_context *ctx, const struct rect *clip)
int clip_y1 = ro_plot_origin_y - clip->y1 * 2;
if (clip_x1 < clip_x0 || clip_y0 < clip_y1) {
- LOG("bad clip rectangle %i %i %i %i",
- clip_x0, clip_y0, clip_x1, clip_y1);
+ NSLOG(netsurf, INFO, "bad clip rectangle %i %i %i %i",
+ clip_x0, clip_y0, clip_x1, clip_y1);
return NSERROR_BAD_SIZE;
}
@@ -132,7 +133,8 @@ ro_plot_clip(const struct redraw_context *ctx, const struct rect *clip)
error = xos_writen(buf, 9);
if (error) {
- LOG("xos_writen: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_writen: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
@@ -173,8 +175,8 @@ ro_plot_arc(const struct redraw_context *ctx,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
@@ -188,19 +190,22 @@ ro_plot_arc(const struct redraw_context *ctx,
error = xos_plot(os_MOVE_TO, x, y); /* move to centre */
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_MOVE_TO, sx, sy); /* move to start */
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_PLOT_ARC | os_PLOT_TO, ex, ey); /* arc to end */
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
@@ -230,20 +235,24 @@ ro_plot_disc(const struct redraw_context *ctx,
error = xcolourtrans_set_gcol(style->fill_colour << 8, 0,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_MOVE_TO,
ro_plot_origin_x + x * 2,
ro_plot_origin_y - y * 2);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_PLOT_CIRCLE | os_PLOT_BY, radius * 2, 0);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
}
@@ -253,22 +262,26 @@ ro_plot_disc(const struct redraw_context *ctx,
error = xcolourtrans_set_gcol(style->stroke_colour << 8, 0,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_MOVE_TO,
ro_plot_origin_x + x * 2,
ro_plot_origin_y - y * 2);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
error = xos_plot(os_PLOT_CIRCLE_OUTLINE | os_PLOT_BY,
radius * 2, 0);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
}
@@ -343,8 +356,10 @@ ro_plot_rectangle(const struct redraw_context *ctx,
colourtrans_USE_ECFS_GCOL,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
@@ -352,7 +367,8 @@ ro_plot_rectangle(const struct redraw_context *ctx,
ro_plot_origin_x + rect->x0 * 2,
ro_plot_origin_y - rect->y0 * 2 - 1);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
@@ -360,7 +376,8 @@ ro_plot_rectangle(const struct redraw_context *ctx,
ro_plot_origin_x + rect->x1 * 2 - 1,
ro_plot_origin_y - rect->y1 * 2);
if (error) {
- LOG("xos_plot: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_plot: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
}
@@ -441,13 +458,14 @@ ro_plot_polygon(const struct redraw_context *ctx,
error = xcolourtrans_set_gcol(style->fill_colour << 8,
0, os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INVALID;
}
error = xdraw_fill((draw_path *) path, 0, 0, 0);
if (error) {
- LOG("xdraw_fill: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdraw_fill: 0x%x: %s", error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
@@ -494,13 +512,13 @@ ro_plot_path(const struct redraw_context *ctx,
}
if (p[0] != PLOTTER_PATH_MOVE) {
- LOG("path doesn't start with a move");
+ NSLOG(netsurf, INFO, "path doesn't start with a move");
goto error;
}
path = malloc(sizeof *path * (n + 10));
if (!path) {
- LOG("out of memory");
+ NSLOG(netsurf, INFO, "out of memory");
goto error;
}
@@ -528,7 +546,7 @@ ro_plot_path(const struct redraw_context *ctx,
path[i + 6] = -p[i + 6] * 2 * 256;
i += 7;
} else {
- LOG("bad path command %f", p[i]);
+ NSLOG(netsurf, INFO, "bad path command %f", p[i]);
goto error;
}
}
@@ -546,15 +564,17 @@ ro_plot_path(const struct redraw_context *ctx,
error = xcolourtrans_set_gcol(pstyle->fill_colour << 8, 0,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
goto error;
}
error = xdraw_fill((draw_path *) path, 0, &trfm, 0);
if (error) {
- LOG("xdraw_stroke: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdraw_stroke: 0x%x: %s",
+ error->errnum, error->errmess);
goto error;
}
}
@@ -563,16 +583,18 @@ ro_plot_path(const struct redraw_context *ctx,
error = xcolourtrans_set_gcol(pstyle->stroke_colour << 8, 0,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
goto error;
}
error = xdraw_stroke((draw_path *) path, 0, &trfm, 0,
width * 2 * 256, &line_style, 0);
if (error) {
- LOG("xdraw_stroke: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdraw_stroke: 0x%x: %s",
+ error->errnum, error->errmess);
goto error;
}
}
@@ -623,7 +645,7 @@ ro_plot_bitmap(const struct redraw_context *ctx,
buffer = riscos_bitmap_get_buffer(bitmap);
if (!buffer) {
- LOG("bitmap_get_buffer failed");
+ NSLOG(netsurf, INFO, "bitmap_get_buffer failed");
return NSERROR_INVALID;
}
@@ -669,8 +691,10 @@ ro_plot_text(const struct redraw_context *ctx,
fstyle->background << 8, fstyle->foreground << 8,
14, 0, 0, 0);
if (error) {
- LOG("xcolourtrans_set_font_colours: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_font_colours: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return NSERROR_INVALID;
}
diff --git a/frontends/riscos/print.c b/frontends/riscos/print.c
index b7ddd4e53..d965baff4 100644
--- a/frontends/riscos/print.c
+++ b/frontends/riscos/print.c
@@ -169,7 +169,8 @@ void ro_gui_print_prepare(struct gui_window *g)
/* Read Printer Driver name */
error = xpdriver_info(0, 0, 0, 0, &desc, 0, 0, 0);
if (error) {
- LOG("xpdriver_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_info: 0x%x: %s",
+ error->errnum, error->errmess);
printers_exists = false;
}
@@ -306,7 +307,8 @@ void print_send_printsave(struct hlcache_handle *h)
e = xwimp_send_message(wimp_USER_MESSAGE_RECORDED,
(wimp_message *)&m, 0);
if (e) {
- LOG("xwimp_send_message: 0x%x: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ e->errnum, e->errmess);
ro_warn_user("WimpError", e->errmess);
ro_print_cleanup();
}
@@ -330,7 +332,8 @@ bool print_send_printtypeknown(wimp_message *m)
m->action = message_PRINT_TYPE_KNOWN;
e = xwimp_send_message(wimp_USER_MESSAGE, m, m->sender);
if (e) {
- LOG("xwimp_send_message: 0x%x: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ e->errnum, e->errmess);
ro_warn_user("WimpError", e->errmess);
return false;
}
@@ -436,7 +439,8 @@ bool ro_print_ack(wimp_message *m)
/* read printer driver type */
error = xpdriver_info(&info_type, 0, 0, 0, 0, 0, 0, 0);
if (error) {
- LOG("xpdriver_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
ro_print_cleanup();
return true;
@@ -461,7 +465,8 @@ bool ro_print_ack(wimp_message *m)
error = xwimp_send_message(wimp_USER_MESSAGE_RECORDED, m, m->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
/* and delete temporary file */
xosfile_delete(m->data.data_xfer.file_name,
@@ -533,7 +538,8 @@ bool print_document(struct gui_window *g, const char *filename)
/* read printer driver features */
error = xpdriver_info(0, 0, 0, &features, 0, 0, 0, 0);
if (error) {
- LOG("xpdriver_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
return false;
}
@@ -541,7 +547,8 @@ bool print_document(struct gui_window *g, const char *filename)
/* read page size */
error = xpdriver_page_size(0, 0, &left, &bottom, &right, &top);
if (error) {
- LOG("xpdriver_page_size: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_page_size: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
return false;
}
@@ -564,7 +571,8 @@ bool print_document(struct gui_window *g, const char *filename)
error = xosfind_openoutw(osfind_NO_PATH | osfind_ERROR_IF_DIR |
osfind_ERROR_IF_ABSENT, filename, 0, &fhandle);
if (error) {
- LOG("xosfind_openoutw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openoutw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
return false;
}
@@ -572,7 +580,8 @@ bool print_document(struct gui_window *g, const char *filename)
/* select print job */
error = xpdriver_select_jobw(fhandle, "NetSurf", &old_job);
if (error) {
- LOG("xpdriver_select_jobw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_select_jobw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
xosfind_closew(fhandle);
return false;
@@ -632,18 +641,23 @@ bool print_document(struct gui_window *g, const char *filename)
/* give page rectangle */
error = xpdriver_give_rectangle(0, &b, &t, &p, os_COLOUR_WHITE);
if (error) {
- LOG("xpdriver_give_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xpdriver_give_rectangle: 0x%x: %s",
+ error->errnum,
+ error->errmess);
error_message = error->errmess;
goto error;
}
- LOG("given rectangle: [(%d, %d), (%d, %d)]", b.x0, b.y0, b.x1, b.y1);
+ NSLOG(netsurf, INFO, "given rectangle: [(%d, %d), (%d, %d)]",
+ b.x0, b.y0, b.x1, b.y1);
/* and redraw the document */
error = xpdriver_draw_page(print_num_copies, &b, 0, 0,
&more, 0);
if (error) {
- LOG("xpdriver_draw_page: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_draw_page: 0x%x: %s",
+ error->errnum, error->errmess);
error_message = error->errmess;
goto error;
}
@@ -657,7 +671,9 @@ bool print_document(struct gui_window *g, const char *filename)
.plot = &ro_plotters
};
- LOG("redrawing area: [(%d, %d), (%d, %d)]", b.x0, b.y0, b.x1, b.y1);
+ NSLOG(netsurf, INFO,
+ "redrawing area: [(%d, %d), (%d, %d)]", b.x0,
+ b.y0, b.x1, b.y1);
clip.x0 = (b.x0 - ro_plot_origin_x) / 2;
clip.y0 = (ro_plot_origin_y - b.y1) / 2;
clip.x1 = (b.x1 - ro_plot_origin_x) / 2;
@@ -679,7 +695,10 @@ bool print_document(struct gui_window *g, const char *filename)
error = xpdriver_get_rectangle(&b, &more, 0);
if (error) {
- LOG("xpdriver_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xpdriver_get_rectangle: 0x%x: %s",
+ error->errnum,
+ error->errmess);
error_message = error->errmess;
goto error;
}
@@ -701,14 +720,16 @@ bool print_document(struct gui_window *g, const char *filename)
error = (os_error *) _swix(PDriver_EndJob, _IN(0), (int) fhandle);
if (error) {
- LOG("xpdriver_end_jobw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_end_jobw: 0x%x: %s",
+ error->errnum, error->errmess);
error_message = error->errmess;
goto error;
}
error = xosfind_closew(fhandle);
if (error) {
- LOG("xosfind_closew: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_closew: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("PrintError", error->errmess);
return false;
}
@@ -716,7 +737,10 @@ bool print_document(struct gui_window *g, const char *filename)
if (old_job) {
error = xpdriver_select_jobw(old_job, 0, 0);
if (error) {
- LOG("xpdriver_select_jobw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xpdriver_select_jobw: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("PrintError", error->errmess);
/* the printing succeeded anyway */
return true;
@@ -855,11 +879,14 @@ print_fonts_plot_text(const struct redraw_context *ctx,
text, length, 0, 0, print_fonts_callback, 0);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR) {
- LOG("rufl_paint_callback: rufl_FONT_MANAGER_ERROR: ""0x%x: %s",
- rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_paint_callback: rufl_FONT_MANAGER_ERROR: ""0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
print_fonts_error = rufl_fm_error->errmess;
} else {
- LOG("rufl_paint_callback: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_paint_callback: 0x%x",
+ code);
}
return NSERROR_INVALID;
}
@@ -934,18 +961,22 @@ const char *print_declare_fonts(struct hlcache_handle *h)
}
for (i = 0; i != print_fonts_count; ++i) {
- LOG("%u %s", i, print_fonts_list[i]);
+ NSLOG(netsurf, INFO, "%u %s", i, print_fonts_list[i]);
error = xpdriver_declare_font(0, print_fonts_list[i],
pdriver_KERNED);
if (error) {
- LOG("xpdriver_declare_font: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xpdriver_declare_font: 0x%x: %s",
+ error->errnum,
+ error->errmess);
error_message = error->errmess;
goto end;
}
}
error = xpdriver_declare_font(0, 0, 0);
if (error) {
- LOG("xpdriver_declare_font: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xpdriver_declare_font: 0x%x: %s",
+ error->errnum, error->errmess);
error_message = error->errmess;
goto end;
}
diff --git a/frontends/riscos/query.c b/frontends/riscos/query.c
index 1d7cf5120..49aea6321 100644
--- a/frontends/riscos/query.c
+++ b/frontends/riscos/query.c
@@ -175,7 +175,7 @@ query_id query_user_xy(const char *query, const char *detail,
err = utf8_to_local_encoding(yes, 0, &local_text);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_local_encoding_failed");
+ NSLOG(netsurf, INFO, "utf8_to_local_encoding_failed");
local_text = NULL;
}
@@ -191,7 +191,8 @@ query_id query_user_xy(const char *query, const char *detail,
error = xwimptextop_string_width(icn->data.indirected_text.text, len, &width);
if (error) {
- LOG("xwimptextop_string_width: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimptextop_string_width: 0x%x:%s",
+ error->errnum, error->errmess);
width = len * 16;
}
if (!query_yes_width) query_yes_width = icn->extent.x1 - icn->extent.x0;
@@ -204,7 +205,7 @@ query_id query_user_xy(const char *query, const char *detail,
err = utf8_to_local_encoding(no, 0, &local_text);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_local_encoding_failed");
+ NSLOG(netsurf, INFO, "utf8_to_local_encoding_failed");
local_text = NULL;
}
@@ -222,7 +223,8 @@ query_id query_user_xy(const char *query, const char *detail,
icn->extent.x1 = tx - 16;
error = xwimptextop_string_width(icn->data.indirected_text.text, len, &width);
if (error) {
- LOG("xwimptextop_string_width: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimptextop_string_width: 0x%x:%s",
+ error->errnum, error->errmess);
width = len * 16;
}
width += 28;
@@ -263,7 +265,8 @@ query_id query_user_xy(const char *query, const char *detail,
error = xwimp_set_caret_position(qw->window, (wimp_i)-1, 0, 0, 1 << 25, -1);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -307,7 +310,10 @@ void ro_gui_query_window_bring_to_front(query_id id)
error = xwimp_set_caret_position(qw->window, (wimp_i)-1, 0, 0, 1 << 25, -1);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_caret_position: 0x%x : %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -327,7 +333,8 @@ void ro_gui_query_close(wimp_w w)
ro_gui_dialog_close(w);
error = xwimp_delete_window(qw->window);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
ro_gui_wimp_event_finalise(w);
diff --git a/frontends/riscos/save.c b/frontends/riscos/save.c
index bed0f5dd1..76ce6d3e5 100644
--- a/frontends/riscos/save.c
+++ b/frontends/riscos/save.c
@@ -166,7 +166,8 @@ wimp_w ro_gui_saveas_create(const char *template_name)
error = xosmodule_alloc(area_size, (void **) &area);
if (error) {
- LOG("xosmodule_alloc: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosmodule_alloc: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
} else {
@@ -176,7 +177,10 @@ wimp_w ro_gui_saveas_create(const char *template_name)
error = xosspriteop_clear_sprites(osspriteop_USER_AREA, saveas_area);
if (error) {
- LOG("xosspriteop_clear_sprites: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_clear_sprites: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
xosmodule_free(saveas_area);
@@ -192,7 +196,8 @@ wimp_w ro_gui_saveas_create(const char *template_name)
/* create window */
error = xwimp_create_window(window, &w);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
xwimp_close_template();
die(error->errmess);
}
@@ -212,7 +217,8 @@ void ro_gui_saveas_quit(void)
if (saveas_area) {
os_error *error = xosmodule_free(saveas_area);
if (error) {
- LOG("xosmodule_free: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosmodule_free: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
}
saveas_area = NULL;
@@ -239,14 +245,14 @@ ro_gui_save_create_thumbnail(struct hlcache_handle *h, const char *name)
bitmap = riscos_bitmap_create(34, 34, BITMAP_NEW | BITMAP_OPAQUE | BITMAP_CLEAR_MEMORY);
if (!bitmap) {
- LOG("Thumbnail initialisation failed.");
+ NSLOG(netsurf, INFO, "Thumbnail initialisation failed.");
return false;
}
riscos_bitmap_render(bitmap, h);
area = riscos_bitmap_convert_8bpp(bitmap);
riscos_bitmap_destroy(bitmap);
if (!area) {
- LOG("Thumbnail conversion failed.");
+ NSLOG(netsurf, INFO, "Thumbnail conversion failed.");
return false;
}
@@ -391,7 +397,10 @@ ro_gui_save_set_state(struct hlcache_handle *h, gui_save_type save_type,
}
if (error) {
- LOG("ro_gui_wimp_get_sprite: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "ro_gui_wimp_get_sprite: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
} else {
/* the sprite area should always be large enough for
@@ -501,7 +510,8 @@ static void ro_gui_save_drag_end(wimp_dragged *drag, void *data)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -627,7 +637,8 @@ static void ro_gui_save_done(void)
error = xwimp_send_message(wimp_USER_MESSAGE, message,
message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
}
}
@@ -667,7 +678,10 @@ static void ro_gui_save_done(void)
ro_gui_dialog_close(dialog_saveas);
error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0);
if (error) {
- LOG("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_create_menu: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MenuError", error->errmess);
}
}
@@ -770,8 +784,8 @@ static void ro_gui_save_set_file_type(const char *path, lwc_string *mime_type)
error = xosfile_set_type(path, rotype);
if (error != NULL) {
- LOG("xosfile_set_type: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
@@ -798,7 +812,8 @@ static bool ro_gui_save_complete(struct hlcache_handle *h, char *path)
/* Create dir */
error = xosfile_create_dir(path, 0);
if (error) {
- LOG("xosfile_create_dir: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_create_dir: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -807,7 +822,7 @@ static bool ro_gui_save_complete(struct hlcache_handle *h, char *path)
snprintf(buf, sizeof buf, "%s.!Run", path);
fp = fopen(buf, "w");
if (!fp) {
- LOG("fopen(): errno = %i", errno);
+ NSLOG(netsurf, INFO, "fopen(): errno = %i", errno);
ro_warn_user("SaveError", strerror(errno));
return false;
}
@@ -816,7 +831,8 @@ static bool ro_gui_save_complete(struct hlcache_handle *h, char *path)
fclose(fp);
error = xosfile_set_type(buf, 0xfeb);
if (error) {
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -825,7 +841,8 @@ static bool ro_gui_save_complete(struct hlcache_handle *h, char *path)
snprintf(buf, sizeof buf, "%s.!RunImage", path);
fp = fopen(buf, "w");
if (!fp) {
- LOG("Creating !RunImage failed: errno = %i", errno);
+ NSLOG(netsurf, INFO, "Creating !RunImage failed: errno = %i",
+ errno);
} else {
fclose(fp);
}
@@ -851,7 +868,10 @@ static bool ro_gui_save_complete(struct hlcache_handle *h, char *path)
error = xosspriteop_save_sprite_file(osspriteop_NAME, saveas_area, buf);
if (error) {
- LOG("xosspriteop_save_sprite_file: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_save_sprite_file: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -897,7 +917,10 @@ static bool ro_gui_save_object_native(struct hlcache_handle *h, char *path)
(byte *) source_data,
(byte *) source_data + source_size);
if (error != NULL) {
- LOG("xosfile_save_stamped: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_save_stamped: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -947,7 +970,8 @@ ro_gui_save_content(struct hlcache_handle *h, char *path, bool force_overwrite)
error = xosfile_read_stamped(path, &obj_type,
NULL, NULL, NULL, NULL, NULL);
if (error) {
- LOG("xosfile_read_stamped: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_read_stamped: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -1003,7 +1027,10 @@ ro_gui_save_content(struct hlcache_handle *h, char *path, bool force_overwrite)
(byte *) source_data,
(byte *) source_data + source_size);
if (error) {
- LOG("xosfile_save_stamped: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_save_stamped: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -1029,14 +1056,20 @@ ro_gui_save_content(struct hlcache_handle *h, char *path, bool force_overwrite)
return false;
error = xosfile_set_type(path, 0xfaf);
if (error)
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_set_type: 0x%x: %s",
+ error->errnum,
+ error->errmess);
break;
case GUI_SAVE_HISTORY_EXPORT_HTML:
if (global_history_export(path, NULL) != NSERROR_OK)
return false;
error = xosfile_set_type(path, 0xfaf);
if (error)
- LOG("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_set_type: 0x%x: %s",
+ error->errnum,
+ error->errmess);
break;
case GUI_SAVE_TEXT_SELECTION:
@@ -1056,7 +1089,10 @@ ro_gui_save_content(struct hlcache_handle *h, char *path, bool force_overwrite)
return ro_gui_save_clipboard(path);
default:
- LOG("Unexpected content type: %d, path %s", gui_save_current_type, path);
+ NSLOG(netsurf, INFO,
+ "Unexpected content type: %d, path %s",
+ gui_save_current_type,
+ path);
return false;
}
return true;
@@ -1121,7 +1157,8 @@ void gui_drag_save_object(struct gui_window *g,
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1158,7 +1195,8 @@ void gui_drag_save_selection(struct gui_window *g, const char *selection)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1210,8 +1248,8 @@ void ro_gui_drag_save_link(gui_save_type save_type, const nsurl *url,
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1252,7 +1290,10 @@ void ro_gui_drag_icon(int x, int y, const char *sprite)
saveas_area, (osspriteop_id)sprite, NULL);
if (error) {
if (error->errnum != error_SPRITE_OP_DOESNT_EXIST) {
- LOG("xosspriteop_select_sprite: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_select_sprite: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
}
}
@@ -1272,7 +1313,8 @@ void ro_gui_drag_icon(int x, int y, const char *sprite)
return;
}
- LOG("xdragasprite_start: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xdragasprite_start: 0x%x: %s",
+ error->errnum, error->errmess);
}
drag.type = wimp_DRAG_USER_FIXED;
@@ -1285,7 +1327,8 @@ void ro_gui_drag_icon(int x, int y, const char *sprite)
error = xwimp_drag_box(&drag);
if (error) {
- LOG("xwimp_drag_box: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("DragError", error->errmess);
} else {
dragbox_active = true;
@@ -1323,14 +1366,20 @@ void ro_gui_drag_box_cancel(void)
if (using_dragasprite) {
error = xdragasprite_stop();
if (error) {
- LOG("xdragasprite_stop: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xdragasprite_stop: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
else {
error = xwimp_drag_box(NULL);
if (error) {
- LOG("xwimp_drag_box: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_drag_box: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -1384,7 +1433,8 @@ void ro_gui_save_datasave_ack(wimp_message *message)
default:
if (!gui_save_content) {
- LOG("unexpected DataSaveAck: gui_save_content not set");
+ NSLOG(netsurf, INFO,
+ "unexpected DataSaveAck: gui_save_content not set");
return;
}
break;
diff --git a/frontends/riscos/save_draw.c b/frontends/riscos/save_draw.c
index 1e0bc1ec6..9ee730434 100644
--- a/frontends/riscos/save_draw.c
+++ b/frontends/riscos/save_draw.c
@@ -54,7 +54,7 @@ static int ro_save_draw_height;
*/
static nserror ro_save_draw_error(pencil_code code)
{
- LOG("code %i", code);
+ NSLOG(netsurf, INFO, "code %i", code);
switch (code) {
case pencil_OK:
@@ -333,13 +333,13 @@ ro_save_draw_path(const struct redraw_context *ctx,
return NSERROR_OK;
if (p[0] != PLOTTER_PATH_MOVE) {
- LOG("path doesn't start with a move");
+ NSLOG(netsurf, INFO, "path doesn't start with a move");
return NSERROR_INVALID;
}
path = malloc(sizeof *path * (n + 10));
if (!path) {
- LOG("out of memory");
+ NSLOG(netsurf, INFO, "out of memory");
return NSERROR_INVALID;
}
@@ -389,7 +389,7 @@ ro_save_draw_path(const struct redraw_context *ctx,
i += 7;
empty_path = false;
} else {
- LOG("bad path command %f", p[i]);
+ NSLOG(netsurf, INFO, "bad path command %f", p[i]);
free(path);
return NSERROR_INVALID;
}
@@ -624,8 +624,8 @@ bool save_as_draw(struct hlcache_handle *h, const char *path)
(byte *) drawfile_buffer,
(byte *) drawfile_buffer + drawfile_size);
if (error) {
- LOG("xosfile_save_stamped failed: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_save_stamped failed: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
pencil_free(ro_save_draw_diagram);
return false;
diff --git a/frontends/riscos/schedule.c b/frontends/riscos/schedule.c
index 54308b7a9..cb44d906d 100644
--- a/frontends/riscos/schedule.c
+++ b/frontends/riscos/schedule.c
@@ -108,7 +108,7 @@ nserror riscos_schedule(int t, void (*callback)(void *p), void *p)
entry = malloc(sizeof *entry);
if (!entry) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
return NSERROR_NOMEM;
}
diff --git a/frontends/riscos/sslcert.c b/frontends/riscos/sslcert.c
index 85b84456e..4d81268f4 100644
--- a/frontends/riscos/sslcert.c
+++ b/frontends/riscos/sslcert.c
@@ -82,14 +82,14 @@ static void ro_gui_cert_release_window(struct ro_cert_window *certw)
error = xwimp_delete_window(certw->wh);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
error = xwimp_delete_window(certw->core.wh);
if (error) {
- LOG("xwimp_delete_window: 0x%x:%s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess);
}
free(certw);
@@ -165,16 +165,16 @@ static nserror cert_attach_pane(wimp_w parent, wimp_w pane)
winfo.w = pane;
error = xwimp_get_window_info_header_only(&winfo);
if (error) {
- LOG("xwimp_get_window_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_info: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INIT_FAILED;
}
wstate.w = parent;
error = xwimp_get_window_state(&wstate);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INIT_FAILED;
}
@@ -182,8 +182,8 @@ static nserror cert_attach_pane(wimp_w parent, wimp_w pane)
istate.i = ICON_SSL_PANE;
error = xwimp_get_icon_state(&istate);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INIT_FAILED;
}
@@ -211,8 +211,8 @@ static nserror cert_attach_pane(wimp_w parent, wimp_w pane)
if (set_extent) {
error = xwimp_set_extent(pane, &(winfo.extent));
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INIT_FAILED;
}
}
@@ -225,8 +225,8 @@ static nserror cert_attach_pane(wimp_w parent, wimp_w pane)
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_LS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_RS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess);
return NSERROR_INIT_FAILED;
}
@@ -336,8 +336,8 @@ gui_cert_verify(nsurl *url,
/* Create the SSL window */
error = xwimp_create_window(dialog_cert_template, &ncwin->wh);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
free(ncwin);
return NSERROR_INIT_FAILED;
}
@@ -345,8 +345,8 @@ gui_cert_verify(nsurl *url,
/* create ssl viewer pane window */
error = xwimp_create_window(cert_tree_template, &ncwin->core.wh);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
free(ncwin);
return NSERROR_INIT_FAILED;
}
diff --git a/frontends/riscos/textarea.c b/frontends/riscos/textarea.c
index d9872927c..6f41c640b 100644
--- a/frontends/riscos/textarea.c
+++ b/frontends/riscos/textarea.c
@@ -138,7 +138,7 @@ uintptr_t ro_textarea_create(wimp_w parent, wimp_i icon, unsigned int flags,
ret = malloc(sizeof(struct text_area));
if (!ret) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
return 0;
}
@@ -148,7 +148,7 @@ uintptr_t ro_textarea_create(wimp_w parent, wimp_i icon, unsigned int flags,
ret->flags = flags;
ret->text = malloc(64);
if (!ret->text) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
free(ret);
return 0;
}
@@ -160,7 +160,7 @@ uintptr_t ro_textarea_create(wimp_w parent, wimp_i icon, unsigned int flags,
// ret->selection_end = (unsigned int)-1;
ret->font_family = strdup(font_family ? font_family : "Corpus");
if (!ret->font_family) {
- LOG("strdup failed");
+ NSLOG(netsurf, INFO, "strdup failed");
free(ret->text);
free(ret);
return 0;
@@ -181,7 +181,8 @@ uintptr_t ro_textarea_create(wimp_w parent, wimp_i icon, unsigned int flags,
text_area_definition.title_fg = wimp_COLOUR_BLACK;
error = xwimp_create_window(&text_area_definition, &ret->window);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
free(ret->font_family);
free(ret->text);
free(ret);
@@ -228,7 +229,8 @@ bool ro_textarea_update(uintptr_t self)
state.w = ta->parent;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -236,7 +238,8 @@ bool ro_textarea_update(uintptr_t self)
istate.i = ta->icon;
error = xwimp_get_icon_state(&istate);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -267,7 +270,8 @@ bool ro_textarea_update(uintptr_t self)
error = xwimp_set_extent(ta->window, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -282,7 +286,8 @@ bool ro_textarea_update(uintptr_t self)
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_RS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess);
return false;
}
@@ -307,7 +312,8 @@ void ro_textarea_destroy(uintptr_t self)
error = xwimp_delete_window(ta->window);
if (error) {
- LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
ro_gui_wimp_event_finalise(ta->window);
@@ -331,14 +337,14 @@ bool ro_textarea_set_text(uintptr_t self, const char *text)
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return true;
}
if (len >= ta->text_alloc) {
char *temp = realloc(ta->text, len + 64);
if (!temp) {
- LOG("realloc failed");
+ NSLOG(netsurf, INFO, "realloc failed");
return false;
}
ta->text = temp;
@@ -368,7 +374,7 @@ int ro_textarea_get_text(uintptr_t self, char *buf, unsigned int len)
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return -1;
}
@@ -378,7 +384,7 @@ int ro_textarea_get_text(uintptr_t self, char *buf, unsigned int len)
}
if (len < ta->text_len) {
- LOG("buffer too small");
+ NSLOG(netsurf, INFO, "buffer too small");
return -1;
}
@@ -403,7 +409,7 @@ void ro_textarea_insert_text(uintptr_t self, unsigned int index,
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return;
}
@@ -420,7 +426,7 @@ void ro_textarea_insert_text(uintptr_t self, unsigned int index,
if (b_len + ta->text_len >= ta->text_alloc) {
char *temp = realloc(ta->text, b_len + ta->text_len + 64);
if (!temp) {
- LOG("realloc failed");
+ NSLOG(netsurf, INFO, "realloc failed");
return;
}
@@ -457,7 +463,7 @@ void ro_textarea_replace_text(uintptr_t self, unsigned int start,
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return;
}
@@ -491,7 +497,7 @@ void ro_textarea_replace_text(uintptr_t self, unsigned int start,
char *temp = realloc(ta->text,
b_len + ta->text_len - (b_end - b_start) + 64);
if (!temp) {
- LOG("realloc failed");
+ NSLOG(netsurf, INFO, "realloc failed");
return;
}
@@ -532,7 +538,7 @@ void ro_textarea_set_caret(uintptr_t self, unsigned int caret)
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return;
}
@@ -574,9 +580,10 @@ void ro_textarea_set_caret(uintptr_t self, unsigned int caret)
b_off - ta->lines[ta->caret_pos.line].b_start, &x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_width: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO, "rufl_width: 0x%x: %s",
+ rufl_fm_error->errnum, rufl_fm_error->errmess);
else
- LOG("rufl_width: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_width: 0x%x", code);
return;
}
@@ -585,7 +592,8 @@ void ro_textarea_set_caret(uintptr_t self, unsigned int caret)
ta->line_height / 4 + ta->line_spacing,
os_line_height.y, -1);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
@@ -609,7 +617,7 @@ void ro_textarea_set_caret_xy(uintptr_t self, int x, int y)
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return;
}
@@ -623,7 +631,8 @@ void ro_textarea_set_caret_xy(uintptr_t self, int x, int y)
state.w = ta->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -644,9 +653,10 @@ void ro_textarea_set_caret_xy(uintptr_t self, int x, int y)
x, &b_off, &x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_x_to_offset: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO, "rufl_x_to_offset: 0x%x: %s",
+ rufl_fm_error->errnum, rufl_fm_error->errmess);
else
- LOG("rufl_x_to_offset: 0x%x", code);
+ NSLOG(netsurf, INFO, "rufl_x_to_offset: 0x%x", code);
return;
}
@@ -670,7 +680,7 @@ unsigned int ro_textarea_get_caret(uintptr_t self)
ta = (struct text_area *)self;
if (!ta || ta->magic != MAGIC) {
- LOG("magic doesn't match");
+ NSLOG(netsurf, INFO, "magic doesn't match");
return -1;
}
@@ -711,7 +721,7 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
ta->lines =
malloc(LINE_CHUNK_SIZE * sizeof(struct line_info));
if (!ta->lines) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
return;
}
}
@@ -734,9 +744,13 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
&b_off, &x);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_x_to_offset: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_x_to_offset: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_x_to_offset: 0x%x", code);
+ NSLOG(netsurf, INFO,
+ "rufl_x_to_offset: 0x%x", code);
return;
}
@@ -745,7 +759,7 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
(line_count + LINE_CHUNK_SIZE) *
sizeof(struct line_info));
if (!temp) {
- LOG("realloc failed");
+ NSLOG(netsurf, INFO, "realloc failed");
return;
}
@@ -809,7 +823,8 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
error = xwimp_set_extent(ta->window, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -826,7 +841,10 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
error = xwimp_get_window_state_and_nesting(&state,
&parent, &linkage);
if (error) {
- LOG("xwimp_get_window_state_and_nesting: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state_and_nesting: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
@@ -839,7 +857,10 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
state.w = ta->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
@@ -853,7 +874,10 @@ void ro_textarea_reflow(struct text_area *ta, unsigned int line)
error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state),
parent, linkage);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
@@ -1009,7 +1033,10 @@ bool ro_textarea_key_press(wimp_key *key)
(wimp_message*)&keypress, ta->parent,
ta->icon, 0);
if (error) {
- LOG("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_send_message: 0x%x:%s",
+ error->errnum,
+ error->errmess);
}
break;
}
@@ -1060,7 +1087,8 @@ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
else
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -1076,13 +1104,17 @@ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
colourtrans_SET_BG_GCOL | colourtrans_USE_ECFS_GCOL,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
error = xos_clg();
if (error) {
- LOG("xos_clg: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_clg: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -1113,7 +1145,10 @@ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
0xD9D9D900 : 0xFFFFFF00,
0x00000000, 14, 0, 0, 0);
if (error) {
- LOG("xcolourtrans_set_font_colours: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_font_colours: 0x%x: %s",
+ error->errnum,
+ error->errmess);
return;
}
@@ -1128,15 +1163,20 @@ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
rufl_BLEND_FONT);
if (code != rufl_OK) {
if (code == rufl_FONT_MANAGER_ERROR)
- LOG("rufl_paint: rufl_FONT_MANAGER_ERROR: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess);
+ NSLOG(netsurf, INFO,
+ "rufl_paint: rufl_FONT_MANAGER_ERROR: 0x%x: %s",
+ rufl_fm_error->errnum,
+ rufl_fm_error->errmess);
else
- LOG("rufl_paint: 0x%x", code);
+ NSLOG(netsurf, INFO,
+ "rufl_paint: 0x%x", code);
}
}
error = xwimp_get_rectangle(redraw, &more);
if (error) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
@@ -1153,7 +1193,8 @@ void ro_textarea_open(wimp_open *open)
error = xwimp_open_window(open);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
}
diff --git a/frontends/riscos/textselection.c b/frontends/riscos/textselection.c
index 5a430c06f..e5be27791 100644
--- a/frontends/riscos/textselection.c
+++ b/frontends/riscos/textselection.c
@@ -92,12 +92,13 @@ void gui_start_selection(struct gui_window *g)
wimp_drag drag;
os_error *error;
- LOG("starting text_selection drag");
+ NSLOG(netsurf, INFO, "starting text_selection drag");
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -111,7 +112,8 @@ void gui_start_selection(struct gui_window *g)
error = xwimp_send_message(wimp_USER_MESSAGE,
(wimp_message*)&msg, wimp_BROADCAST);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
owns_caret_and_selection = true;
@@ -127,7 +129,8 @@ void gui_start_selection(struct gui_window *g)
wimp_AUTO_SCROLL_ENABLE_HORIZONTAL,
&scroll, 0);
if (error)
- LOG("xwimp_auto_scroll: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_auto_scroll: 0x%x: %s",
+ error->errnum, error->errmess);
ro_mouse_drag_start(ro_gui_selection_drag_end, ro_gui_window_mouse_at,
NULL, g);
@@ -141,7 +144,8 @@ void gui_start_selection(struct gui_window *g)
error = xwimp_drag_box(&drag);
if (error) {
- LOG("xwimp_drag_box: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
last_start_window = g;
@@ -166,17 +170,20 @@ static void ro_gui_selection_drag_end(wimp_dragged *drag, void *data)
scroll.w = g->window;
error = xwimp_auto_scroll(0, &scroll, 0);
if (error)
- LOG("xwimp_auto_scroll: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_auto_scroll: 0x%x: %s",
+ error->errnum, error->errmess);
error = xwimp_drag_box((wimp_drag*)-1);
if (error) {
- LOG("xwimp_drag_box: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -217,7 +224,7 @@ static void gui_set_clipboard(const char *buffer, size_t length,
wimp_full_message_claim_entity msg;
os_error *error;
- LOG("claiming clipboard");
+ NSLOG(netsurf, INFO, "claiming clipboard");
msg.size = sizeof(msg);
msg.your_ref = 0;
@@ -227,13 +234,14 @@ static void gui_set_clipboard(const char *buffer, size_t length,
error = xwimp_send_message(wimp_USER_MESSAGE,
(wimp_message*)&msg, wimp_BROADCAST);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
owns_clipboard = true;
}
- LOG("clipboard now holds %zd bytes", clip_length);
+ NSLOG(netsurf, INFO, "clipboard now holds %zd bytes", clip_length);
}
@@ -441,7 +449,7 @@ void ro_gui_selection_claim_entity(wimp_full_message_claim_entity *claim)
/* ignore our own broadcasts! */
if (claim->sender != task_handle) {
- LOG("%x", claim->flags);
+ NSLOG(netsurf, INFO, "%x", claim->flags);
if (claim->flags & wimp_CLAIM_CARET_OR_SELECTION) {
owns_caret_and_selection = false;
@@ -474,7 +482,7 @@ void ro_gui_selection_data_request(wimp_full_message_data_request *req)
// bits ftype = req->file_types[i];
// if (ftype == ~0U) break; /* list terminator */
//
-// LOG("type %x", ftype);
+// NSLOG(netsurf, INFO, "type %x", ftype);
// i++;
// }
@@ -524,7 +532,8 @@ bool ro_gui_save_clipboard(const char *path)
free(local_cb);
if (error) {
- LOG("xosfile_save_stamped: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("SaveError", error->errmess);
return false;
}
@@ -606,7 +615,8 @@ void ro_gui_selection_send_dragging(wimp_pointer *pointer)
{
wimp_full_message_dragging dragmsg;
- LOG("sending DRAGGING to %p, %d", pointer->w, pointer->i);
+ NSLOG(netsurf, INFO, "sending DRAGGING to %p, %d", pointer->w,
+ pointer->i);
dragmsg.size = offsetof(wimp_full_message_dragging, file_types) + 8;
dragmsg.your_ref = 0;
diff --git a/frontends/riscos/theme.c b/frontends/riscos/theme.c
index b0b4ab879..341b7f7cd 100644
--- a/frontends/riscos/theme.c
+++ b/frontends/riscos/theme.c
@@ -16,8 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
- * Window themes (implementation).
+/**
+ * \file
+ * Window themes implementation.
*/
#include <alloca.h>
@@ -180,8 +181,10 @@ static void ro_gui_theme_get_available_in_dir(const char *directory)
(osgbpb_info_list *) &info, 1, context,
sizeof(info), 0, &read_count, &context);
if (error) {
- LOG("xosgbpb_dir_entries_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosgbpb_dir_entries_info: 0x%x: %s",
+ error->errnum,
+ error->errmess);
if (error->errnum == 0xd6) /* no such dir */
return;
ro_warn_user("MiscError", error->errmess);
@@ -364,7 +367,7 @@ bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname)
/* create a full filename */
filename = malloc(strlen(folder) + strlen(leafname) + 2);
if (!filename) {
- LOG("No memory for malloc");
+ NSLOG(netsurf, INFO, "No memory for malloc");
ro_warn_user("NoMemory", 0);
return false;
}
@@ -374,7 +377,8 @@ bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname)
error = xosfind_openinw(osfind_NO_PATH, filename, 0,
&file_handle);
if (error) {
- LOG("xosfind_openinw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfind_openinw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("FileError", error->errmess);
free(filename);
return false;
@@ -389,7 +393,8 @@ bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname)
0, &output_left);
xosfind_closew(file_handle);
if (error) {
- LOG("xosbgpb_read_atw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosbgpb_read_atw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("FileError", error->errmess);
free(filename);
return false;
@@ -403,7 +408,7 @@ bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname)
current = (struct theme_descriptor *)calloc(1,
sizeof(struct theme_descriptor));
if (!current) {
- LOG("calloc failed");
+ NSLOG(netsurf, INFO, "calloc failed");
ro_warn_user("NoMemory", 0);
free(filename);
return false;
@@ -521,7 +526,7 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
descriptor->theme = (struct theme *)calloc(1,
sizeof(struct theme));
if (!descriptor->theme) {
- LOG("calloc() failed");
+ NSLOG(netsurf, INFO, "calloc() failed");
ro_warn_user("NoMemory", 0);
continue;
}
@@ -531,7 +536,10 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
error = xosfile_read_stamped_no_path(descriptor->filename,
&obj_type, 0, 0, &file_size, 0, 0);
if (error) {
- LOG("xosfile_read_stamped_no_path: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_read_stamped_no_path: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("FileError", error->errmess);
continue;
}
@@ -539,7 +547,7 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
continue;
raw_data = malloc(file_size);
if (!raw_data) {
- LOG("malloc() failed");
+ NSLOG(netsurf, INFO, "malloc() failed");
ro_warn_user("NoMemory", 0);
continue;
}
@@ -547,7 +555,10 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
(byte *)raw_data, 0, 0, 0, 0, 0);
if (error) {
free(raw_data);
- LOG("xosfile_load_stamped_no_path: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_load_stamped_no_path: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("FileError", error->errmess);
continue;
}
@@ -556,7 +567,10 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
error = xsquash_decompress_return_sizes(-1, &workspace_size, 0);
if (error) {
free(raw_data);
- LOG("xsquash_decompress_return_sizes: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xsquash_decompress_return_sizes: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
continue;
}
@@ -566,7 +580,7 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
if ((!decompressed) || (!workspace)) {
free(decompressed);
free(raw_data);
- LOG("malloc() failed");
+ NSLOG(netsurf, INFO, "malloc() failed");
ro_warn_user("NoMemory", 0);
continue;
}
@@ -581,7 +595,8 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
free(raw_data);
if (error) {
free(decompressed);
- LOG("xsquash_decompress: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xsquash_decompress: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
continue;
}
@@ -599,7 +614,10 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
descriptor->theme->sprite_area,
sprite_name, 16, i, 0);
if (error) {
- LOG("xosspriteop_return_name: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_return_name: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
continue;
}
@@ -614,7 +632,10 @@ bool ro_gui_theme_open(struct theme_descriptor *descriptor, bool list)
&dimensions.x, &dimensions.y,
(osbool *) 0, &mode);
if (error) {
- LOG("xosspriteop_read_sprite_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_read_sprite_info: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
continue;
}
diff --git a/frontends/riscos/theme_install.c b/frontends/riscos/theme_install.c
index 43ecb4687..fbca9e4fa 100644
--- a/frontends/riscos/theme_install.c
+++ b/frontends/riscos/theme_install.c
@@ -182,7 +182,7 @@ bool ro_gui_theme_install_apply(wimp_w w)
/* convert spaces to hard spaces */
theme_file = strdup(theme_install_descriptor.name);
if (!theme_file) {
- LOG("malloc failed");
+ NSLOG(netsurf, INFO, "malloc failed");
ro_warn_user("NoMemory", 0);
return false;
}
@@ -203,7 +203,8 @@ bool ro_gui_theme_install_apply(wimp_w w)
(byte *) source_data,
(byte *) source_data + source_size);
if (error) {
- LOG("xosfile_save_stamped: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("ThemeInstallErr", 0);
free(theme_file);
return false;
diff --git a/frontends/riscos/toolbar.c b/frontends/riscos/toolbar.c
index 2b5cb3415..758c90cc2 100644
--- a/frontends/riscos/toolbar.c
+++ b/frontends/riscos/toolbar.c
@@ -227,7 +227,7 @@ struct toolbar *ro_toolbar_create(struct theme_descriptor *descriptor,
toolbar = calloc(sizeof(struct toolbar), 1);
if (toolbar == NULL) {
- LOG("No memory for malloc()");
+ NSLOG(netsurf, INFO, "No memory for malloc()");
ro_warn_user("NoMemory", 0);
return NULL;
}
@@ -366,7 +366,8 @@ bool ro_toolbar_rebuild(struct toolbar *toolbar)
old_window = toolbar->toolbar_handle;
error = xwimp_delete_window(toolbar->toolbar_handle);
if (error)
- LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess);
toolbar->toolbar_handle = NULL;
}
@@ -375,7 +376,8 @@ bool ro_toolbar_rebuild(struct toolbar *toolbar)
error = xwimp_create_window(&ro_toolbar_window,
&toolbar->toolbar_handle);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -493,7 +495,8 @@ bool ro_toolbar_rebuild(struct toolbar *toolbar)
icon.icon.data.indirected_text.size = 1;
error = xwimp_create_icon(&icon, &toolbar->editor_div1);
if (error) {
- LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_icon: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
toolbar->editor_div1 = -1;
}
@@ -558,7 +561,10 @@ bool ro_toolbar_attach(struct toolbar *toolbar, wimp_w parent)
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
- LOG("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_open_window_nested: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -568,7 +574,8 @@ bool ro_toolbar_attach(struct toolbar *toolbar, wimp_w parent)
error = xwimp_close_window(toolbar->toolbar_handle);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -601,7 +608,10 @@ bool ro_toolbar_process(struct toolbar *toolbar, int width, bool reformat)
outline.w = toolbar->parent_handle;
error = xwimp_get_window_outline(&outline);
if (error) {
- LOG("xwimp_get_window_outline: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_outline: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -621,7 +631,10 @@ bool ro_toolbar_process(struct toolbar *toolbar, int width, bool reformat)
state.w = toolbar->parent_handle;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -647,7 +660,10 @@ bool ro_toolbar_process(struct toolbar *toolbar, int width, bool reformat)
error = xwimp_set_extent(toolbar->toolbar_handle,
&extent);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -935,7 +951,7 @@ void ro_toolbar_destroy(struct toolbar *toolbar)
if (toolbar == NULL)
return;
- LOG("Destroying toolbar 0x%x", (unsigned int)toolbar);
+ NSLOG(netsurf, INFO, "Destroying toolbar 0x%x", (unsigned int)toolbar);
/* Destroy the widgets. */
@@ -994,7 +1010,8 @@ void ro_toolbar_redraw(wimp_draw *redraw)
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1013,7 +1030,8 @@ void ro_toolbar_redraw(wimp_draw *redraw)
error = xwimp_get_rectangle(redraw, &more);
if (error) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1046,7 +1064,8 @@ bool ro_toolbar_click(wimp_pointer *pointer)
state.w = toolbar->toolbar_handle;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -1325,7 +1344,8 @@ const char *ro_toolbar_get_help_suffix(wimp_w w, wimp_i i, os_coord *pos,
state.w = toolbar->toolbar_handle;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NULL;
}
diff --git a/frontends/riscos/ucstables.c b/frontends/riscos/ucstables.c
index 8e538ef95..3e31c992e 100644
--- a/frontends/riscos/ucstables.c
+++ b/frontends/riscos/ucstables.c
@@ -623,7 +623,8 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
off - prev_off, &temp, NULL);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_from_enc failed");
+ NSLOG(netsurf, INFO,
+ "utf8_from_enc failed");
free(*result);
return NSERROR_NOMEM;
}
@@ -665,7 +666,7 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
&temp, NULL);
if (err != NSERROR_OK) {
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_from_enc failed");
+ NSLOG(netsurf, INFO, "utf8_from_enc failed");
free(*result);
return NSERROR_NOMEM;
}
@@ -680,7 +681,7 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
/* and copy into more reasonably-sized buffer */
temp = realloc((*result), cur_off + 1);
if (!temp) {
- LOG("realloc failed");
+ NSLOG(netsurf, INFO, "realloc failed");
free(*result);
return NSERROR_NOMEM;
}
diff --git a/frontends/riscos/uri.c b/frontends/riscos/uri.c
index a2f126b31..d79cfe56d 100644
--- a/frontends/riscos/uri.c
+++ b/frontends/riscos/uri.c
@@ -120,7 +120,8 @@ void ro_uri_bounce(wimp_message *msg)
/* Get required buffer size */
e = xuri_request_uri(0, NULL, 0, message->handle, &size);
if (e) {
- LOG("xuri_request_uri: %d: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "xuri_request_uri: %d: %s", e->errnum,
+ e->errmess);
return;
}
@@ -131,7 +132,8 @@ void ro_uri_bounce(wimp_message *msg)
/* Get URI */
e = xuri_request_uri(0, uri_buf, size, message->handle, 0);
if (e) {
- LOG("xuri_request_uri: %d: %s", e->errnum, e->errmess);
+ NSLOG(netsurf, INFO, "xuri_request_uri: %d: %s", e->errnum,
+ e->errmess);
free(uri_buf);
return;
}
diff --git a/frontends/riscos/url_complete.c b/frontends/riscos/url_complete.c
index 16c6e3a2e..82c2d2c67 100644
--- a/frontends/riscos/url_complete.c
+++ b/frontends/riscos/url_complete.c
@@ -171,7 +171,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
-(url_complete_matches_selection + 1) * 44,
65536, -url_complete_matches_selection * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -210,7 +211,10 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
state.w = parent;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -228,7 +232,10 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
error = xwimp_force_redraw(dialog_url_complete,
0, -(i + 1) * 44, 65536, -i * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_force_redraw: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError",
error->errmess);
}
@@ -281,7 +288,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
0, -(old_selection + 1) * 44,
65536, -old_selection * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -289,7 +297,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
0, -(url_complete_matches_selection + 1) * 44,
65536, -url_complete_matches_selection * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -320,7 +329,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
state.w = dialog_url_complete;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return true;
}
@@ -335,7 +345,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
error = xwimp_open_window(PTR_WIMP_OPEN(&state));
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return true;
}
@@ -411,7 +422,8 @@ void ro_gui_url_complete_resize(struct toolbar *toolbar, wimp_open *open)
state.w = dialog_url_complete;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -423,13 +435,14 @@ void ro_gui_url_complete_resize(struct toolbar *toolbar, wimp_open *open)
toolbar_state.w = ro_toolbar_get_window(toolbar);
error = xwimp_get_window_state(&toolbar_state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
if (!ro_toolbar_get_url_field_extent(toolbar, &url_extent)) {
- LOG("Failed to read URL field extent.");
+ NSLOG(netsurf, INFO, "Failed to read URL field extent.");
return;
}
@@ -438,7 +451,8 @@ void ro_gui_url_complete_resize(struct toolbar *toolbar, wimp_open *open)
extent.x1 = 65536;
error = xwimp_set_extent(dialog_url_complete, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -460,14 +474,16 @@ void ro_gui_url_complete_resize(struct toolbar *toolbar, wimp_open *open)
if (state.visible.x1 - state.visible.x0 < 0) {
error = xwimp_close_window(dialog_url_complete);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
} else {
error = xwimp_open_window_nested_with_flags(&state,
(wimp_w)-1, 0);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -507,7 +523,8 @@ bool ro_gui_url_complete_close(void)
error = xwimp_close_window(dialog_url_complete);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -547,7 +564,7 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
/* no matches? no redraw */
if (!url_complete_matches) {
- LOG("Attempt to redraw with no matches made");
+ NSLOG(netsurf, INFO, "Attempt to redraw with no matches made");
/* Fill is never used, so make it something obvious */
ro_gui_user_redraw(redraw, false, os_COLOUR_BLACK);
return;
@@ -582,7 +599,10 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
error = xwimp_plot_icon(&url_complete_icon);
if (error) {
- LOG("xwimp_plot_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_plot_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -604,7 +624,10 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
url_complete_sprite.extent.y0 = -(line + 1) * 44;
error = xwimp_plot_icon(&url_complete_sprite);
if (error) {
- LOG("xwimp_plot_icon: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_plot_icon: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -658,7 +681,8 @@ bool ro_gui_url_complete_click(wimp_pointer *pointer)
state.w = dialog_url_complete;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -685,14 +709,16 @@ bool ro_gui_url_complete_click(wimp_pointer *pointer)
0, -(old_selection + 1) * 44,
65536, -old_selection * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_force_redraw(dialog_url_complete,
0, -(url_complete_matches_selection + 1) * 44,
65536, -url_complete_matches_selection * 44);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
diff --git a/frontends/riscos/url_protocol.c b/frontends/riscos/url_protocol.c
index 9a7ae062c..184aaeab0 100644
--- a/frontends/riscos/url_protocol.c
+++ b/frontends/riscos/url_protocol.c
@@ -75,17 +75,19 @@ void ro_url_message_received(wimp_message *message)
} else {
if (!url_message->indirect.url.offset) {
- LOG("no URL in message");
+ NSLOG(netsurf, INFO, "no URL in message");
return;
}
if (28 < message->size &&
url_message->indirect.body_file.offset) {
- LOG("POST for URL message not implemented");
+ NSLOG(netsurf, INFO,
+ "POST for URL message not implemented");
return;
}
if (url_message->indirect.url.offset < 28 ||
236 <= url_message->indirect.url.offset) {
- LOG("external pointers in URL message unimplemented");
+ NSLOG(netsurf, INFO,
+ "external pointers in URL message unimplemented");
/* these messages have never been seen in the wild,
* and there is the problem of invalid addresses which
* would cause an abort */
@@ -122,7 +124,8 @@ void ro_url_message_received(wimp_message *message)
error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE, message,
message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -165,7 +168,8 @@ void ro_url_broadcast(const char *url)
error = xwimp_send_message(wimp_USER_MESSAGE_RECORDED,
(wimp_message *) &message, 0);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -184,7 +188,7 @@ void ro_url_load(const char *url)
colon = strchr(url, ':');
if (!colon) {
- LOG("invalid url '%s'", url);
+ NSLOG(netsurf, INFO, "invalid url '%s'", url);
return;
}
@@ -204,7 +208,8 @@ void ro_url_load(const char *url)
error = xwimp_start_task(command, 0);
if (error) {
- LOG("xwimp_start_task: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_start_task: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
diff --git a/frontends/riscos/wimp.c b/frontends/riscos/wimp.c
index abf099a55..d851ab59e 100644
--- a/frontends/riscos/wimp.c
+++ b/frontends/riscos/wimp.c
@@ -103,7 +103,10 @@ void ro_gui_wimp_cache_furniture_sizes(wimp_w w)
furniture_sizes.border_widths.x1 = 40;
error = xwimpextend_get_furniture_sizes(&furniture_sizes);
if (error) {
- LOG("xwimpextend_get_furniture_sizes: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimpextend_get_furniture_sizes: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -123,13 +126,15 @@ bool ro_gui_wimp_read_eig_factors(os_mode mode, int *xeig, int *yeig)
error = xos_read_mode_variable(mode, os_MODEVAR_XEIG_FACTOR, xeig, 0);
if (error) {
- LOG("xos_read_mode_variable: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_read_mode_variable: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
return false;
}
error = xos_read_mode_variable(mode, os_MODEVAR_YEIG_FACTOR, yeig, 0);
if (error) {
- LOG("xos_read_mode_variable: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xos_read_mode_variable: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
return false;
}
@@ -196,14 +201,16 @@ void ro_gui_force_redraw_icon(wimp_w w, wimp_i i)
ic.i = i;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
error = xwimp_force_redraw(w, ic.icon.extent.x0, ic.icon.extent.y0,
ic.icon.extent.x1, ic.icon.extent.y1);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -235,7 +242,8 @@ const char *ro_gui_get_icon_string(wimp_w w, wimp_i i)
ic.i = i;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NULL;
}
@@ -277,7 +285,7 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8)
if (err != NSERROR_OK) {
/* A bad encoding should never happen, so assert this */
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
/* Paranoia */
local_text = NULL;
}
@@ -292,7 +300,8 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8)
ic.i = i;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
goto exit;
}
@@ -325,7 +334,10 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8)
(button_type == wimp_BUTTON_WRITE_CLICK_DRAG)) {
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
goto exit;
}
@@ -336,7 +348,10 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8)
error = xwimp_set_caret_position(w, i, caret.pos.x,
caret.pos.y, -1, caret.index);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -433,7 +448,8 @@ void ro_gui_set_icon_selected_state(wimp_w w, wimp_i i, bool state)
error = xwimp_set_icon_state(w, i,
(state ? wimp_ICON_SELECTED : 0), wimp_ICON_SELECTED);
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -452,7 +468,8 @@ bool ro_gui_get_icon_selected_state(wimp_w w, wimp_i i)
ic.i = i;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -478,7 +495,8 @@ void ro_gui_set_icon_shaded_state(wimp_w w, wimp_i i, bool state)
error = xwimp_set_icon_state(w, i,
(state ? wimp_ICON_SHADED : 0), wimp_ICON_SHADED);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
if (!state)
@@ -487,7 +505,8 @@ void ro_gui_set_icon_shaded_state(wimp_w w, wimp_i i, bool state)
/* ensure the caret is not in a shaded icon */
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -499,7 +518,8 @@ void ro_gui_set_icon_shaded_state(wimp_w w, wimp_i i, bool state)
/* lose the caret */
error = xwimp_set_caret_position((wimp_w)-1, (wimp_i)-1, -1, -1, -1, -1);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -540,7 +560,8 @@ void ro_gui_set_icon_deleted_state(wimp_w w, wimp_i i, bool state)
error = xwimp_set_icon_state(w, i,
(state ? wimp_ICON_DELETED : 0), wimp_ICON_DELETED);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
if (!state)
@@ -549,7 +570,8 @@ void ro_gui_set_icon_deleted_state(wimp_w w, wimp_i i, bool state)
/* ensure the caret is not in a shaded icon */
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -561,7 +583,8 @@ void ro_gui_set_icon_deleted_state(wimp_w w, wimp_i i, bool state)
/* lose the caret */
error = xwimp_set_caret_position((wimp_w)-1, (wimp_i)-1, -1, -1, -1, -1);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -597,7 +620,8 @@ void ro_gui_set_icon_button_type(wimp_w w, wimp_i i, int type)
error = xwimp_set_icon_state(w, i, wimp_ICON_BUTTON_TYPE,
(type << wimp_ICON_BUTTON_TYPE_SHIFT));
if (error) {
- LOG("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -622,7 +646,8 @@ void ro_gui_set_icon_sprite(wimp_w w, wimp_i i, osspriteop_area *area,
ic.i = i;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -659,7 +684,8 @@ void ro_gui_set_window_title(wimp_w w, const char *text)
window.w = w;
error = xwimp_get_window_info_header_only((wimp_window_info *)&window);
if (error) {
- LOG("xwimp_get_window_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -670,7 +696,7 @@ void ro_gui_set_window_title(wimp_w w, const char *text)
/* A bad encoding should never happen,
* so assert this */
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
return;
}
@@ -686,7 +712,8 @@ void ro_gui_set_window_title(wimp_w w, const char *text)
*/
error = xwimp_force_redraw_title(w);
if (error) {
- LOG("xwimp_force_redraw_title: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw_title: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -713,7 +740,8 @@ bool ro_gui_set_caret_first(wimp_w w)
win_state.w = w;
error = xwimp_get_window_state(&win_state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -724,7 +752,8 @@ bool ro_gui_set_caret_first(wimp_w w)
window.w = w;
error = xwimp_get_window_info_header_only((wimp_window_info *)&window);
if (error) {
- LOG("xwimp_get_window_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -735,7 +764,10 @@ bool ro_gui_set_caret_first(wimp_w w)
state.i = icon;
error = xwimp_get_icon_state(&state);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -752,7 +784,10 @@ bool ro_gui_set_caret_first(wimp_w w)
error = xwimp_set_caret_position(w, icon, 0, 0, -1,
strlen(state.icon.data.indirected_text.text));
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
return true;
@@ -778,7 +813,10 @@ osspriteop_area *ro_gui_load_sprite_file(const char *pathname)
error = xosfile_read_stamped_no_path(pathname,
&obj_type, 0, 0, &len, 0, 0);
if (error) {
- LOG("xosfile_read_stamped_no_path: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosfile_read_stamped_no_path: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
return 0;
}
@@ -801,7 +839,10 @@ osspriteop_area *ro_gui_load_sprite_file(const char *pathname)
error = xosspriteop_load_sprite_file(osspriteop_USER_AREA,
area, pathname);
if (error) {
- LOG("xosspriteop_load_sprite_file: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_load_sprite_file: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
free(area);
return 0;
@@ -831,7 +872,10 @@ bool ro_gui_wimp_sprite_exists(const char *sprite)
error = xwimpspriteop_select_sprite(sprite, 0);
if (error) {
if (error->errnum != error_SPRITE_OP_DOESNT_EXIST) {
- LOG("xwimpspriteop_select_sprite: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimpspriteop_select_sprite: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
}
return false;
@@ -904,7 +948,10 @@ bool ro_gui_wimp_get_sprite_dimensions(osspriteop_area *area, char *sprite,
if (height != NULL)
*height = dimensions.y;
} else if (error->errnum != error_SPRITE_OP_DOESNT_EXIST) {
- LOG("xosspriteop_read_sprite_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_read_sprite_info: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
return false;
}
@@ -929,7 +976,8 @@ void ro_gui_user_redraw(wimp_draw *redraw, bool user_fill,
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -939,14 +987,18 @@ void ro_gui_user_redraw(wimp_draw *redraw, bool user_fill,
colourtrans_SET_BG_GCOL,
os_ACTION_OVERWRITE, 0, 0);
if (error) {
- LOG("xcolourtrans_set_gcol: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xcolourtrans_set_gcol: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
}
os_clg();
}
error = xwimp_get_rectangle(redraw, &more);
if (error) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -973,7 +1025,8 @@ void ro_gui_wimp_update_window_furniture(wimp_w w, wimp_window_flags bic_mask,
state.w = w;
error = xwimp_get_window_state_and_nesting(&state, &parent, &linkage);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -986,7 +1039,8 @@ void ro_gui_wimp_update_window_furniture(wimp_w w, wimp_window_flags bic_mask,
state.next = wimp_HIDDEN;
error = xwimp_open_window_nested_with_flags(&state, parent, linkage);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -994,7 +1048,8 @@ void ro_gui_wimp_update_window_furniture(wimp_w w, wimp_window_flags bic_mask,
if (!open) {
error = xwimp_close_window(w);
if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_close_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1016,7 +1071,8 @@ bool ro_gui_wimp_check_window_furniture(wimp_w w, wimp_window_flags mask)
state.w = w;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -1116,7 +1172,8 @@ void ro_gui_scroll(wimp_scroll *scroll)
error = xwimp_open_window((wimp_open *) scroll);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
diff --git a/frontends/riscos/wimp_event.c b/frontends/riscos/wimp_event.c
index 015e87baf..cdca470da 100644
--- a/frontends/riscos/wimp_event.c
+++ b/frontends/riscos/wimp_event.c
@@ -156,7 +156,9 @@ bool ro_gui_wimp_event_memorise(wimp_w w)
ro_gui_get_icon_string(window->w, event->i));
if (!event->previous_value.textual) {
error = true;
- LOG("Unable to store state for icon %i", event->i);
+ NSLOG(netsurf, INFO,
+ "Unable to store state for icon %i",
+ event->i);
}
break;
case EVENT_CHECKBOX:
@@ -267,7 +269,10 @@ bool ro_gui_wimp_event_transfer(wimp_w from, wimp_w to)
struct event_window *window;
int h;
- LOG("Transferring all events from window 0x%x to window 0x%x", (unsigned int)from, (unsigned int)to);
+ NSLOG(netsurf, INFO,
+ "Transferring all events from window 0x%x to window 0x%x",
+ (unsigned int)from,
+ (unsigned int)to);
window = ro_gui_wimp_event_remove_window(from);
if (window == NULL || window->w != from)
@@ -293,7 +298,8 @@ void ro_gui_wimp_event_finalise(wimp_w w)
struct event_window *window;
struct icon_event *event;
- LOG("Removing all events for window 0x%x", (unsigned int)w);
+ NSLOG(netsurf, INFO, "Removing all events for window 0x%x",
+ (unsigned int)w);
window = ro_gui_wimp_event_remove_window(w);
if (!window)
return;
@@ -330,7 +336,8 @@ void ro_gui_wimp_event_deregister(wimp_w w, wimp_i i)
struct event_window *window;
struct icon_event *event, *parent, *child;
- LOG("Removing all events for window 0x%x, icon %d", (unsigned int)w, (int)i);
+ NSLOG(netsurf, INFO, "Removing all events for window 0x%x, icon %d",
+ (unsigned int)w, (int)i);
window = ro_gui_wimp_event_get_window(w);
if (!window)
return;
@@ -344,7 +351,8 @@ void ro_gui_wimp_event_deregister(wimp_w w, wimp_i i)
child = event->next;
if (event->i == i) {
- LOG("Removing event 0x%x", (unsigned int)event);
+ NSLOG(netsurf, INFO, "Removing event 0x%x",
+ (unsigned int)event);
if (parent == NULL)
window->first = child;
@@ -576,7 +584,8 @@ bool ro_gui_wimp_event_menu_selection(wimp_w w, wimp_i i, wimp_menu *menu,
ic.i = event->data.menu_gright.field;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -586,7 +595,8 @@ bool ro_gui_wimp_event_menu_selection(wimp_w w, wimp_i i, wimp_menu *menu,
return prepared;
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -594,7 +604,10 @@ bool ro_gui_wimp_event_menu_selection(wimp_w w, wimp_i i, wimp_menu *menu,
error = xwimp_set_caret_position(window->w, event->data.menu_gright.field,
-1, -1, -1, strlen(menu_entry->data.indirected_text.text));
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -666,7 +679,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
for (search = window->first; search; search = search->next)
if (search->i == event->data.linked_icon) break;
if (!search) {
- LOG("Incorrect reference.");
+ NSLOG(netsurf, INFO, "Incorrect reference.");
return false;
}
stepping = search->data.numeric_field.stepping;
@@ -703,13 +716,19 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
open.w = pointer->w;
error = xwimp_get_window_state(&open);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -718,7 +737,10 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
ro_gui_menu_destroy();
error = xwimp_open_window(PTR_WIMP_OPEN(&open));
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_open_window: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -728,7 +750,10 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
caret.pos.x, caret.pos.y,
-1, caret.index);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -796,7 +821,8 @@ void ro_gui_wimp_event_prepare_gright_menu(wimp_w w, struct icon_event *event)
ic.i = event->data.menu_gright.field;
error = xwimp_get_icon_state(&ic);
if (error) {
- LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -903,7 +929,8 @@ bool ro_gui_wimp_event_keypress(wimp_key *key)
*/
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &t_alphabet);
if (error) {
- LOG("failed reading alphabet: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "failed reading alphabet: 0x%x: %s",
+ error->errnum, error->errmess);
/* prevent any corruption of ucstable */
t_alphabet = alphabet;
}
@@ -917,7 +944,10 @@ bool ro_gui_wimp_event_keypress(wimp_key *key)
error = xserviceinternational_get_ucs_conversion_table(
alphabet, &unclaimed, &ostable);
if (error != NULL) {
- LOG("failed reading UCS conversion table: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "failed reading UCS conversion table: 0x%x: %s",
+ error->errnum,
+ error->errmess);
/* Try using our own table instead */
ucstable = ucstable_from_alphabet(alphabet);
} else if (unclaimed) {
@@ -974,7 +1004,9 @@ bool ro_gui_wimp_event_keypress(wimp_key *key)
/* If this ever happens,
* RISC OS' UTF8 keyboard
* drivers are broken */
- LOG("unexpected UTF8 start"" byte %x (ignoring)", c);
+ NSLOG(netsurf, INFO,
+ "unexpected UTF8 start"" byte %x (ignoring)",
+ c);
return true;
}
/* Anything else is ASCII, so just
@@ -985,7 +1017,9 @@ bool ro_gui_wimp_event_keypress(wimp_key *key)
/* If this ever happens,
* RISC OS' UTF8 keyboard
* drivers are broken */
- LOG("unexpected keycode: ""%x (ignoring)", c);
+ NSLOG(netsurf, INFO,
+ "unexpected keycode: ""%x (ignoring)",
+ c);
return true;
}
@@ -1074,7 +1108,8 @@ bool ro_gui_wimp_event_close_window(wimp_w w)
{
struct event_window *window;
- LOG("Close event received for window 0x%x", (unsigned int)w);
+ NSLOG(netsurf, INFO, "Close event received for window 0x%x",
+ (unsigned int)w);
if (w == ro_gui_wimp_event_submenu)
ro_gui_wimp_event_submenu = 0;
window = ro_gui_wimp_event_find_window(w);
@@ -1615,7 +1650,8 @@ struct event_window *ro_gui_wimp_event_get_window(wimp_w w)
if (window)
return window;
- LOG("Creating structure for window 0x%x", (unsigned int)w);
+ NSLOG(netsurf, INFO, "Creating structure for window 0x%x",
+ (unsigned int)w);
window = calloc(1, sizeof(struct event_window));
if (!window)
return NULL;
diff --git a/frontends/riscos/window.c b/frontends/riscos/window.c
index 6dbcc325b..986e5c55d 100644
--- a/frontends/riscos/window.c
+++ b/frontends/riscos/window.c
@@ -206,7 +206,8 @@ gui_window_place_caret(struct gui_window *g,
error = xwimp_set_caret_position(g->window, -1,
x * 2, -(y + height) * 2, height * 2, -1);
if (error) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
@@ -235,7 +236,10 @@ static void gui_window_set_extent(struct gui_window *g, int width, int height)
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -266,7 +270,8 @@ static void gui_window_set_extent(struct gui_window *g, int width, int height)
os_box extent = { 0, -height, width, toolbar_height };
error = xwimp_set_extent(g->window, &extent);
if (error) {
- LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_set_extent: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -309,7 +314,8 @@ static void ro_gui_window_open(wimp_open *open)
state.w = g->window;
error = xwimp_get_window_state_and_nesting(&state, &parent, &linkage);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -414,7 +420,8 @@ static void ro_gui_window_open(wimp_open *open)
error = xwimp_open_window_nested_with_flags(&state, parent, linkage);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -453,8 +460,10 @@ static void gui_window_update_extent(struct gui_window *g)
info.w = g->window;
error = xwimp_get_window_info_header_only(&info);
if (error) {
- LOG("xwimp_get_window_info_header_only: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_info_header_only: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1046,7 +1055,8 @@ ro_gui_window_scroll_action(struct gui_window *g,
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
return;
}
@@ -1060,7 +1070,8 @@ ro_gui_window_scroll_action(struct gui_window *g,
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1180,7 +1191,8 @@ ro_gui_window_scroll_action(struct gui_window *g,
error = xwimp_open_window((wimp_open *) &state);
if (error) {
- LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess);
}
}
}
@@ -1218,7 +1230,8 @@ ro_gui_window_handle_local_keypress(struct gui_window *g,
ro_error = xwimp_get_pointer_info(&pointer);
if (ro_error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s\n", ro_error->errnum, ro_error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s\n",
+ ro_error->errnum, ro_error->errmess);
ro_warn_user("WimpError", ro_error->errmess);
return false;
}
@@ -1528,8 +1541,8 @@ static void ro_gui_window_close(wimp_w w)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1559,7 +1572,10 @@ static void ro_gui_window_close(wimp_w w)
}
error = xos_cli(temp_name);
if (error) {
- LOG("xos_cli: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xos_cli: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
return;
}
@@ -1611,7 +1627,8 @@ static void ro_gui_window_redraw(wimp_draw *redraw)
error = xwimp_redraw_window(redraw, &more);
if (error) {
- LOG("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_redraw_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -1653,7 +1670,8 @@ static void ro_gui_window_redraw(wimp_draw *redraw)
if (error && !(ro_gui_current_redraw_gui->
option.buffer_everything &&
error->errnum == error_WIMP_GET_RECT)) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
ro_gui_current_redraw_gui = NULL;
return;
@@ -1971,7 +1989,7 @@ ro_gui_window_prepare_form_select_menu(struct gui_window *g,
if (err != NSERROR_OK) {
/* badenc should never happen */
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_local_encoding failed");
+ NSLOG(netsurf, INFO, "utf8_to_local_encoding failed");
ro_warn_user("NoMemory", 0);
ro_gui_menu_destroy();
return false;
@@ -1997,7 +2015,7 @@ ro_gui_window_prepare_form_select_menu(struct gui_window *g,
temp = cnv_space2nbsp(option->text);
if (!temp) {
- LOG("cnv_space2nbsp failed");
+ NSLOG(netsurf, INFO, "cnv_space2nbsp failed");
ro_warn_user("NoMemory", 0);
ro_gui_menu_destroy();
return false;
@@ -2009,7 +2027,7 @@ ro_gui_window_prepare_form_select_menu(struct gui_window *g,
/* A bad encoding should never happen,
* so assert this */
assert(err != NSERROR_BAD_ENCODING);
- LOG("utf8_to_enc failed");
+ NSLOG(netsurf, INFO, "utf8_to_enc failed");
ro_warn_user("NoMemory", 0);
ro_gui_menu_destroy();
return false;
@@ -2831,7 +2849,10 @@ ro_gui_window_menu_select(wimp_w w,
state.w = w;
oserror = xwimp_get_window_state(&state);
if (oserror) {
- LOG("xwimp_get_window_state: 0x%x: %s", oserror->errnum, oserror->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ oserror->errnum,
+ oserror->errmess);
ro_warn_user("WimpError", oserror->errmess);
}
nsoption_set_int(window_x, state.visible.x0);
@@ -3209,7 +3230,10 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
state.w = existing->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_state: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
window.visible.x0 = state.visible.x0;
@@ -3313,7 +3337,8 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
error = xwimp_create_window(&window, &g->window);
if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
free(g);
return 0;
@@ -3382,8 +3407,8 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return g;
}
@@ -3459,7 +3484,8 @@ static void gui_window_destroy(struct gui_window *g)
/* delete window */
error = xwimp_delete_window(w);
if (error) {
- LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
ro_gui_wimp_event_finalise(w);
@@ -3515,7 +3541,8 @@ static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3550,8 +3577,8 @@ gui_window_set_scroll(struct gui_window *g, const struct rect *rect)
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_BAD_PARAMETER;
}
@@ -3731,8 +3758,8 @@ static void gui_window_remove_caret(struct gui_window *g)
error = xwimp_get_caret_position(&caret);
if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_caret_position: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
@@ -3776,20 +3803,25 @@ static void ro_gui_window_scroll_end(wimp_dragged *drag, void *data)
error = xwimp_drag_box((wimp_drag*)-1);
if (error) {
- LOG("xwimp_drag_box: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return;
}
error = xwimpspriteop_set_pointer_shape("ptr_default", 0x31, 0, 0, 0, 0);
if (error) {
- LOG("xwimpspriteop_set_pointer_shape: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimpspriteop_set_pointer_shape: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -3814,7 +3846,8 @@ static bool gui_window_scroll_start(struct gui_window *g)
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3822,7 +3855,8 @@ static bool gui_window_scroll_start(struct gui_window *g)
info.w = g->window;
error = xwimp_get_window_info_header_only((wimp_window_info*)&info);
if (error) {
- LOG("xwimp_get_window_state: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3844,7 +3878,8 @@ static bool gui_window_scroll_start(struct gui_window *g)
error = xwimp_drag_box(&drag);
if (error) {
- LOG("xwimp_drag_box: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3876,7 +3911,10 @@ gui_window_drag_start(struct gui_window *g,
* duration */
os_error *error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_pointer_info 0x%x : %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3893,7 +3931,8 @@ gui_window_drag_start(struct gui_window *g,
error = xwimp_drag_box(&drag);
if (error) {
- LOG("xwimp_drag_box: 0x%x : %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_drag_box: 0x%x : %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -3955,7 +3994,8 @@ gui_window_create_form_select_menu(struct gui_window *g,
error = xwimp_get_pointer_info(&pointer);
if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
ro_gui_menu_destroy();
return;
@@ -3988,7 +4028,8 @@ ro_gui_window_import_text(struct gui_window *g, const char *filename)
error = xosfile_read_stamped(filename, &obj_type, NULL, NULL,
&size, NULL, NULL);
if (error) {
- LOG("xosfile_read_stamped: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_read_stamped: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("FileError", error->errmess);
return true; /* was for us, but it didn't work! */
}
@@ -4007,7 +4048,8 @@ ro_gui_window_import_text(struct gui_window *g, const char *filename)
NULL, NULL, NULL, NULL, NULL);
if (error) {
- LOG("xosfile_load_stamped: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosfile_load_stamped: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("LoadError", error->errmess);
free(buf);
return true;
@@ -4017,7 +4059,7 @@ ro_gui_window_import_text(struct gui_window *g, const char *filename)
if (ret != NSERROR_OK) {
/* bad encoding shouldn't happen */
assert(ret != NSERROR_BAD_ENCODING);
- LOG("utf8_from_local_encoding failed");
+ NSLOG(netsurf, INFO, "utf8_from_local_encoding failed");
free(buf);
ro_warn_user("NoMemory", NULL);
return true;
@@ -4206,8 +4248,10 @@ ro_gui_window_invalidate_area(struct gui_window *g, const struct rect *rect)
info.w = g->window;
error = xwimp_get_window_info_header_only(&info);
if (error) {
- LOG("xwimp_get_window_info_header_only: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_window_info_header_only: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_INVALID;
}
@@ -4216,8 +4260,8 @@ ro_gui_window_invalidate_area(struct gui_window *g, const struct rect *rect)
info.extent.x0, info.extent.y0,
info.extent.x1, info.extent.y1);
if (error) {
- LOG("xwimp_force_redraw: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_force_redraw: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return NSERROR_INVALID;
}
@@ -4251,7 +4295,7 @@ ro_gui_window_invalidate_area(struct gui_window *g, const struct rect *rect)
}
cur = malloc(sizeof(struct update_box));
if (!cur) {
- LOG("No memory for malloc.");
+ NSLOG(netsurf, INFO, "No memory for malloc.");
return NSERROR_NOMEM;
}
@@ -4323,7 +4367,8 @@ bool ro_gui_window_dataload(struct gui_window *g, wimp_message *message)
message->your_ref = message->my_ref;
error = xwimp_send_message(wimp_USER_MESSAGE, message, message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s\n", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x: %s\n",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
@@ -4375,12 +4420,14 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
(osspriteop_id)overlay, &width, &height, NULL,
NULL);
if (error) {
- LOG("xosspriteop_read_sprite_info: 0x%x: %s",
- error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_read_sprite_info: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("MiscError", error->errmess);
overlay = NULL;
} else if (sprite_bpp(overlay) != 8) {
- LOG("overlay sprite is not 8bpp");
+ NSLOG(netsurf, INFO, "overlay sprite is not 8bpp");
overlay = NULL;
}
}
@@ -4389,7 +4436,7 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
bitmap = riscos_bitmap_create(width, height,
BITMAP_NEW | BITMAP_OPAQUE | BITMAP_CLEAR_MEMORY);
if (!bitmap) {
- LOG("Thumbnail initialisation failed.");
+ NSLOG(netsurf, INFO, "Thumbnail initialisation failed.");
return;
}
riscos_bitmap_render(bitmap, h);
@@ -4399,7 +4446,7 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
area = riscos_bitmap_convert_8bpp(bitmap);
riscos_bitmap_destroy(bitmap);
if (!area) {
- LOG("Thumbnail conversion failed.");
+ NSLOG(netsurf, INFO, "Thumbnail conversion failed.");
return;
}
@@ -4420,7 +4467,8 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
error = xosspriteop_save_sprite_file(osspriteop_USER_AREA,
area, temp_fname);
if (error) {
- LOG("xosspriteop_save_sprite_file: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xosspriteop_save_sprite_file: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("MiscError", error->errmess);
free(area);
return;
@@ -4428,7 +4476,10 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
error = xwimpspriteop_merge_sprite_file(temp_fname);
if (error) {
- LOG("xwimpspriteop_merge_sprite_file: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimpspriteop_merge_sprite_file: 0x%x:%s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
remove(temp_fname);
free(area);
@@ -4453,7 +4504,8 @@ ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi)
error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)wi,
wi->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_send_message: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
}
else {
@@ -4479,7 +4531,10 @@ bool ro_gui_toolbar_dataload(struct gui_window *g, wimp_message *message)
error = xwimp_send_message(wimp_USER_MESSAGE, message,
message->sender);
if (error) {
- LOG("xwimp_send_message: 0x%x: %s\n", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_send_message: 0x%x: %s\n",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
return true;
@@ -4536,7 +4591,8 @@ void ro_gui_window_update_boxes(void)
error = xwimp_update_window(&update, &more);
if (error) {
- LOG("xwimp_update_window: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_update_window: 0x%x: %s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
continue;
}
@@ -4569,7 +4625,10 @@ void ro_gui_window_update_boxes(void)
* found. This appears to be a bug in RISC OS. */
if (error && !(use_buffer &&
error->errnum == error_WIMP_GET_RECT)) {
- LOG("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimp_get_rectangle: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
ro_gui_current_redraw_gui = NULL;
continue;
@@ -4685,7 +4744,8 @@ ro_gui_window_to_window_pos(struct gui_window *g, int x, int y, os_coord *pos)
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -4709,7 +4769,8 @@ bool ro_gui_window_to_screen_pos(struct gui_window *g,
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
- LOG("xwimp_get_window_state: 0x%x:%s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO, "xwimp_get_window_state: 0x%x:%s",
+ error->errnum, error->errmess);
ro_warn_user("WimpError", error->errmess);
return false;
}
@@ -4913,7 +4974,10 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
error = xwimpspriteop_set_pointer_shape(entry->sprite_name,
1, entry->xactive, entry->yactive, 0, 0);
if (error) {
- LOG("xwimpspriteop_set_pointer_shape: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xwimpspriteop_set_pointer_shape: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
} else {
@@ -4923,7 +4987,10 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
(osspriteop_id) entry->sprite_name,
1, entry->xactive, entry->yactive, 0, 0);
if (error) {
- LOG("xosspriteop_set_pointer_shape: 0x%x: %s", error->errnum, error->errmess);
+ NSLOG(netsurf, INFO,
+ "xosspriteop_set_pointer_shape: 0x%x: %s",
+ error->errnum,
+ error->errmess);
ro_warn_user("WimpError", error->errmess);
}
}
diff --git a/frontends/windows/Makefile b/frontends/windows/Makefile
index bd34b465e..50d0d4b44 100644
--- a/frontends/windows/Makefile
+++ b/frontends/windows/Makefile
@@ -15,7 +15,7 @@ $(eval $(call pkg_config_find_and_add,libcares,Cares))
$(eval $(call pkg_config_find_and_add,zlib,ZLib))
# libraries for windows API
-LDFLAGS += -lgnurx -lgdi32 -lcomctl32 -lws2_32 -lmsimg32 -lshlwapi -mwindows
+LDFLAGS += -lgnurx -lgdi32 -lcomctl32 -lws2_32 -lmsimg32 -lshlwapi -lcrypt32 -mwindows
CFLAGS += -U__STRICT_ANSI__ -mwin32
# only windows versions after XP are supported
diff --git a/frontends/windows/about.c b/frontends/windows/about.c
index 65c81cd7d..2cd855b55 100644
--- a/frontends/windows/about.c
+++ b/frontends/windows/about.c
@@ -52,7 +52,7 @@ static BOOL init_about_dialog(HWND hwnd)
hFont=CreateFont (26, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
if (hFont != NULL) {
- LOG("Setting font object");
+ NSLOG(netsurf, INFO, "Setting font object");
SendMessage(dlg_itm, WM_SETFONT, (WPARAM)hFont, 0);
}
@@ -85,7 +85,7 @@ static BOOL destroy_about_dialog(HWND hwnd)
if (dlg_itm != NULL) {
hFont = (HFONT)SendMessage(dlg_itm, WM_GETFONT, 0, 0);
if (hFont != NULL) {
- LOG("Destroyed font object");
+ NSLOG(netsurf, INFO, "Destroyed font object");
DeleteObject(hFont);
}
}
@@ -107,12 +107,12 @@ nsws_about_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
case WM_COMMAND:
switch(LOWORD(wparam)) {
case IDOK:
- LOG("OK clicked");
+ NSLOG(netsurf, INFO, "OK clicked");
EndDialog(hwnd, IDOK);
break;
case IDCANCEL:
- LOG("Cancel clicked");
+ NSLOG(netsurf, INFO, "Cancel clicked");
EndDialog(hwnd, IDOK);
break;
diff --git a/frontends/windows/bitmap.c b/frontends/windows/bitmap.c
index f60dab613..eed3d3a15 100644
--- a/frontends/windows/bitmap.c
+++ b/frontends/windows/bitmap.c
@@ -52,7 +52,8 @@ void *win32_bitmap_create(int width, int height, unsigned int state)
HBITMAP windib;
uint8_t *pixdata;
- LOG("width %d, height %d, state %u", width, height, state);
+ NSLOG(netsurf, INFO, "width %d, height %d, state %u", width, height,
+ state);
pbmi = calloc(1, sizeof(BITMAPV5HEADER));
if (pbmi == NULL) {
@@ -96,7 +97,7 @@ void *win32_bitmap_create(int width, int height, unsigned int state)
bitmap->opaque = false;
}
- LOG("bitmap %p", bitmap);
+ NSLOG(netsurf, INFO, "bitmap %p", bitmap);
return bitmap;
}
@@ -115,7 +116,7 @@ static unsigned char *bitmap_get_buffer(void *bitmap)
{
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return NULL;
}
@@ -134,7 +135,7 @@ static size_t bitmap_get_rowstride(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
@@ -152,7 +153,7 @@ void win32_bitmap_destroy(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return;
}
@@ -195,11 +196,12 @@ static void bitmap_set_opaque(void *bitmap, bool opaque)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return;
}
- LOG("setting bitmap %p to %s", bm, opaque ? "opaque" : "transparent");
+ NSLOG(netsurf, INFO, "setting bitmap %p to %s", bm,
+ opaque ? "opaque" : "transparent");
bm->opaque = opaque;
}
@@ -216,7 +218,7 @@ static bool bitmap_test_opaque(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return false;
}
@@ -224,11 +226,11 @@ static bool bitmap_test_opaque(void *bitmap)
while (tst-- > 0) {
if (bm->pixdata[(tst << 2) + 3] != 0xff) {
- LOG("bitmap %p has transparency", bm);
+ NSLOG(netsurf, INFO, "bitmap %p has transparency", bm);
return false;
}
}
- LOG("bitmap %p is opaque", bm);
+ NSLOG(netsurf, INFO, "bitmap %p is opaque", bm);
return true;
}
@@ -243,7 +245,7 @@ static bool bitmap_get_opaque(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return false;
}
@@ -255,7 +257,7 @@ static int bitmap_get_width(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
@@ -267,7 +269,7 @@ static int bitmap_get_height(void *bitmap)
struct bitmap *bm = bitmap;
if (bitmap == NULL) {
- LOG("NULL bitmap!");
+ NSLOG(netsurf, INFO, "NULL bitmap!");
return 0;
}
@@ -324,12 +326,12 @@ bitmap_render(struct bitmap *bitmap, struct hlcache_handle *content)
.plot = &win_plotters
};
- width = min(content_get_width(content), 1024);
+ width = min(max(content_get_width(content), bitmap->width), 1024);
height = ((width * bitmap->height) + (bitmap->width / 2)) /
bitmap->width;
- LOG("bitmap %p for content %p width %d, height %d",
- bitmap, content, width, height);
+ NSLOG(netsurf, INFO, "bitmap %p for content %p width %d, height %d",
+ bitmap, content, width, height);
/* create two memory device contexts to put the bitmaps in */
bufferdc = CreateCompatibleDC(NULL);
diff --git a/frontends/windows/corewindow.c b/frontends/windows/corewindow.c
index 3c31c5e46..7d88ce7c4 100644
--- a/frontends/windows/corewindow.c
+++ b/frontends/windows/corewindow.c
@@ -155,7 +155,7 @@ nsw32_corewindow_vscroll(struct nsw32_corewindow *nsw32_cw,
SCROLLINFO si; /* current scroll information */
SCROLLINFO usi; /* updated scroll infomation for scrollwindowex */
- LOG("VSCROLL");
+ NSLOG(netsurf, INFO, "VSCROLL");
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
@@ -230,7 +230,7 @@ nsw32_corewindow_hscroll(struct nsw32_corewindow *nsw32_cw,
SCROLLINFO si; /* current scroll information */
SCROLLINFO usi; /* updated scroll infomation for scrollwindowex */
- LOG("VSCROLL");
+ NSLOG(netsurf, INFO, "VSCROLL");
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
@@ -450,7 +450,7 @@ nsw32_cw_update_size(struct core_window *cw, int width, int height)
nsw32_cw->content_width = width;
nsw32_cw->content_height = height;
- LOG("new content size w:%d h:%d", width, height);
+ NSLOG(netsurf, INFO, "new content size w:%d h:%d", width, height);
update_scrollbars(nsw32_cw);
}
@@ -527,7 +527,7 @@ nsw32_corewindow_init(HINSTANCE hInstance,
CS_DBLCLKS;
}
- LOG("creating hInstance %p core window", hInstance);
+ NSLOG(netsurf, INFO, "creating hInstance %p core window", hInstance);
nsw32_cw->hWnd = CreateWindowEx(0,
windowclassname_corewindow,
nsw32_cw->title,
@@ -541,7 +541,7 @@ nsw32_corewindow_init(HINSTANCE hInstance,
hInstance,
NULL);
if (nsw32_cw->hWnd == NULL) {
- LOG("Window create failed");
+ NSLOG(netsurf, INFO, "Window create failed");
return NSERROR_NOMEM;
}
diff --git a/frontends/windows/download.c b/frontends/windows/download.c
index 3a969834e..dfcd2b5a4 100644
--- a/frontends/windows/download.c
+++ b/frontends/windows/download.c
@@ -253,7 +253,8 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
strcat(destination, "/");
if (strlen(destination) + strlen(filename) < PATH_MAX - 1)
strcat(destination, filename);
- LOG("download %s [%s] from %s to %s", filename, size, domain, destination);
+ NSLOG(netsurf, INFO, "download %s [%s] from %s to %s", filename,
+ size, domain, destination);
w->title = filename;
w->domain = domain;
w->size = total_size;
@@ -313,7 +314,8 @@ gui_download_window_data(struct gui_download_window *w, const char *data,
struct timeval val;
res = fwrite((void *)data, 1, size, w->file);
if (res != size)
- LOG("file write error %d of %d", size - res, size);
+ NSLOG(netsurf, INFO, "file write error %d of %d", size - res,
+ size);
w->downloaded += res;
w->progress = (unsigned int)(((long long)(w->downloaded) * 10000)
/ w->size);
@@ -327,7 +329,7 @@ gui_download_window_data(struct gui_download_window *w, const char *data,
static void gui_download_window_error(struct gui_download_window *w,
const char *error_msg)
{
- LOG("error %s", error_msg);
+ NSLOG(netsurf, INFO, "error %s", error_msg);
}
static void gui_download_window_done(struct gui_download_window *w)
diff --git a/frontends/windows/drawable.c b/frontends/windows/drawable.c
index 28a76cfe8..f491e0a2a 100644
--- a/frontends/windows/drawable.c
+++ b/frontends/windows/drawable.c
@@ -83,7 +83,7 @@ nsws_drawable_vscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
SCROLLINFO si;
int mem;
- LOG("VSCROLL %d", gw->requestscrolly);
+ NSLOG(netsurf, INFO, "VSCROLL %d", gw->requestscrolly);
if (gw->requestscrolly != 0)
return 0;
@@ -157,7 +157,7 @@ nsws_drawable_hscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
SCROLLINFO si;
int mem;
- LOG("HSCROLL %d", gw->requestscrollx);
+ NSLOG(netsurf, INFO, "HSCROLL %d", gw->requestscrollx);
if (gw->requestscrollx != 0)
return 0;
@@ -369,7 +369,8 @@ nsws_drawable_mouseup(struct gui_window *gw,
(gw->bw == NULL))
return 0;
- LOG("state 0x%x, press 0x%x", gw->mouse->state, press);
+ NSLOG(netsurf, INFO, "state 0x%x, press 0x%x", gw->mouse->state,
+ press);
if ((gw->mouse->state & press) != 0) {
gw->mouse->state &= ~press;
gw->mouse->state |= click;
@@ -383,10 +384,10 @@ nsws_drawable_mouseup(struct gui_window *gw,
gw->mouse->state &= ~BROWSER_MOUSE_MOD_3;
if ((gw->mouse->state & click) != 0) {
- LOG("mouse click bw %p, state 0x%x, x %f, y %f",
- gw->bw, gw->mouse->state,
- (x + gw->scrollx) / gw->scale,
- (y + gw->scrolly) / gw->scale);
+ NSLOG(netsurf, INFO,
+ "mouse click bw %p, state 0x%x, x %f, y %f", gw->bw,
+ gw->mouse->state, (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale);
browser_window_mouse_click(gw->bw,
gw->mouse->state,
@@ -430,10 +431,9 @@ nsws_drawable_mousedown(struct gui_window *gw,
gw->mouse->pressed_x = (x + gw->scrollx) / gw->scale;
gw->mouse->pressed_y = (y + gw->scrolly) / gw->scale;
- LOG("mouse click bw %p, state %x, x %f, y %f",
- gw->bw, gw->mouse->state,
- (x + gw->scrollx) / gw->scale,
- (y + gw->scrolly) / gw->scale);
+ NSLOG(netsurf, INFO, "mouse click bw %p, state %x, x %f, y %f",
+ gw->bw, gw->mouse->state, (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale);
browser_window_mouse_click(gw->bw, gw->mouse->state,
(x + gw->scrollx) / gw->scale,
@@ -466,7 +466,8 @@ nsws_drawable_mousemove(struct gui_window *gw, int x, int y)
(abs(x - gw->mouse->pressed_x) >= 5) &&
(abs(y - gw->mouse->pressed_y) >= 5)) {
- LOG("Drag start state 0x%x", gw->mouse->state);
+ NSLOG(netsurf, INFO, "Drag start state 0x%x",
+ gw->mouse->state);
if ((gw->mouse->state & BROWSER_MOUSE_PRESS_1) != 0) {
browser_window_mouse_click(gw->bw, BROWSER_MOUSE_DRAG_1,
@@ -515,7 +516,8 @@ nsws_window_drawable_event_callback(HWND hwnd,
gw = nsws_get_gui_window(hwnd);
if (gw == NULL) {
- LOG("Unable to find gui window structure for hwnd %p", hwnd);
+ NSLOG(netsurf, INFO,
+ "Unable to find gui window structure for hwnd %p", hwnd);
return DefWindowProc(hwnd, msg, wparam, lparam);
}
@@ -604,7 +606,7 @@ nsws_window_create_drawable(HINSTANCE hinstance,
if (hwnd == NULL) {
win_perror("WindowCreateDrawable");
- LOG("Window creation failed");
+ NSLOG(netsurf, INFO, "Window creation failed");
return NULL;
}
diff --git a/frontends/windows/filetype.c b/frontends/windows/filetype.c
index d31434aeb..a5fd9e95e 100644
--- a/frontends/windows/filetype.c
+++ b/frontends/windows/filetype.c
@@ -39,7 +39,7 @@
static const char *fetch_filetype(const char *unix_path)
{
int l;
- LOG("unix path %s", unix_path);
+ NSLOG(netsurf, INFO, "unix path %s", unix_path);
l = strlen(unix_path);
if (2 < l && strcasecmp(unix_path + l - 3, "css") == 0)
return "text/css";
diff --git a/frontends/windows/findfile.c b/frontends/windows/findfile.c
index e1c9595eb..e665530ba 100644
--- a/frontends/windows/findfile.c
+++ b/frontends/windows/findfile.c
@@ -99,7 +99,7 @@ char *nsws_find_resource(char *buf, const char *filename, const char *def)
char t[PATH_MAX];
if (cdir != NULL) {
- LOG("Found Home %s", cdir);
+ NSLOG(netsurf, INFO, "Found Home %s", cdir);
strcpy(t, cdir);
strcat(t, "/.netsurf/");
strcat(t, filename);
@@ -126,7 +126,7 @@ char *nsws_find_resource(char *buf, const char *filename, const char *def)
getcwd(t, PATH_MAX - SLEN("\\res\\") - strlen(filename));
strcat(t, "\\res\\");
strcat(t, filename);
- LOG("looking in %s", t);
+ NSLOG(netsurf, INFO, "looking in %s", t);
if ((realpath(t, buf) != NULL) && (access(buf, R_OK) == 0))
return buf;
diff --git a/frontends/windows/font.c b/frontends/windows/font.c
index 75464f992..37ccf23fe 100644
--- a/frontends/windows/font.c
+++ b/frontends/windows/font.c
@@ -309,10 +309,11 @@ win32_font_split(const plot_font_style_t *style,
}
}
-/*
- LOG("ret %d Split %u chars at %ipx: Split at char %i (%ipx) - %.*s",
- ret, length, x, *char_offset, *actual_x, *char_offset, string);
-*/
+
+ NSLOG(netsurf, DEEPDEBUG,
+ "ret %d Split %u chars at %ipx: Split at char %i (%ipx) - %.*s",
+ ret, length, x, *char_offset, *actual_x, *char_offset, string);
+
return ret;
}
diff --git a/frontends/windows/gui.c b/frontends/windows/gui.c
index 602dcd445..890bfae42 100644
--- a/frontends/windows/gui.c
+++ b/frontends/windows/gui.c
@@ -66,7 +66,7 @@ void win32_run(void)
int timeout; /* timeout in miliseconds */
UINT timer_id = 0;
- LOG("Starting messgae dispatcher");
+ NSLOG(netsurf, INFO, "Starting messgae dispatcher");
while (!win32_quit) {
/* run the scheduler and discover how long to wait for
@@ -128,7 +128,7 @@ static void gui_get_clipboard(char **buffer, size_t *length)
clipboard_handle = GetClipboardData(CF_TEXT);
if (clipboard_handle != NULL) {
content = GlobalLock(clipboard_handle);
- LOG("pasting %s", content);
+ NSLOG(netsurf, INFO, "pasting %s", content);
GlobalUnlock(clipboard_handle);
}
}
diff --git a/frontends/windows/main.c b/frontends/windows/main.c
index d019f10c7..a3a7c2b39 100644
--- a/frontends/windows/main.c
+++ b/frontends/windows/main.c
@@ -99,7 +99,7 @@ static nserror get_config_home(char **config_home_out)
*config_home_out = strdup(adPath);
- LOG("using config path \"%s\"", *config_home_out);
+ NSLOG(netsurf, INFO, "using config path \"%s\"", *config_home_out);
return NSERROR_OK;
}
@@ -343,15 +343,16 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
/* Locate the correct user configuration directory path */
ret = get_config_home(&nsw32_config_home);
if (ret != NSERROR_OK) {
- LOG("Unable to locate a configuration directory.");
+ NSLOG(netsurf, INFO,
+ "Unable to locate a configuration directory.");
nsw32_config_home = NULL;
}
/* Initialise user options */
ret = nsw32_option_init(&argc, argv);
if (ret != NSERROR_OK) {
- LOG("Options failed to initialise (%s)\n",
- messages_get_errorcode(ret));
+ NSLOG(netsurf, INFO, "Options failed to initialise (%s)\n",
+ messages_get_errorcode(ret));
return 1;
}
@@ -365,7 +366,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
/* common initialisation */
ret = netsurf_init(NULL);
if (ret != NSERROR_OK) {
- LOG("NetSurf failed to initialise");
+ NSLOG(netsurf, INFO, "NetSurf failed to initialise");
return 1;
}
@@ -392,7 +393,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
addr = NETSURF_HOMEPAGE;
}
- LOG("calling browser_window_create");
+ NSLOG(netsurf, INFO, "calling browser_window_create");
ret = nsurl_create(addr, &url);
if (ret == NSERROR_OK) {
@@ -418,5 +419,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
/* finalise options */
nsoption_finalise(nsoptions, nsoptions_default);
+ /* finalise logging */
+ nslog_finalise();
+
return 0;
}
diff --git a/frontends/windows/plot.c b/frontends/windows/plot.c
index 1bd0ba4a0..3668e4bb6 100644
--- a/frontends/windows/plot.c
+++ b/frontends/windows/plot.c
@@ -41,16 +41,6 @@
#include "windows/gui.h"
#include "windows/plot.h"
-
-/* set NSWS_PLOT_DEBUG to 0 for no debugging, 1 for debugging */
-/* #define NSWS_PLOT_DEBUG */
-
-#ifdef NSWS_PLOT_DEBUG
-#define PLOT_LOG(x...) LOG(x)
-#else
-#define PLOT_LOG(x...) ((void) 0)
-#endif
-
HDC plot_hdc;
/** currently set clipping rectangle */
@@ -84,7 +74,7 @@ plot_block(COLORREF col, int x, int y, int width, int height)
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -159,9 +149,9 @@ plot_alpha_bitmap(HDC hdc,
BITMAPINFO *bmi;
HBITMAP MemBMh;
- PLOT_LOG("%p bitmap %d,%d width %d height %d",
+ NSLOG(plot, DEEPDEBUG, "%p bitmap %d,%d width %d height %d",
bitmap, x, y, width, height);
- PLOT_LOG("clipped %ld,%ld to %ld,%ld",
+ NSLOG(plot, DEEPDEBUG, "clipped %ld,%ld to %ld,%ld",
plot_clip.left, plot_clip.top,
plot_clip.right, plot_clip.bottom);
@@ -172,7 +162,7 @@ plot_alpha_bitmap(HDC hdc,
if ((bitmap->width != width) ||
(bitmap->height != height)) {
- PLOT_LOG("scaling from %d,%d to %d,%d",
+ NSLOG(plot, DEEPDEBUG, "scaling from %d,%d to %d,%d",
bitmap->width, bitmap->height, width, height);
bitmap = bitmap_scale(bitmap, width, height);
if (bitmap == NULL) {
@@ -299,7 +289,7 @@ plot_bitmap(struct bitmap *bitmap, int x, int y, int width, int height)
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -344,7 +334,7 @@ plot_bitmap(struct bitmap *bitmap, int x, int y, int width, int height)
if (bltres == 0) {
res = NSERROR_INVALID;
}
- PLOT_LOG("bltres = %d", bltres);
+ NSLOG(plot, DEEPDEBUG, "bltres = %d", bltres);
} else {
/* Bitmap with alpha.*/
res = plot_alpha_bitmap(plot_hdc, bitmap, x, y, width, height);
@@ -366,7 +356,7 @@ plot_bitmap(struct bitmap *bitmap, int x, int y, int width, int height)
*/
static nserror clip(const struct redraw_context *ctx, const struct rect *clip)
{
- PLOT_LOG("clip %d,%d to %d,%d", clip->x0, clip->y0, clip->x1, clip->y1);
+ NSLOG(plot, DEEPDEBUG, "clip %d,%d to %d,%d", clip->x0, clip->y0, clip->x1, clip->y1);
plot_clip.left = clip->x0;
plot_clip.top = clip->y0;
@@ -399,12 +389,12 @@ arc(const struct redraw_context *ctx,
int x, int y,
int radius, int angle1, int angle2)
{
- PLOT_LOG("arc centre %d,%d radius %d from %d to %d", x, y, radius,
+ NSLOG(plot, DEEPDEBUG, "arc centre %d,%d radius %d from %d to %d", x, y, radius,
angle1, angle2);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -511,11 +501,11 @@ disc(const struct redraw_context *ctx,
const plot_style_t *style,
int x, int y, int radius)
{
- PLOT_LOG("disc at %d,%d radius %d", x, y, radius);
+ NSLOG(plot, DEEPDEBUG, "disc at %d,%d radius %d", x, y, radius);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -590,11 +580,12 @@ line(const struct redraw_context *ctx,
const plot_style_t *style,
const struct rect *line)
{
- PLOT_LOG("from %d,%d to %d,%d", x0, y0, x1, y1);
+ NSLOG(plot, DEEPDEBUG, "from %d,%d to %d,%d",
+ line->x0, line->y0, line->x1, line->y1);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -656,12 +647,12 @@ rectangle(const struct redraw_context *ctx,
const plot_style_t *style,
const struct rect *rect)
{
- PLOT_LOG("rectangle from %d,%d to %d,%d",
+ NSLOG(plot, DEEPDEBUG, "rectangle from %d,%d to %d,%d",
rect->x0, rect->y0, rect->x1, rect->y1);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -740,11 +731,11 @@ polygon(const struct redraw_context *ctx,
const int *p,
unsigned int n)
{
- PLOT_LOG("polygon %d points", n);
+ NSLOG(plot, DEEPDEBUG, "polygon %d points", n);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
@@ -788,7 +779,7 @@ polygon(const struct redraw_context *ctx,
points[i].x = (long) p[2 * i];
points[i].y = (long) p[2 * i + 1];
- PLOT_LOG("%ld,%ld ", points[i].x, points[i].y);
+ NSLOG(plot, DEEPDEBUG, "%ld,%ld ", points[i].x, points[i].y);
}
SelectClipRgn(plot_hdc, clipregion);
@@ -831,7 +822,7 @@ path(const struct redraw_context *ctx,
float width,
const float transform[6])
{
- PLOT_LOG("path unimplemented");
+ NSLOG(plot, DEEPDEBUG, "path unimplemented");
return NSERROR_OK;
}
@@ -875,10 +866,10 @@ bitmap(const struct redraw_context *ctx,
/* Bail early if we can */
- PLOT_LOG("Plotting %p at %d,%d by %d,%d",bitmap, x,y,width,height);
+ NSLOG(plot, DEEPDEBUG, "Plotting %p at %d,%d by %d,%d",bitmap, x,y,width,height);
if (bitmap == NULL) {
- LOG("Passed null bitmap!");
+ NSLOG(netsurf, INFO, "Passed null bitmap!");
return NSERROR_OK;
}
@@ -937,8 +928,8 @@ bitmap(const struct redraw_context *ctx,
}
}
- PLOT_LOG("Tiled plotting %d,%d by %d,%d", x, y, width, height);
- PLOT_LOG("clipped %ld,%ld to %ld,%ld",
+ NSLOG(plot, DEEPDEBUG, "Tiled plotting %d,%d by %d,%d", x, y, width, height);
+ NSLOG(plot, DEEPDEBUG, "clipped %ld,%ld to %ld,%ld",
plot_clip.left, plot_clip.top,
plot_clip.right, plot_clip.bottom);
@@ -952,7 +943,7 @@ bitmap(const struct redraw_context *ctx,
for (; y > plot_clip.top; y -= height);
}
- PLOT_LOG("repeat from %d,%d to %ld,%ld",
+ NSLOG(plot, DEEPDEBUG, "repeat from %d,%d to %ld,%ld",
x, y, plot_clip.right, plot_clip.bottom);
/* tile down and across to extents */
@@ -989,11 +980,11 @@ text(const struct redraw_context *ctx,
const char *text,
size_t length)
{
- PLOT_LOG("words %s at %d,%d", text, x, y);
+ NSLOG(plot, DEEPDEBUG, "words %s at %d,%d", text, x, y);
/* ensure the plot HDC is set */
if (plot_hdc == NULL) {
- LOG("HDC not set on call to plotters");
+ NSLOG(netsurf, INFO, "HDC not set on call to plotters");
return NSERROR_INVALID;
}
diff --git a/frontends/windows/prefs.c b/frontends/windows/prefs.c
index f84ee1c96..591b57426 100644
--- a/frontends/windows/prefs.c
+++ b/frontends/windows/prefs.c
@@ -304,7 +304,8 @@ static BOOL CALLBACK options_appearance_dialog_handler(HWND hwnd,
case WM_COMMAND:
- LOG("WM_COMMAND Identifier 0x%x",LOWORD(wparam));
+ NSLOG(netsurf, INFO, "WM_COMMAND Identifier 0x%x",
+ LOWORD(wparam));
switch(LOWORD(wparam)) {
case IDC_PREFS_PROXYTYPE:
diff --git a/frontends/windows/schedule.c b/frontends/windows/schedule.c
index eae6c1d63..76358ec68 100644
--- a/frontends/windows/schedule.c
+++ b/frontends/windows/schedule.c
@@ -25,12 +25,6 @@
#include "windows/schedule.h"
-#ifdef DEBUG_SCHEDULER
-#define SRLOG(x...) LOG(x)
-#else
-#define SRLOG(x...) ((void) 0)
-#endif
-
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -66,7 +60,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
return NSERROR_OK;
}
- SRLOG("removing %p, %p", callback, p);
+ NSLOG(schedule, DEBUG, "removing %p, %p", callback, p);
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -76,8 +70,11 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- SRLOG("callback entry %p removing %p(%p)",
- cur_nscb, cur_nscb->callback, cur_nscb->p);
+ NSLOG(schedule, DEBUG,
+ "callback entry %p removing %p(%p)",
+ cur_nscb,
+ cur_nscb->callback,
+ cur_nscb->p);
/* remove callback */
unlnk_nscb = cur_nscb;
@@ -118,7 +115,8 @@ nserror win32_schedule(int ival, void (*callback)(void *p), void *p)
return NSERROR_NOMEM;
}
- SRLOG("adding callback %p for %p(%p) at %d cs",
+ NSLOG(schedule, DEBUG,
+ "adding callback %p for %p(%p) at %d cs",
nscb, callback, p, ival);
gettimeofday(&nscb->tv, NULL);
@@ -168,8 +166,11 @@ schedule_run(void)
prev_nscb->next = unlnk_nscb->next;
}
- SRLOG("callback entry %p running %p(%p)",
- unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p);
+ NSLOG(schedule, DEBUG,
+ "callback entry %p running %p(%p)",
+ unlnk_nscb,
+ unlnk_nscb->callback,
+ unlnk_nscb->p);
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
@@ -201,8 +202,9 @@ schedule_run(void)
/* make returned time relative to now */
timersub(&nexttime, &tv, &rettime);
- SRLOG("returning time to next event as %ldms",
- (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000));
+ NSLOG(schedule, DEBUG,
+ "returning time to next event as %ldms",
+ (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000));
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
@@ -216,12 +218,16 @@ void list_schedule(void)
gettimeofday(&tv, NULL);
- LOG("schedule list at %ld:%ld", tv.tv_sec, tv.tv_usec);
+ NSLOG(netsurf, INFO, "schedule list at %ld:%ld", tv.tv_sec, tv.tv_usec);
cur_nscb = schedule_list;
while (cur_nscb != NULL) {
- LOG("Schedule %p at %ld:%ld", cur_nscb, cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec);
+ NSLOG(netsurf, INFO,
+ "Schedule %p at %ld:%ld",
+ cur_nscb,
+ cur_nscb->tv.tv_sec,
+ cur_nscb->tv.tv_usec);
cur_nscb = cur_nscb->next;
}
}
diff --git a/frontends/windows/ssl_cert.c b/frontends/windows/ssl_cert.c
index fac211c11..4db061626 100644
--- a/frontends/windows/ssl_cert.c
+++ b/frontends/windows/ssl_cert.c
@@ -191,7 +191,7 @@ nserror nsw32_cert_verify(struct nsurl *url,
return res;
}
- LOG("creating hInstance %p SSL window", hinst);
+ NSLOG(netsurf, INFO, "creating hInstance %p SSL window", hinst);
ncwin->hWnd = CreateWindowEx(0,
windowclassname_sslcert,
"SSL Certificate viewer",
@@ -208,7 +208,7 @@ nserror nsw32_cert_verify(struct nsurl *url,
hinst,
NULL);
if (ncwin->hWnd == NULL) {
- LOG("Window create failed");
+ NSLOG(netsurf, INFO, "Window create failed");
return NSERROR_NOMEM;
}
@@ -375,8 +375,11 @@ nsw32_window_ssl_cert_command(HWND hwnd,
int identifier,
HWND ctrl_window)
{
- LOG("notification_code %x identifier %x ctrl_window %p",
- notification_code, identifier, ctrl_window);
+ NSLOG(netsurf, INFO,
+ "notification_code %x identifier %x ctrl_window %p",
+ notification_code,
+ identifier,
+ ctrl_window);
switch(identifier) {
case IDC_SSLCERT_BTN_ACCEPT:
diff --git a/frontends/windows/windbg.h b/frontends/windows/windbg.h
index b2d8640f4..6cd9f97f8 100644
--- a/frontends/windows/windbg.h
+++ b/frontends/windows/windbg.h
@@ -24,11 +24,13 @@
const char *msg_num_to_name(int msg);
void win_perror(const char *lpszFunction);
-#define LOG_WIN_MSG(h, m, w, l) \
- if (((m) != WM_SETCURSOR) && \
- ((m) != WM_MOUSEMOVE) && \
- ((m) != WM_NCHITTEST) && \
- ((m) != WM_ENTERIDLE)) \
- LOG("%s, hwnd %p, w 0x%x, l 0x%Ix", msg_num_to_name(m), h, w, l);
+#define LOG_WIN_MSG(h, m, w, l) \
+ if (((m) != WM_SETCURSOR) && \
+ ((m) != WM_MOUSEMOVE) && \
+ ((m) != WM_NCHITTEST) && \
+ ((m) != WM_ENTERIDLE)) \
+ NSLOG(netsurf, INFO, \
+ "%s, hwnd %p, w 0x%x, l 0x%Ix", \
+ msg_num_to_name(m), h, w, l)
#endif
diff --git a/frontends/windows/window.c b/frontends/windows/window.c
index c72173697..90d076812 100644
--- a/frontends/windows/window.c
+++ b/frontends/windows/window.c
@@ -88,7 +88,7 @@ static int get_window_dpi(HWND hwnd)
ReleaseDC(hwnd, hdc);
- LOG("FIX DPI %d", dpi);
+ NSLOG(netsurf, INFO, "FIX DPI %d", dpi);
return dpi;
}
@@ -163,7 +163,9 @@ static HWND nsws_window_create(HINSTANCE hInstance, struct gui_window *gw)
gw->mainmenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
gw->rclick = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_CONTEXT));
- LOG("creating hInstance %p GUI window %p", hInstance, gw);
+ NSLOG(netsurf, INFO,
+ "creating hInstance %p GUI window %p",
+ hInstance, gw);
hwnd = CreateWindowEx(0,
windowclassname_main,
"NetSurf Browser",
@@ -181,7 +183,7 @@ static HWND nsws_window_create(HINSTANCE hInstance, struct gui_window *gw)
NULL);
if (hwnd == NULL) {
- LOG("Window create failed");
+ NSLOG(netsurf, INFO, "Window create failed");
return NULL;
}
@@ -194,9 +196,10 @@ static HWND nsws_window_create(HINSTANCE hInstance, struct gui_window *gw)
(nsoption_int(window_height) >= 100) &&
(nsoption_int(window_x) >= 0) &&
(nsoption_int(window_y) >= 0)) {
- LOG("Setting Window position %d,%d %d,%d",
- nsoption_int(window_x), nsoption_int(window_y),
- nsoption_int(window_width), nsoption_int(window_height));
+ NSLOG(netsurf, INFO,
+ "Setting Window position %d,%d %d,%d",
+ nsoption_int(window_x), nsoption_int(window_y),
+ nsoption_int(window_width), nsoption_int(window_height));
SetWindowPos(hwnd, HWND_TOP,
nsoption_int(window_x),
nsoption_int(window_y),
@@ -227,47 +230,50 @@ nsws_window_toolbar_command(struct gui_window *gw,
int identifier,
HWND ctrl_window)
{
- LOG("notification_code %d identifier %d ctrl_window %p",
- notification_code, identifier, ctrl_window);
+ NSLOG(netsurf, INFO,
+ "notification_code %d identifier %d ctrl_window %p",
+ notification_code,
+ identifier,
+ ctrl_window);
switch(identifier) {
case IDC_MAIN_URLBAR:
switch (notification_code) {
case EN_CHANGE:
- LOG("EN_CHANGE");
+ NSLOG(netsurf, INFO, "EN_CHANGE");
break;
case EN_ERRSPACE:
- LOG("EN_ERRSPACE");
+ NSLOG(netsurf, INFO, "EN_ERRSPACE");
break;
case EN_HSCROLL:
- LOG("EN_HSCROLL");
+ NSLOG(netsurf, INFO, "EN_HSCROLL");
break;
case EN_KILLFOCUS:
- LOG("EN_KILLFOCUS");
+ NSLOG(netsurf, INFO, "EN_KILLFOCUS");
break;
case EN_MAXTEXT:
- LOG("EN_MAXTEXT");
+ NSLOG(netsurf, INFO, "EN_MAXTEXT");
break;
case EN_SETFOCUS:
- LOG("EN_SETFOCUS");
+ NSLOG(netsurf, INFO, "EN_SETFOCUS");
break;
case EN_UPDATE:
- LOG("EN_UPDATE");
+ NSLOG(netsurf, INFO, "EN_UPDATE");
break;
case EN_VSCROLL:
- LOG("EN_VSCROLL");
+ NSLOG(netsurf, INFO, "EN_VSCROLL");
break;
default:
- LOG("Unknown notification_code");
+ NSLOG(netsurf, INFO, "Unknown notification_code");
break;
}
break;
@@ -421,7 +427,7 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
case WM_DESTROY:
hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
if (hFont != NULL) {
- LOG("Destroyed font object");
+ NSLOG(netsurf, INFO, "Destroyed font object");
DeleteObject(hFont);
}
@@ -502,12 +508,13 @@ nsws_window_urlbar_create(HINSTANCE hInstance,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "Arial");
if (hFont != NULL) {
- LOG("Setting font object");
+ NSLOG(netsurf, INFO, "Setting font object");
SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
}
- LOG("Created url bar hwnd:%p, x:%d, y:%d, w:%d, h:%d",
- hwnd, urlx, urly, urlwidth, urlheight);
+ NSLOG(netsurf, INFO,
+ "Created url bar hwnd:%p, x:%d, y:%d, w:%d, h:%d", hwnd, urlx,
+ urly, urlwidth, urlheight);
return hwnd;
}
@@ -548,7 +555,7 @@ nsws_window_throbber_create(HINSTANCE hInstance,
NULL);
nsws_find_resource(avi, "throbber.avi", "windows/res/throbber.avi");
- LOG("setting throbber avi as %s", avi);
+ NSLOG(netsurf, INFO, "setting throbber avi as %s", avi);
Animate_Open(hwnd, avi);
if (gw->throbbing) {
Animate_Play(hwnd, 0, -1, -1);
@@ -576,7 +583,8 @@ get_imagelist(HINSTANCE hInstance, int resid, int bsize, int bcnt)
HIMAGELIST hImageList;
HBITMAP hScrBM;
- LOG("resource id %d, bzize %d, bcnt %d", resid, bsize, bcnt);
+ NSLOG(netsurf, INFO, "resource id %d, bzize %d, bcnt %d", resid,
+ bsize, bcnt);
hImageList = ImageList_Create(bsize, bsize,
ILC_COLOR24 | ILC_MASK, 0,
@@ -997,8 +1005,11 @@ nsws_window_command(HWND hwnd,
{
nserror ret;
- LOG("notification_code %x identifier %x ctrl_window %p",
- notification_code, identifier, ctrl_window);
+ NSLOG(netsurf, INFO,
+ "notification_code %x identifier %x ctrl_window %p",
+ notification_code,
+ identifier,
+ ctrl_window);
switch(identifier) {
@@ -1073,7 +1084,7 @@ nsws_window_command(HWND hwnd,
HANDLE h = GetClipboardData(CF_TEXT);
if (h != NULL) {
char *content = GlobalLock(h);
- LOG("pasting %s\n", content);
+ NSLOG(netsurf, INFO, "pasting %s\n", content);
GlobalUnlock(h);
}
CloseClipboard();
@@ -1276,7 +1287,7 @@ nsws_window_command(HWND hwnd,
int len = SendMessage(gw->urlbar, WM_GETTEXTLENGTH, 0, 0);
char addr[len + 1];
SendMessage(gw->urlbar, WM_GETTEXT, (WPARAM)(len + 1), (LPARAM)addr);
- LOG("launching %s\n", addr);
+ NSLOG(netsurf, INFO, "launching %s\n", addr);
if (nsurl_create(addr, &url) != NSERROR_OK) {
win32_warning("NoMemory", 0);
@@ -1313,7 +1324,7 @@ nsws_window_command(HWND hwnd,
*/
static bool win32_window_get_scroll(struct gui_window *gw, int *sx, int *sy)
{
- LOG("get scroll");
+ NSLOG(netsurf, INFO, "get scroll");
if (gw == NULL)
return false;
@@ -1410,7 +1421,8 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
gw = nsws_get_gui_window(hwnd);
if (gw == NULL) {
- LOG("Unable to find gui window structure for hwnd %p", hwnd);
+ NSLOG(netsurf, INFO,
+ "Unable to find gui window structure for hwnd %p", hwnd);
return DefWindowProc(hwnd, msg, wparam, lparam);
}
@@ -1463,7 +1475,7 @@ win32_window_create(struct browser_window *bw,
{
struct gui_window *gw;
- LOG("Creating gui window for browser window %p", bw);
+ NSLOG(netsurf, INFO, "Creating gui window for browser window %p", bw);
gw = calloc(1, sizeof(struct gui_window));
if (gw == NULL) {
@@ -1484,7 +1496,7 @@ win32_window_create(struct browser_window *bw,
gw->mouse = malloc(sizeof(struct browser_mouse));
if (gw->mouse == NULL) {
free(gw);
- LOG("Unable to allocate mouse state");
+ NSLOG(netsurf, INFO, "Unable to allocate mouse state");
return NULL;
}
gw->mouse->gui = gw;
@@ -1504,8 +1516,12 @@ win32_window_create(struct browser_window *bw,
gw->statusbar = nsws_window_create_statusbar(hinst, gw->main, gw);
gw->drawingarea = nsws_window_create_drawable(hinst, gw->main, gw);
- LOG("new window: main:%p toolbar:%p statusbar %p drawingarea %p",
- gw->main, gw->toolbar, gw->statusbar, gw->drawingarea);
+ NSLOG(netsurf, INFO,
+ "new window: main:%p toolbar:%p statusbar %p drawingarea %p",
+ gw->main,
+ gw->toolbar,
+ gw->statusbar,
+ gw->drawingarea);
font_hwnd = gw->drawingarea;
open_windows++;
@@ -1556,7 +1572,7 @@ win32_window_get_dimensions(struct gui_window *gw,
*width = gw->width;
*height = gw->height;
- LOG("gw:%p w=%d h=%d", gw, *width, *height);
+ NSLOG(netsurf, INFO, "gw:%p w=%d h=%d", gw, *width, *height);
return NSERROR_OK;
}
@@ -1588,7 +1604,7 @@ static void win32_window_set_title(struct gui_window *w, const char *title)
return;
}
- LOG("%p, title %s", w, title);
+ NSLOG(netsurf, INFO, "%p, title %s", w, title);
fulltitle = malloc(strlen(title) + SLEN(" - NetSurf") + 1);
if (fulltitle == NULL) {
win32_warning("NoMemory", 0);
@@ -1865,7 +1881,9 @@ nserror win32_window_set_scroll(struct gui_window *gw, const struct rect *rect)
gw->requestscrolly = rect->y0 - gw->scrolly;
}
- /*LOG("requestscroll x,y:%d,%d", w->requestscrollx, w->requestscrolly);*/
+ NSLOG(netsurf, DEEPDEBUG,
+ "requestscroll x,y:%d,%d",
+ gw->requestscrollx, gw->requestscrolly);
/* set the vertical scroll offset */
si.cbSize = sizeof(si);
@@ -1876,7 +1894,9 @@ nserror win32_window_set_scroll(struct gui_window *gw, const struct rect *rect)
si.nPos = max(gw->scrolly + gw->requestscrolly, 0);
si.nPos = min(si.nPos, height - gw->height);
SetScrollInfo(gw->drawingarea, SB_VERT, &si, TRUE);
- /*LOG("SetScrollInfo VERT min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
+ NSLOG(netsurf, DEEPDEBUG,
+ "SetScrollInfo VERT min:%d max:%d page:%d pos:%d",
+ si.nMin, si.nMax, si.nPage, si.nPos);
/* set the horizontal scroll offset */
si.cbSize = sizeof(si);
@@ -1887,7 +1907,9 @@ nserror win32_window_set_scroll(struct gui_window *gw, const struct rect *rect)
si.nPos = max(gw->scrollx + gw->requestscrollx, 0);
si.nPos = min(si.nPos, width - gw->width);
SetScrollInfo(gw->drawingarea, SB_HORZ, &si, TRUE);
- /*LOG("SetScrollInfo HORZ min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
+ NSLOG(netsurf, DEEPDEBUG,
+ "SetScrollInfo HORZ min:%d max:%d page:%d pos:%d",
+ si.nMin, si.nMax, si.nPage, si.nPos);
/* Set caret position */
GetCaretPos(&p);
@@ -1900,8 +1922,19 @@ nserror win32_window_set_scroll(struct gui_window *gw, const struct rect *rect)
r.bottom = gw->height + 1;
r.left = 0;
r.right = gw->width + 1;
- ScrollWindowEx(gw->drawingarea, - gw->requestscrollx, - gw->requestscrolly, &r, NULL, NULL, &redraw, SW_INVALIDATE);
- /*LOG("ScrollWindowEx %d, %d", - w->requestscrollx, - w->requestscrolly);*/
+ ScrollWindowEx(gw->drawingarea,
+ - gw->requestscrollx,
+ - gw->requestscrolly,
+ &r,
+ NULL,
+ NULL,
+ &redraw,
+ SW_INVALIDATE);
+ NSLOG(netsurf, DEEPDEBUG,
+ "ScrollWindowEx %d, %d",
+ - gw->requestscrollx,
+ - gw->requestscrolly);
+
gw->scrolly += gw->requestscrolly;
gw->scrollx += gw->requestscrollx;
gw->requestscrollx = 0;