summaryrefslogtreecommitdiff
path: root/atari/toolbar.c
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2012-11-27 02:12:09 +0100
committerOle Loots <ole@monochrom.net>2012-11-27 02:12:09 +0100
commitfe0e2508e62323955df415b45e2ea9b1b7d6373f (patch)
tree281f289f43c09c168a35714c5800a0e3dcf74300 /atari/toolbar.c
parent6ea22068aa50dfa15807e80277b1ad843146a76c (diff)
downloadnetsurf-fe0e2508e62323955df415b45e2ea9b1b7d6373f.tar.gz
netsurf-fe0e2508e62323955df415b45e2ea9b1b7d6373f.tar.bz2
Refactored a lot of browser window code,... still totally WIP.
...but it compiles...
Diffstat (limited to 'atari/toolbar.c')
-rw-r--r--[-rwxr-xr-x]atari/toolbar.c1152
1 files changed, 328 insertions, 824 deletions
diff --git a/atari/toolbar.c b/atari/toolbar.c
index 396cccbc4..39025697d 100755..100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
+ * Copyright 2012 Ole Loots <ole@monochrom.net>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -24,7 +24,6 @@
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
-#include <windom.h>
#include <assert.h>
#include <math.h>
@@ -50,16 +49,83 @@
#include "atari/global_evnt.h"
#include "atari/plot/plot.h"
#include "cflib.h"
-#include "atari/res/netsurf.rsh"
+#include "atari/res/netsurf.rsh"
+
+#include "desktop/textarea.h"
+#include "desktop/textinput.h"
+#include "content/hlcache.h"
+#include "atari/browser.h"
+
+#define TB_BUTTON_WIDTH 32
+#define THROBBER_WIDTH 32
+#define THROBBER_MIN_INDEX 1
+#define THROBBER_MAX_INDEX 12
+#define THROBBER_INACTIVE_INDEX 13
+
+#define TOOLBAR_URL_MARGIN_LEFT 2
+#define TOOLBAR_URL_MARGIN_RIGHT 2
+#define TOOLBAR_URL_MARGIN_TOP 2
+#define TOOLBAR_URL_MARGIN_BOTTOM 2
+
+enum e_toolbar_button_states {
+ button_on = 0,
+ button_off = 1
+};
+#define TOOLBAR_BUTTON_NUM_STATES 2
+
+struct s_toolbar;
+
+struct s_tb_button
+{
+ short rsc_id;
+ void (*cb_click)(struct s_toolbar *tb);
+ hlcache_handle *icon[TOOLBAR_BUTTON_NUM_STATES];
+ struct s_toolbar *owner;
+ short state;
+ short index;
+ GRECT area;
+};
+struct s_url_widget
+{
+ /* widget is only redrawn when this flag is set */
+ bool redraw;
+ struct text_area *textarea;
+ GRECT rdw_area;
+ GRECT area;
+};
+
+struct s_throbber_widget
+{
+ short index;
+ short max_index;
+ bool running;
+ GRECT area;
+};
+
+struct s_toolbar
+{
+ struct s_gui_win_root *owner;
+ struct s_url_widget url;
+ struct s_throbber_widget throbber;
+ GRECT btdim;
+ GRECT area;
+ /* size & location of buttons: */
+ struct s_tb_button * buttons;
+ bool hidden;
+ int btcnt;
+ int style;
+ bool redraw;
+};
+
extern char * option_homepage_url;
extern void * h_gem_rsrc;
extern struct gui_window * input_window;
extern long atari_plot_flags;
extern int atari_plot_vdi_handle;
-static OBJECT * toolbar_buttons = NULL;
+static OBJECT * aes_toolbar = NULL;
static OBJECT * throbber_form = NULL;
static bool img_toolbar = false;
static char * toolbar_image_folder = (char *)"default";
@@ -68,7 +134,7 @@ static hlcache_handle * toolbar_image;
static hlcache_handle * throbber_image;
static bool toolbar_image_ready = false;
static bool throbber_image_ready = false;
-
+static bool init = false;
static plot_font_style_t font_style_url = {
.family = PLOT_FONT_FAMILY_SANS_SERIF,
@@ -77,46 +143,45 @@ static plot_font_style_t font_style_url = {
.flags = FONTF_NONE,
.background = 0xffffff,
.foreground = 0x0
- };
+ };
+
/* prototypes & order for button widgets: */
+
static struct s_tb_button tb_buttons[] =
{
{
TOOLBAR_BT_BACK,
- tb_back_click,
- 0,
+ toolbar_back_click,
{0,0},
- 0, 0, 0
+ 0, 0, 0, {0,0,0,0}
},
{
TOOLBAR_BT_HOME,
- tb_home_click,
- 0, {0,0}, 0, 0, 0
+ toolbar_home_click,
+ {0,0},
+ 0, 0, 0, {0,0,0,0}
},
{
TOOLBAR_BT_FORWARD,
- tb_forward_click,
- 0,
- {0,0},
- 0, 0, 0
+ toolbar_forward_click,
+ {0,0},
+ 0, 0, 0, {0,0,0,0}
},
{
TOOLBAR_BT_STOP,
- tb_stop_click,
- 0,
- {0,0},
- 0, 0, 0
+ toolbar_stop_click,
+ {0,0},
+ 0, 0, 0, {0,0,0,0}
},
{
TOOLBAR_BT_RELOAD,
- tb_reload_click,
- 0,
- {0,0},
- 0, 0, 0
+ toolbar_reload_click,
+ {0,0},
+ 0, 0, 0, {0,0,0,0}
},
- { 0, 0, 0, {0,0}, 0, 0, -1 }
+ { 0, 0, {0,0}, 0, -1, 0, {0,0,0,0}}
};
struct s_toolbar_style {
@@ -142,10 +207,93 @@ static struct s_toolbar_style toolbar_styles[] =
{18, 34, 64, 64, 2, 0, 0 }
};
-static void tb_txt_request_redraw( void *data, int x, int y, int w, int h );
+static void tb_txt_request_redraw(void *data, int x, int y, int w, int h );
static nserror toolbar_icon_callback( hlcache_handle *handle,
const hlcache_event *event, void *pw );
+/**
+* Callback for textarea redraw
+*/
+static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
+{
+ LGRECT work;
+ if( data == NULL )
+ return;
+ CMP_TOOLBAR t = data;
+ if( t->url.redraw == false ){
+ t->url.redraw = true;
+ //t->redraw = true;
+ t->url.rdw_area.g_x = x;
+ t->url.rdw_area.g_y = y;
+ t->url.rdw_area.g_w = w;
+ t->url.rdw_area.g_h = h;
+ } else {
+ /* merge the redraw area to the new area.: */
+ int newx1 = x+w;
+ int newy1 = y+h;
+ int oldx1 = t->url.rdw_area.g_x + t->url.rdw_area.g_w;
+ int oldy1 = t->url.rdw_area.g_y + t->url.rdw_area.g_h;
+ t->url.rdw_area.g_x = MIN(t->url.rdw_area.g_x, x);
+ t->url.rdw_area.g_y = MIN(t->url.rdw_area.g_y, y);
+ t->url.rdw_area.g_w = ( oldx1 > newx1 ) ?
+ oldx1 - t->url.rdw_area.g_x : newx1 - t->url.rdw_area.g_x;
+ t->url.rdw_area.g_h = ( oldy1 > newy1 ) ?
+ oldy1 - t->url.rdw_area.g_y : newy1 - t->url.rdw_area.g_y;
+ }
+}
+
+/**
+ * Callback for load_icon(). Should be removed once bitmaps get loaded directly
+ * from disc
+ */
+static nserror toolbar_icon_callback(hlcache_handle *handle,
+ const hlcache_event *event, void *pw)
+{
+ if( event->type == CONTENT_MSG_READY ){
+ if( handle == toolbar_image ){
+ toolbar_image_ready = true;
+ if(input_window != NULL )
+ toolbar_update_buttons(input_window->root->toolbar,
+ input_window->browser->bw, 0);
+ }
+ else if(handle == throbber_image ){
+ throbber_image_ready = true;
+ }
+ }
+
+ return NSERROR_OK;
+}
+
+static struct s_tb_button *button_init(struct s_toolbar *tb, OBJECT * tree, int index,
+ struct s_tb_button * instance)
+{
+ *instance = tb_buttons[index];
+ instance->owner = tb;
+
+ instance->area.g_w = toolbar_styles[tb->style].icon_width + \
+ ( toolbar_styles[tb->style].button_vmargin * 2);
+
+ return(instance);
+}
+
+
+static void toolbar_reflow(struct s_toolbar *tb)
+{
+ LOG((""));
+/*
+ int i=0, x=0;
+
+ x = 2;
+ while (tb->buttons[i].rsc_id > 0) {
+ tb->buttons[i].area.g_x = x;
+ x += tb->buttons[i].area.g_w;
+ x += 2;
+ i++;
+ }
+ tb->url.area.g_x = x;
+*/
+}
+
void toolbar_init( void )
{
@@ -155,7 +303,7 @@ void toolbar_init( void )
toolbar_image_folder = nsoption_charp(atari_image_toolbar_folder);
toolbar_bg_color = (nsoption_colour(atari_toolbar_bg));
- img_toolbar = (nsoption_int( atari_image_toolbar ) > 0 ) ? true : false;
+ img_toolbar = (nsoption_int(atari_image_toolbar) > 0 ) ? true : false;
if( img_toolbar ){
char imgfile[PATH_MAX];
@@ -175,13 +323,8 @@ void toolbar_init( void )
toolbar_icon_callback, NULL );
} else {
- RsrcGaddr( h_gem_rsrc, R_TREE, TOOLBAR, &toolbar_buttons );
- //toolbar_buttons->ob_x = 0;
- //toolbar_buttons->ob_y = 0;
-
- RsrcGaddr( h_gem_rsrc, R_TREE, THROBBER , &throbber_form );
- throbber_form->ob_x = 0;
- throbber_form->ob_y = 0;
+ aes_toolbar = get_tree(TOOLBAR);
+ throbber_form = get_tree(THROBBER);
}
n = (sizeof( toolbar_styles ) / sizeof( struct s_toolbar_style ));
for (i=0; i<n; i++) {
@@ -189,579 +332,42 @@ void toolbar_init( void )
}
}
-void toolbar_exit( void )
-{
- if( toolbar_image )
- hlcache_handle_release( toolbar_image );
- if( throbber_image )
- hlcache_handle_release( throbber_image );
-}
-/**
- * Callback for load_icon(). Should be removed once bitmaps get loaded directly
- * from disc
- */
-static nserror toolbar_icon_callback(hlcache_handle *handle,
- const hlcache_event *event, void *pw)
+void toolbar_exit(void)
{
- if( event->type == CONTENT_MSG_READY ){
- if( handle == toolbar_image ){
- toolbar_image_ready = true;
- if( input_window != NULL )
- tb_update_buttons( input_window, 0 );
- }
- else if( handle == throbber_image ){
- throbber_image_ready = true;
- }
- }
-
- return NSERROR_OK;
+ if (toolbar_image)
+ hlcache_handle_release(toolbar_image);
+ if (throbber_image)
+ hlcache_handle_release(throbber_image);
}
-
-
-static void __CDECL button_redraw( COMPONENT *c, long buff[8], void * data )
-{
-
- OBJECT *tree=NULL;
- LGRECT work,clip;
- GRECT todo,crect;
- struct s_tb_button *bt = (struct s_tb_button*)data;
- struct gui_window * gw = bt->gw;
- struct s_toolbar * tb = gw->root->toolbar;
-
- short pxy[4];
- int bmpx=0, bmpy=0, bmpw=0, bmph = 0, drawstate=0;
- struct bitmap * icon = NULL;
- struct rect icon_clip;
- GRECT icon_dim = {0,0,0,0};
- plot_style_t plot_style_background = {
- .fill_type = PLOT_OP_TYPE_SOLID,
- .fill_colour = toolbar_bg_color,
- .stroke_type = PLOT_OP_TYPE_NONE
- };
-
-
- mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
- work.g_h = work.g_h - 1;
- clip = work;
-
- /* return if component and redraw region does not intersect: */
- if (!rc_lintersect( (LGRECT*)&buff[4], &clip)) {
- return;
- }
-
- drawstate = bt->state;
- if( img_toolbar ){
-
- if( toolbar_image_ready == false ){
- return;
- }
- icon = content_get_bitmap( toolbar_image );
- if( icon == NULL ){
- return;
- }
- bmpw = bitmap_get_width(icon);
- bmph = bitmap_get_height(icon);
- bmpx = 0;
- bmpy = 0;
- icon_clip.x0 = bmpx+(toolbar_styles[tb->style].icon_width*bt->index);
- icon_clip.y0 = bmpy+(toolbar_styles[tb->style].icon_height*drawstate);
- icon_clip.x1 = icon_clip.x0+toolbar_styles[tb->style].icon_width;
- icon_clip.y1 = icon_clip.y0+toolbar_styles[tb->style].icon_height;
- icon_dim.g_x = work.g_x-(toolbar_styles[tb->style].icon_width * bt->index)+toolbar_styles[tb->style].button_vmargin;
- icon_dim.g_y = work.g_y-(toolbar_styles[tb->style].icon_height * drawstate)+toolbar_styles[tb->style].button_hmargin;
- icon_dim.g_w = toolbar_styles[tb->style].icon_width*(bt->index+1);
- icon_dim.g_h = toolbar_styles[tb->style].icon_height*(drawstate+1);
- } else {
- /* Place the CICON into workarea: */
- tree = &toolbar_buttons[bt->rsc_id];
- if( tree == NULL )
- return;
- //tree->ob_x = work.g_x;
- //tree->ob_y = work.g_y + (work.g_h - tree->ob_height) / 2;
- if( drawstate == button_off ) {
- tree->ob_state |= OS_DISABLED;
- } else {
- tree->ob_state &= ~OS_DISABLED;
- }
- }
-
- /* Setup draw mode: */
- vsf_interior(atari_plot_vdi_handle , 1 );
- vswr_mode(atari_plot_vdi_handle, MD_REPLACE);
-
- /* go through the rectangle list, using classic AES methods. */
- /* Windom ComGetLGrect is buggy for WF_FIRST/NEXTXYWH */
- crect.g_x = clip.g_x;
- crect.g_y = clip.g_y;
- crect.g_w = clip.g_w;
- crect.g_h = clip.g_h;
- wind_get(gw->root->handle->handle, WF_FIRSTXYWH,
- &todo.g_x, &todo.g_y, &todo.g_w, &todo.g_h );
- while( (todo.g_w > 0) && (todo.g_h > 0) ){
-
- if (rc_intersect(&crect, &todo )) {
-
- struct rect bgclip = {0,0,todo.g_w, todo.g_h};
- pxy[0] = todo.g_x;
- pxy[1] = todo.g_y;
- pxy[2] = todo.g_w + todo.g_x-1;
- pxy[3] = todo.g_h + todo.g_y-1;
-
- vs_clip(atari_plot_vdi_handle, 1, (short*)&pxy );
- plot_set_dimensions(todo.g_x, todo.g_y, todo.g_w, todo.g_h);
- plot_rectangle(0, 0, crect.g_w, crect.g_h, &plot_style_background);
-
- if( img_toolbar == true ){
- plot_set_dimensions(icon_dim.g_x, icon_dim.g_y,
- icon_dim.g_w, icon_dim.g_h);
- plot_clip( &icon_clip );
- atari_plotters.bitmap( bmpx, bmpy, bmpw, bmph, icon,
- toolbar_styles[tb->style].icon_bgcolor,
- BITMAPF_BUFFER_NATIVE );
- } else {
- objc_draw( tree, 0, 0, todo.g_x, todo.g_y, todo.g_w, todo.g_h );
- }
- vs_clip(atari_plot_vdi_handle, 0, (short*)&clip );
- }
- wind_get(gw->root->handle->handle, WF_NEXTXYWH,
- &todo.g_x, &todo.g_y, &todo.g_w, &todo.g_h );
- }
-}
-
-
-static void __CDECL button_click( COMPONENT *c, long buff[8], void * data )
-{
- struct s_tb_button * bt = (struct s_tb_button *)data;
- int i = 0;
- struct gui_window * gw = bt->gw;
- assert( gw );
- gw->root->toolbar->buttons[bt->index].cb_click( gw );
-}
-
-
-static struct s_tb_button * find_button( struct gui_window * gw, int rsc_id )
+struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
{
- int i = 0;
- while( i < gw->root->toolbar->btcnt ) {
- if( gw->root->toolbar->buttons[i].rsc_id == rsc_id ) {
- return( &gw->root->toolbar->buttons[i] );
- }
- i++;
- }
-}
-
-
-static COMPONENT *button_init( CMP_TOOLBAR t, OBJECT * tree, int index,
- struct s_tb_button * instance )
-{
- int comp_width;
-
- *instance = tb_buttons[index];
- instance->gw = t->owner;
-
- comp_width = toolbar_styles[t->style].icon_width + \
- ( toolbar_styles[t->style].button_vmargin * 2 );
-
- instance->comp = mt_CompCreate( &app, CLT_VERTICAL, comp_width, 0 );
- assert( instance->comp );
+ int i;
- instance->comp->bounds.max_width = comp_width;
- mt_CompEvntDataAttach( &app, instance->comp, WM_REDRAW, button_redraw,
- instance );
- mt_CompEvntDataAttach( &app, instance->comp, WM_XBUTTON, button_click,
- instance );
- return instance->comp;
-}
-
+ LOG((""));
-static
-void __CDECL evnt_throbber_redraw( COMPONENT *c, long buff[8])
-{
- LGRECT work, clip;
- int idx;
- short pxy[4];
- struct s_toolbar * tb;
- struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app,
- c,
- CDT_OWNER );
- plot_style_t plot_style_background = {
- .fill_type = PLOT_OP_TYPE_SOLID,
- .fill_colour = toolbar_bg_color,
- .stroke_type = PLOT_OP_TYPE_NONE
- };
-
- tb = gw->root->toolbar;
- mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
- clip = work;
- if ( !rc_lintersect( (LGRECT*)&buff[4], &clip ) ) return;
-
- vsf_interior(atari_plot_vdi_handle , 1 );
- pxy[0] = (short)buff[4];
- pxy[1] = (short)buff[5];
- pxy[2] = (short)buff[4] + buff[6]-1;
- pxy[3] = (short)buff[5] + buff[7]-2;
- vs_clip(atari_plot_vdi_handle, 1, (short*)&pxy );
-
- if (app.nplanes > 2 ) {
- plot_set_dimensions(work.g_x, work.g_y, work.g_w, work.g_h);
- plot_rectangle( 0, 0, work.g_w, work.g_h, &plot_style_background);
- }
- else {
- vsf_color(atari_plot_vdi_handle, WHITE );
- v_bar(atari_plot_vdi_handle, (short*)&pxy );
- }
-
- if( img_toolbar ){
-
- int bmpx=0, bmpy=0, bmpw=0, bmph = 0, drawstate=0;
- struct rect icon_clip;
- struct bitmap * icon = NULL;
-
- if( throbber_image_ready == false ){
- return;
- }
- icon = content_get_bitmap( throbber_image );
- if( icon == NULL ){
- return;
- }
+ struct s_toolbar *t = calloc(sizeof(struct s_toolbar), 1);
- if( tb->throbber.running == false ) {
- idx = 0;
- }
- else {
- idx = tb->throbber.index;
- if( idx > tb->throbber.max_index ) {
- idx = tb->throbber.index = 1;
- }
- }
- bmpw = bitmap_get_width(icon);
- bmph = bitmap_get_height(icon);
- bmpx = 0;
- bmpy = 0;
-
- /*
- for some reason, adding
- toolbar_styles[tb->style].button_vmargin to the x pos of
- the plotter shifts the icon a bit to much.
- Maybe that's becasue the icon is inside an padded form.
- */
- plot_set_dimensions(
- work.g_x-(toolbar_styles[tb->style].icon_width * idx),
- work.g_y+toolbar_styles[tb->style].button_hmargin,
- toolbar_styles[tb->style].icon_width*(idx+1),
- toolbar_styles[tb->style].icon_height
- );
- icon_clip.x0 = bmpx+(toolbar_styles[tb->style].icon_width*idx);
- icon_clip.y0 = bmpy;
- icon_clip.x1 = icon_clip.x0+toolbar_styles[tb->style].icon_width;
- icon_clip.y1 = icon_clip.y0+toolbar_styles[tb->style].icon_height;
- plot_clip( &icon_clip );
- atari_plotters.bitmap( bmpx, bmpy, bmpw, bmph, icon,
- toolbar_styles[tb->style].icon_bgcolor,
- BITMAPF_BUFFER_NATIVE );
- }
- else {
- if( throbber_form != NULL ) {
- if( gw->root->toolbar->throbber.running == false ) {
- idx = THROBBER_INACTIVE_INDEX;
- } else {
- idx = gw->root->toolbar->throbber.index;
- if( idx > THROBBER_MAX_INDEX || idx < THROBBER_MIN_INDEX ) {
- idx = THROBBER_MIN_INDEX;
- }
- }
- throbber_form[idx].ob_x = work.g_x+1;
- throbber_form[idx].ob_y = work.g_y+4;
- mt_objc_draw( throbber_form, idx, 8, clip.g_x, clip.g_y, clip.g_w, clip.g_h, app.aes_global );
- }
- }
-
-}
-
-static
-void __CDECL evnt_url_redraw( COMPONENT *c, long buff[8], void * data)
-{
- LGRECT work, clip;
- struct gui_window * gw;
- short pxy[10];
- plot_style_t plot_style_background = {
- .fill_type = PLOT_OP_TYPE_SOLID,
- .fill_colour = toolbar_bg_color,
- .stroke_type = PLOT_OP_TYPE_NONE
- };
-
- CMP_TOOLBAR tb = (CMP_TOOLBAR)data;
- mt_CompGetLGrect(&app, tb->url.comp, WF_WORKXYWH, &work);
-
- // this last pixel is drawn by the root component of the toolbar:
- // it's the black border, so we leave it out:
- work.g_h--;
- clip = work;
- if ( !rc_lintersect( (LGRECT*)&buff[4], &clip ) ) return;
-
- plot_set_dimensions(work.g_x, work.g_y, work.g_w, work.g_h);
-
- //left margin:
- plot_rectangle(0, 0, TOOLBAR_URL_MARGIN_LEFT, work.g_h,
- &plot_style_background);
- // right margin:
- plot_rectangle(work.g_w-TOOLBAR_URL_MARGIN_RIGHT, 0, work.g_w, work.g_h,
- &plot_style_background);
-
- // top margin:
- plot_rectangle(0, 0, work.g_w, TOOLBAR_URL_MARGIN_TOP,
- &plot_style_background);
-
- // bottom margin:
- plot_rectangle(0, work.g_h-TOOLBAR_URL_MARGIN_BOTTOM, work.g_w, work.g_h,
- &plot_style_background);
-
- // TBD: request redraw of textarea for specific region.
- clip.g_x -= work.g_x+TOOLBAR_URL_MARGIN_LEFT;
- clip.g_y -= work.g_y+TOOLBAR_URL_MARGIN_TOP;
- tb_txt_request_redraw( tb, clip.g_x, clip.g_y, clip.g_w, clip.g_h );
-}
-
-static
-void __CDECL evnt_url_click( COMPONENT *c, long buff[8] )
-{
- LGRECT work;
- short pxy[4];
- short mx, my, mb, kstat;
- int old;
- graf_mkstate( &mx, &my, &mb, &kstat );
- struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app, c, CDT_OWNER);
- assert( gw != NULL );
- CMP_TOOLBAR tb = gw->root->toolbar;
- mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
- mx = evnt.mx - (work.g_x + TOOLBAR_URL_MARGIN_LEFT);
- my = evnt.my - (work.g_y + TOOLBAR_URL_MARGIN_TOP);
-
- /* TODO: reset mouse state of browser window? */
- /* select whole text when newly focused, otherwise set caret to end of text */
- if( !window_url_widget_has_focus(gw) ) {
- window_set_focus( gw, URL_WIDGET, (void*)&tb->url );
- } else {
- if( mb & 1 ) {
- textarea_mouse_action( tb->url.textarea, BROWSER_MOUSE_DRAG_1,
- mx, my );
- short prev_x = mx;
- short prev_y = my;
- do{
- if( abs(prev_x-mx) > 5 || abs(prev_y-my) > 5 ){
- textarea_mouse_action( tb->url.textarea,
- BROWSER_MOUSE_HOLDING_1, mx, my );
- prev_x = mx;
- prev_y = my;
- if( tb->url.redraw ){
- tb_url_redraw( gw );
- }
- }
- graf_mkstate( &mx, &my, &mb, &kstat );
- mx = mx - (work.g_x + TOOLBAR_URL_MARGIN_LEFT);
- my = my - (work.g_y + TOOLBAR_URL_MARGIN_TOP);
- }while( mb & 1 );
- textarea_drag_end( tb->url.textarea, 0, mx, my );
- } else {
- /* TODO: recognize click + shift key */
- int mstate = BROWSER_MOUSE_PRESS_1;
- if( (kstat & (K_LSHIFT|K_RSHIFT)) != 0 )
- mstate = BROWSER_MOUSE_MOD_1;
- if( evnt.nb_click == 2 ){
- textarea_mouse_action( tb->url.textarea,
- BROWSER_MOUSE_DOUBLE_CLICK | BROWSER_MOUSE_CLICK_1,
- mx, my );
- } else {
- textarea_mouse_action( tb->url.textarea,
- BROWSER_MOUSE_PRESS_1, mx, my );
- }
- }
- }
- // TODO: do not send an complete redraw!
- ApplWrite( _AESapid, WM_REDRAW, gw->root->handle->handle,
- work.g_x, work.g_y, work.g_w, work.g_h );
-}
-
-
-void tb_adjust_size( struct gui_window * gw )
-{
- LGRECT work;
- CMP_TOOLBAR t = gw->root->toolbar;
-
- mt_CompGetLGrect( &app, t->url.comp, WF_WORKXYWH, &work);
- work.g_w -= (TOOLBAR_URL_MARGIN_LEFT + TOOLBAR_URL_MARGIN_RIGHT);
- /* do not overwrite the black border, because of that, add 1 */
- work.g_h -= (TOOLBAR_URL_MARGIN_TOP + TOOLBAR_URL_MARGIN_BOTTOM+1);
- textarea_set_dimensions( t->url.textarea, work.g_w, work.g_h );
- tb_txt_request_redraw( t, 0,0, work.g_w-1, work.g_h-1);
-}
-
-static void __CDECL evnt_toolbar_redraw( COMPONENT *c, long buff[8], void *data )
-{
- LGRECT work, clip;
- short pxy[4];
- const plot_style_t plot_style_background = {
- .fill_type = PLOT_OP_TYPE_SOLID,
- .fill_colour = toolbar_bg_color,
- .stroke_type = PLOT_OP_TYPE_NONE
- };
-
- mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
- clip = work;
- if( !rc_lintersect( (LGRECT*)&buff[4], &clip ) ) return;
- if( work.g_y + work.g_h != clip.g_y + clip.g_h ) return;
-
- vswr_mode(atari_plot_vdi_handle, MD_REPLACE );
- vsl_color(atari_plot_vdi_handle, BLACK );
- vsl_type(atari_plot_vdi_handle, 1 );
- vsl_width(atari_plot_vdi_handle, 1 );
- pxy[0] = clip.g_x;
- pxy[1] = pxy[3] = work.g_y + work.g_h-1 ;
- pxy[2] = clip.g_x + clip.g_w;
- v_pline(atari_plot_vdi_handle, 2, (short*)&pxy );
-}
-
-
-static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
-{
- LGRECT work;
- if( data == NULL )
- return;
- CMP_TOOLBAR t = data;
- if( t->url.redraw == false ){
- t->url.redraw = true;
- //t->redraw = true;
- t->url.rdw_area.g_x = x;
- t->url.rdw_area.g_y = y;
- t->url.rdw_area.g_w = w;
- t->url.rdw_area.g_h = h;
- } else {
- /* merge the redraw area to the new area.: */
- int newx1 = x+w;
- int newy1 = y+h;
- int oldx1 = t->url.rdw_area.g_x + t->url.rdw_area.g_w;
- int oldy1 = t->url.rdw_area.g_y + t->url.rdw_area.g_h;
- t->url.rdw_area.g_x = MIN(t->url.rdw_area.g_x, x);
- t->url.rdw_area.g_y = MIN(t->url.rdw_area.g_y, y);
- t->url.rdw_area.g_w = ( oldx1 > newx1 ) ?
- oldx1 - t->url.rdw_area.g_x : newx1 - t->url.rdw_area.g_x;
- t->url.rdw_area.g_h = ( oldy1 > newy1 ) ?
- oldy1 - t->url.rdw_area.g_y : newy1 - t->url.rdw_area.g_y;
- }
-}
-
-void tb_url_redraw( struct gui_window * gw )
-{
-
- CMP_TOOLBAR t = gw->root->toolbar;
- if (t != NULL) {
- if( t->url.redraw && ((atari_plot_flags & PLOT_FLAG_OFFSCREEN) == 0) ) {
-
- const struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &atari_plotters
- };
- short todo[4];
- LGRECT work;
-
- mt_CompGetLGrect(&app, gw->root->toolbar->url.comp, WF_WORKXYWH, &work);
- work.g_x += TOOLBAR_URL_MARGIN_RIGHT;
- work.g_y += TOOLBAR_URL_MARGIN_LEFT;
- work.g_w -= TOOLBAR_URL_MARGIN_RIGHT;
- work.g_h -= TOOLBAR_URL_MARGIN_BOTTOM;
-
- plot_set_dimensions( work.g_x, work.g_y, work.g_w, work.g_h );
- if(plot_lock() == false)
- return;
+ assert(t);
- todo[0] = work.g_x;
- todo[1] = work.g_y;
- todo[2] = todo[0] + work.g_w-1;
- todo[3] = todo[1] + work.g_h-1;
- vs_clip(atari_plot_vdi_handle, 1, (short*)&todo );
-
- if( wind_get(gw->root->handle->handle, WF_FIRSTXYWH,
- &todo[0], &todo[1], &todo[2], &todo[3] )!=0 ) {
- while (todo[2] && todo[3]) {
-
- /* convert screen to relative coords: */
- todo[0] = todo[0] - work.g_x;
- todo[1] = todo[1] - work.g_y;
- if( todo[0] < 0 ){
- todo[2] = todo[2] + todo[0];
- todo[0] = 0;
- }
- if( todo[1] < 0 ){
- todo[3] = todo[3] + todo[1];
- todo[1] = 0;
- }
-
- if (rc_intersect(&t->url.rdw_area,(GRECT *)&todo)) {
- struct rect clip = {
- .x0 = todo[0],
- .y0 = todo[1],
- .x1 = todo[0]+todo[2],
- .y1 = todo[1]+todo[3]
- };
- textarea_redraw( t->url.textarea, 0, 0, &clip, &ctx );
- }
- if (wind_get(gw->root->handle->handle, WF_NEXTXYWH,
- &todo[0], &todo[1], &todo[2], &todo[3])==0) {
- break;
- }
- }
- } else {
- plot_unlock();
- return;
- }
- plot_unlock();
- vs_clip(atari_plot_vdi_handle, 0, (short*)&todo);
- t->url.redraw = false;
- t->url.rdw_area.g_x = 65000;
- t->url.rdw_area.g_y = 65000;
- t->url.rdw_area.g_w = -1;
- t->url.rdw_area.g_h = -1;
- } else {
- /* just copy stuff from the offscreen buffer */
- }
- }
-}
-
-CMP_TOOLBAR tb_create( struct gui_window * gw )
-{
- int i;
-
-
- CMP_TOOLBAR t = malloc( sizeof(struct s_toolbar) );
- if( t == NULL )
- return( NULL );
-
- t->owner = gw;
+ t->owner = owner;
t->style = 1;
/* create the root component: */
- t->comp = (COMPONENT*)mt_CompCreate(&app, CLT_HORIZONTAL,
- toolbar_styles[t->style].height, 0 );
- t->comp->rect.g_h = toolbar_styles[t->style].height;
- t->comp->bounds.max_height = toolbar_styles[t->style].height;
- mt_CompEvntDataAdd(&app, t->comp, WM_REDRAW, evnt_toolbar_redraw,
- gw, EV_BOT);
+ t->area.g_h = toolbar_styles[t->style].height;
/* count buttons and add them as components: */
i = 0;
- while( tb_buttons[i].rsc_id > 0 ) {
+ while(tb_buttons[i].rsc_id > 0) {
i++;
}
t->btcnt = i;
- t->buttons = malloc( t->btcnt * sizeof(struct s_tb_button) );
- memset( t->buttons, 0, t->btcnt * sizeof(struct s_tb_button) );
- for( i=0; i < t->btcnt; i++ ) {
- button_init( t, toolbar_buttons, i, &t->buttons[i] );
- mt_CompAttach( &app, t->comp, t->buttons[i].comp );
+ t->buttons = malloc(t->btcnt * sizeof(struct s_tb_button));
+ memset( t->buttons, 0, t->btcnt * sizeof(struct s_tb_button));
+ for (i=0; i < t->btcnt; i++ ) {
+ button_init(t, aes_toolbar, i, &t->buttons[i]);
}
/* create the url widget: */
@@ -770,30 +376,16 @@ CMP_TOOLBAR tb_create( struct gui_window * gw )
int ta_height = toolbar_styles[t->style].height;
ta_height -= (TOOLBAR_URL_MARGIN_TOP + TOOLBAR_URL_MARGIN_BOTTOM);
- t->url.textarea = textarea_create( 300,
- ta_height,
- 0,
- &font_style_url, tb_txt_request_redraw,
- t );
+ t->url.textarea = textarea_create(300, ta_height, 0, &font_style_url,
+ tb_txt_request_redraw, t);
if( t->url.textarea != NULL ){
textarea_set_text(t->url.textarea, "http://");
}
-
- t->url.comp = (COMPONENT*)mt_CompCreate(&app, CLT_HORIZONTAL,
- toolbar_styles[t->style].height, 1);
- mt_CompEvntDataAttach( &app, t->url.comp, WM_REDRAW, evnt_url_redraw, t);
- mt_CompEvntAttach( &app, t->url.comp, WM_XBUTTON, evnt_url_click );
- mt_CompDataAttach( &app, t->url.comp, CDT_OWNER, gw );
- mt_CompAttach( &app, t->comp, t->url.comp );
/* create the throbber widget: */
- t->throbber.comp = (COMPONENT*)mt_CompCreate(&app, CLT_HORIZONTAL,
- toolbar_styles[t->style].height, 0);
- t->throbber.comp->rect.g_h = toolbar_styles[t->style].height;
- t->throbber.comp->rect.g_w = t->throbber.comp->bounds.max_width = \
- toolbar_styles[t->style].icon_width + \
+ t->throbber.area.g_h = toolbar_styles[t->style].height;
+ t->throbber.area.g_w = toolbar_styles[t->style].icon_width + \
(2*toolbar_styles[t->style].button_vmargin );
- t->throbber.comp->bounds.max_height = toolbar_styles[t->style].height;
if( img_toolbar == true ){
t->throbber.index = 0;
t->throbber.max_index = 8;
@@ -801,251 +393,163 @@ CMP_TOOLBAR tb_create( struct gui_window * gw )
t->throbber.index = THROBBER_MIN_INDEX;
t->throbber.max_index = THROBBER_MAX_INDEX;
}
- t->throbber.running = false;
- mt_CompEvntAttach( &app, t->throbber.comp, WM_REDRAW, evnt_throbber_redraw );
- mt_CompDataAttach( &app, t->throbber.comp, CDT_OWNER, gw );
- mt_CompAttach( &app, t->comp, t->throbber.comp );
+ t->throbber.running = false;
+
+ LOG(("created toolbar: %p, root: %p, textarea: %p, throbber: %p", t,
+ owner, t->url.textarea, t->throbber));
return( t );
-}
-
-
-void tb_destroy( CMP_TOOLBAR tb )
+}
+
+
+void toolbar_destroy(struct s_toolbar *tb)
{
- free( tb->buttons );
+ free(tb->buttons);
textarea_destroy( tb->url.textarea );
- mt_CompDelete( &app, tb->comp);
- free( tb );
-}
-
-
-struct gui_window * tb_gui_window( CMP_TOOLBAR tb )
-{
- struct gui_window * gw;
- gw = window_list;
- while( gw != NULL ) {
- if( gw->root->toolbar == tb ) {
- LOG(("found tb gw: %p (tb: %p) for tb: %p", gw, gw->root->toolbar, tb ));
- return( gw );
- }
- else
- gw = gw->next;
- }
- return( NULL );
-}
-
-
-void tb_update_buttons( struct gui_window * gw, short button )
+ free(tb);
+}
+
+static void toolbar_objc_reflow(struct s_toolbar *tb)
{
-
-#define FIRST_BUTTON TOOLBAR_BT_BACK
-
- struct s_tb_button * bt;
- bool enable = false;
- if( button == TOOLBAR_BT_BACK || button <= 0 ){
- bt = &gw->root->toolbar->buttons[TOOLBAR_BT_BACK-FIRST_BUTTON];
- enable = browser_window_back_available(gw->browser->bw);
- if( enable ){
- bt->state = button_on;
- } else {
- bt->state = button_off;
- }
- mt_CompEvntRedraw( &app, bt->comp );
- }
+ aes_toolbar->ob_x = tb->area.g_x;
+ aes_toolbar->ob_y = tb->area.g_y;
+ aes_toolbar->ob_width = tb->area.g_w;
+ aes_toolbar->ob_height = tb->area.g_h;
- if( button == TOOLBAR_BT_HOME || button <= 0 ){
- bt = &gw->root->toolbar->buttons[TOOLBAR_BT_HOME-FIRST_BUTTON];
- mt_CompEvntRedraw( &app, bt->comp );
- }
+ aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x = tb->area.g_w
+ - aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width;
- if( button == TOOLBAR_BT_FORWARD || button <= 0 ){
- bt = &gw->root->toolbar->buttons[TOOLBAR_BT_FORWARD-FIRST_BUTTON];
- enable = browser_window_forward_available(gw->browser->bw);
- if( enable ){
- bt->state = button_on;
- } else {
- bt->state = button_off;
- }
- mt_CompEvntRedraw( &app, bt->comp );
- }
+ aes_toolbar[TOOLBAR_URL_AREA].ob_width = tb->area.g_w
+ - (aes_toolbar[TOOLBAR_NAVIGATION_AREA].ob_width
+ + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width);
+}
- if( button == TOOLBAR_BT_RELOAD || button <= 0 ){
- bt = &gw->root->toolbar->buttons[TOOLBAR_BT_RELOAD-FIRST_BUTTON];
- enable = browser_window_reload_available(gw->browser->bw);
- if( enable ){
- bt->state = button_on;
- } else {
- bt->state = button_off;
- }
- mt_CompEvntRedraw( &app, bt->comp );
- }
+void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
+{
+ // position toolbar areas:
+ toolbar_objc_reflow(tb);
+ objc_draw_grect(aes_toolbar,0,8,clip);
- if( button == TOOLBAR_BT_STOP || button <= 0 ){
- bt = &gw->root->toolbar->buttons[TOOLBAR_BT_STOP-FIRST_BUTTON];
- enable = browser_window_stop_available(gw->browser->bw);
- if( enable ){
- bt->state = button_on;
- } else {
- bt->state = button_off;
- }
- mt_CompEvntRedraw( &app, bt->comp );
- }
+ // position throbber image:
+ throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
+ aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x;
-#undef FIRST_BUTON
-}
-
-
-
-void tb_url_set( struct gui_window * gw, char * text )
-{
- LGRECT work;
- int len = strlen(text);
- char * newtext;
- int newsize;
-
- if( gw->root->toolbar == NULL )
- return;
-
- if( gw->browser->attached == false )
- return;
-
- struct s_url_widget * url = &gw->root->toolbar->url;
-
- assert( gw != NULL );
- assert( gw->browser != NULL );
- assert( gw->root != NULL );
- assert( gw->browser->bw != NULL );
-
- textarea_set_text(url->textarea, text);
-
- mt_CompGetLGrect( &app, gw->root->toolbar->url.comp, WF_WORKXYWH, &work);
- work.g_w -= (TOOLBAR_URL_MARGIN_LEFT + TOOLBAR_URL_MARGIN_RIGHT);
- /* do not overwrite the black border, because of that, add 1 */
- work.g_h -= (TOOLBAR_URL_MARGIN_TOP + TOOLBAR_URL_MARGIN_BOTTOM+1);
- tb_txt_request_redraw( gw->root->toolbar, 0,0,work.g_w,work.g_h );
- tb_update_buttons( gw, TOOLBAR_BT_STOP );
- return;
-}
-
-
-/* -------------------------------------------------------------------------- */
-/* Public Module event handlers: */
-/* -------------------------------------------------------------------------- */
-
-bool tb_url_input( struct gui_window * gw, short nkc )
-{
- CMP_TOOLBAR tb = gw->root->toolbar;
- assert(tb!=NULL);
- LGRECT work;
- bool ret = false;
-
- assert( gw != NULL );
-
- long ucs4;
- long ik = nkc_to_input_key( nkc, &ucs4 );
-
- if( ik == 0 ){
- if ( (nkc&0xFF) >= 9 ) {
- ret = textarea_keypress( tb->url.textarea, ucs4 );
- }
- }
- else if( ik == KEY_CR || ik == KEY_NL ){
- char tmp_url[PATH_MAX];
- if( textarea_get_text( tb->url.textarea, tmp_url, PATH_MAX) > 0 ) {
- window_set_focus( gw, BROWSER, gw->browser);
- browser_window_go(gw->browser->bw, (const char*)&tmp_url, 0, true);
- ret = true;
- }
- }
- else if( ik == KEY_COPY_SELECTION ){
- // copy whole text
- char * text;
- int len;
- len = textarea_get_text( tb->url.textarea, NULL, 0 );
- text = malloc( len+1 );
- if( text ){
- textarea_get_text( tb->url.textarea, text, len+1 );
- scrap_txt_write( &app, text );
- free( text );
- }
- }
- else if( ik == KEY_PASTE ){
- char * clip = scrap_txt_read( &app );
- if( clip != NULL ){
- int clip_length = strlen( clip );
- if ( clip_length > 0 ) {
- char *utf8;
- utf8_convert_ret res;
- /* Clipboard is in local encoding so
- * convert to UTF8 */
- res = utf8_from_local_encoding( clip, clip_length, &utf8 );
- if ( res == UTF8_CONVERT_OK ) {
- tb_url_set( gw, utf8 );
- free(utf8);
- ret = true;
- }
- free( clip );
- }
- }
- }
- else if( ik == KEY_ESCAPE ) {
- textarea_keypress( tb->url.textarea, KEY_SELECT_ALL );
- textarea_keypress( tb->url.textarea, KEY_DELETE_LEFT );
- }
- else {
- ret = textarea_keypress( tb->url.textarea, ik );
- }
-
- return( ret );
-}
+ throbber_form[tb->throbber.index].ob_x = tb->area.g_x
+ + aes_toolbar[TOOLBAR_THROBBER_AREA].ob_x +
+ ((aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width
+ - throbber_form[tb->throbber.index].ob_width) >> 1);
+
+ throbber_form[tb->throbber.index].ob_y = tb->area.g_y +
+ ((aes_toolbar[TOOLBAR_THROBBER_AREA].ob_height
+ - throbber_form[tb->throbber.index].ob_height) >> 1);
+
+ printf("x pos: %d, y pos: %d\n", throbber_form[tb->throbber.index].ob_x,
+ throbber_form[tb->throbber.index].ob_y);
+ objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
+
+}
+
+
+void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
+ short button)
+{
+ LOG((""));
+}
+
+
+void toolbar_set_dimensions(struct s_toolbar *tb, GRECT *area)
+{
+ tb->area = *area;
+ if (img_toolbar != 0) {
+ toolbar_reflow(tb);
+ }
+}
+
+
+void toolbar_set_url(struct s_toolbar *tb, const char * text)
+{
+ LOG((""));
+}
+
+
+bool toolbar_text_input(struct s_toolbar *tb, char *text)
+{
+ bool handled = true;
+
+ LOG((""));
+
+ return(handled);
+}
+
+bool toolbar_key_input(struct s_toolbar *tb, short nkc)
+{
+ bool handled = true;
+
+ LOG((""));
+
+ return(handled);
+}
+
+
+void toolbar_mouse_input(struct s_toolbar *tb, short mx, short my)
+{
+ LOG((""));
+}
+
+
+
+void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *dst)
+{
+
+}
+
+
+struct text_area *toolbar_get_textarea(struct s_toolbar *tb,
+ enum toolbar_textarea which)
+{
+ return(tb->url.textarea);
+}
+
+
+/* public event handler */
+void toolbar_back_click(struct s_toolbar *tb)
+{
+ assert(input_window != NULL);
-void tb_back_click( struct gui_window * gw )
-{
- struct browser_window *bw = gw->browser->bw;
+ struct browser_window *bw = input_window->browser->bw;
if( history_back_available(bw->history) )
history_back(bw, bw->history);
}
-void tb_reload_click( struct gui_window * gw )
+void toolbar_reload_click(struct s_toolbar *tb)
{
- browser_window_reload( gw->browser->bw, true );
+ assert(input_window != NULL);
+ browser_window_reload(input_window->browser->bw, true);
}
-void tb_forward_click( struct gui_window * gw )
-{
- struct browser_window *bw = gw->browser->bw;
+void toolbar_forward_click(struct s_toolbar *tb)
+{
+ assert(input_window != NULL);
+ struct browser_window *bw = input_window->browser->bw;
if (history_forward_available(bw->history))
history_forward(bw, bw->history);
}
-void tb_home_click( struct gui_window * gw )
+void toolbar_home_click(struct s_toolbar *tb)
{
- browser_window_go(gw->browser->bw, option_homepage_url, 0, true);
+ assert(input_window != NULL);
+ struct browser_window * bw;
+ struct gui_window * gw;
+
+ gw = window_get_active_gui_window(tb->owner);
+ bw = gw->browser->bw;
+ browser_window_go(bw, option_homepage_url, 0, true);
}
-void tb_stop_click( struct gui_window * gw )
+void toolbar_stop_click(struct s_toolbar *tb)
{
- browser_window_stop(gw->browser->bw);
+ assert(input_window != NULL);
+ browser_window_stop(input_window->browser->bw);
}
-
-void tb_hide( struct gui_window * gw, short mode )
-{
- CMP_TOOLBAR tb = gw->root->toolbar;
- assert( tb != NULL );
- if( mode == 1 ){
- tb->hidden = true;
- tb->comp->rect.g_h = 0;
- tb->comp->bounds.max_height = 0;
-
- } else {
- tb->hidden = false;
- tb->comp->rect.g_h = toolbar_styles[tb->style].height;
- tb->comp->bounds.max_height = toolbar_styles[tb->style].height;
- }
- gw->browser->reformat_pending = true;
- browser_update_rects( gw );
- snd_rdw( gw->root->handle );
-}
-