NetSurf
window.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2008 François Revol <mmu_man@users.sourceforge.net>
3 * Copyright 2006 Daniel Silverstone <dsilvers@digital-scurf.org>
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 <stdlib.h>
23#include <assert.h>
24#include <AppDefs.h>
25#include <BeBuild.h>
26#include <Clipboard.h>
27#include <Cursor.h>
28#include <InterfaceDefs.h>
29#include <Message.h>
30#include <ScrollBar.h>
31#include <String.h>
32#include <String.h>
33#include <TextView.h>
34#include <View.h>
35#include <Window.h>
36
37extern "C" {
38#include "utils/nsoption.h"
39#include "utils/log.h"
40#include "utils/utf8.h"
41#include "utils/utils.h"
42#include "utils/nsurl.h"
43#include "netsurf/inttypes.h"
46#include "netsurf/mouse.h"
47#include "netsurf/plotters.h"
48#include "netsurf/window.h"
49#include "netsurf/clipboard.h"
50#include "netsurf/url_db.h"
51#include "netsurf/keypress.h"
52}
53
54#include "beos/about.h"
55#include "beos/window.h"
56#include "beos/font.h"
57#include "beos/gui.h"
58#include "beos/scaffolding.h"
59#include "beos/plotters.h"
60
61
63
64struct gui_window {
65 /* All gui_window objects have an ultimate scaffold */
68 /* A gui_window is the rendering of a browser_window */
69 struct browser_window *bw;
70
71 struct {
74 int state; /* browser_mouse_state */
76
77 /* These are the storage for the rendering */
81
83
84 // some cached events to speed up things
85 // those are the last queued event of their kind,
86 // we can safely drop others and avoid wasting cpu.
87 // number of pending resizes
89 // accumulated rects of pending redraws
90 //volatile BMessage *lastRedraw;
91 // UNUSED YET
93
94 /* Keep gui_windows in a list for cleanup later */
95 struct gui_window *next, *prev;
96};
97
98
99
100static const rgb_color kWhiteColor = {255, 255, 255, 255};
101
102static struct gui_window *window_list = 0; /**< first entry in win list*/
103
104static BString current_selection;
106
107/* Methods which apply only to a gui_window */
108static void nsbeos_window_expose_event(BView *view, gui_window *g, BMessage *message);
109static void nsbeos_window_keypress_event(BView *view, gui_window *g, BMessage *event);
110static void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event);
111static void nsbeos_window_moved_event(BView *view, gui_window *g, BMessage *event);
112/* Other useful bits */
113static void nsbeos_redraw_caret(struct gui_window *g);
114
115
116// #pragma mark - class NSBrowserFrameView
117
118
120 : BView(frame, "NSBrowserFrameView", B_FOLLOW_ALL_SIDES,
121 B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS ),
122 fGuiWindow(gui)
123{
124}
125
126
128{
129}
130
131
132void
134{
135 switch (message->what) {
136 case B_SIMPLE_DATA:
137 case B_ARGV_RECEIVED:
138 case B_REFS_RECEIVED:
139 case B_COPY:
140 case B_CUT:
141 case B_PASTE:
142 case B_SELECT_ALL:
143 //case B_MOUSE_WHEEL_CHANGED:
145 // NetPositive messages
146 case B_NETPOSITIVE_OPEN_URL:
147 case B_NETPOSITIVE_BACK:
148 case B_NETPOSITIVE_FORWARD:
149 case B_NETPOSITIVE_HOME:
150 case B_NETPOSITIVE_RELOAD:
151 case B_NETPOSITIVE_STOP:
152 case B_NETPOSITIVE_DOWN:
153 case B_NETPOSITIVE_UP:
154 // messages for top-level
155 case 'back':
156 case 'forw':
157 case 'stop':
158 case 'relo':
159 case 'home':
160 case 'urlc':
161 case 'urle':
162 case 'sear':
163 case 'menu':
164 case NO_ACTION:
166 case HELP_OPEN_GUIDE:
168 case HELP_OPEN_ABOUT:
172 case HOTLIST_ADD_URL:
173 case HOTLIST_SHOW:
174 case COOKIES_SHOW:
175 case COOKIES_DELETE:
176 case BROWSER_PAGE:
178 case BROWSER_PRINT:
181 case BROWSER_OBJECT:
189 case BROWSER_SAVE:
196 case HOTLIST_EXPORT:
197 case HISTORY_EXPORT:
217 case TREE_NEW_FOLDER:
218 case TREE_NEW_LINK:
219 case TREE_EXPAND_ALL:
225 case TREE_SELECTION:
229 case TREE_SELECT_ALL:
231 case TOOLBAR_BUTTONS:
233 case TOOLBAR_THROBBER:
234 case TOOLBAR_EDIT:
235 case CHOICES_SHOW:
236 case APPLICATION_QUIT:
237 Window()->DetachCurrentMessage();
239 break;
240 default:
241 //message->PrintToStream();
242 BView::MessageReceived(message);
243 }
244}
245
246
247void
249{
250 BMessage *message = NULL;
251 //message = Window()->DetachCurrentMessage();
252 // might be called directly...
253 if (message == NULL)
254 message = new BMessage(_UPDATE_);
255 message->AddRect("rect", updateRect);
256 nsbeos_pipe_message(message, this, fGuiWindow);
257}
258
259
260
261void
262NSBrowserFrameView::FrameResized(float new_width, float new_height)
263{
264 BMessage *message = Window()->DetachCurrentMessage();
265 // discard any other pending resize,
266 // so we don't end up processing them all, the last one matters.
267 atomic_add(&fGuiWindow->pending_resizes, 1);
268 nsbeos_pipe_message(message, this, fGuiWindow);
269 BView::FrameResized(new_width, new_height);
270}
271
272
273void
274NSBrowserFrameView::KeyDown(const char *bytes, int32 numBytes)
275{
276 BMessage *message = Window()->DetachCurrentMessage();
277 nsbeos_pipe_message(message, this, fGuiWindow);
278}
279
280
281void
283{
284 BMessage *message = Window()->DetachCurrentMessage();
285 BPoint screenWhere;
286 if (message->FindPoint("screen_where", &screenWhere) < B_OK) {
287 screenWhere = ConvertToScreen(where);
288 message->AddPoint("screen_where", screenWhere);
289 }
290 nsbeos_pipe_message(message, this, fGuiWindow);
291}
292
293
294void
296{
297 //BMessage *message = Window()->DetachCurrentMessage();
298 //nsbeos_pipe_message(message, this, fGuiWindow);
299 BMessage *message = Window()->DetachCurrentMessage();
300 BPoint screenWhere;
301 if (message->FindPoint("screen_where", &screenWhere) < B_OK) {
302 screenWhere = ConvertToScreen(where);
303 message->AddPoint("screen_where", screenWhere);
304 }
305 nsbeos_pipe_message(message, this, fGuiWindow);
306}
307
308
309void
310NSBrowserFrameView::MouseMoved(BPoint where, uint32 transit, const BMessage *msg)
311{
312 if (transit != B_INSIDE_VIEW) {
313 BView::MouseMoved(where, transit, msg);
314 return;
315 }
316 BMessage *message = Window()->DetachCurrentMessage();
317 nsbeos_pipe_message(message, this, fGuiWindow);
318}
319
320
321// #pragma mark - gui_window
322
324{
325 return g->bw;
326}
327
329{
330 return g->scaffold;
331}
332
334{
335 return g->bw;
336}
337
338/* Create a gui_window */
340 struct gui_window *existing,
342{
343 struct gui_window *g; /**< what we're creating to return */
344
345 g = (struct gui_window *)malloc(sizeof(*g));
346 if (!g) {
347 beos_warn_user("NoMemory", 0);
348 return 0;
349 }
350
351 NSLOG(netsurf, INFO, "Creating gui window %p for browser window %p",
352 g, bw);
353
354 g->bw = bw;
355 g->mouse.state = 0;
357
358 g->careth = 0;
359 g->pending_resizes = 0;
360
361 /* Attach ourselves to the list (push_top) */
362 if (window_list)
363 window_list->prev = g;
364 g->next = window_list;
365 g->prev = NULL;
366 window_list = g;
367
368 /* Now construct and attach a scaffold */
370 if (!g->scaffold)
371 return NULL;
372
373 /* Construct our primary elements */
374 BRect frame(0,0,-1,-1); // will be resized later
375 g->view = new NSBrowserFrameView(frame, g);
376 /* set the default background colour of the drawing area to white. */
377 //g->view->SetViewColor(kWhiteColor);
378 /* NOOO! Since we defer drawing (DetachCurrent()), the white flickers,
379 * besides sometimes text was drawn twice, making it ugly.
380 * Instead we set to transparent here, and implement plot_clg() to
381 * do it just before the rest. This almost removes the flicker. */
382 g->view->SetViewColor(B_TRANSPARENT_COLOR);
383 g->view->SetLowColor(kWhiteColor);
384
385#ifdef B_BEOS_VERSION_DANO
386 /* enable double-buffering on the content view */
387/*
388 XXX: doesn't really work
389 g->view->SetDoubleBuffering(B_UPDATE_INVALIDATED
390 | B_UPDATE_SCROLLED
391 //| B_UPDATE_RESIZED
392 | B_UPDATE_EXPOSED);
393*/
394#endif
395
396
397 g->toplevel = true;
398
399 /* Attach our viewport into the scaffold */
401
402
403 return g;
404}
405
406/* exported interface documented in beos/window.h */
407void nsbeos_dispatch_event(BMessage *message)
408{
409 struct gui_window *gui = NULL;
410 NSBrowserFrameView *view = NULL;
411 struct beos_scaffolding *scaffold = NULL;
412 NSBrowserWindow *window = NULL;
413
414 //message->PrintToStream();
415 if (message->FindPointer("View", (void **)&view) < B_OK)
416 view = NULL;
417 if (message->FindPointer("gui_window", (void **)&gui) < B_OK)
418 gui = NULL;
419 if (message->FindPointer("Window", (void **)&window) < B_OK)
420 window = NULL;
421 if (message->FindPointer("scaffolding", (void **)&scaffold) < B_OK)
422 scaffold = NULL;
423
424 struct gui_window *z;
425 for (z = window_list; z && gui && z != gui; z = z->next)
426 continue;
427
428 struct gui_window *y;
429 for (y = window_list; y && scaffold && y->scaffold != scaffold; y = y->next)
430 continue;
431
432 if (gui && gui != z) {
433 NSLOG(netsurf, INFO,
434 "discarding event for destroyed gui_window");
435 delete message;
436 return;
437 }
438 if (scaffold && (!y || scaffold != y->scaffold)) {
439 NSLOG(netsurf, INFO,
440 "discarding event for destroyed scaffolding");
441 delete message;
442 return;
443 }
444
445 // messages for top-level
446 if (scaffold) {
447 NSLOG(netsurf, INFO, "dispatching to top-level");
449 delete message;
450 return;
451 }
452
453 NSLOG(netsurf, DEEPDEBUG, "processing message");
454 switch (message->what) {
455 case B_QUIT_REQUESTED:
456 // from the BApplication
457 nsbeos_done = true;
458 break;
459 case B_ABOUT_REQUESTED:
460 {
461 if (gui == NULL)
464 break;
465 }
466 case _UPDATE_:
467 if (gui && view)
469 break;
470 case B_MOUSE_MOVED:
471 {
472 if (gui == NULL)
473 break;
474
475 BPoint where;
476 int32 mods;
477 // where refers to Window coords !?
478 // check be:view_where first
479 if (message->FindPoint("be:view_where", &where) < B_OK) {
480 if (message->FindPoint("where", &where) < B_OK)
481 break;
482 }
483 if (message->FindInt32("modifiers", &mods) < B_OK)
484 mods = 0;
485
486
488 /* Start button 1 drag */
491 /* Replace PRESS with HOLDING and declare drag in progress */
495 } else if (gui->mouse.state & BROWSER_MOUSE_PRESS_2) {
496 /* Start button 2 drag */
499 /* Replace PRESS with HOLDING and declare drag in progress */
503 }
504
505 bool shift = mods & B_SHIFT_KEY;
506 bool ctrl = mods & B_CONTROL_KEY;
507
508 /* Handle modifiers being removed */
509 if (gui->mouse.state & BROWSER_MOUSE_MOD_1 && !shift)
511 if (gui->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl)
513
516 (int)(where.x),
517 (int)(where.y));
518
519 gui->last_x = (int)where.x;
520 gui->last_y = (int)where.y;
521 break;
522 }
523 case B_MOUSE_DOWN:
524 {
525 if (gui == NULL)
526 break;
527
528 BPoint where;
529 int32 buttons;
530 int32 mods;
531 BPoint screenWhere;
532 if (message->FindPoint("be:view_where", &where) < B_OK) {
533 if (message->FindPoint("where", &where) < B_OK)
534 break;
535 }
536 if (message->FindInt32("buttons", &buttons) < B_OK)
537 break;
538 if (message->FindPoint("screen_where", &screenWhere) < B_OK)
539 break;
540 if (message->FindInt32("modifiers", &mods) < B_OK)
541 mods = 0;
542
543 if (buttons & B_SECONDARY_MOUSE_BUTTON) {
544 /* 2 == right button on BeOS */
545 nsbeos_scaffolding_popup_menu(gui->scaffold, gui->bw, where, screenWhere);
546 break;
547 }
548
550
551 if (buttons & B_TERTIARY_MOUSE_BUTTON) /* 3 == middle button on BeOS */
553
554 if (mods & B_SHIFT_KEY)
556 if (mods & B_CONTROL_KEY)
558
559 gui->mouse.pressed_x = where.x;
560 gui->mouse.pressed_y = where.y;
561
562 // make sure the view is in focus
563 if (view && view->LockLooper()) {
564 if (!view->IsFocus())
565 view->MakeFocus();
566 view->UnlockLooper();
567 }
568
572
573 break;
574 }
575 case B_MOUSE_UP:
576 {
577 if (gui == NULL)
578 break;
579
580 BPoint where;
581 int32 buttons;
582 int32 mods;
583 BPoint screenWhere;
584 if (message->FindPoint("be:view_where", &where) < B_OK) {
585 if (message->FindPoint("where", &where) < B_OK)
586 break;
587 }
588 if (message->FindInt32("buttons", &buttons) < B_OK)
589 break;
590 if (message->FindPoint("screen_where", &screenWhere) < B_OK)
591 break;
592 if (message->FindInt32("modifiers", &mods) < B_OK)
593 mods = 0;
594
595 /* If the mouse state is PRESS then we are waiting for a release to emit
596 * a click event, otherwise just reset the state to nothing*/
601
602 bool shift = mods & B_SHIFT_KEY;
603 bool ctrl = mods & B_CONTROL_KEY;
604
605 /* Handle modifiers being removed */
606 if (gui->mouse.state & BROWSER_MOUSE_MOD_1 && !shift)
608 if (gui->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl)
610
611 /*
612 if (view && view->LockLooper()) {
613 view->MakeFocus();
614 view->UnlockLooper();
615 }
616 */
617
621 where.x,
622 where.y);
623 else
625 where.x, where.y);
626
627 gui->mouse.state = 0;
628
629 break;
630 }
631 case B_KEY_DOWN:
632 if (gui && view)
634 break;
635 case B_VIEW_RESIZED:
636 if (gui && view)
638 break;
639 case B_VIEW_MOVED:
640 if (gui && view)
642 break;
643 case B_MOUSE_WHEEL_CHANGED:
644 break;
647 break;
648 case 'nsLO': // login
649 {
650 nsurl* url;
651 BString realm;
652 BString username;
653 BString password;
654 void* cbpw;
655 nserror (*cb)(const char *username,
656 const char *password,
657 void *pw);
658
659 if (message->FindPointer("URL", (void**)&url) < B_OK)
660 break;
661 if (message->FindString("Realm", &realm) < B_OK)
662 break;
663 if (message->FindString("User", &username) < B_OK)
664 break;
665 if (message->FindString("Pass", &password) < B_OK)
666 break;
667 if (message->FindPointer("callback", (void**)&cb) < B_OK)
668 break;
669 if (message->FindPointer("callback_pw", (void**)&cbpw) < B_OK)
670 break;
671 cb(username.String(), password.String(), cbpw);
672 break;
673 }
674 default:
675 break;
676 }
677 delete message;
678}
679
680void nsbeos_window_expose_event(BView *view, gui_window *g, BMessage *message)
681{
682 BRect updateRect;
683 struct rect clip;
684
685 struct redraw_context ctx = { true, true, &nsbeos_plotters, NULL};
686
687 assert(g);
688 assert(g->bw);
689
690 struct gui_window *z;
691 for (z = window_list; z && z != g; z = z->next)
692 continue;
693 assert(z);
694 assert(g->view == view);
695
696 // we'll be resizing = reflowing = redrawing everything anyway...
697 if (g->pending_resizes > 1)
698 return;
699
700 if (message->FindRect("rect", &updateRect) < B_OK)
701 return;
702
703 if (browser_window_has_content(g->bw) == false)
704 return;
705
706 if (!view->LockLooper())
707 return;
709
710 if (view->Window())
711 view->Window()->BeginViewTransaction();
712
713 clip.x0 = (int)updateRect.left;
714 clip.y0 = (int)updateRect.top;
715 clip.x1 = (int)updateRect.right + 1;
716 clip.y1 = (int)updateRect.bottom + 1;
717
718 browser_window_redraw(g->bw, 0, 0, &clip, &ctx);
719
720 if (g->careth != 0)
722
723 if (view->Window())
724 view->Window()->EndViewTransaction();
725
726 // reset clipping just in case
727 view->ConstrainClippingRegion(NULL);
729 view->UnlockLooper();
730}
731
732void nsbeos_window_keypress_event(BView *view, gui_window *g, BMessage *event)
733{
734 const char *bytes;
735 char buff[6];
736 int numbytes = 0;
737 uint32 mods;
738 uint32 key;
739 uint32 raw_char;
740 uint32_t nskey;
741 int i;
742
743 if (event->FindInt32("modifiers", (int32 *)&mods) < B_OK)
744 mods = modifiers();
745 if (event->FindInt32("key", (int32 *)&key) < B_OK)
746 key = 0;
747 if (event->FindInt32("raw_char", (int32 *)&raw_char) < B_OK)
748 raw_char = 0;
749 /* check for byte[] first, because C-space gives bytes="" (and byte[0] = '\0') */
750 for (i = 0; i < 5; i++) {
751 buff[i] = '\0';
752 if (event->FindInt8("byte", i, (int8 *)&buff[i]) < B_OK)
753 break;
754 }
755
756 if (i) {
757 bytes = buff;
758 numbytes = i;
759 } else if (event->FindString("bytes", &bytes) < B_OK)
760 bytes = "";
761
762 if (!numbytes)
763 numbytes = strlen(bytes);
764
765 NSLOG(netsurf, INFO,
766 "mods 0x%08" PRIx32 " key %" PRIu32 " raw %" PRIu32 " byte[0] %d",
767 mods, key, raw_char, buff[0]);
768
769 char byte;
770 if (numbytes == 1) {
771 byte = bytes[0];
772 if (mods & B_CONTROL_KEY)
773 byte = (char)raw_char;
774 if (byte >= '!' && byte <= '~')
775 nskey = (uint32_t)byte;
776 else {
777 switch (byte) {
778 case B_BACKSPACE: nskey = NS_KEY_DELETE_LEFT; break;
779 case B_TAB: nskey = NS_KEY_TAB; break;
780 /*case XK_Linefeed: return QKlinefeed;*/
781 case B_ENTER: nskey = (uint32_t)10; break;
782 case B_ESCAPE: nskey = (uint32_t)'\033'; break;
783 case B_SPACE: nskey = (uint32_t)' '; break;
784 case B_DELETE: nskey = NS_KEY_DELETE_RIGHT; break;
785 /*
786 case B_INSERT: nskey = NS_KEYSYM("insert"); break;
787 */
788 case B_HOME: nskey = NS_KEY_LINE_START; break; // XXX ?
789 case B_END: nskey = NS_KEY_LINE_END; break; // XXX ?
790 case B_PAGE_UP: nskey = NS_KEY_PAGE_UP; break;
791 case B_PAGE_DOWN: nskey = NS_KEY_PAGE_DOWN; break;
792 case B_LEFT_ARROW: nskey = NS_KEY_LEFT; break;
793 case B_RIGHT_ARROW: nskey = NS_KEY_RIGHT; break;
794 case B_UP_ARROW: nskey = NS_KEY_UP; break;
795 case B_DOWN_ARROW: nskey = NS_KEY_DOWN; break;
796 /*
797 case B_FUNCTION_KEY:
798 switch (scancode) {
799 case B_F1_KEY: nskey = KEYSYM("f1"); break;
800 case B_F2_KEY: nskey = KEYSYM("f2"); break;
801 case B_F3_KEY: nskey = KEYSYM("f3"); break;
802 case B_F4_KEY: nskey = KEYSYM("f4"); break;
803 case B_F5_KEY: nskey = KEYSYM("f5"); break;
804 case B_F6_KEY: nskey = KEYSYM("f6"); break;
805 case B_F7_KEY: nskey = KEYSYM("f7"); break;
806 case B_F8_KEY: nskey = KEYSYM("f8"); break;
807 case B_F9_KEY: nskey = KEYSYM("f9"); break;
808 case B_F10_KEY: nskey = KEYSYM("f10"); break;
809 case B_F11_KEY: nskey = KEYSYM("f11"); break;
810 case B_F12_KEY: nskey = KEYSYM("f12"); break;
811 case B_PRINT_KEY: nskey = KEYSYM("print"); break;
812 case B_SCROLL_KEY: nskey = KEYSYM("scroll-lock"); break;
813 case B_PAUSE_KEY: nskey = KEYSYM("pause"); break;
814 }
815 */
816 case 0:
817 nskey = (uint32_t)0;
818 break;
819 default:
820 nskey = (uint32_t)raw_char;
821 /*if (simple_p)
822 nskey = (uint32_t)0;*/
823 break;
824 }
825 }
826 } else {
827 nskey = utf8_to_ucs4(bytes, numbytes);
828 }
829
830 if(browser_window_key_press(g->bw, nskey))
831 return;
832
833 // Remaining events are for scrolling the page around
834 float hdelta = 0.0f, vdelta = 0.0f;
835 g->view->LockLooper();
836 BRect size = g->view->Bounds();
837 switch (byte) {
838 case B_HOME:
839 g->view->ScrollTo(0.0f, 0.0f);
840 break;
841 case B_END:
842 {
843 // TODO
844 break;
845 }
846 case B_PAGE_UP:
847 vdelta = -size.Height();
848 break;
849 case B_PAGE_DOWN:
850 vdelta = size.Height();
851 break;
852 case B_LEFT_ARROW:
853 hdelta = -10;
854 break;
855 case B_RIGHT_ARROW:
856 hdelta = 10;
857 break;
858 case B_UP_ARROW:
859 vdelta = -10;
860 break;
861 case B_DOWN_ARROW:
862 vdelta = 10;
863 break;
864 }
865
866 g->view->ScrollBy(hdelta, vdelta);
867 g->view->UnlockLooper();
868}
869
870
871void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event)
872{
873 //CALLED();
874 int32 width;
876
877 // drop this event if we have at least 2 resize pending
878 if (atomic_add(&g->pending_resizes, -1) > 1)
879 return;
880
881 if (event->FindInt32("width", &width) < B_OK)
882 width = -1;
883 if (event->FindInt32("height", &height) < B_OK)
884 height = -1;
885 width++;
886 height++;
887
889
890 return;
891}
892
893
894void nsbeos_window_moved_event(BView *view, gui_window *g, BMessage *event)
895{
896 //CALLED();
897
898#warning XXX: Invalidate ?
899 if (!view || !view->LockLooper())
900 return;
901 //view->Invalidate(view->Bounds());
902 view->UnlockLooper();
903
904 return;
905}
906
907
909{
910 for (struct gui_window *g = window_list; g; g = g->next) {
912 }
913}
914
915
917{
919}
920
921static void gui_window_destroy(struct gui_window *g)
922{
923 if (!g)
924 return;
925
926 if (g->prev)
927 g->prev->next = g->next;
928 else
929 window_list = g->next;
930
931 if (g->next)
932 g->next->prev = g->prev;
933
934
935 NSLOG(netsurf, INFO, "Destroying gui_window %p", g);
936 assert(g != NULL);
937 assert(g->bw != NULL);
938 NSLOG(netsurf, INFO, " Scaffolding: %p", g->scaffold);
939
940 if (g->view == NULL)
941 return;
942 if (!g->view->LockLooper())
943 return;
944
945 BLooper *looper = g->view->Looper();
946 /* If we're a top-level gui_window, destroy our scaffold */
947 if (g->toplevel) {
948 g->view->RemoveSelf();
949 delete g->view;
951 } else {
952 g->view->RemoveSelf();
953 delete g->view;
954 looper->Unlock();
955 }
956 //XXX
957 //looper->Unlock();
958
959
960 free(g);
961
962}
963
965{
966 if (g->careth == 0)
967 return;
968
969 if (g->view == NULL)
970 return;
971 if (!g->view->LockLooper())
972 return;
973
975
976 g->view->Invalidate(BRect(g->caretx, g->carety,
977 g->caretx, g->carety + g->careth));
978
980 g->view->UnlockLooper();
981}
982
983/**
984 * Invalidate an area of a beos browser window
985 *
986 * \param g The netsurf window being invalidated.
987 * \param rect area to redraw or NULL for entrire window area.
988 * \return NSERROR_OK or appropriate error code.
989 */
990static nserror
992{
993 if (browser_window_has_content(g->bw) == false) {
994 return NSERROR_OK;
995 }
996
997 if (g->view == NULL) {
998 return NSERROR_OK;
999 }
1000
1001 if (!g->view->LockLooper()) {
1002 return NSERROR_OK;
1003 }
1004
1005 if (rect != NULL) {
1006 //XXX +1 ??
1007 g->view->Invalidate(BRect(rect->x0, rect->y0,
1008 rect->x1 - 1, rect->y1 - 1));
1009 } else {
1010 g->view->Invalidate();
1011 }
1012
1013 g->view->UnlockLooper();
1014
1015 return NSERROR_OK;
1016}
1017
1018static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
1019{
1020 //CALLED();
1021 if (g->view == NULL)
1022 return false;
1023 if (!g->view->LockLooper())
1024 return false;
1025
1026#warning XXX: report to view frame ?
1027 if (g->view->ScrollBar(B_HORIZONTAL))
1028 *sx = (int)g->view->ScrollBar(B_HORIZONTAL)->Value();
1029 if (g->view->ScrollBar(B_VERTICAL))
1030 *sy = (int)g->view->ScrollBar(B_VERTICAL)->Value();
1031
1032 g->view->UnlockLooper();
1033 return true;
1034}
1035
1036/**
1037 * Set the scroll position of a beos browser window.
1038 *
1039 * Scrolls the viewport to ensure the specified rectangle of the
1040 * content is shown. The beos implementation scrolls the contents so
1041 * the specified point in the content is at the top of the viewport.
1042 *
1043 * \param g gui window to scroll
1044 * \param rect The rectangle to ensure is shown.
1045 * \return NSERROR_OK on success or apropriate error code.
1046 */
1047static nserror
1049{
1050 //CALLED();
1051 if (g->view == NULL) {
1052 return NSERROR_BAD_PARAMETER;
1053 }
1054 if (!g->view->LockLooper()) {
1055 return NSERROR_BAD_PARAMETER;
1056 }
1057
1058#warning XXX: report to view frame ?
1059 if (g->view->ScrollBar(B_HORIZONTAL)) {
1060 g->view->ScrollBar(B_HORIZONTAL)->SetValue(rect->x0);
1061 }
1062 if (g->view->ScrollBar(B_VERTICAL)) {
1063 g->view->ScrollBar(B_VERTICAL)->SetValue(rect->y0);
1064 }
1065
1066 g->view->UnlockLooper();
1067
1068 return NSERROR_OK;
1069}
1070
1071
1073{
1074 nserror err;
1075 //CALLED();
1076 if (browser_window_has_content(g->bw) == false)
1077 return;
1078
1079 if (g->view == NULL)
1080 return;
1081 if (!g->view->LockLooper())
1082 return;
1083
1084 int x_max, y_max;
1085
1086 err = browser_window_get_extents(g->bw, true, &x_max, &y_max);
1087 if (err != NSERROR_OK)
1088 return;
1089
1090 float x_prop = g->view->Bounds().Width() / x_max;
1091 float y_prop = g->view->Bounds().Height() / y_max;
1092 x_max -= g->view->Bounds().Width() + 1;
1093 y_max -= g->view->Bounds().Height() + 1;
1094
1095 NSLOG(netsurf, INFO,
1096 "x_max = %d y_max = %d x_prop = %f y_prop = %f\n", x_max,
1097 y_max, x_prop, y_prop);
1098
1099 if (g->view->ScrollBar(B_HORIZONTAL)) {
1100 g->view->ScrollBar(B_HORIZONTAL)->SetRange(0, x_max);
1101 g->view->ScrollBar(B_HORIZONTAL)->SetProportion(x_prop);
1102 g->view->ScrollBar(B_HORIZONTAL)->SetSteps(10, 50);
1103 }
1104 if (g->view->ScrollBar(B_VERTICAL)) {
1105 g->view->ScrollBar(B_VERTICAL)->SetRange(0, y_max);
1106 g->view->ScrollBar(B_VERTICAL)->SetProportion(y_prop);
1107 g->view->ScrollBar(B_VERTICAL)->SetSteps(10, 50);
1108 }
1109
1110
1111 g->view->UnlockLooper();
1112}
1113
1115{
1116 switch (shape) {
1117 case GUI_POINTER_POINT: /* link */
1118 return B_CURSOR_ID_FOLLOW_LINK;
1119
1120 case GUI_POINTER_CARET: /* input */
1121 return B_CURSOR_ID_I_BEAM;
1122
1123 case GUI_POINTER_MENU:
1124 return B_CURSOR_ID_CONTEXT_MENU;
1125
1126 case GUI_POINTER_UP:
1127 return B_CURSOR_ID_RESIZE_NORTH;
1128
1129 case GUI_POINTER_DOWN:
1130 return B_CURSOR_ID_RESIZE_SOUTH;
1131
1132 case GUI_POINTER_LEFT:
1133 return B_CURSOR_ID_RESIZE_WEST;
1134
1135 case GUI_POINTER_RIGHT:
1136 return B_CURSOR_ID_RESIZE_EAST;
1137
1138 case GUI_POINTER_RU:
1139 return B_CURSOR_ID_RESIZE_NORTH_EAST;
1140
1141 case GUI_POINTER_LD:
1142 return B_CURSOR_ID_RESIZE_SOUTH_WEST;
1143
1144 case GUI_POINTER_LU:
1145 return B_CURSOR_ID_RESIZE_NORTH_WEST;
1146
1147 case GUI_POINTER_RD:
1148 return B_CURSOR_ID_RESIZE_SOUTH_EAST;
1149
1150 case GUI_POINTER_CROSS:
1151 return B_CURSOR_ID_CROSS_HAIR;
1152
1153 case GUI_POINTER_MOVE:
1154 return B_CURSOR_ID_MOVE;
1155
1156 case GUI_POINTER_WAIT:
1158 return B_CURSOR_ID_PROGRESS;
1159
1162 return B_CURSOR_ID_NOT_ALLOWED;
1163
1164 case GUI_POINTER_HELP:
1165 return B_CURSOR_ID_HELP;
1166
1168 default:
1169 break;
1170 }
1171 return B_CURSOR_ID_SYSTEM_DEFAULT;
1172}
1173
1175{
1176 if (g->current_pointer == shape)
1177 return;
1178
1179 g->current_pointer = shape;
1180
1181 BCursor cursor(gui_haiku_pointer(shape));
1182
1183 if (g->view && g->view->LockLooper()) {
1184 g->view->SetViewCursor(&cursor);
1185 g->view->UnlockLooper();
1186 }
1187}
1188
1189static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
1190 const struct rect *clip)
1191{
1192 //CALLED();
1193 if (g->view == NULL)
1194 return;
1195 if (!g->view->LockLooper())
1196 return;
1197
1199
1200 g->caretx = x;
1201 g->carety = y + 1;
1202 g->careth = height - 2;
1203
1205 g->view->MakeFocus();
1206
1207 g->view->UnlockLooper();
1208}
1209
1211{
1212 int oh = g->careth;
1213
1214 if (oh == 0)
1215 return;
1216
1217 g->careth = 0;
1218
1219 if (g->view == NULL)
1220 return;
1221 if (!g->view->LockLooper())
1222 return;
1223
1225
1226 g->view->Invalidate(BRect(g->caretx, g->carety, g->caretx, g->carety + oh));
1227
1229 g->view->UnlockLooper();
1230}
1231
1233{
1234 if (!g->toplevel)
1235 return;
1236
1237 if (g->view == NULL)
1238 return;
1239 if (!g->view->LockLooper())
1240 return;
1241
1242 // scroll back to top
1243 g->view->ScrollTo(0,0);
1244
1245 g->view->UnlockLooper();
1246}
1247
1248static void gui_start_selection(struct gui_window *g)
1249{
1250 if (!g->view->LockLooper())
1251 return;
1252
1253 g->view->MakeFocus();
1254
1255 g->view->UnlockLooper();
1256}
1257
1258static void gui_get_clipboard(char **buffer, size_t *length)
1259{
1260 BMessage *clip;
1261 *length = 0;
1262 *buffer = NULL;
1263
1264 if (be_clipboard->Lock()) {
1265 clip = be_clipboard->Data();
1266 if (clip) {
1267 const char *text;
1268 ssize_t textlen;
1269 if (clip->FindData("text/plain", B_MIME_TYPE,
1270 (const void **)&text, &textlen) >= B_OK) {
1271 *buffer = (char *)malloc(textlen);
1272 *length = textlen;
1273 memcpy(*buffer, text, textlen);
1274 }
1275 }
1276 be_clipboard->Unlock();
1277 }
1278}
1279
1280static void gui_set_clipboard(const char *buffer, size_t length,
1281 nsclipboard_styles styles[], int n_styles)
1282{
1283 BMessage *clip;
1284
1285 if (be_clipboard->Lock()) {
1286 be_clipboard->Clear();
1287 clip = be_clipboard->Data();
1288 if (clip) {
1289 clip->AddData("text/plain", B_MIME_TYPE, buffer, length);
1290
1291 int arraySize = sizeof(text_run_array) +
1292 n_styles * sizeof(text_run);
1293 text_run_array *array = (text_run_array *)malloc(arraySize);
1294 array->count = n_styles;
1295 for (int i = 0; i < n_styles; i++) {
1296 BFont font;
1297 nsbeos_style_to_font(font, &styles[i].style);
1298 array->runs[i].offset = styles[i].start;
1299 array->runs[i].font = font;
1300 array->runs[i].color =
1301 nsbeos_rgb_colour(styles[i].style.foreground);
1302 }
1303 clip->AddData("application/x-vnd.Be-text_run_array", B_MIME_TYPE,
1304 array, arraySize);
1305 free(array);
1306 be_clipboard->Commit();
1307 }
1308 be_clipboard->Unlock();
1309 }
1310}
1311
1315};
1316
1318
1319/**
1320 * Find the current dimensions of a beos browser window content area.
1321 *
1322 * \param g The gui window to measure content area of.
1323 * \param width receives width of window
1324 * \param height receives height of window
1325 * \return NSERROR_OK on sucess and width and height updated
1326 * else error code.
1327 */
1328static nserror
1330{
1331 if (g->view &&
1332 g->view->LockLooper()) {
1333 *width = g->view->Bounds().Width() + 1;
1334 *height = g->view->Bounds().Height() + 1;
1335 g->view->UnlockLooper();
1336 }
1337 return NSERROR_OK;
1338}
1339
1340
1341/**
1342 * process miscellaneous window events
1343 *
1344 * \param gw The window receiving the event.
1345 * \param event The event code.
1346 * \return NSERROR_OK when processed ok
1347 */
1348static nserror
1350{
1351 switch (event) {
1354 break;
1355
1358 break;
1359
1362 break;
1363
1366 break;
1367
1370 break;
1371
1374 break;
1375
1376 default:
1377 break;
1378 }
1379 return NSERROR_OK;
1380}
1381
1382
1391
1392 /* from scaffold */
1399 NULL, //drag_start
1400 NULL, //save_link
1401 NULL, //create_form_select_menu
1402 NULL, //file_gadget_open
1403 NULL, //drag_save_object
1404 NULL, //drag_save_selection
1405 NULL //console_log
1406};
1407
void nsbeos_about(struct gui_window *gui)
Creates the about alert.
Definition: about.cpp:44
static void gui_window_set_status(struct gui_window *g, const char *text)
Definition: gui.c:5933
static nserror gui_window_set_url(struct gui_window *g, nsurl *url)
Definition: gui.c:5967
static void gui_window_set_title(struct gui_window *g, const char *restrict title)
Definition: gui.c:3624
static void gui_window_set_icon(struct gui_window *g, struct hlcache_handle *icon)
function to add retrieved favicon to gui
Definition: gui.c:2464
void gui_window_stop_throbber(struct gui_window *g)
Definition: theme.c:432
void gui_window_start_throbber(struct gui_window *g)
Definition: theme.c:413
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
@ 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
Browser window creation and manipulation interface.
nserror browser_window_schedule_reformat(struct browser_window *bw)
Reformat the browser window contents in a safe context.
bool browser_window_redraw(struct browser_window *bw, int x, int y, const struct rect *clip, const struct redraw_context *ctx)
Redraw an area of a window.
bool browser_window_has_content(struct browser_window *bw)
Find out if a browser window is currently showing a content.
void browser_window_mouse_click(struct browser_window *bw, browser_mouse_state mouse, int x, int y)
Handle mouse clicks in a browser window.
void browser_window_destroy(struct browser_window *bw)
Close and destroy a browser window.
nserror browser_window_get_extents(struct browser_window *bw, bool scaled, int *width, int *height)
Get a browser window's content extents.
void browser_window_mouse_track(struct browser_window *bw, browser_mouse_state mouse, int x, int y)
Handle non-click mouse action in a browser window.
static osspriteop_area * buffer
The buffer characteristics.
Definition: buffer.c:55
virtual void FrameResized(float new_width, float new_height)
Definition: window.cpp:262
virtual ~NSBrowserFrameView()
Definition: window.cpp:127
virtual void MouseDown(BPoint where)
Definition: window.cpp:282
virtual void KeyDown(const char *bytes, int32 numBytes)
Definition: window.cpp:274
struct gui_window * fGuiWindow
Definition: window.h:50
virtual void MouseUp(BPoint where)
Definition: window.cpp:295
virtual void Draw(BRect updateRect)
Definition: window.cpp:248
NSBrowserFrameView(BRect frame, struct gui_window *gui)
Definition: window.cpp:119
virtual void MessageReceived(BMessage *message)
Definition: window.cpp:133
virtual void MouseMoved(BPoint where, uint32 transit, const BMessage *msg)
Definition: window.cpp:310
Declaration of content enumerations.
nserror
Enumeration of error codes.
Definition: errors.h:29
@ NSERROR_BAD_PARAMETER
Bad Parameter.
Definition: errors.h:48
@ NSERROR_OK
No error.
Definition: errors.h:30
void nsbeos_style_to_font(BFont &font, const struct plot_font_style *fstyle)
Convert a font style to a PangoFontDescription.
Definition: font.cpp:54
Beos font layout handling interface.
Target independent plotting (BeOS interface).
bool nsbeos_done
Definition: gui.cpp:90
void nsbeos_pipe_message_top(BMessage *message, BWindow *_this, struct beos_scaffolding *scaffold)
Definition: gui.cpp:799
void nsbeos_pipe_message(BMessage *message, BView *_this, struct gui_window *gui)
Definition: gui.cpp:785
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 NO_ACTION
Definition: idna.c:695
Interface to platform-specific clipboard operations.
Core mouse and pointer states.
browser_mouse_state
Mouse state: 1 is primary mouse button.
Definition: mouse.h:52
@ BROWSER_MOUSE_PRESS_1
primary button pressed
Definition: mouse.h:59
@ BROWSER_MOUSE_CLICK_2
button 2 clicked.
Definition: mouse.h:72
@ BROWSER_MOUSE_PRESS_2
auxillary button pressed
Definition: mouse.h:61
@ BROWSER_MOUSE_CLICK_1
button 1 clicked.
Definition: mouse.h:70
@ BROWSER_MOUSE_MOD_2
2nd modifier key pressed (eg.
Definition: mouse.h:101
@ BROWSER_MOUSE_MOD_1
1st modifier key pressed (eg.
Definition: mouse.h:99
@ BROWSER_MOUSE_DRAG_1
start of button 1 drag
Definition: mouse.h:86
@ BROWSER_MOUSE_HOLDING_2
during button 2 drag
Definition: mouse.h:96
@ BROWSER_MOUSE_HOLDING_1
during button 1 drag
Definition: mouse.h:94
@ BROWSER_MOUSE_DRAG_ON
a drag operation was started and a mouse button is still pressed
Definition: mouse.h:91
@ BROWSER_MOUSE_DRAG_2
start of button 2 drag
Definition: mouse.h:88
gui_pointer_shape
Definition: mouse.h:112
@ GUI_POINTER_WAIT
Definition: mouse.h:127
@ GUI_POINTER_RIGHT
Definition: mouse.h:120
@ GUI_POINTER_MOVE
Definition: mouse.h:126
@ GUI_POINTER_CARET
Definition: mouse.h:115
@ GUI_POINTER_PROGRESS
Definition: mouse.h:131
@ GUI_POINTER_RD
Definition: mouse.h:124
@ GUI_POINTER_LD
Definition: mouse.h:122
@ GUI_POINTER_NO_DROP
Definition: mouse.h:129
@ GUI_POINTER_DOWN
Definition: mouse.h:118
@ GUI_POINTER_UP
Definition: mouse.h:117
@ GUI_POINTER_RU
Definition: mouse.h:121
@ GUI_POINTER_DEFAULT
Definition: mouse.h:113
@ GUI_POINTER_HELP
Definition: mouse.h:128
@ GUI_POINTER_MENU
Definition: mouse.h:116
@ GUI_POINTER_POINT
Definition: mouse.h:114
@ GUI_POINTER_LEFT
Definition: mouse.h:119
@ GUI_POINTER_NOT_ALLOWED
Definition: mouse.h:130
@ GUI_POINTER_LU
Definition: mouse.h:123
@ GUI_POINTER_CROSS
Definition: mouse.h:125
Target independent plotting interface.
Interface to platform-specific graphical user interface window operations.
gui_window_create_flags
Window creation control flags.
Definition: window.h:66
gui_window_event
Window events.
Definition: window.h:80
@ GW_EVENT_REMOVE_CARET
Remove the caret, if present.
Definition: window.h:98
@ GW_EVENT_NEW_CONTENT
Called when the gui_window has new content.
Definition: window.h:118
@ GW_EVENT_STOP_THROBBER
stop the navigation throbber.
Definition: window.h:108
@ GW_EVENT_UPDATE_EXTENT
Update the extent of the inside of a browser window to that of the current content.
Definition: window.h:93
@ GW_EVENT_START_SELECTION
selection started
Definition: window.h:123
@ GW_EVENT_START_THROBBER
start the navigation throbber.
Definition: window.h:103
Netsurf additional integer type formatting macros.
Interface to key press operations.
@ NS_KEY_LINE_START
Definition: keypress.h:57
@ NS_KEY_RIGHT
Definition: keypress.h:51
@ NS_KEY_LEFT
Definition: keypress.h:50
@ NS_KEY_TAB
Definition: keypress.h:36
@ NS_KEY_DOWN
Definition: keypress.h:53
@ NS_KEY_PAGE_UP
Definition: keypress.h:65
@ NS_KEY_PAGE_DOWN
Definition: keypress.h:66
@ NS_KEY_LINE_END
Definition: keypress.h:58
@ NS_KEY_DELETE_RIGHT
Definition: keypress.h:55
@ NS_KEY_DELETE_LEFT
Definition: keypress.h:35
@ NS_KEY_UP
Definition: keypress.h:52
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
NetSurf URL handling (interface).
struct nsurl nsurl
NetSurf URL object.
Definition: nsurl.h:31
int8_t int8
Definition: os3support.h:179
int32_t int32
Definition: os3support.h:183
uint32_t uint32
Definition: os3support.h:184
const struct plotter_table nsbeos_plotters
beos plotter operation table
Definition: plotters.cpp:739
rgb_color nsbeos_rgb_colour(colour c)
Definition: plotters.cpp:169
void nsbeos_current_gc_set(BView *view)
Definition: plotters.cpp:93
void nsbeos_plot_caret(int x, int y, int h)
Plot a caret.
Definition: plotters.cpp:194
int width
Definition: gui.c:161
int height
Definition: gui.c:162
void nsbeos_scaffolding_popup_menu(nsbeos_scaffolding *scaffold, struct browser_window *bw, BPoint where, BPoint screenWhere)
nsbeos_scaffolding * nsbeos_new_scaffolding(struct gui_window *toplevel)
void nsbeos_scaffolding_destroy(nsbeos_scaffolding *scaffold)
void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *message)
void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
NSBrowserWindow * window
Definition: scaffolding.cpp:99
Browser window data.
int x
Window dimensions.
function table for clipboard operations.
Definition: clipboard.h:42
Graphical user interface window function table.
Definition: window.h:137
first entry in window list
Definition: gui.c:298
struct gui_window * prev
Previous in linked list.
Definition: gui.h:159
NSBrowserFrameView * view
Definition: window.cpp:82
MFORM_EX * cursor
Definition: gui.h:150
struct gui_window * next
list for cleanup
Definition: gui.h:159
int state
Definition: window.cpp:74
gui_pointer_shape current_pointer
caret shape for rendering
Definition: window.cpp:79
int last_y
Definition: window.cpp:80
bool toplevel
Definition: window.cpp:67
struct gui_window * gui
Definition: window.c:89
nsbeos_scaffolding * scaffold
Definition: window.cpp:66
char * url
Definition: gui.h:154
int last_x
previous event location
Definition: window.cpp:80
int pressed_y
Definition: window.cpp:73
BRect pendingRedraw
Definition: window.cpp:92
int carety
Definition: window.cpp:78
int pressed_x
Definition: window.cpp:72
int32 pending_resizes
Definition: window.cpp:88
int caretx
caret dimension and location for rendering
Definition: window.cpp:78
struct gui_window::@32 mouse
int careth
Definition: window.cpp:78
struct browser_window * bw
The 'content' window that is rendered in the gui_window.
Definition: gui.c:316
size_t start
Start of run.
Definition: clipboard.h:34
Rectangle coordinates.
Definition: types.h:40
int x0
Definition: types.h:41
int y0
Top left.
Definition: types.h:41
int x1
Definition: types.h:42
int y1
Bottom right.
Definition: types.h:42
Redraw context.
Definition: plotters.h:51
Unified URL information database public interface.
Option reading and saving interface.
uint32_t utf8_to_ucs4(const char *s_in, size_t l)
Convert a UTF-8 multibyte sequence into a single UCS4 character.
Definition: utf8.c:41
UTF-8 manipulation functions (interface).
Interface to a number of general purpose functionality.
static void gui_set_clipboard(const char *buffer, size_t length, nsclipboard_styles styles[], int n_styles)
Definition: window.cpp:1280
void nsbeos_dispatch_event(BMessage *message)
Process beos messages into browser operations.
Definition: window.cpp:407
nsbeos_scaffolding * nsbeos_get_scaffold(struct gui_window *g)
Get containing scaffold of a beos gui window.
Definition: window.cpp:328
static nserror gui_window_event(struct gui_window *gw, enum gui_window_event event)
process miscellaneous window events
Definition: window.cpp:1349
static void gui_window_destroy(struct gui_window *g)
Definition: window.cpp:921
static void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
Definition: window.cpp:1174
static void gui_window_remove_caret(struct gui_window *g)
Definition: window.cpp:1210
static void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event)
Definition: window.cpp:871
static void gui_window_update_extent(struct gui_window *g)
Definition: window.cpp:1072
static BCursorID gui_haiku_pointer(gui_pointer_shape shape)
Definition: window.cpp:1114
static void gui_get_clipboard(char **buffer, size_t *length)
Definition: window.cpp:1258
static struct gui_window * gui_window_create(struct browser_window *bw, struct gui_window *existing, gui_window_create_flags flags)
Definition: window.cpp:339
struct gui_clipboard_table * beos_clipboard_table
Definition: window.cpp:1317
static struct gui_window_table window_table
Definition: window.cpp:1383
struct browser_window * nsbeos_get_browser_window(struct gui_window *g)
Definition: window.cpp:323
static nserror beos_window_invalidate_area(struct gui_window *g, const struct rect *rect)
Invalidate an area of a beos browser window.
Definition: window.cpp:991
static BList current_selection_textruns
Definition: window.cpp:105
struct gui_window_table * beos_window_table
Definition: window.cpp:1408
static struct gui_clipboard_table clipboard_table
Definition: window.cpp:1312
static void gui_window_place_caret(struct gui_window *g, int x, int y, int height, const struct rect *clip)
Definition: window.cpp:1189
static void nsbeos_window_expose_event(BView *view, gui_window *g, BMessage *message)
Definition: window.cpp:680
static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
Definition: window.cpp:1018
static const rgb_color kWhiteColor
Definition: window.cpp:100
static nserror gui_window_set_scroll(struct gui_window *g, const struct rect *rect)
Set the scroll position of a beos browser window.
Definition: window.cpp:1048
void nsbeos_window_destroy_browser(struct gui_window *g)
Definition: window.cpp:916
static void nsbeos_window_keypress_event(BView *view, gui_window *g, BMessage *event)
Definition: window.cpp:732
static struct gui_window * window_list
first entry in win list
Definition: window.cpp:102
static void gui_window_new_content(struct gui_window *g)
Definition: window.cpp:1232
static void gui_start_selection(struct gui_window *g)
Definition: window.cpp:1248
static nserror gui_window_get_dimensions(struct gui_window *g, int *width, int *height)
Find the current dimensions of a beos browser window content area.
Definition: window.cpp:1329
void nsbeos_reflow_all_windows(void)
Cause all windows to be reflowed.
Definition: window.cpp:908
static void nsbeos_window_moved_event(BView *view, gui_window *g, BMessage *event)
Definition: window.cpp:894
struct browser_window * nsbeos_get_browser_for_gui(struct gui_window *g)
Definition: window.cpp:333
static BString current_selection
Definition: window.cpp:104
static void nsbeos_redraw_caret(struct gui_window *g)
Definition: window.cpp:964
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
static nserror clip(const struct redraw_context *ctx, const struct rect *clip)
Sets a clip rectangle for subsequent plot operations.
Definition: plot.c:357