NetSurf
scaffolding.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2015 Adrián Arroyo Calle <adrian.arroyocalle@gmail.com>
3 * Copyright 2008 François Revol <mmu_man@users.sourceforge.net>
4 * Copyright 2006 Rob Kendrick <rjek@rjek.com>
5 *
6 * This file is part of NetSurf, http://www.netsurf-browser.org/
7 *
8 * NetSurf is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
11 *
12 * NetSurf is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#define __STDBOOL_H__ 1
22#include <assert.h>
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include <BeBuild.h>
28#include <Bitmap.h>
29#include <Box.h>
30#include <Button.h>
31#include <Dragger.h>
32#include <Menu.h>
33#include <MenuBar.h>
34#include <MenuItem.h>
35#include <Node.h>
36#include <Path.h>
37#include <PopUpMenu.h>
38#include <Resources.h>
39#include <Roster.h>
40#include <Screen.h>
41#include <ScrollView.h>
42#include <String.h>
43#include <StringView.h>
44#include <TextControl.h>
45#include <View.h>
46#include <Window.h>
47
48#if defined(__HAIKU__)
49#include <IconUtils.h>
50#include "WindowStack.h"
51#endif
52
53#include <fs_attr.h>
54
55extern "C" {
56#include "utils/messages.h"
57#include "utils/utils.h"
58#include "utils/log.h"
59#include "utils/nsurl.h"
60#include "utils/nsoption.h"
61#include "netsurf/netsurf.h"
62#include "netsurf/plotters.h"
63#include "netsurf/clipboard.h"
64#include "netsurf/content.h"
67#include "netsurf/form.h"
68#include "netsurf/keypress.h"
69#include "netsurf/inttypes.h"
71#include "desktop/version.h"
72#include "desktop/searchweb.h"
73#include "desktop/search.h"
74}
75
76#include "beos/about.h"
77#include "beos/bitmap.h"
78#include "beos/gui.h"
79#include "beos/plotters.h"
80#include "beos/scaffolding.h"
81#include "beos/gui_options.h"
82//#include "beos/completion.h"
83#include "beos/throbber.h"
84#include "beos/window.h"
85#include "beos/schedule.h"
86//#include "beos/download.h"
87#include "beos/cookies.h"
88
89#define TOOLBAR_HEIGHT 32
90#define DRAGGER_WIDTH 8
91
93
95class NSBrowserWindow;
96class NSThrobber;
97
99 NSBrowserWindow *window; // top-level container object
100
101 // top-level view, contains toolbar & top-level browser view
103
104 BMenuBar *menu_bar;
105
106 BPopUpMenu *popup_menu;
107
108#ifdef ENABLE_DRAGGER
109 BDragger *dragger;
110#endif
111
112 BView *tool_bar;
113
114 BControl *back_button;
115 BControl *forward_button;
116 BControl *stop_button;
117 BControl *reload_button;
118 BControl *home_button;
119
121 BTextControl *search_bar;
122 //BMenuField *url_bar_completion;
123
125
126 BStringView *status_bar;
127
128 BScrollView *scroll_view;
129
131
135
137
138 /** Object under menu, or 0 if no object. */
140};
141
144 BWindow *window;
145
146};
147
149 const char *widget;
150};
151
152// passed to the replicant main thread
154 char app[B_PATH_NAME_LENGTH];
155 BString url;
156 char *args[3];
157};
158
159
160static int open_windows = 0; /**< current number of open browsers */
161static NSBaseView *replicant_view = NULL; /**< if not NULL, the replicant View we are running NetSurf for */
162static sem_id replicant_done_sem = -1;
163static thread_id replicant_thread = -1;
164
166static void nsbeos_throb(void *);
167static int32 nsbeos_replicant_main_thread(void *_arg);
168
169// in beos_gui.cpp
170extern int main(int argc, char** argv);
171
172// in fetch_rsrc.cpp
173extern BResources *gAppResources;
174
175// #pragma mark - class NSIconTextControl
176
177#define ICON_WIDTH 16
178
179class NSIconTextControl : public BTextControl {
180public:
181 NSIconTextControl(BRect frame, const char* name,
182 const char* label, const char* initialText,
183 BMessage* message,
184 uint32 resizeMode
185 = B_FOLLOW_LEFT | B_FOLLOW_TOP,
186 uint32 flags
187 = B_WILL_DRAW | B_NAVIGABLE | B_DRAW_ON_CHILDREN);
188virtual ~NSIconTextControl();
189
190virtual void FrameResized(float newWidth, float newHeight);
191virtual void Draw(BRect updateRect);
192virtual void DrawAfterChildren(BRect updateRect);
193virtual void AttachedToWindow();
194
195void SetBitmap(const BBitmap *bitmap);
196void FixupTextRect();
197
198private:
201 const BBitmap *fIconBitmap;
202};
203
204NSIconTextControl::NSIconTextControl(BRect frame, const char* name,
205 const char* label, const char* initialText,
206 BMessage* message,
207 uint32 resizeMode,
208 uint32 flags)
209 : BTextControl(frame, name, label, initialText, message, resizeMode, flags),
210 fIconOffset(0,0),
211 fIconBitmap(NULL)
212{
213 BRect r(Bounds());
214 fIconFrame = r;
215 fIconFrame.right = fIconFrame.left + ICON_WIDTH - 1;
216 fIconFrame.bottom = fIconFrame.top + ICON_WIDTH - 1;
217 fIconFrame.OffsetBy((int32)((r.IntegerHeight() - ICON_WIDTH + 3) / 2),
218 (int32)((r.IntegerHeight() - ICON_WIDTH + 1) / 2));
220}
221
222
224{
225 delete fIconBitmap;
226}
227
228
229void
230NSIconTextControl::FrameResized(float newWidth, float newHeight)
231{
232 BTextControl::FrameResized(newWidth, newHeight);
234}
235
236
237void
238NSIconTextControl::Draw(BRect updateRect)
239{
241 BTextControl::Draw(updateRect);
242}
243
244
245void
247{
248 BTextControl::DrawAfterChildren(updateRect);
249
250 PushState();
251
252 SetDrawingMode(B_OP_ALPHA);
253 DrawBitmap(fIconBitmap, fIconFrame);
254
255 //XXX: is this needed?
256 PopState();
257}
258
259
260void
262{
263 BTextControl::AttachedToWindow();
265}
266
267
268void
270{
271 delete fIconBitmap;
272 fIconBitmap = NULL;
273
274 // keep a copy
275 if (bitmap)
276 fIconBitmap = new BBitmap(bitmap);
277 // invalidate just the icon area
278 Invalidate(fIconFrame);
279}
280
281
282void
284{
285 // FIXME: this flickers on resize, quite ugly
286 BRect r(TextView()->TextRect());
287
288 // don't fix the fix
289 if (r.left > ICON_WIDTH)
290 return;
291
292 r.left += r.bottom - r.top;
293 TextView()->SetTextRect(r);
294}
295
296
297#undef ICON_WIDTH
298
299// #pragma mark - class NSResizeKnob
300
301class NSResizeKnob : public BView {
302public:
303 NSResizeKnob(BRect frame, BView *target);
304virtual ~NSResizeKnob();
305
306virtual void MouseDown(BPoint where);
307virtual void MouseUp(BPoint where);
308virtual void MouseMoved(BPoint where, uint32 code,
309 const BMessage* dragMessage);
310
311virtual void Draw(BRect updateRect);
312
313void SetBitmap(const BBitmap *bitmap);
314
315private:
316 const BBitmap *fBitmap;
317 BView *fTarget;
318 BPoint fOffset;
319};
320
321NSResizeKnob::NSResizeKnob(BRect frame, BView *target)
322 : BView(frame, "NSResizeKnob", B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT, B_WILL_DRAW),
323 fBitmap(NULL),
324 fTarget(target),
325 fOffset(-1, -1)
326{
327 SetViewColor(0, 255, 0);
328}
329
330
332{
333}
334
335
336void
338{
339 SetMouseEventMask(B_POINTER_EVENTS,
340 B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS);
341 fOffset = where;
342}
343
344
345void
347{
348 fOffset.Set(-1, -1);
349}
350
351
352void
354 const BMessage* dragMessage)
355{
356 if (fOffset.x >= 0) {
357 fTarget->ResizeBy(where.x - fOffset.x, where.y - fOffset.y);
358 }
359}
360
361
362void
363NSResizeKnob::Draw(BRect updateRect)
364{
365 if (!fBitmap)
366 return;
367 DrawBitmap(fBitmap);
368}
369
370
371void
373{
374 fBitmap = bitmap;
375 Invalidate();
376}
377
378
379// #pragma mark - class NSThrobber
380
381class NSThrobber : public BView {
382public:
383 NSThrobber(BRect frame);
384virtual ~NSThrobber();
385
386virtual void MessageReceived(BMessage *message);
387virtual void Draw(BRect updateRect);
388void SetBitmap(const BBitmap *bitmap);
389
390private:
391 const BBitmap *fBitmap;
392};
393
395 : BView(frame, "NSThrobber", B_FOLLOW_TOP | B_FOLLOW_RIGHT, B_WILL_DRAW),
396 fBitmap(NULL)
397{
398}
399
400
402{
403}
404
405
406void
408{
409 BView::MessageReceived(message);
410}
411
412
413void
414NSThrobber::Draw(BRect updateRect)
415{
416 if (!fBitmap)
417 return;
418 DrawBitmap(fBitmap);
419}
420
421
422void
424{
425 fBitmap = bitmap;
426 Invalidate();
427}
428
429
430// #pragma mark - class NSBaseView
431
432
434 : BView(frame, "NetSurf", B_FOLLOW_ALL_SIDES,
435 0 /*B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS*/ /*| B_SUBPIXEL_PRECISE*/),
436 fScaffolding(NULL)
437{
438}
439
440NSBaseView::NSBaseView(BMessage *archive)
441 : BView(archive),
442 fScaffolding(NULL)
443{
444}
445
446
448{
449 //beos_warn_user("~NSBaseView()", NULL);
450 if (replicated) {
451 BMessage *message = new BMessage(B_QUIT_REQUESTED);
453 while (acquire_sem(replicant_done_sem) == EINTR);
454 //debugger("plop");
455 status_t status = -1;
456 wait_for_thread(replicant_thread, &status);
457 }
458}
459
460
461void
463{
464 switch (message->what) {
465 case B_SIMPLE_DATA:
466 case B_ABOUT_REQUESTED:
467 case B_ARGV_RECEIVED:
468 case B_REFS_RECEIVED:
469 case B_COPY:
470 case B_CUT:
471 case B_PASTE:
472 case B_SELECT_ALL:
473 //case B_MOUSE_WHEEL_CHANGED:
475 // NetPositive messages
476 case B_NETPOSITIVE_OPEN_URL:
477 case B_NETPOSITIVE_BACK:
478 case B_NETPOSITIVE_FORWARD:
479 case B_NETPOSITIVE_HOME:
480 case B_NETPOSITIVE_RELOAD:
481 case B_NETPOSITIVE_STOP:
482 case B_NETPOSITIVE_DOWN:
483 case B_NETPOSITIVE_UP:
484 // messages for top-level
485 case 'back':
486 case 'forw':
487 case 'stop':
488 case 'relo':
489 case 'home':
490 case 'urlc':
491 case 'urle':
492 case 'sear':
493 case 'menu':
494 case NO_ACTION:
496 case HELP_OPEN_GUIDE:
498 case HELP_OPEN_ABOUT:
503 case HOTLIST_ADD_URL:
504 case HOTLIST_SHOW:
505 case COOKIES_SHOW:
506 case COOKIES_DELETE:
507 case BROWSER_PAGE:
509 case BROWSER_PRINT:
512 case BROWSER_OBJECT:
520 case BROWSER_SAVE:
527 case HOTLIST_EXPORT:
528 case HISTORY_EXPORT:
548 case TREE_NEW_FOLDER:
549 case TREE_NEW_LINK:
550 case TREE_EXPAND_ALL:
556 case TREE_SELECTION:
560 case TREE_SELECT_ALL:
562 case TOOLBAR_BUTTONS:
564 case TOOLBAR_THROBBER:
565 case TOOLBAR_EDIT:
566 case CHOICES_SHOW:
567 case APPLICATION_QUIT:
568 if (Window())
569 Window()->DetachCurrentMessage();
571 break;
572 default:
573 //message->PrintToStream();
574 BView::MessageReceived(message);
575 }
576}
577
578
579status_t
580NSBaseView::Archive(BMessage *archive, bool deep) const
581{
582 // force archiving only the base view
583 deep = false;
584 status_t err;
585 err = BView::Archive(archive, deep);
586 if (err < B_OK)
587 return err;
588 // add our own fields
589 // we try to reuse the same fields as NetPositive
590 archive->AddString("add_on", "application/x-vnd.NetSurf");
591 //archive->AddInt32("version", 2);
592 archive->AddString("url", fScaffolding->url_bar->Text());
593 archive->AddBool("openAsText", false);
594 archive->AddInt32("encoding", 258);
595 return err;
596}
597
598
599BArchivable *
600NSBaseView::Instantiate(BMessage *archive)
601{
602 if (!validate_instantiation(archive, "NSBaseView"))
603 return NULL;
604 const char *url;
605 if (archive->FindString("url", &url) < B_OK
606 || url == NULL || strlen(url) == 0) {
607 url = "about:";
608 }
609
611 info->url = BString(url);
612 if (nsbeos_find_app_path(info->app) < B_OK) {
613 delete info;
614 return NULL;
615 }
616 info->args[0] = info->app;
617 info->args[1] = (char *)info->url.String();
618 info->args[2] = NULL;
619 NSBaseView *view = new NSBaseView(archive);
621 replicated = true;
622
623 //TODO:FIXME: fix replicants
624 // do as much as possible in this thread to avoid deadlocks
625
626 gui_init_replicant(2, info->args);
627
628 replicant_done_sem = create_sem(0, "NS Replicant created");
630 "NetSurf Main Thread", B_NORMAL_PRIORITY, info);
631 if (replicant_thread < B_OK) {
632 delete_sem(replicant_done_sem);
633 delete info;
634 delete view;
635 return NULL;
636 }
637 resume_thread(replicant_thread);
638 //XXX: deadlocks BeHappy
639 //while (acquire_sem(replicant_done_sem) == EINTR);
640
641 return view;
642}
643
644
645void
647{
648 fScaffolding = scaf;
649}
650
651
652// AttachedToWindow() is not enough to get the dragger and status bar
653// stick to the panel color
654void
656{
657 BView::AllAttached();
658
659 struct beos_scaffolding *g = fScaffolding;
660 if (!g)
661 return;
662 // set targets to the topmost ns view
663 g->back_button->SetTarget(this);
664 g->forward_button->SetTarget(this);
665 g->stop_button->SetTarget(this);
666 g->reload_button->SetTarget(this);
667 g->home_button->SetTarget(this);
668
669 rgb_color c = ui_color(B_PANEL_BACKGROUND_COLOR);
670 SetViewColor(c);
671
672 g->tool_bar->SetViewColor(c);
673 g->back_button->SetViewColor(c);
674 g->back_button->SetLowColor(c);
675 g->forward_button->SetViewColor(c);
676 g->forward_button->SetLowColor(c);
677 g->stop_button->SetViewColor(c);
678 g->stop_button->SetLowColor(c);
679 g->reload_button->SetViewColor(c);
680 g->reload_button->SetLowColor(c);
681 g->home_button->SetViewColor(c);
682 g->home_button->SetLowColor(c);
683 g->url_bar->SetViewColor(c);
684 g->search_bar->SetViewColor(c);
685 g->throbber->SetViewColor(c);
686 g->scroll_view->SetViewColor(c);
687
688#ifdef ENABLE_DRAGGER
689 g->dragger->SetViewColor(c);
690#endif
691
692 g->status_bar->SetViewColor(c);
693 g->status_bar->SetLowColor(c);
694#if defined(__HAIKU__) || defined(B_DANO_VERSION)
695 g->status_bar->SetHighColor(ui_color(B_PANEL_TEXT_COLOR));
696#endif
697}
698
699
700// #pragma mark - class NSBrowserWindow
701
702
704 : BWindow(frame, "NetSurf", B_DOCUMENT_WINDOW, 0),
705 fScaffolding(scaf)
706{
707}
708
709
711{
712 if(activeWindow == this)
713 activeWindow = NULL;
714}
715
716
717void
718NSBrowserWindow::DispatchMessage(BMessage *message, BHandler *handler)
719{
720 BMessage *msg;
721 switch (message->what) {
723 msg = new BMessage(*message);
725 break;
726 }
727 BWindow::DispatchMessage(message, handler);
728}
729
730
731void
733{
734 switch (message->what) {
735 case B_ARGV_RECEIVED:
736 case B_REFS_RECEIVED:
738 // NetPositive messages
739 case B_NETPOSITIVE_OPEN_URL:
740 case B_NETPOSITIVE_BACK:
741 case B_NETPOSITIVE_FORWARD:
742 case B_NETPOSITIVE_HOME:
743 case B_NETPOSITIVE_RELOAD:
744 case B_NETPOSITIVE_STOP:
745 case B_NETPOSITIVE_DOWN:
746 case B_NETPOSITIVE_UP:
747 DetachCurrentMessage();
749 break;
750 default:
751 BWindow::MessageReceived(message);
752 }
753}
754
755bool
757{
758 BWindow::QuitRequested();
759 BMessage *message = DetachCurrentMessage();
760 // BApplication::Quit() calls us directly...
761 if (message == NULL)
762 message = new BMessage(B_QUIT_REQUESTED);
764 return false; // we will Quit() ourselves from the main thread
765}
766
767
768void
770{
771 if(active)
772 activeWindow = this;
773 else if(activeWindow == this)
774 activeWindow = NULL;
775}
776
777
778// #pragma mark - implementation
779
781{
782 struct replicant_thread_info *info = (struct replicant_thread_info *)_arg;
783 int32 ret = 0;
784
785 while (!nsbeos_done) {
787 }
788
789 netsurf_exit();
790 delete info;
791 delete_sem(replicant_done_sem);
792 return ret;
793}
794
795
796/* event handlers and support functions for them */
797
798static void nsbeos_window_destroy_event(NSBrowserWindow *window, nsbeos_scaffolding *g, BMessage *event)
799{
800 NSLOG(netsurf, INFO, "Being Destroyed = %d", g->being_destroyed);
801
802 if (--open_windows == 0)
803 nsbeos_done = true;
804
805 if (window) {
806 window->Lock();
807 window->Quit();
808 }
809
810 if (!g->being_destroyed) {
811 g->being_destroyed = 1;
813 }
814}
815
816
818{
819 if (!g->top_view->LockLooper())
820 return;
821 rgb_color c = ui_color(B_PANEL_BACKGROUND_COLOR);
822 g->top_view->SetViewColor(c);
823
824 g->tool_bar->SetViewColor(c);
825 g->back_button->SetViewColor(c);
826 g->forward_button->SetViewColor(c);
827 g->stop_button->SetViewColor(c);
828 g->reload_button->SetViewColor(c);
829 g->home_button->SetViewColor(c);
830 g->url_bar->SetViewColor(c);
831 g->search_bar->SetViewColor(c);
832 g->throbber->SetViewColor(c);
833 g->scroll_view->SetViewColor(c);
834
835#ifdef ENABLE_DRAGGER
836 g->dragger->SetViewColor(c);
837#endif
838
839 g->status_bar->SetViewColor(c);
840 g->status_bar->SetLowColor(c);
841#if defined(__HAIKU__) || defined(B_DANO_VERSION)
842 g->status_bar->SetHighColor(ui_color(B_PANEL_TEXT_COLOR));
843#endif
844 g->top_view->UnlockLooper();
845}
846
847
848/*static*/ BWindow*
850
851
853{
854 struct browser_window *bw;
856 bool reloadAll = false;
857
858 NSLOG(netsurf, INFO,
859 "nsbeos_scaffolding_dispatch_event() what = 0x%08" PRIx32,
860 message->what);
861 switch (message->what) {
862 case B_QUIT_REQUESTED:
864 break;
865 case B_ABOUT_REQUESTED:
866 {
867 nsbeos_about(scaffold->top_level);
868 break;
869 }
870 case B_NETPOSITIVE_DOWN:
871 //XXX WRITEME
872 break;
873 case B_SIMPLE_DATA:
874 {
875 if (!message->HasRef("refs")) {
876 // XXX handle DnD
877 break;
878 }
879 // FALL THROUGH
880 // handle refs
881 }
883 case B_REFS_RECEIVED:
884 {
885 int32 i;
886 entry_ref ref;
887
888 for (i = 0; message->FindRef("refs", i, &ref) >= B_OK; i++) {
889 BString url("file://");
890 BPath path(&ref);
891 if (path.InitCheck() < B_OK)
892 break;
893
894 BNode node(path.Path());
895 if (node.InitCheck() < B_OK)
896 break;
897 if (node.IsSymLink()) {
898 // dereference the symlink
899 BEntry entry(path.Path(), true);
900 if (entry.InitCheck() < B_OK)
901 break;
902 if (entry.GetPath(&path) < B_OK)
903 break;
904 if (node.SetTo(path.Path()) < B_OK)
905 break;
906 }
907
908 attr_info ai;
909 if (node.GetAttrInfo("META:url", &ai) >= B_OK) {
910 char data[(size_t)ai.size + 1];
911 memset(data, 0, (size_t)ai.size + 1);
912 if (node.ReadAttr("META:url", B_STRING_TYPE, 0LL, data, (size_t)ai.size) < 4)
913 break;
914 url = data;
915 } else
916 url << path.Path();
917
918 nsurl *nsurl;
919 nserror error;
920
921 error = nsurl_create(url.String(), &nsurl);
922 if (error == NSERROR_OK) {
923 if (/*message->WasDropped() &&*/ i == 0) {
927 NULL, NULL, NULL);
928 } else {
930 nsurl,
931 NULL,
932 bw,
933 NULL);
934 }
936 }
937 if (error != NSERROR_OK) {
939 }
940 }
941 break;
942 }
943 case B_ARGV_RECEIVED:
944 {
945 int32 i;
946 BString urltxt;
947 nsurl *url;
948 nserror error;
949
950 for (i = 1; message->FindString("argv", i, &urltxt) >= B_OK; i++) {
951 error = nsurl_create(urltxt.String(), &url);
952 if (error == NSERROR_OK) {
954 url,
955 NULL,
956 bw,
957 NULL);
958 nsurl_unref(url);
959 }
960 if (error != NSERROR_OK) {
962 }
963 }
964 break;
965 }
969 break;
970 case B_NETPOSITIVE_OPEN_URL:
971 {
972 BString url;
973 if (message->FindString("be:url", &url) < B_OK)
974 break;
975
976 nsurl *nsurl;
977 nserror error;
978
979 error = nsurl_create(url.String(), &nsurl);
980 if (error != NSERROR_OK) {
982 } else {
984 nsurl,
985 NULL,
987 NULL,
988 NULL,
989 NULL);
991 }
992 break;
993 }
994 case B_COPY:
996 break;
997 case B_CUT:
999 break;
1000 case B_PASTE:
1002 break;
1003 case B_SELECT_ALL:
1004 NSLOG(netsurf, INFO, "Selecting all text");
1006 break;
1007 case B_NETPOSITIVE_BACK:
1009 case 'back':
1011 break;
1014 break;
1015 case B_NETPOSITIVE_FORWARD:
1017 case 'forw':
1019 break;
1022 break;
1023 case B_NETPOSITIVE_STOP:
1025 case 'stop':
1027 break;
1028 case B_NETPOSITIVE_RELOAD:
1030 case 'relo':
1031 reloadAll = true;
1034 browser_window_reload(bw, reloadAll);
1035 break;
1036 case B_NETPOSITIVE_HOME:
1038 case 'home':
1039 {
1040 nsurl *url;
1041 nserror error;
1042
1043 static const char *addr = NETSURF_HOMEPAGE;
1044
1045 if (nsoption_charp(homepage_url) != NULL) {
1046 addr = nsoption_charp(homepage_url);
1047 }
1048
1049 error = nsurl_create(addr, &url);
1050 if (error != NSERROR_OK) {
1052 } else {
1054 url,
1055 NULL,
1057 NULL,
1058 NULL,
1059 NULL);
1060 nsurl_unref(url);
1061 }
1062 break;
1063 }
1064 case 'urle':
1065 {
1066 nsurl *url;
1067 nserror error;
1068 BString text;
1069
1070 if (!scaffold->url_bar->LockLooper())
1071 break;
1072
1073 text = scaffold->url_bar->Text();
1074 scaffold->scroll_view->Target()->MakeFocus();
1075 scaffold->url_bar->UnlockLooper();
1076
1077 error = nsurl_create(text.String(), &url);
1078 if (error != NSERROR_OK) {
1080 } else {
1082 url,
1083 NULL,
1085 NULL,
1086 NULL,
1087 NULL);
1088 nsurl_unref(url);
1089 }
1090 break;
1091 }
1092 case 'urlc':
1093 {
1094 BString text;
1095 if (!scaffold->url_bar->LockLooper())
1096 break;
1097 text = scaffold->url_bar->Text();
1098 scaffold->url_bar->UnlockLooper();
1099 //nsbeos_completion_update(text.String());
1100 break;
1101 }
1102 case 'sear':
1103 {
1104 nserror ret;
1105 nsurl* url;
1106 BString text;
1107 if (!scaffold->search_bar->LockLooper())
1108 break;
1109 text = scaffold->search_bar->Text();
1110 scaffold->search_bar->UnlockLooper();
1111
1112 char t[PATH_MAX];
1113 find_resource(t,"SearchEngines","./beos/res/SearchEngines");
1114
1115 search_web_init(&t[0]);
1116
1118 ,&url);
1119 if (ret == NSERROR_OK) {
1122 url,
1123 NULL,
1124 bw,
1125 NULL);
1126 nsurl_unref(url);
1127 }
1128
1129 if (ret != NSERROR_OK) {
1131 }
1132
1134
1135 break;
1136 }
1137/*
1138 case 'menu':
1139 {
1140 menu_action action;
1141 if (message->FindInt32("action", (int32 *)&action) < B_OK)
1142 break;
1143 switch (action) {
1144 case NO_ACTION:
1145 case HELP_OPEN_CONTENTS:
1146 case HELP_OPEN_GUIDE:
1147 case HELP_OPEN_INFORMATION:
1148 case HELP_OPEN_ABOUT:
1149 case HELP_LAUNCH_INTERACTIVE:
1150
1151 break;
1152 }
1153#warning XXX
1154 break;
1155 }
1156*/
1157 case NO_ACTION:
1158 break;
1159 case HELP_OPEN_CONTENTS:
1160 break;
1161 case HELP_OPEN_GUIDE:
1162 break;
1164 break;
1165 case HELP_OPEN_ABOUT:
1166 {
1167 const char *goto_url = "about:credits";
1168 nserror nserr;
1169 nsurl *url;
1170 nserr = nsurl_create(goto_url, &url);
1171 if (nserr == NSERROR_OK) {
1173 url, NULL,
1175 NULL, NULL, NULL);
1176 nsurl_unref(url);
1177 }
1178 if (nserr != NSERROR_OK) {
1180 }
1181 }
1182 break;
1183 case HELP_OPEN_LICENCE:
1184 {
1185 const char *goto_url = "about:licence";
1186 nserror nserr;
1187 nsurl *url;
1188 nserr = nsurl_create(goto_url, &url);
1189 if (nserr == NSERROR_OK) {
1191 url, NULL,
1193 NULL, NULL, NULL);
1194 nsurl_unref(url);
1195 }
1196 if (nserr != NSERROR_OK) {
1198 }
1199 }
1200 break;
1202 break;
1203 case HISTORY_SHOW_LOCAL:
1204 break;
1206 break;
1207 case HOTLIST_ADD_URL:
1208 break;
1209 case HOTLIST_SHOW:
1210 break;
1211 case COOKIES_SHOW:
1212 {
1214 break;
1215 }
1216 case COOKIES_DELETE:
1217 {
1219 break;
1220 }
1221 case BROWSER_PAGE:
1222 break;
1223 case BROWSER_PAGE_INFO:
1224 break;
1225 case BROWSER_PRINT:
1226 break;
1227 case BROWSER_NEW_WINDOW:
1228 {
1229 BString text;
1230 nsurl *url;
1231 nserror error;
1232
1233 if (!scaffold->url_bar->LockLooper())
1234 break;
1235 text = scaffold->url_bar->Text();
1236 scaffold->url_bar->UnlockLooper();
1237
1239
1240 error = nsurl_create(text.String(), &url);
1241 if (error == NSERROR_OK) {
1243 url,
1244 NULL,
1245 bw,
1246 NULL);
1247 nsurl_unref(url);
1248 }
1249 if (error != NSERROR_OK) {
1251 }
1252 break;
1253 }
1255 {
1256 if (!bw || browser_window_has_content(bw) == false)
1257 break;
1259 break;
1260 }
1261 case BROWSER_OBJECT:
1262 break;
1264 break;
1266 if (scaffold->current_menu_object != NULL) {
1268 browser_window_reload(bw, false);
1269 scaffold->current_menu_object = NULL;
1270 }
1271 break;
1273 break;
1275 break;
1277 break;
1279 break;
1281 break;
1282 case BROWSER_SAVE:
1283 break;
1285 break;
1287 break;
1289 break;
1291 break;
1293 break;
1295 break;
1296 case HOTLIST_EXPORT:
1297 break;
1298 case HISTORY_EXPORT:
1299 break;
1300 case B_NETPOSITIVE_UP:
1302 break;
1304 if (!scaffold->url_bar->LockLooper())
1305 break;
1306 scaffold->url_bar->MakeFocus();
1307 scaffold->url_bar->UnlockLooper();
1308 break;
1309 case BROWSER_SCALE_VIEW:
1310 break;
1311 case BROWSER_FIND_TEXT:
1312 break;
1314 break;
1316 break;
1318 break;
1319 case BROWSER_BUFFER_ALL:
1320 break;
1321 case BROWSER_SAVE_VIEW:
1322 break;
1324 break;
1326 break;
1328 break;
1330 break;
1331 case TREE_NEW_FOLDER:
1332 case TREE_NEW_LINK:
1333 case TREE_EXPAND_ALL:
1335 case TREE_EXPAND_LINKS:
1336 case TREE_COLLAPSE_ALL:
1339 case TREE_SELECTION:
1343 case TREE_SELECT_ALL:
1345 break;
1346 case TOOLBAR_BUTTONS:
1347 break;
1349 break;
1350 case TOOLBAR_THROBBER:
1351 break;
1352 case TOOLBAR_EDIT:
1353 break;
1354 case CHOICES_SHOW:
1355 break;
1356 case APPLICATION_QUIT:
1357 nsbeos_done = true;
1358 break;
1359 default:
1360 break;
1361 }
1362}
1363
1365{
1366 NSLOG(netsurf, INFO, "Being Destroyed = %d",
1367 scaffold->being_destroyed);
1368 if (scaffold->being_destroyed) return;
1369 scaffold->being_destroyed = 1;
1370 nsbeos_window_destroy_event(scaffold->window, scaffold, NULL);
1371}
1372
1373
1375{
1377
1378 if (!g->top_view->LockLooper())
1379 return;
1380
1383
1384 g->top_view->UnlockLooper();
1385
1386}
1387
1388void nsbeos_throb(void *p)
1389{
1390 struct beos_scaffolding *g = (struct beos_scaffolding *)p;
1391
1392 if (g->throb_frame >= (nsbeos_throbber->nframes - 1))
1393 g->throb_frame = 1;
1394 else
1395 g->throb_frame++;
1396
1397 if (!g->top_view->LockLooper())
1398 return;
1399
1401 g->throbber->Invalidate();
1402
1403 g->top_view->UnlockLooper();
1404
1405 beos_schedule(100, nsbeos_throb, p);
1406
1407}
1408
1409
1411{
1412 int32 i;
1413 if (!be_app || !be_app->Lock())
1414 return NULL;
1415 for (i = be_app->CountWindows() - 1; i >= 0; i--) {
1416 if (be_app->WindowAt(i) == NULL)
1417 continue;
1418 NSBrowserWindow *win;
1419 win = dynamic_cast<NSBrowserWindow *>(be_app->WindowAt(i));
1420 if (win) {
1421 win->Lock();
1422 be_app->Unlock();
1423 return win;
1424 }
1425 }
1426 be_app->Unlock();
1427 return NULL;
1428}
1429
1431{
1432 return scaffold->window;
1433}
1434
1436{
1437 return scaffold->top_view;
1438}
1439
1440static void recursively_set_menu_items_target(BMenu *menu, BHandler *handler)
1441{
1442 menu->SetTargetForItems(handler);
1443 for (int i = 0; menu->ItemAt(i); i++) {
1444 if (!menu->SubmenuAt(i))
1445 continue;
1446 recursively_set_menu_items_target(menu->SubmenuAt(i), handler);
1447 }
1448}
1449
1451{
1452 NSLOG(netsurf, INFO, "Attaching view to scaffolding %p", g);
1453
1454 // this is a replicant,... and it went bad
1455 if (!g->window) {
1456 if (g->top_view->Looper() && !g->top_view->LockLooper())
1457 return;
1458 }
1459
1460 BRect rect(g->top_view->Bounds());
1461 rect.top += TOOLBAR_HEIGHT;
1462 rect.right -= B_V_SCROLL_BAR_WIDTH;
1463 rect.bottom -= B_H_SCROLL_BAR_HEIGHT;
1464
1465 view->ResizeTo(rect.Width() /*+ 1*/, rect.Height() /*+ 1*/);
1466 view->MoveTo(rect.LeftTop());
1467
1468
1469 g->scroll_view = new BScrollView("NetSurfScrollView", view,
1470 B_FOLLOW_ALL, 0, true, true, B_NO_BORDER);
1471
1472 g->top_view->AddChild(g->scroll_view);
1473
1474 // for replicants, add a NSResizeKnob to allow resizing
1475 if (!g->window) {
1476 BRect frame = g->scroll_view->Bounds();
1477 frame.left = frame.right - B_V_SCROLL_BAR_WIDTH;
1478 frame.top = frame.bottom - B_H_SCROLL_BAR_HEIGHT;
1479 NSResizeKnob *knob = new NSResizeKnob(frame, g->top_view);
1480 //TODO: set bitmap
1481 g->scroll_view->AddChild(knob);
1482 }
1483
1484 view->MakeFocus();
1485
1486 // resize the horiz scrollbar to make room for the status bar and add it.
1487
1488 BScrollBar *sb = g->scroll_view->ScrollBar(B_HORIZONTAL);
1489 rect = sb->Frame();
1490 float divider = rect.Width() + 1;
1491 //divider /= 2;
1492 divider *= 67.0/100; // 67%
1493
1494 sb->ResizeBy(-divider, 0);
1495 sb->MoveBy(divider, 0);
1496
1497 rect.right = rect.left + divider - 1;
1498
1499 /*
1500 BBox *statusBarBox = new BBox(rect, "StatusBarBox",
1501 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM,
1502 B_WILL_DRAW | B_FRAME_EVENTS,
1503 B_RAISED_BORDER);
1504 */
1505
1506 g->status_bar->MoveTo(rect.LeftTop());
1507 g->status_bar->ResizeTo(rect.Width() + 1, rect.Height() + 1);
1508 g->scroll_view->AddChild(g->status_bar);
1509 g->status_bar->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
1510 g->status_bar->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)) ;
1511#if defined(__HAIKU__) || defined(B_DANO_VERSION)
1512 g->status_bar->SetHighColor(ui_color(B_PANEL_TEXT_COLOR));
1513#endif
1514
1515
1516
1517 // set targets to the topmost ns view,
1518 // we might not have a window later (replicant ?)
1519 // this won't work for replicants, since the base view isn't attached yet
1520 // we'll redo this in NSBaseView::AllAttached
1521 g->back_button->SetTarget(view);
1522 g->forward_button->SetTarget(view);
1523 g->stop_button->SetTarget(view);
1524 g->reload_button->SetTarget(view);
1525 g->home_button->SetTarget(view);
1526
1527 g->url_bar->SetTarget(view);
1528 g->search_bar->SetTarget(view);
1529
1531
1533
1534 if (g->window) {
1536
1537 // add toolbar shortcuts
1538 BMessage *message;
1539
1540 message = new BMessage('back');
1541 message->AddPointer("scaffolding", g);
1542 g->window->AddShortcut(B_LEFT_ARROW, 0, message, view);
1543
1544 message = new BMessage('forw');
1545 message->AddPointer("scaffolding", g);
1546 g->window->AddShortcut(B_RIGHT_ARROW, 0, message, view);
1547
1548 message = new BMessage('stop');
1549 message->AddPointer("scaffolding", g);
1550 g->window->AddShortcut('S', 0, message, view);
1551
1552 message = new BMessage('relo');
1553 message->AddPointer("scaffolding", g);
1554 g->window->AddShortcut('R', 0, message, view);
1555
1556 message = new BMessage('home');
1557 message->AddPointer("scaffolding", g);
1558 g->window->AddShortcut('H', 0, message, view);
1559
1560
1561#if defined(__HAIKU__)
1562 // Make sure the window is layouted and answering to events, but do not
1563 // show it before it is actually resized
1564 g->window->Hide();
1565 g->window->Show();
1566
1569 stack.AddWindow(g->window);
1570 }
1571#endif
1572 g->window->Show();
1573
1574 } else {
1575 if (g->top_view->Looper())
1576 g->top_view->UnlockLooper();
1577 }
1578
1579
1580}
1581
1582static BMenuItem *make_menu_item(const char *name, BMessage *message, bool enabled=false)
1583{
1584 BMenuItem *item;
1585 BString label(messages_get(name));
1586 BString accelKey(name);
1587 accelKey += "Accel";
1588 BString accel(messages_get(accelKey));
1589 if (accel == accelKey)
1590 accel = "";
1591 uint32 mods = 0;
1592 char key = 0;
1593 // try to understand accelerators
1594 if (!accel.IsEmpty()) {
1595 if (accel.FindFirst("\xe2\x87\x91") > -1) {
1596 accel.RemoveFirst("\xe2\x87\x91");
1597 mods |= B_SHIFT_KEY;
1598 }
1599 if (accel.FindFirst("^") > -1) {
1600 accel.RemoveFirst("^");
1601 mods |= B_CONTROL_KEY;
1602 }
1603 if (accel.FindFirst("PRINT") > -1) {
1604 accel.RemoveFirst("PRINT");
1605 //mods |= ; // ALT!!!
1606 key = B_PRINT_KEY;
1607 }
1608
1609 /* replace UTF-8 glyphs (arrows...) with API codes */
1610 accel.ReplaceAll("\xE2\x86\x90", (BString()+=B_LEFT_ARROW).String());
1611 accel.ReplaceAll("\xE2\x86\x92", (BString()+=B_RIGHT_ARROW).String());
1612 accel.ReplaceAll("\xE2\x86\x91", (BString()+=B_UP_ARROW).String());
1613
1614 if (accel.Length() > 1 && accel[0] == 'F') { // Function key
1615 int num;
1616 if (sscanf(accel.String(), "F%d", &num) > 0) {
1617 //
1618 }
1619 } else if (accel.Length() > 0) {
1620 key = accel[0];
1621 }
1622 //printf("MENU: detected accel '%s' mods 0x%08lx, key %d\n", accel.String(), mods, key);
1623 }
1624
1625 // turn ... into ellipsis
1626 label.ReplaceAll("...", B_UTF8_ELLIPSIS);
1627
1628 item = new BMenuItem(label.String(), message, key, mods);
1629
1630 item->SetEnabled(enabled);
1631
1632 return item;
1633}
1634
1635
1636class BBitmapButton: public BButton
1637{
1638 public:
1639 BBitmapButton(BRect rect, const char* name, const char* label,
1640 BMessage* message);
1642
1643 void Draw(BRect updateRect);
1644 void SetBitmap(const char* attrName);
1645 private:
1646 BBitmap* fBitmap;
1648};
1649
1650
1651BBitmapButton::BBitmapButton(BRect rect, const char* name, const char* label,
1652 BMessage* message)
1653 : BButton(rect, name, label, message)
1654{
1655 SetBitmap(name);
1656}
1657
1658
1660{
1661 delete fBitmap;
1662 delete fDisabledBitmap;
1663}
1664
1665
1666void BBitmapButton::Draw(BRect updateRect)
1667{
1668 if(fBitmap == NULL) {
1669 BButton::Draw(updateRect);
1670 return;
1671 }
1672
1673 SetDrawingMode(B_OP_COPY);
1674 FillRect(updateRect, B_SOLID_LOW);
1675 rgb_color color = LowColor();
1676
1677 SetDrawingMode(B_OP_ALPHA);
1678 if(IsEnabled()) {
1679 if(Value() != 0) {
1680 // button is clicked
1681 DrawBitmap(fBitmap, BPoint(1, 1));
1682 } else {
1683 // button is released
1684 DrawBitmap(fBitmap, BPoint(0, 0));
1685 }
1686 } else
1687 DrawBitmap(fDisabledBitmap, BPoint(0, 0));
1688}
1689
1690
1691void BBitmapButton::SetBitmap(const char* attrname)
1692{
1693#ifdef __HAIKU__
1694 size_t size = 0;
1695 const void* data = gAppResources->LoadResource('VICN', attrname, &size);
1696
1697 if (!data) {
1698 printf("CANT LOAD RESOURCE %s\n", attrname);
1699 return;
1700 }
1701
1702 fBitmap = new BBitmap(BRect(0, 0, 32, 32), B_RGB32);
1703 status_t status = BIconUtils::GetVectorIcon((const uint8*)data, size, fBitmap);
1704
1705 if(status != B_OK) {
1706 fprintf(stderr, "%s > oops %s\n", attrname, strerror(status));
1707 delete fBitmap;
1708 fBitmap = NULL;
1709 }
1710
1711 fDisabledBitmap = new BBitmap(fBitmap);
1712 rgb_color* pixel = (rgb_color*)fDisabledBitmap->Bits();
1713 for(int i = 0; i < fDisabledBitmap->BitsLength()/4; i++)
1714 {
1715 *pixel = tint_color(*pixel, B_DISABLED_MARK_TINT);
1716 pixel++;
1717 }
1718#else
1719 // No vector icon support on BeOS. We could try to load a bitmap one
1720 fBitmap = NULL;
1721 fDisabledBitmap = NULL;
1722#endif
1723}
1724
1725
1727{
1728 struct beos_scaffolding *g = (struct beos_scaffolding *)malloc(sizeof(*g));
1729
1730 NSLOG(netsurf, INFO,
1731 "Constructing a scaffold of %p for gui_window %p", g, toplevel);
1732
1733 g->top_level = toplevel;
1734 g->being_destroyed = 0;
1735 g->fullscreen = false;
1736
1737 open_windows++;
1738
1739 BMessage *message;
1740 BRect rect;
1741 BMenuItem *item;
1742
1743 g->window = NULL;
1744 g->menu_bar = NULL;
1745
1746 if (replicated && !replicant_view) {
1747 beos_warn_user("Error: No subwindow allowed when replicated.", NULL);
1748 return NULL;
1749 }
1750
1751
1752 if (!replicant_view) {
1753 BRect frame(0, 0, 600-1, 500-1);
1754 if (nsoption_int(window_width) > 0) {
1755 frame.Set(0, 0, nsoption_int(window_width) - 1, nsoption_int(window_height) - 1);
1756 frame.OffsetToSelf(nsoption_int(window_x), nsoption_int(window_y));
1757 } else {
1758 BPoint pos(50, 50);
1759 // XXX: use last BApplication::WindowAt()'s dynamic_cast<NSBrowserWindow *> Frame()
1761 if (win) {
1762 pos = win->Frame().LeftTop();
1763 win->UnlockLooper();
1764 }
1765 pos += BPoint(20, 20);
1766 BScreen screen;
1767 BRect screenFrame(screen.Frame());
1768 if (pos.y + frame.Height() >= screenFrame.Height()) {
1769 pos.y = 50;
1770 pos.x += 50;
1771 }
1772 if (pos.x + frame.Width() >= screenFrame.Width()) {
1773 pos.x = 50;
1774 pos.y = 50;
1775 }
1776 frame.OffsetToSelf(pos);
1777 }
1778
1779 g->window = new NSBrowserWindow(frame, g);
1780
1781 rect = frame.OffsetToCopy(0,0);
1782 rect.bottom = rect.top + 20;
1783
1784 // build menus
1785 g->menu_bar = new BMenuBar(rect, "menu_bar");
1786 g->window->AddChild(g->menu_bar);
1787
1788 BMenu *menu;
1789
1790 // App menu
1791 //XXX: use icon item ?
1792
1793 menu = new BMenu(messages_get("NetSurf"));
1794 g->menu_bar->AddItem(menu);
1795
1796 message = new BMessage(B_ABOUT_REQUESTED);
1797 item = make_menu_item("Info", message, true);
1798 menu->AddItem(item);
1799
1800#if 0
1801 message = new BMessage(NO_ACTION);
1802 item = make_menu_item("AppHelp", message);
1803 menu->AddItem(item);
1804
1805 submenu = new BMenu(messages_get("Open"));
1806 menu->AddItem(submenu);
1807
1808 message = new BMessage(NO_ACTION);
1809 item = make_menu_item("OpenURL", message);
1810 submenu->AddItem(item);
1811
1812 message = new BMessage(CHOICES_SHOW);
1813 item = make_menu_item("Choices", message);
1814 menu->AddItem(item);
1815#endif
1816
1817 message = new BMessage(APPLICATION_QUIT);
1818 item = make_menu_item("Quit", message, true);
1819 menu->AddItem(item);
1820
1821 // Page menu
1822
1823 menu = new BMenu(messages_get("Page"));
1824 g->menu_bar->AddItem(menu);
1825
1826#if 0
1827 message = new BMessage(BROWSER_PAGE_INFO);
1828 item = make_menu_item("PageInfo", message);
1829 menu->AddItem(item);
1830
1831 message = new BMessage(BROWSER_SAVE);
1832 item = make_menu_item("SaveAsNS", message);
1833 menu->AddItem(item);
1834
1835 message = new BMessage(BROWSER_SAVE_COMPLETE);
1836 item = make_menu_item("SaveCompNS", message);
1837 menu->AddItem(item);
1838
1839 submenu = new BMenu(messages_get("Export"));
1840 menu->AddItem(submenu);
1841
1842 /*
1843 message = new BMessage(BROWSER_EXPORT_DRAW);
1844 item = make_menu_item("Draw", message);
1845 submenu->AddItem(item);
1846 */
1847
1848 message = new BMessage(BROWSER_EXPORT_TEXT);
1849 item = make_menu_item("LinkText", message);
1850 submenu->AddItem(item);
1851
1852
1853 submenu = new BMenu(messages_get("SaveURL"));
1854 menu->AddItem(submenu);
1855
1856 //XXX
1857 message = new BMessage(BROWSER_OBJECT_SAVE_URL_URL);
1858 item = make_menu_item("URL", message);
1859 submenu->AddItem(item);
1860
1861
1862 message = new BMessage(BROWSER_PRINT);
1863 item = make_menu_item("PrintNS", message);
1864 menu->AddItem(item);
1865#endif
1866
1867 message = new BMessage(BROWSER_NEW_WINDOW);
1868 item = make_menu_item("NewWindowNS", message, true);
1869 menu->AddItem(item);
1870
1871 message = new BMessage(BROWSER_VIEW_SOURCE);
1872 item = make_menu_item("ViewSrc", message, true);
1873 menu->AddItem(item);
1874
1875#if 0 // FIXME This is supposed to be a popup menu!
1876 // Object menu
1877
1878 menu = new BMenu(messages_get("Object"));
1879 g->menu_bar->AddItem(menu);
1880
1881 message = new BMessage(BROWSER_OBJECT_INFO);
1882 item = make_menu_item("ObjInfo", message);
1883 menu->AddItem(item);
1884
1885 message = new BMessage(BROWSER_OBJECT_SAVE);
1886 item = make_menu_item("ObjSave", message);
1887 menu->AddItem(item);
1888 // XXX: submenu: Sprite ?
1889
1890 message = new BMessage(BROWSER_OBJECT_RELOAD);
1891 item = make_menu_item("ObjReload", message);
1892 menu->AddItem(item);
1893#endif
1894
1895 // Navigate menu
1896
1897 menu = new BMenu(messages_get("Navigate"));
1898 g->menu_bar->AddItem(menu);
1899
1900 message = new BMessage(BROWSER_NAVIGATE_HOME);
1901 item = make_menu_item("Home", message, true);
1902 menu->AddItem(item);
1903
1904 message = new BMessage(BROWSER_NAVIGATE_BACK);
1905 item = make_menu_item("Back", message, true);
1906 menu->AddItem(item);
1907
1908 message = new BMessage(BROWSER_NAVIGATE_FORWARD);
1909 item = make_menu_item("Forward", message, true);
1910 menu->AddItem(item);
1911
1912 message = new BMessage(BROWSER_NAVIGATE_UP);
1913 item = make_menu_item("UpLevel", message);
1914 menu->AddItem(item);
1915
1916 message = new BMessage(BROWSER_NAVIGATE_RELOAD);
1917 item = make_menu_item("Reload", message, true);
1918 menu->AddItem(item);
1919
1920 message = new BMessage(BROWSER_NAVIGATE_STOP);
1921 item = make_menu_item("Stop", message, true);
1922 menu->AddItem(item);
1923
1924#if 0
1925 // View menu
1926
1927 menu = new BMenu(messages_get("View"));
1928 g->menu_bar->AddItem(menu);
1929
1930 message = new BMessage(BROWSER_SCALE_VIEW);
1931 item = make_menu_item("ScaleView", message);
1932 menu->AddItem(item);
1933
1934 submenu = new BMenu(messages_get("Images"));
1935 menu->AddItem(submenu);
1936
1937 message = new BMessage(BROWSER_IMAGES_FOREGROUND);
1938 item = make_menu_item("ForeImg", message);
1939 submenu->AddItem(item);
1940
1941 message = new BMessage(BROWSER_IMAGES_BACKGROUND);
1942 item = make_menu_item("BackImg", message);
1943 submenu->AddItem(item);
1944
1945
1946 submenu = new BMenu(messages_get("Toolbars"));
1947 menu->AddItem(submenu);
1948 submenu->SetEnabled(false);
1949
1950 message = new BMessage(NO_ACTION);
1951 item = make_menu_item("ToolButtons", message);
1952 submenu->AddItem(item);
1953
1954 message = new BMessage(NO_ACTION);
1955 item = make_menu_item("ToolAddress", message);
1956 submenu->AddItem(item);
1957
1958 message = new BMessage(NO_ACTION);
1959 item = make_menu_item("ToolThrob", message);
1960 submenu->AddItem(item);
1961
1962 message = new BMessage(NO_ACTION);
1963 item = make_menu_item("ToolStatus", message);
1964 submenu->AddItem(item);
1965
1966
1967 submenu = new BMenu(messages_get("Render"));
1968 menu->AddItem(submenu);
1969
1970 message = new BMessage(BROWSER_BUFFER_ANIMS);
1971 item = make_menu_item("RenderAnims", message);
1972 submenu->AddItem(item);
1973
1974 message = new BMessage(BROWSER_BUFFER_ALL);
1975 item = make_menu_item("RenderAll", message);
1976 submenu->AddItem(item);
1977
1978
1979 message = new BMessage(NO_ACTION);
1980 item = make_menu_item("OptDefault", message);
1981 menu->AddItem(item);
1982#endif
1983
1984 // Utilities menu
1985
1986 menu = new BMenu(messages_get("Utilities"));
1987 g->menu_bar->AddItem(menu);
1988
1989#if 0
1990 submenu = new BMenu(messages_get("Hotlist"));
1991 menu->AddItem(submenu);
1992
1993 message = new BMessage(HOTLIST_ADD_URL);
1994 item = make_menu_item("HotlistAdd", message);
1995 submenu->AddItem(item);
1996
1997 message = new BMessage(HOTLIST_SHOW);
1998 item = make_menu_item("HotlistShowNS", message);
1999 submenu->AddItem(item);
2000
2001
2002 submenu = new BMenu(messages_get("History"));
2003 menu->AddItem(submenu);
2004
2005 message = new BMessage(HISTORY_SHOW_LOCAL);
2006 item = make_menu_item("HistLocal", message);
2007 submenu->AddItem(item);
2008
2009 message = new BMessage(HISTORY_SHOW_GLOBAL);
2010 item = make_menu_item("HistGlobal", message);
2011 submenu->AddItem(item);
2012#endif
2013
2014 message = new BMessage(COOKIES_SHOW);
2015 item = make_menu_item("Cookie manager", message, true);
2016 menu->AddItem(item);
2017
2018#if 0
2019 message = new BMessage(BROWSER_FIND_TEXT);
2020 item = make_menu_item("FindText", message);
2021 menu->AddItem(item);
2022
2023 submenu = new BMenu(messages_get("Window"));
2024 menu->AddItem(submenu);
2025
2026 message = new BMessage(BROWSER_WINDOW_DEFAULT);
2027 item = make_menu_item("WindowSave", message);
2028 submenu->AddItem(item);
2029
2030 message = new BMessage(BROWSER_WINDOW_STAGGER);
2031 item = make_menu_item("WindowStagr", message);
2032 submenu->AddItem(item);
2033
2034 message = new BMessage(BROWSER_WINDOW_COPY);
2035 item = make_menu_item("WindowSize", message);
2036 submenu->AddItem(item);
2037
2038 message = new BMessage(BROWSER_WINDOW_RESET);
2039 item = make_menu_item("WindowReset", message);
2040 submenu->AddItem(item);
2041#endif
2042
2043
2044 // Help menu
2045
2046 menu = new BMenu(messages_get("Help"));
2047 g->menu_bar->AddItem(menu);
2048
2049#if 0
2050 message = new BMessage(HELP_OPEN_CONTENTS);
2051 item = make_menu_item("HelpContent", message);
2052 menu->AddItem(item);
2053
2054 message = new BMessage(HELP_OPEN_GUIDE);
2055 item = make_menu_item("HelpGuide", message);
2056 menu->AddItem(item);
2057
2058 message = new BMessage(HELP_OPEN_INFORMATION);
2059 item = make_menu_item("HelpInfo", message);
2060 menu->AddItem(item);
2061#endif
2062
2063 message = new BMessage(HELP_OPEN_ABOUT);
2064 item = make_menu_item("HelpCredits", message, true);
2065 menu->AddItem(item);
2066
2067 message = new BMessage(HELP_OPEN_LICENCE);
2068 item = make_menu_item("HelpLicence", message, true);
2069 menu->AddItem(item);
2070
2071#if 0
2072 message = new BMessage(HELP_LAUNCH_INTERACTIVE);
2073 item = make_menu_item("HelpInter", message);
2074 menu->AddItem(item);
2075#endif
2076
2077 // the base view that receives the toolbar, statusbar and top-level view.
2078 rect = frame.OffsetToCopy(0,0);
2079 rect.top = g->menu_bar->Bounds().Height() + 1;
2080 //rect.top = 20 + 1; // XXX
2081 //rect.bottom -= B_H_SCROLL_BAR_HEIGHT;
2082 g->top_view = new NSBaseView(rect);
2083 // add the top view to the window
2084 g->window->AddChild(g->top_view);
2085 } else { // replicant_view
2086 // the base view has already been created with the archive constructor
2088 }
2089 g->top_view->SetScaffolding(g);
2090
2091 // build popup menu
2092 g->popup_menu = new BPopUpMenu("popup", false, false);
2093
2094#if 0
2095 message = new BMessage(BROWSER_OBJECT_INFO);
2096 item = make_menu_item("ObjInfo", message);
2097 g->popup_menu->AddItem(item);
2098
2099 message = new BMessage(BROWSER_OBJECT_SAVE);
2100 item = make_menu_item("ObjSave", message);
2101 g->popup_menu->AddItem(item);
2102 // XXX: submenu: Sprite ?
2103#endif
2104
2105 message = new BMessage(BROWSER_OBJECT_RELOAD);
2106 item = make_menu_item("ObjReload", message, true);
2107 g->popup_menu->AddItem(item);
2108
2109
2110#ifdef ENABLE_DRAGGER
2111 // the dragger to allow replicating us
2112 // XXX: try to stuff it in the status bar at the bottom
2113 // (BDragger *must* be a parent, sibiling or direct child of NSBaseView!)
2114 rect = g->top_view->Bounds();
2115 rect.bottom = rect.top + TOOLBAR_HEIGHT - 1;
2116 rect.left = rect.right - DRAGGER_WIDTH + 1;
2117 g->dragger = new BDragger(rect, g->top_view,
2118 B_FOLLOW_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW);
2119 g->top_view->AddChild(g->dragger);
2120 g->dragger->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
2121 g->dragger->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)) ;
2122#endif
2123
2124 // tool_bar
2125 // the toolbar is also the dragger for now
2126 // XXX: try to stuff it in the status bar at the bottom
2127 // (BDragger *must* be a parent, sibiling or direct child of NSBaseView!)
2128 // XXX: B_FULL_UPDATE_ON_RESIZE avoids leaving bits on resize,
2129 // but causes flicker
2130 rect = g->top_view->Bounds();
2131 rect.bottom = rect.top + TOOLBAR_HEIGHT - 1;
2132#ifdef ENABLE_DRAGGER
2133 rect.right = rect.right - DRAGGER_WIDTH;
2134#else
2135 rect.right = rect.right + 1;
2136#endif
2137 g->tool_bar = new BBox(rect, "Toolbar",
2138 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW | B_FRAME_EVENTS
2139 | B_FULL_UPDATE_ON_RESIZE | B_NAVIGABLE_JUMP, B_PLAIN_BORDER);
2140 g->top_view->AddChild(g->tool_bar);
2141 g->tool_bar->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
2142 g->tool_bar->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)) ;
2143
2144 // buttons
2145 rect = g->tool_bar->Bounds();
2146 rect.right = TOOLBAR_HEIGHT;
2147 rect.InsetBySelf(5, 5);
2148 rect.OffsetBySelf(0, -1);
2149 int nButtons = 0;
2150
2151 message = new BMessage('back');
2152 message->AddPointer("scaffolding", g);
2153 g->back_button = new BBitmapButton(rect, "back_button", "<", message);
2154 g->tool_bar->AddChild(g->back_button);
2155 nButtons++;
2156
2157 rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
2158 message = new BMessage('forw');
2159 message->AddPointer("scaffolding", g);
2160 g->forward_button = new BBitmapButton(rect, "forward_button", ">", message);
2161 g->tool_bar->AddChild(g->forward_button);
2162 nButtons++;
2163
2164 rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
2165 message = new BMessage('stop');
2166 message->AddPointer("scaffolding", g);
2167 g->stop_button = new BBitmapButton(rect, "stop_button", "S", message);
2168 g->tool_bar->AddChild(g->stop_button);
2169 nButtons++;
2170
2171 rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
2172 message = new BMessage('relo');
2173 message->AddPointer("scaffolding", g);
2174 g->reload_button = new BBitmapButton(rect, "reload_button", "R", message);
2175 g->tool_bar->AddChild(g->reload_button);
2176 nButtons++;
2177
2178 rect.OffsetBySelf(TOOLBAR_HEIGHT, 0);
2179 message = new BMessage('home');
2180 message->AddPointer("scaffolding", g);
2181 g->home_button = new BBitmapButton(rect, "home_button", "H", message);
2182 g->tool_bar->AddChild(g->home_button);
2183 nButtons++;
2184
2185
2186 // url bar
2187 rect = g->tool_bar->Bounds();
2188 rect.left += TOOLBAR_HEIGHT * nButtons;
2189 rect.right -= TOOLBAR_HEIGHT * 1 + 100;
2190 rect.InsetBySelf(5, 5);
2191 message = new BMessage('urle');
2192 message->AddPointer("scaffolding", g);
2193 g->url_bar = new NSIconTextControl(rect, "url_bar", "", "", message,
2194 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
2195 g->url_bar->SetDivider(0);
2196 rect = g->url_bar->TextView()->TextRect();
2197 rect.left += 16;
2198 g->url_bar->TextView()->SetTextRect(rect);
2199 g->tool_bar->AddChild(g->url_bar);
2200
2201 // search bar
2202
2203 rect = g->tool_bar->Bounds();
2204 rect.left = g->url_bar->Frame().right;
2205 rect.right -= TOOLBAR_HEIGHT * 1;
2206 rect.InsetBy(5,5);
2207 message = new BMessage('sear');
2208 message->AddPointer("scaffolding", g);
2209 g->search_bar = new BTextControl(rect, "search_bar", "",
2210 "Search" B_UTF8_ELLIPSIS, message, B_FOLLOW_RIGHT | B_FOLLOW_TOP);
2211 g->search_bar->SetDivider(0);
2212 g->tool_bar->AddChild(g->search_bar);
2213
2214 // throbber
2215 rect.Set(0, 0, 24, 24);
2216 rect.OffsetTo(g->tool_bar->Bounds().right - 24 - (TOOLBAR_HEIGHT - 24) / 2,
2217 (TOOLBAR_HEIGHT - 24) / 2);
2218 g->throbber = new NSThrobber(rect);
2219 g->tool_bar->AddChild(g->throbber);
2220 g->throbber->SetViewColor(g->tool_bar->ViewColor());
2221 g->throbber->SetLowColor(g->tool_bar->ViewColor());
2222 g->throbber->SetDrawingMode(B_OP_ALPHA);
2223 g->throbber->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
2224 /* set up the throbber. */
2226 g->throb_frame = 0;
2227
2228
2229 // the status bar at the bottom
2230 BString status("NetSurf");
2231 status << " " << netsurf_version;
2232 g->status_bar = new BStringView(BRect(0,0,-1,-1), "StatusBar",
2233 status.String(), B_FOLLOW_LEFT/*_RIGHT*/ | B_FOLLOW_BOTTOM);
2234
2235 // will be added to the scrollview when adding the top view.
2236
2237 // notify the thread creating the replicant that we're done
2238 if (replicant_view)
2239 release_sem(replicant_done_sem);
2240
2241 replicant_view = NULL;
2242
2243 return g;
2244}
2245
2246void gui_window_set_title(struct gui_window *_g, const char *title)
2247{
2248 struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
2249 if (g->top_level != _g) return;
2250
2251 // if we're a replicant, discard
2252 if (!g->window)
2253 return;
2254
2255 BString nt(title);
2256 if (nt.Length())
2257 nt << " - ";
2258 nt << "NetSurf";
2259
2260 if (!g->top_view->LockLooper())
2261 return;
2262
2263 g->window->SetTitle(nt.String());
2264
2265 g->top_view->UnlockLooper();
2266}
2267
2268void gui_window_set_status(struct gui_window *_g, const char *text)
2269{
2270 struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
2271 assert(g);
2272 assert(g->status_bar);
2273
2274 if (!g->top_view->LockLooper())
2275 return;
2276
2277 if (text == NULL || text[0] == '\0')
2278 {
2279 BString status("NetSurf");
2280 status << " " << netsurf_version;
2281 g->status_bar->SetText(status.String());
2282 }
2283 else
2284 {
2285 g->status_bar->SetText(text);
2286 }
2287 g->top_view->UnlockLooper();
2288}
2289
2291{
2292 struct beos_scaffolding *g;
2293
2294 g = nsbeos_get_scaffold(gw);
2295 if (g->top_level != gw)
2296 return NSERROR_OK;
2297
2298 assert(g->status_bar);
2299
2300 if (g->top_view->LockLooper()) {
2301 g->url_bar->SetText(nsurl_access(url));
2302
2303 g->top_view->UnlockLooper();
2304 }
2305
2306 return NSERROR_OK;
2307}
2308
2310{
2311 struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
2312
2313 if (!g->top_view->LockLooper())
2314 return;
2315
2316 g->stop_button->SetEnabled(true);
2317 g->reload_button->SetEnabled(false);
2318
2319 g->top_view->UnlockLooper();
2320
2322
2323 beos_schedule(100, nsbeos_throb, g);
2324}
2325
2327{
2328 struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
2329
2331
2333
2334 if (!g->top_view->LockLooper())
2335 return;
2336
2337 g->stop_button->SetEnabled(false);
2338 g->reload_button->SetEnabled(true);
2339
2341 g->throbber->Invalidate();
2342
2343 g->top_view->UnlockLooper();
2344}
2345
2346/**
2347 * add retrieved favicon to the gui
2348 */
2350{
2351 BBitmap *bitmap = NULL;
2352 struct bitmap *bmp_icon;
2353
2354 bmp_icon = (icon != NULL) ? content_get_bitmap(icon) : NULL;
2355
2356 if (bmp_icon) {
2358 }
2359
2360 struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
2361
2362 if (!g->top_view->LockLooper())
2363 return;
2364
2366
2367 g->top_view->UnlockLooper();
2368}
2369
2370
2371void nsbeos_scaffolding_popup_menu(nsbeos_scaffolding *scaffold, struct browser_window *bw, BPoint where, BPoint screenWhere)
2372{
2373 struct browser_window_features cont;
2374
2375 browser_window_get_features(bw, (int)where.x, (int)where.y, &cont);
2376
2377 scaffold->current_menu_object = cont.object;
2378 bool enabled = !!scaffold->current_menu_object;
2379
2380 for (int i = 0; scaffold->popup_menu->ItemAt(i); i++) {
2381 scaffold->popup_menu->ItemAt(i)->SetEnabled(enabled);
2382 }
2383
2384 scaffold->popup_menu->Go(screenWhere, true, false, true);
2385}
2386
void nsbeos_about(struct gui_window *gui)
Creates the about alert.
Definition: about.cpp:44
#define PATH_MAX
Definition: gui.h:31
static struct s_view view
Definition: plot.c:199
#define B_UI_SETTINGS_CHANGED
Definition: gui.h:28
@ HELP_OPEN_ABOUT
Definition: scaffolding.h:86
@ BROWSER_WINDOW_STAGGER
Definition: scaffolding.h:149
@ TREE_EXPAND_FOLDERS
Definition: scaffolding.h:157
@ BROWSER_NAVIGATE_HOME
Definition: scaffolding.h:131
@ TREE_EXPAND_ALL
Definition: scaffolding.h:156
@ BROWSER_SCALE_VIEW
Definition: scaffolding.h:141
@ BROWSER_PAGE_INFO
Definition: scaffolding.h:104
@ BROWSER_OBJECT_SAVE
Definition: scaffolding.h:115
@ BROWSER_NAVIGATE_FORWARD
Definition: scaffolding.h:133
@ BROWSER_BUFFER_ALL
Definition: scaffolding.h:146
@ BROWSER_BUFFER_ANIMS
Definition: scaffolding.h:145
@ HELP_OPEN_LICENCE
Definition: scaffolding.h:87
@ TREE_COLLAPSE_FOLDERS
Definition: scaffolding.h:160
@ TOOLBAR_ADDRESS_BAR
Definition: scaffolding.h:171
@ BROWSER_OBJECT_RELOAD
Definition: scaffolding.h:112
@ TREE_SELECTION
Definition: scaffolding.h:162
@ BROWSER_OBJECT_EXPORT_SPRITE
Definition: scaffolding.h:116
@ BROWSER_WINDOW_RESET
Definition: scaffolding.h:151
@ BROWSER_WINDOW_COPY
Definition: scaffolding.h:150
@ CHOICES_SHOW
Definition: scaffolding.h:176
@ BROWSER_OBJECT_SAVE_URL_URI
Definition: scaffolding.h:117
@ COOKIES_SHOW
Definition: scaffolding.h:99
@ BROWSER_SAVE_VIEW
Definition: scaffolding.h:147
@ BROWSER_IMAGES_BACKGROUND
Definition: scaffolding.h:144
@ BROWSER_NAVIGATE_RELOAD
Definition: scaffolding.h:135
@ BROWSER_OBJECT
Definition: scaffolding.h:110
@ BROWSER_NEW_WINDOW
Definition: scaffolding.h:106
@ BROWSER_NAVIGATE_BACK
Definition: scaffolding.h:132
@ BROWSER_PRINT
Definition: scaffolding.h:105
@ BROWSER_NAVIGATE_STOP
Definition: scaffolding.h:137
@ HISTORY_SHOW_LOCAL
Definition: scaffolding.h:91
@ TREE_SELECTION_LAUNCH
Definition: scaffolding.h:164
@ TREE_NEW_FOLDER
Definition: scaffolding.h:154
@ BROWSER_SAVE_URL_TEXT
Definition: scaffolding.h:126
@ TREE_SELECT_ALL
Definition: scaffolding.h:166
@ BROWSER_NAVIGATE_UP
Definition: scaffolding.h:134
@ HOTLIST_ADD_URL
Definition: scaffolding.h:95
@ TREE_CLEAR_SELECTION
Definition: scaffolding.h:167
@ BROWSER_OBJECT_SAVE_URL_URL
Definition: scaffolding.h:118
@ HELP_OPEN_GUIDE
Definition: scaffolding.h:84
@ BROWSER_NAVIGATE_URL
Definition: scaffolding.h:138
@ HOTLIST_SHOW
Definition: scaffolding.h:96
@ BROWSER_PAGE
Definition: scaffolding.h:103
@ BROWSER_SAVE
Definition: scaffolding.h:120
@ TREE_SELECTION_EDIT
Definition: scaffolding.h:163
@ BROWSER_FIND_TEXT
Definition: scaffolding.h:142
@ TREE_EXPAND_LINKS
Definition: scaffolding.h:158
@ BROWSER_OBJECT_INFO
Definition: scaffolding.h:111
@ BROWSER_NAVIGATE_RELOAD_ALL
Definition: scaffolding.h:136
@ BROWSER_IMAGES_FOREGROUND
Definition: scaffolding.h:143
@ TOOLBAR_BUTTONS
Definition: scaffolding.h:170
@ HOTLIST_EXPORT
Definition: scaffolding.h:127
@ BROWSER_OBJECT_SAVE_URL_TEXT
Definition: scaffolding.h:119
@ APPLICATION_QUIT
Definition: scaffolding.h:177
@ TREE_SELECTION_DELETE
Definition: scaffolding.h:165
@ BROWSER_SAVE_COMPLETE
Definition: scaffolding.h:121
@ HELP_OPEN_INFORMATION
Definition: scaffolding.h:85
@ HISTORY_SHOW_GLOBAL
Definition: scaffolding.h:92
@ TOOLBAR_EDIT
Definition: scaffolding.h:173
@ HISTORY_EXPORT
Definition: scaffolding.h:128
@ BROWSER_WINDOW_DEFAULT
Definition: scaffolding.h:148
@ BROWSER_SAVE_URL_URI
Definition: scaffolding.h:124
@ BROWSER_EXPORT_DRAW
Definition: scaffolding.h:122
@ BROWSER_VIEW_SOURCE
Definition: scaffolding.h:107
@ TREE_COLLAPSE_ALL
Definition: scaffolding.h:159
@ COOKIES_DELETE
Definition: scaffolding.h:100
@ BROWSER_SAVE_URL_URL
Definition: scaffolding.h:125
@ BROWSER_EXPORT_TEXT
Definition: scaffolding.h:123
@ TREE_COLLAPSE_LINKS
Definition: scaffolding.h:161
@ HELP_OPEN_CONTENTS
Definition: scaffolding.h:83
@ TREE_NEW_LINK
Definition: scaffolding.h:155
@ TOOLBAR_THROBBER
Definition: scaffolding.h:172
@ HELP_LAUNCH_INTERACTIVE
Definition: scaffolding.h:88
BBitmap * nsbeos_bitmap_get_primary(struct bitmap *bitmap)
The primary image associated with this bitmap object.
Definition: bitmap.cpp:308
nserror browser_window_history_forward(struct browser_window *bw, bool new_window)
Go forward in the history.
bool browser_window_history_forward_available(struct browser_window *bw)
Check whether it is pssible to go forwards in the history.
bool browser_window_history_back_available(struct browser_window *bw)
Check whether it is pssible to go back in the history.
nserror browser_window_history_back(struct browser_window *bw, bool new_window)
Go back in the history.
Interface to browser history operations.
Browser window creation and manipulation interface.
nserror browser_window_get_features(struct browser_window *bw, int x, int y, struct browser_window_features *data)
Get access to any page features at the given coordinates.
nserror browser_window_navigate(struct browser_window *bw, struct nsurl *url, struct nsurl *referrer, enum browser_window_nav_flags flags, char *post_urlenc, struct fetch_multipart_data *post_multipart, struct hlcache_handle *parent)
Start fetching a page in a browser window.
bool browser_window_has_content(struct browser_window *bw)
Find out if a browser window is currently showing a content.
nserror browser_window_reload(struct browser_window *bw, bool all)
Reload the page in a browser window.
nserror browser_window_create(enum browser_window_create_flags flags, struct nsurl *url, struct nsurl *referrer, struct browser_window *existing, struct browser_window **bw)
Create and open a new root browser window with the given page.
void browser_window_stop(struct browser_window *bw)
Stop all fetching activity in a browser window.
struct hlcache_handle * browser_window_get_content(struct browser_window *bw)
Get a cache handle for the content within a browser window.
browser_window_create_flags
flags to browser_window_create
@ BW_CREATE_HISTORY
this will form a new history node (don't set for back/reload/etc)
@ BW_CREATE_TAB
New gui_window to be tab in same window as "existing" gui_window.
@ BW_CREATE_CLONE
New gui_window to be clone of "existing" gui_window.
browser_window_nav_flags
flags to browser_window_navigate
@ BW_NAVIGATE_HISTORY
this will form a new history node (don't set for back/reload/etc)
@ BW_NAVIGATE_UNVERIFIABLE
Transation not caused by user interaction (e.g.
void Draw(BRect updateRect)
BBitmap * fDisabledBitmap
void SetBitmap(const char *attrName)
BBitmap * fBitmap
BBitmapButton(BRect rect, const char *name, const char *label, BMessage *message)
status_t AddWindow(const BWindow *window)
virtual status_t Archive(BMessage *archive, bool deep=true) const
virtual void MessageReceived(BMessage *message)
static BArchivable * Instantiate(BMessage *archive)
struct beos_scaffolding * fScaffolding
Definition: scaffolding.h:53
NSBaseView(BRect frame)
void SetScaffolding(struct beos_scaffolding *scaf)
virtual ~NSBaseView()
virtual void AllAttached(void)
virtual bool QuitRequested(void)
virtual void DispatchMessage(BMessage *message, BHandler *handler)
NSBrowserWindow(BRect frame, struct beos_scaffolding *scaf)
static BWindow * activeWindow
Definition: scaffolding.h:68
struct beos_scaffolding * fScaffolding
Definition: scaffolding.h:70
void WindowActivated(bool active)
virtual ~NSBrowserWindow()
virtual void MessageReceived(BMessage *message)
virtual void AttachedToWindow()
virtual void FrameResized(float newWidth, float newHeight)
void SetBitmap(const BBitmap *bitmap)
virtual void Draw(BRect updateRect)
const BBitmap * fIconBitmap
virtual ~NSIconTextControl()
NSIconTextControl(BRect frame, const char *name, const char *label, const char *initialText, BMessage *message, uint32 resizeMode=B_FOLLOW_LEFT|B_FOLLOW_TOP, uint32 flags=B_WILL_DRAW|B_NAVIGABLE|B_DRAW_ON_CHILDREN)
virtual void DrawAfterChildren(BRect updateRect)
void SetBitmap(const BBitmap *bitmap)
virtual void MouseUp(BPoint where)
virtual void MouseDown(BPoint where)
virtual void MouseMoved(BPoint where, uint32 code, const BMessage *dragMessage)
NSResizeKnob(BRect frame, BView *target)
BView * fTarget
const BBitmap * fBitmap
virtual void Draw(BRect updateRect)
virtual ~NSResizeKnob()
NSThrobber(BRect frame)
const BBitmap * fBitmap
virtual ~NSThrobber()
virtual void MessageReceived(BMessage *message)
virtual void Draw(BRect updateRect)
void SetBitmap(const BBitmap *bitmap)
Declaration of content enumerations.
void nsbeos_cookies_init(void)
Creates the Cookie Manager.
Definition: cookies.cpp:410
Browseing window text search interface.
nserror search_web_omni(const char *term, enum search_web_omni_flags flags, struct nsurl **url_out)
Generate a nsurl from a search term.
Definition: searchweb.c:318
nserror search_web_init(const char *provider_fname)
Initialise the web search operations.
Definition: searchweb.c:531
nserror search_web_finalise(void)
Finalise the web search operations freeing all resources.
Definition: searchweb.c:588
const char *const netsurf_version
User friendly version string.
Definition: version.c:23
Version information interface.
nserror
Enumeration of error codes.
Definition: errors.h:29
@ NSERROR_OK
No error.
Definition: errors.h:30
Form handling public interface.
Target independent plotting (BeOS interface).
void nsbeos_gui_view_source(struct hlcache_handle *content)
Send the source of a content to a text editor.
Definition: gui.cpp:898
image_id nsbeos_find_app_path(char *path)
Definition: gui.cpp:246
bool nsbeos_done
Definition: gui.cpp:90
void nsbeos_gui_poll(void)
Definition: gui.cpp:813
int gui_init_replicant(int argc, char **argv)
called when replicated from NSBaseView::Instantiate()
Definition: gui.cpp:1173
void nsbeos_pipe_message_top(BMessage *message, BWindow *_this, struct beos_scaffolding *scaffold)
Definition: gui.cpp:799
char * find_resource(char *buf, const char *filename, const char *def)
Locate a shared resource file by searching known places in order.
Definition: gui.cpp:277
bool replicated
if we are running as a replicant
Definition: gui.cpp:92
nserror beos_warn_user(const char *warning, const char *detail)
Display a warning for a serious problem (eg memory exhaustion).
Definition: gui.cpp:116
void nsbeos_update_system_ui_colors(void)
Definition: gui.cpp:571
#define B_PANEL_TEXT_COLOR
Definition: gui.cpp:403
#define NO_ACTION
Definition: idna.c:695
Interface to platform-specific clipboard operations.
Public content interface.
struct bitmap * content_get_bitmap(struct hlcache_handle *h)
Retrieve the bitmap contained in an image content.
Definition: content.c:1256
void content_invalidate_reuse_data(struct hlcache_handle *h)
Invalidate content reuse data.
Definition: content.c:1221
Target independent plotting interface.
Netsurf additional integer type formatting macros.
Interface to key press operations.
@ NS_KEY_SELECT_ALL
Definition: keypress.h:32
@ NS_KEY_PASTE
Definition: keypress.h:43
@ NS_KEY_COPY_SELECTION
Definition: keypress.h:33
@ NS_KEY_CUT_SELECTION
Definition: keypress.h:44
bool browser_window_key_press(struct browser_window *bw, uint32_t key)
Handle key presses in a browser window.
Definition: textinput.c:107
#define NSLOG(catname, level, logmsg, args...)
Definition: log.h:116
const char * messages_get_errorcode(nserror code)
lookup of a message by errorcode from the standard Messages hash.
Definition: messages.c:263
const char * messages_get(const char *key)
Fast lookup of a message by key from the standard Messages hash.
Definition: messages.c:256
Localised message support (interface).
NetSurf core interface registration, construction and destruction.
void netsurf_exit(void)
Finalise NetSurf core.
Definition: netsurf.c:232
NetSurf URL handling (interface).
nserror nsurl_create(const char *const url_s, nsurl **url)
Create a NetSurf URL object from a URL string.
void nsurl_unref(nsurl *url)
Drop a reference to a NetSurf URL object.
const char * nsurl_access(const nsurl *url)
Access a NetSurf URL object as a string.
struct nsurl nsurl
NetSurf URL object.
Definition: nsurl.h:31
uint8_t uint8
Definition: os3support.h:180
int32_t int32
Definition: os3support.h:183
uint32_t uint32
Definition: os3support.h:184
static void nsbeos_scaffolding_update_colors(nsbeos_scaffolding *g)
void nsbeos_scaffolding_popup_menu(nsbeos_scaffolding *scaffold, struct browser_window *bw, BPoint where, BPoint screenWhere)
BResources * gAppResources
Definition: fetch_rsrc.cpp:71
nsbeos_scaffolding * nsbeos_new_scaffolding(struct gui_window *toplevel)
nserror gui_window_set_url(struct gui_window *gw, nsurl *url)
void gui_window_start_throbber(struct gui_window *_g)
#define TOOLBAR_HEIGHT
Definition: scaffolding.cpp:89
static void nsbeos_throb(void *)
NSBaseView * nsbeos_get_baseview_for_scaffolding(nsbeos_scaffolding *scaffold)
void nsbeos_scaffolding_destroy(nsbeos_scaffolding *scaffold)
int main(int argc, char **argv)
Normal entry point from OS.
Definition: gui.c:6539
void gui_window_set_status(struct gui_window *_g, const char *text)
static sem_id replicant_done_sem
static void nsbeos_window_destroy_event(NSBrowserWindow *window, nsbeos_scaffolding *g, BMessage *event)
static BMenuItem * make_menu_item(const char *name, BMessage *message, bool enabled=false)
NSBrowserWindow * nsbeos_find_last_window(void)
static int32 nsbeos_replicant_main_thread(void *_arg)
void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *message)
#define ICON_WIDTH
void gui_window_set_icon(struct gui_window *_g, hlcache_handle *icon)
add retrieved favicon to the gui
NSBrowserWindow * nsbeos_get_bwindow_for_scaffolding(nsbeos_scaffolding *scaffold)
static int open_windows
current number of open browsers
static thread_id replicant_thread
static void nsbeos_window_update_back_forward(struct beos_scaffolding *)
static NSBaseView * replicant_view
if not NULL, the replicant View we are running NetSurf for
static void recursively_set_menu_items_target(BMenu *menu, BHandler *handler)
void gui_window_stop_throbber(struct gui_window *_g)
void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
#define DRAGGER_WIDTH
Definition: scaffolding.cpp:90
void gui_window_set_title(struct gui_window *_g, const char *title)
nserror beos_schedule(int t, void(*callback)(void *p), void *p)
Definition: schedule.cpp:84
core web search facilities interface.
@ SEARCH_WEB_OMNI_SEARCHONLY
The search does not attempt to interpret the url as a url before using it as a search term.
Definition: searchweb.h:55
Interface to utility string handling.
struct beos_scaffolding * g
BPopUpMenu * popup_menu
BMenuBar * menu_bar
BControl * forward_button
BControl * reload_button
struct beos_history_window * history_window
NSBaseView * top_view
BStringView * status_bar
BControl * back_button
BControl * home_button
struct gui_window * top_level
NSIconTextControl * url_bar
NSThrobber * throbber
struct hlcache_handle * current_menu_object
Object under menu, or 0 if no object.
BScrollView * scroll_view
BTextControl * search_bar
BControl * stop_button
NSBrowserWindow * window
Definition: scaffolding.cpp:99
RISC OS wimp toolkit bitmap.
Definition: bitmap.c:68
Page features at a specific spatial location.
struct hlcache_handle * object
Object at position or NULL.
Browser window data.
int x
Window dimensions.
struct browser_window * bw
first entry in window list
Definition: gui.c:298
High-level cache handle.
Definition: hlcache.c:66
const char * widget
int nframes
Number of frames in the throbber.
Definition: throbber.h:26
BBitmap ** framedata
Definition: throbber.h:27
Rectangle coordinates.
Definition: types.h:40
char app[B_PATH_NAME_LENGTH]
struct rect rect
Rectangle coordinates.
Option reading and saving interface.
#define nsoption_charp(OPTION)
Get the value of a string option.
Definition: nsoption.h:335
#define nsoption_int(OPTION)
Get the value of an integer option.
Definition: nsoption.h:317
Interface to a number of general purpose functionality.
#define fallthrough
switch fall through
Definition: utils.h:119
nsbeos_scaffolding * nsbeos_get_scaffold(struct gui_window *g)
Get containing scaffold of a beos gui window.
Definition: window.cpp:328
void nsbeos_window_destroy_browser(struct gui_window *g)
Definition: window.cpp:916
struct browser_window * nsbeos_get_browser_for_gui(struct gui_window *g)
Definition: window.cpp:333
static nserror path(const struct redraw_context *ctx, const plot_style_t *pstyle, const float *p, unsigned int n, const float transform[6])
Plots a path.
Definition: plot.c:821
static nserror bitmap(const struct redraw_context *ctx, struct bitmap *bitmap, int x, int y, int width, int height, colour bg, bitmap_flags_t flags)
Plot a bitmap.
Definition: plot.c:857
static nserror text(const struct redraw_context *ctx, const struct plot_font_style *fstyle, int x, int y, const char *text, size_t length)
Text plotting.
Definition: plot.c:978