2008-08-02 18:31:32 +04:00
/*
2014-01-03 22:17:25 +04:00
* Copyright 2008 - 2014 Chris Young < chris @ unsatisfactorysoftware . co . uk >
2008-08-02 18:31:32 +04:00
*
* This file is part of NetSurf , http : //www.netsurf-browser.org/
*
* NetSurf is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* NetSurf is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2010-02-14 15:26:12 +03:00
2008-08-11 21:53:45 +04:00
2010-02-14 15:26:12 +03:00
/* Custom StringView class */
2009-07-23 15:23:34 +04:00
# include "amiga/stringview/stringview.h"
# include "amiga/stringview/urlhistory.h"
2010-02-14 15:26:12 +03:00
/* AmigaOS libraries */
2011-01-07 02:17:17 +03:00
# ifdef __amigaos4__
2010-02-14 15:26:12 +03:00
# include <proto/application.h>
2011-01-07 02:17:17 +03:00
# endif
2010-02-14 15:26:12 +03:00
# include <proto/asl.h>
# include <proto/datatypes.h>
# include <proto/dos.h>
# include <proto/exec.h>
# include <proto/graphics.h>
# include <proto/intuition.h>
# include <proto/keymap.h>
# include <proto/locale.h>
# include <proto/Picasso96API.h>
2014-01-11 00:32:20 +04:00
# include <proto/popupmenu.h>
2010-02-14 15:26:12 +03:00
# include <proto/utility.h>
# include <proto/wb.h>
2008-08-15 21:19:57 +04:00
2010-02-14 15:26:12 +03:00
/* Other OS includes */
2010-04-02 20:25:55 +04:00
# include <datatypes/textclass.h>
2010-02-14 15:26:12 +03:00
# include <devices/inputevent.h>
2011-01-07 02:50:50 +03:00
# ifdef __amigaos4__
2010-03-24 01:27:33 +03:00
# include <graphics/blitattr.h>
2010-02-14 15:26:12 +03:00
# include <libraries/application.h>
# include <libraries/keymap.h>
2011-01-07 02:50:50 +03:00
# endif
# include <libraries/gadtools.h>
2010-02-14 15:26:12 +03:00
# include <intuition/icclass.h>
# include <graphics/rpattr.h>
# include <workbench/workbench.h>
2013-05-28 20:34:29 +04:00
# include <intuition/gui.h>
# include <intuition/screens.h>
2010-02-14 15:26:12 +03:00
/* ReAction libraries */
# include <proto/bevel.h>
2008-08-09 02:38:13 +04:00
# include <proto/bitmap.h>
2008-08-09 19:19:04 +04:00
# include <proto/button.h>
2014-06-15 18:39:49 +04:00
# include <proto/chooser.h>
2008-09-28 00:55:11 +04:00
# include <proto/clicktab.h>
2010-02-14 15:26:12 +03:00
# include <proto/layout.h>
2014-10-25 16:17:49 +04:00
# include <proto/scroller.h>
2010-02-14 15:26:12 +03:00
# include <proto/space.h>
2012-11-28 23:29:43 +04:00
# include <proto/speedbar.h>
2010-02-14 15:26:12 +03:00
# include <proto/string.h>
# include <proto/window.h>
2008-08-09 02:38:13 +04:00
# include <classes/window.h>
2010-02-14 15:26:12 +03:00
# include <gadgets/button.h>
2014-06-15 18:39:49 +04:00
# include <gadgets/chooser.h>
2010-02-14 15:26:12 +03:00
# include <gadgets/clicktab.h>
2008-08-09 02:38:13 +04:00
# include <gadgets/layout.h>
2008-08-09 19:19:04 +04:00
# include <gadgets/scroller.h>
2008-08-11 21:53:45 +04:00
# include <gadgets/space.h>
2012-11-28 23:29:43 +04:00
# include <gadgets/speedbar.h>
2010-02-14 15:26:12 +03:00
# include <gadgets/string.h>
# include <images/bevel.h>
# include <images/bitmap.h>
2008-08-09 02:38:13 +04:00
# include <reaction/reaction_macros.h>
2010-02-14 15:26:12 +03:00
/* newlib includes */
# include <math.h>
# include <string.h>
2014-10-16 12:55:01 +04:00
/* NetSurf core includes */
# include "utils/log.h"
# include "utils/messages.h"
# include "utils/nsoption.h"
# include "utils/utf8.h"
# include "utils/utils.h"
# include "utils/nsurl.h"
# include "utils/file.h"
# include "content/backing_store.h"
# include "content/fetchers.h"
# include "content/fetchers/resource.h"
# include "content/urldb.h"
# include "image/ico.h"
# include "desktop/browser_history.h"
# include "desktop/browser_private.h"
# include "desktop/hotlist.h"
# include "desktop/mouse.h"
# include "desktop/netsurf.h"
# include "desktop/version.h"
# include "desktop/save_complete.h"
# include "desktop/scrollbar.h"
# include "desktop/searchweb.h"
# include "desktop/textinput.h"
# include "desktop/tree.h"
# include "desktop/gui_window.h"
# include "desktop/gui_fetch.h"
# include "desktop/gui_misc.h"
/* NetSurf Amiga platform includes */
# include "amiga/gui.h"
# include "amiga/arexx.h"
# include "amiga/bitmap.h"
# include "amiga/clipboard.h"
# include "amiga/context_menu.h"
# include "amiga/cookies.h"
# include "amiga/datatypes.h"
# include "amiga/download.h"
# include "amiga/drag.h"
# include "amiga/file.h"
# include "amiga/filetype.h"
# include "amiga/font.h"
# include "amiga/gui_options.h"
# include "amiga/help.h"
# include "amiga/history.h"
# include "amiga/history_local.h"
# include "amiga/hotlist.h"
# include "amiga/icon.h"
# include "amiga/launch.h"
2014-11-08 22:25:53 +03:00
# include "amiga/libs.h"
2014-10-16 12:55:01 +04:00
# include "amiga/login.h"
# include "amiga/menu.h"
# include "amiga/misc.h"
# include "amiga/plotters.h"
# include "amiga/plugin_hack.h"
# include "amiga/print.h"
# include "amiga/schedule.h"
# include "amiga/search.h"
# include "amiga/theme.h"
# include "amiga/tree.h"
# include "amiga/utf8.h"
# include "amiga/sslcert.h"
2013-05-28 20:00:55 +04:00
# define AMINS_SCROLLERPEN NUMDRIPENS
2013-05-28 19:44:46 +04:00
2011-09-25 14:08:23 +04:00
# define NSA_KBD_SCROLL_PX 10
2011-06-03 22:08:17 +04:00
/* Extra mouse button defines to match those in intuition/intuition.h */
2011-06-03 22:11:19 +04:00
# define SIDEDOWN (IECODE_4TH_BUTTON)
# define SIDEUP (IECODE_4TH_BUTTON | IECODE_UP_PREFIX)
# define EXTRADOWN (IECODE_5TH_BUTTON)
# define EXTRAUP (IECODE_5TH_BUTTON | IECODE_UP_PREFIX)
2011-06-03 22:08:17 +04:00
2014-10-12 12:58:54 +04:00
static bool ami_quit = false ;
2014-02-02 02:44:43 +04:00
extern struct gui_utf8_table * amiga_utf8_table ;
2013-09-12 15:29:47 +04:00
struct ami_gui_tb_userdata {
struct List * sblist ;
struct gui_window_2 * gw ;
int items ;
} ;
2008-09-04 02:02:41 +04:00
struct MsgPort * appport ;
2009-07-23 15:23:34 +04:00
Class * urlStringClass ;
2008-12-08 00:50:04 +03:00
BOOL locked_screen = FALSE ;
2009-07-04 20:12:27 +04:00
BOOL screen_closed = FALSE ;
2014-10-25 19:22:08 +04:00
int screen_signal = - 1 ;
2014-10-25 23:17:33 +04:00
ULONG sz_gad_width = 0 ;
2014-10-26 20:00:18 +03:00
ULONG sz_gad_height = 0 ;
2014-02-07 01:23:24 +04:00
2009-09-28 22:00:40 +04:00
struct MsgPort * applibport = NULL ;
ULONG applibsig = 0 ;
2014-11-16 17:06:12 +03:00
uint32 ami_appid = 0 ;
2012-04-07 21:16:32 +04:00
struct Hook newprefs_hook ;
2008-09-11 23:33:40 +04:00
2014-01-19 02:10:18 +04:00
STRPTR temp_homepage_url = NULL ;
bool cli_force = false ;
2012-03-29 02:17:27 +04:00
static char * current_user ;
static char * current_user_dir ;
2014-06-30 01:35:52 +04:00
static char * current_user_faviconcache ;
2012-03-29 02:17:27 +04:00
2014-10-31 00:51:52 +03:00
static const __attribute__ ( ( used ) ) char * stack_cookie = " \0 $STACK:131072 \0 " ;
2009-03-27 23:04:34 +03:00
2011-09-07 22:38:08 +04:00
const char * const versvn ;
const char * const verdate ;
2008-08-15 21:19:57 +04:00
void ami_scroller_hook ( struct Hook * , Object * , struct IntuiMessage * ) ;
2008-10-21 22:04:27 +04:00
void ami_switch_tab ( struct gui_window_2 * gwin , bool redraw ) ;
2009-12-13 14:52:58 +03:00
void ami_change_tab ( struct gui_window_2 * gwin , int direction ) ;
2009-08-29 03:12:18 +04:00
void ami_get_hscroll_pos ( struct gui_window_2 * gwin , ULONG * xs ) ;
2009-08-31 01:43:14 +04:00
void ami_get_vscroll_pos ( struct gui_window_2 * gwin , ULONG * ys ) ;
2012-12-08 22:08:00 +04:00
void ami_quit_netsurf_delayed ( void ) ;
2011-05-08 02:21:41 +04:00
Object * ami_gui_splash_open ( void ) ;
void ami_gui_splash_close ( Object * win_obj ) ;
2012-04-29 19:59:37 +04:00
static uint32 ami_set_favicon_render_hook ( struct Hook * hook , APTR space ,
struct gpRender * msg ) ;
static uint32 ami_set_throbber_render_hook ( struct Hook * hook , APTR space ,
struct gpRender * msg ) ;
2011-10-29 18:14:13 +04:00
bool ami_gui_map_filename ( char * * remapped , const char * path , const char * file ,
const char * map ) ;
2013-02-14 00:23:17 +04:00
static void ami_gui_window_update_box_deferred ( struct gui_window * g , bool draw ) ;
2013-04-04 22:46:33 +04:00
static void ami_do_redraw ( struct gui_window_2 * g ) ;
2013-04-12 00:32:05 +04:00
static void ami_schedule_redraw_remove ( struct gui_window_2 * gwin ) ;
2008-08-10 00:27:36 +04:00
2014-01-13 05:08:15 +04:00
static bool gui_window_get_scroll ( struct gui_window * g , int * sx , int * sy ) ;
static void gui_window_set_scroll ( struct gui_window * g , int sx , int sy ) ;
2014-01-16 18:43:48 +04:00
static void gui_window_remove_caret ( struct gui_window * g ) ;
static void gui_window_place_caret ( struct gui_window * g , int x , int y , int height , const struct rect * clip ) ;
2014-01-13 05:08:15 +04:00
2013-06-01 19:05:51 +04:00
/* accessors for default options - user option is updated if it is set as per default */
# define nsoption_default_set_int(OPTION, VALUE) \
if ( nsoptions_default [ NSOPTION_ # # OPTION ] . value . i = = nsoptions [ NSOPTION_ # # OPTION ] . value . i ) \
nsoptions [ NSOPTION_ # # OPTION ] . value . i = VALUE ; \
nsoptions_default [ NSOPTION_ # # OPTION ] . value . i = VALUE
2014-05-07 19:14:18 +04:00
2009-06-22 02:12:52 +04:00
STRPTR ami_locale_langs ( void )
{
struct Locale * locale ;
2014-04-05 22:29:27 +04:00
STRPTR acceptlangs = NULL ;
2011-10-29 18:14:13 +04:00
char * remapped ;
2009-06-22 02:12:52 +04:00
2014-10-18 02:18:58 +04:00
if ( ( locale = OpenLocale ( NULL ) ) )
2009-06-22 02:12:52 +04:00
{
2014-04-05 22:29:27 +04:00
for ( int i = 0 ; i < 10 ; i + + )
2009-06-22 02:12:52 +04:00
{
if ( locale - > loc_PrefLanguages [ i ] )
{
2011-10-29 18:14:13 +04:00
if ( ami_gui_map_filename ( & remapped , " PROGDIR:Resources " ,
locale - > loc_PrefLanguages [ i ] , " LangNames " ) )
2009-06-22 02:12:52 +04:00
{
if ( acceptlangs )
{
2014-04-05 22:29:27 +04:00
STRPTR acceptlangs2 = acceptlangs ;
2011-10-29 18:14:13 +04:00
acceptlangs = ASPrintf ( " %s, %s " , acceptlangs2 , remapped ) ;
2009-06-22 02:12:52 +04:00
FreeVec ( acceptlangs2 ) ;
acceptlangs2 = NULL ;
}
else
{
2011-10-29 18:14:13 +04:00
acceptlangs = ASPrintf ( " %s " , remapped ) ;
2009-06-22 02:12:52 +04:00
}
}
}
else
{
continue ;
}
}
CloseLocale ( locale ) ;
}
return acceptlangs ;
}
2011-10-29 17:35:55 +04:00
bool ami_gui_map_filename ( char * * remapped , const char * path , const char * file , const char * map )
2011-10-29 17:32:53 +04:00
{
BPTR fh = 0 ;
2014-05-10 18:22:38 +04:00
char * mapfile = NULL ;
size_t mapfile_size = 0 ;
2011-10-29 17:32:53 +04:00
char buffer [ 1024 ] ;
char * realfname ;
bool found = false ;
2014-05-11 19:54:36 +04:00
netsurf_mkpath ( & mapfile , & mapfile_size , 2 , path , map ) ;
2011-10-29 17:32:53 +04:00
2014-05-10 18:22:38 +04:00
if ( mapfile = = NULL ) return false ;
2014-10-18 02:18:58 +04:00
fh = FOpen ( mapfile , MODE_OLDFILE , 0 ) ;
if ( fh )
2011-10-29 17:32:53 +04:00
{
while ( FGets ( fh , buffer , 1024 ) ! = 0 )
{
if ( ( buffer [ 0 ] = = ' # ' ) | |
( buffer [ 0 ] = = ' \n ' ) | |
( buffer [ 0 ] = = ' \0 ' ) ) continue ;
2014-10-18 02:18:58 +04:00
realfname = strchr ( buffer , ' : ' ) ;
if ( realfname )
2011-10-29 17:32:53 +04:00
{
2011-10-29 18:14:13 +04:00
if ( strncmp ( buffer , file , strlen ( file ) ) = = 0 )
2011-10-29 17:32:53 +04:00
{
if ( realfname [ strlen ( realfname ) - 1 ] = = ' \n ' )
realfname [ strlen ( realfname ) - 1 ] = ' \0 ' ;
* remapped = strdup ( realfname + 1 ) ;
found = true ;
break ;
}
}
}
FClose ( fh ) ;
}
if ( found = = false ) * remapped = strdup ( file ) ;
2011-10-29 17:51:19 +04:00
else LOG ( ( " Remapped %s to %s in path %s using %s " , file , * remapped , path , map ) ) ;
2011-10-29 17:32:53 +04:00
2014-05-10 18:22:38 +04:00
free ( mapfile ) ;
2011-10-29 17:32:53 +04:00
return found ;
}
2014-10-16 12:55:01 +04:00
static bool ami_gui_check_resource ( char * fullpath , const char * file )
2011-10-29 17:32:53 +04:00
{
bool found = false ;
char * remapped ;
BPTR lock = 0 ;
2014-05-07 19:14:18 +04:00
size_t fullpath_len = 1024 ;
2011-10-29 17:32:53 +04:00
2011-10-29 17:51:19 +04:00
ami_gui_map_filename ( & remapped , fullpath , file , " Resource.map " ) ;
2014-05-11 19:54:36 +04:00
netsurf_mkpath ( & fullpath , & fullpath_len , 2 , fullpath , remapped ) ;
2011-10-29 17:32:53 +04:00
2013-06-02 19:07:59 +04:00
LOG ( ( " Checking for %s " , fullpath ) ) ;
2014-10-18 02:18:58 +04:00
lock = Lock ( fullpath , ACCESS_READ ) ;
if ( lock )
2011-10-29 17:32:53 +04:00
{
UnLock ( lock ) ;
found = true ;
}
2011-10-29 17:51:19 +04:00
if ( found ) LOG ( ( " Found %s " , fullpath ) ) ;
2011-10-29 17:35:55 +04:00
free ( remapped ) ;
2011-10-29 17:32:53 +04:00
return found ;
}
2011-10-29 15:24:29 +04:00
bool ami_locate_resource ( char * fullpath , const char * file )
2008-08-02 18:31:32 +04:00
{
2008-08-10 00:27:36 +04:00
struct Locale * locale ;
int i ;
2011-03-13 21:33:57 +03:00
bool found = false ;
2011-10-29 17:51:19 +04:00
char * remapped ;
2014-05-07 19:14:18 +04:00
size_t fullpath_len = 1024 ;
2008-08-23 20:17:51 +04:00
2012-03-30 23:28:37 +04:00
/* Check NetSurf user data area first */
strcpy ( fullpath , current_user_dir ) ;
found = ami_gui_check_resource ( fullpath , file ) ;
if ( found ) return true ;
2013-08-15 21:21:12 +04:00
/* Check current theme directory */
2012-03-22 13:34:34 +04:00
if ( nsoption_charp ( theme ) )
2011-10-29 15:24:29 +04:00
{
2012-03-22 13:34:34 +04:00
strcpy ( fullpath , nsoption_charp ( theme ) ) ;
2011-10-29 17:32:53 +04:00
found = ami_gui_check_resource ( fullpath , file ) ;
if ( found ) return true ;
2011-10-29 15:24:29 +04:00
}
/* If not found, start on the user's preferred languages */
2008-08-10 00:27:36 +04:00
locale = OpenLocale ( NULL ) ;
for ( i = 0 ; i < 10 ; i + + )
2008-08-09 19:19:04 +04:00
{
2011-10-29 15:24:29 +04:00
strcpy ( fullpath , " PROGDIR:Resources/ " ) ;
2011-10-29 17:32:53 +04:00
2008-08-10 00:27:36 +04:00
if ( locale - > loc_PrefLanguages [ i ] )
{
2011-10-29 17:51:19 +04:00
ami_gui_map_filename ( & remapped , " PROGDIR:Resources " ,
locale - > loc_PrefLanguages [ i ] , " LangNames " ) ;
2014-05-11 19:54:36 +04:00
netsurf_mkpath ( & fullpath , & fullpath_len , 2 , fullpath , remapped ) ;
2011-10-29 17:51:19 +04:00
2011-10-29 17:32:53 +04:00
found = ami_gui_check_resource ( fullpath , file ) ;
2008-08-10 00:27:36 +04:00
}
else
{
continue ;
}
2011-03-13 21:33:57 +03:00
2011-10-29 17:32:53 +04:00
if ( found ) break ;
2008-08-10 00:27:36 +04:00
}
if ( ! found )
{
2011-03-13 21:33:57 +03:00
/* If not found yet, check in PROGDIR:Resources/en,
* might not be in user ' s preferred languages */
2011-10-29 15:24:29 +04:00
strcpy ( fullpath , " PROGDIR:Resources/en/ " ) ;
2011-10-29 17:32:53 +04:00
found = ami_gui_check_resource ( fullpath , file ) ;
2008-08-09 19:19:04 +04:00
}
2008-08-10 00:27:36 +04:00
CloseLocale ( locale ) ;
2011-03-13 21:33:57 +03:00
if ( ! found )
{
/* Lastly check directly in PROGDIR:Resources */
2011-10-29 15:24:29 +04:00
strcpy ( fullpath , " PROGDIR:Resources/ " ) ;
2011-10-29 17:32:53 +04:00
found = ami_gui_check_resource ( fullpath , file ) ;
2011-03-13 21:33:57 +03:00
}
return found ;
2010-03-24 01:55:56 +03:00
}
2008-08-10 00:27:36 +04:00
2014-11-10 21:56:09 +03:00
static bool ami_open_resources ( void )
2010-03-24 01:55:56 +03:00
{
urlStringClass = MakeStringClass ( ) ;
if ( ! ( appport = AllocSysObjectTags ( ASOT_PORT ,
2014-11-10 21:56:09 +03:00
ASO_NoTrack , FALSE ,
TAG_DONE ) ) ) return false ;
2010-03-24 01:55:56 +03:00
if ( ! ( sport = AllocSysObjectTags ( ASOT_PORT ,
2014-11-10 21:56:09 +03:00
ASO_NoTrack , FALSE ,
TAG_DONE ) ) ) return false ;
2010-03-24 01:55:56 +03:00
2011-10-15 18:09:35 +04:00
ami_file_req_init ( ) ;
2014-11-10 21:56:09 +03:00
return true ;
2010-03-24 01:55:56 +03:00
}
2013-05-28 20:22:07 +04:00
static UWORD ami_system_colour_scrollbar_fgpen ( struct DrawInfo * drinfo )
{
LONG scrollerfillpen = FALSE ;
GetGUIAttrs ( NULL , drinfo , GUIA_PropKnobColor , & scrollerfillpen , TAG_DONE ) ;
if ( scrollerfillpen ) return FILLPEN ;
else return FOREGROUNDPEN ;
}
2013-05-27 18:01:47 +04:00
/**
* set option from pen
*/
static nserror
2013-06-01 18:27:29 +04:00
colour_option_from_pen ( UWORD pen ,
2013-05-27 18:01:47 +04:00
enum nsoption_e option ,
2013-06-01 21:56:53 +04:00
struct Screen * screen ,
2013-05-27 18:01:47 +04:00
colour def_colour )
{
2014-04-05 22:32:30 +04:00
ULONG colr [ 3 ] ;
2013-05-27 18:01:47 +04:00
struct DrawInfo * drinfo ;
if ( ( option < NSOPTION_SYS_COLOUR_START ) | |
( option > NSOPTION_SYS_COLOUR_END ) | |
2013-06-01 18:27:29 +04:00
( nsoptions [ option ] . type ! = OPTION_COLOUR ) ) {
2013-05-27 18:01:47 +04:00
return NSERROR_BAD_PARAMETER ;
}
2013-06-01 21:56:53 +04:00
if ( screen ! = NULL ) {
drinfo = GetScreenDrawInfo ( screen ) ;
2013-05-27 18:01:47 +04:00
if ( drinfo ! = NULL ) {
if ( pen = = AMINS_SCROLLERPEN ) pen = ami_system_colour_scrollbar_fgpen ( drinfo ) ;
/* Get the colour of the pen being used for "pen" */
2014-04-05 22:32:30 +04:00
GetRGB32 ( screen - > ViewPort . ColorMap , drinfo - > dri_Pens [ pen ] , 1 , ( ULONG * ) & colr ) ;
2013-05-27 18:01:47 +04:00
/* convert it to a color */
2014-04-05 22:32:30 +04:00
def_colour = ( ( colr [ 0 ] & 0xff000000 ) > > 24 ) |
( ( colr [ 1 ] & 0xff000000 ) > > 16 ) |
( ( colr [ 2 ] & 0xff000000 ) > > 8 ) ;
2013-05-27 18:01:47 +04:00
2013-06-01 21:56:53 +04:00
FreeScreenDrawInfo ( screen , drinfo ) ;
2013-05-27 18:01:47 +04:00
}
}
2013-06-01 18:11:26 +04:00
if ( nsoptions_default [ option ] . value . c = = nsoptions [ option ] . value . c )
nsoptions [ option ] . value . c = def_colour ;
nsoptions_default [ option ] . value . c = def_colour ;
2013-05-27 18:01:47 +04:00
return NSERROR_OK ;
}
2013-06-01 21:56:53 +04:00
static void ami_set_screen_defaults ( struct Screen * screen )
2013-05-31 22:34:22 +04:00
{
2013-06-01 17:58:51 +04:00
nsoption_default_set_int ( window_x , 0 ) ;
2013-06-01 21:56:53 +04:00
nsoption_default_set_int ( window_y , screen - > BarHeight + 1 ) ;
nsoption_default_set_int ( window_width , screen - > Width ) ;
nsoption_default_set_int ( window_height , screen - > Height - screen - > BarHeight - 1 ) ;
2013-06-01 18:37:26 +04:00
2013-06-01 21:56:53 +04:00
nsoption_default_set_int ( redraw_tile_size_x , screen - > Width ) ;
nsoption_default_set_int ( redraw_tile_size_y , screen - > Height ) ;
2013-06-01 18:37:26 +04:00
2013-06-01 18:11:26 +04:00
/* set system colours for amiga ui */
2013-06-01 21:56:53 +04:00
colour_option_from_pen ( FILLPEN , NSOPTION_sys_colour_ActiveBorder , screen , 0x00000000 ) ;
colour_option_from_pen ( FILLPEN , NSOPTION_sys_colour_ActiveCaption , screen , 0x00dddddd ) ;
colour_option_from_pen ( BACKGROUNDPEN , NSOPTION_sys_colour_AppWorkspace , screen , 0x00eeeeee ) ;
colour_option_from_pen ( BACKGROUNDPEN , NSOPTION_sys_colour_Background , screen , 0x00aa0000 ) ;
colour_option_from_pen ( FOREGROUNDPEN , NSOPTION_sys_colour_ButtonFace , screen , 0x00aaaaaa ) ;
colour_option_from_pen ( FORESHINEPEN , NSOPTION_sys_colour_ButtonHighlight , screen , 0x00cccccc ) ;
colour_option_from_pen ( FORESHADOWPEN , NSOPTION_sys_colour_ButtonShadow , screen , 0x00bbbbbb ) ;
colour_option_from_pen ( TEXTPEN , NSOPTION_sys_colour_ButtonText , screen , 0x00000000 ) ;
colour_option_from_pen ( FILLTEXTPEN , NSOPTION_sys_colour_CaptionText , screen , 0x00000000 ) ;
colour_option_from_pen ( DISABLEDTEXTPEN , NSOPTION_sys_colour_GrayText , screen , 0x00777777 ) ;
colour_option_from_pen ( SELECTPEN , NSOPTION_sys_colour_Highlight , screen , 0x00ee0000 ) ;
colour_option_from_pen ( SELECTTEXTPEN , NSOPTION_sys_colour_HighlightText , screen , 0x00000000 ) ;
colour_option_from_pen ( INACTIVEFILLPEN , NSOPTION_sys_colour_InactiveBorder , screen , 0x00000000 ) ;
colour_option_from_pen ( INACTIVEFILLPEN , NSOPTION_sys_colour_InactiveCaption , screen , 0x00ffffff ) ;
colour_option_from_pen ( INACTIVEFILLTEXTPEN , NSOPTION_sys_colour_InactiveCaptionText , screen , 0x00cccccc ) ;
colour_option_from_pen ( BACKGROUNDPEN , NSOPTION_sys_colour_InfoBackground , screen , 0x00aaaaaa ) ; /* This is wrong, HelpHint backgrounds are pale yellow but doesn't seem to be a DrawInfo pen defined for it. */
colour_option_from_pen ( TEXTPEN , NSOPTION_sys_colour_InfoText , screen , 0x00000000 ) ;
colour_option_from_pen ( MENUBACKGROUNDPEN , NSOPTION_sys_colour_Menu , screen , 0x00aaaaaa ) ;
colour_option_from_pen ( MENUTEXTPEN , NSOPTION_sys_colour_MenuText , screen , 0x00000000 ) ;
colour_option_from_pen ( AMINS_SCROLLERPEN , NSOPTION_sys_colour_Scrollbar , screen , 0x00aaaaaa ) ;
colour_option_from_pen ( FORESHADOWPEN , NSOPTION_sys_colour_ThreeDDarkShadow , screen , 0x00555555 ) ;
colour_option_from_pen ( FOREGROUNDPEN , NSOPTION_sys_colour_ThreeDFace , screen , 0x00dddddd ) ;
colour_option_from_pen ( FORESHINEPEN , NSOPTION_sys_colour_ThreeDHighlight , screen , 0x00aaaaaa ) ;
colour_option_from_pen ( HALFSHINEPEN , NSOPTION_sys_colour_ThreeDLightShadow , screen , 0x00999999 ) ;
colour_option_from_pen ( HALFSHADOWPEN , NSOPTION_sys_colour_ThreeDShadow , screen , 0x00777777 ) ;
colour_option_from_pen ( BACKGROUNDPEN , NSOPTION_sys_colour_Window , screen , 0x00aaaaaa ) ;
colour_option_from_pen ( INACTIVEFILLPEN , NSOPTION_sys_colour_WindowFrame , screen , 0x00000000 ) ;
colour_option_from_pen ( TEXTPEN , NSOPTION_sys_colour_WindowText , screen , 0x00000000 ) ;
2013-05-31 22:34:22 +04:00
}
2013-05-27 18:01:47 +04:00
/**
* Set option defaults for amiga frontend
*
* @ param defaults The option table to update .
* @ return error status .
*/
static nserror ami_set_options ( struct nsoption_s * defaults )
2010-03-24 01:55:56 +03:00
{
STRPTR tempacceptlangs ;
2012-03-29 02:17:27 +04:00
char temp [ 1024 ] ;
2009-08-14 21:53:28 +04:00
/* The following line disables the popupmenu.class select menu
* * This will become a user option when / if popupmenu . class is
* * updated to show more items than can fit in one column vertically
*/
2012-03-22 13:34:34 +04:00
nsoption_set_bool ( core_select_menu , true ) ;
2008-12-14 02:25:42 +03:00
2012-03-22 13:34:34 +04:00
if ( ( ! nsoption_charp ( accept_language ) ) | |
( nsoption_charp ( accept_language ) [ 0 ] = = ' \0 ' ) | |
( nsoption_bool ( accept_lang_locale ) = = true ) )
2009-06-22 02:12:52 +04:00
{
2014-10-25 19:22:08 +04:00
if ( ( tempacceptlangs = ami_locale_langs ( ) ) )
2009-06-22 02:12:52 +04:00
{
2012-03-22 13:34:34 +04:00
nsoption_set_charp ( accept_language ,
( char * ) strdup ( tempacceptlangs ) ) ;
2009-06-22 02:12:52 +04:00
FreeVec ( tempacceptlangs ) ;
}
}
2009-05-09 22:56:12 +04:00
2012-03-29 02:17:27 +04:00
sprintf ( temp , " %s/Cookies " , current_user_dir ) ;
2012-03-22 13:34:34 +04:00
nsoption_setnull_charp ( cookie_file ,
2012-03-29 02:17:27 +04:00
( char * ) strdup ( temp ) ) ;
2008-08-10 00:27:36 +04:00
2012-03-29 02:17:27 +04:00
sprintf ( temp , " %s/Hotlist " , current_user_dir ) ;
2012-03-22 13:34:34 +04:00
nsoption_setnull_charp ( hotlist_file ,
2012-03-29 02:17:27 +04:00
( char * ) strdup ( temp ) ) ;
2012-03-22 13:34:34 +04:00
2012-03-29 02:17:27 +04:00
sprintf ( temp , " %s/URLdb " , current_user_dir ) ;
2012-03-22 13:34:34 +04:00
nsoption_setnull_charp ( url_file ,
2012-03-29 02:17:27 +04:00
( char * ) strdup ( temp ) ) ;
2008-08-10 00:27:36 +04:00
2012-03-22 13:34:34 +04:00
nsoption_setnull_charp ( ca_bundle ,
( char * ) strdup ( " PROGDIR:Resources/ca-bundle " ) ) ;
2008-08-10 13:57:41 +04:00
2012-05-10 02:23:10 +04:00
sprintf ( temp , " %s/FontGlyphCache " , current_user_dir ) ;
2012-05-05 19:58:17 +04:00
nsoption_setnull_charp ( font_unicode_file ,
( char * ) strdup ( temp ) ) ;
2012-03-22 13:34:34 +04:00
/* font defaults */
nsoption_setnull_charp ( font_sans , ( char * ) strdup ( " DejaVu Sans " ) ) ;
nsoption_setnull_charp ( font_serif , ( char * ) strdup ( " DejaVu Serif " ) ) ;
nsoption_setnull_charp ( font_mono , ( char * ) strdup ( " DejaVu Sans Mono " ) ) ;
nsoption_setnull_charp ( font_cursive , ( char * ) strdup ( " DejaVu Sans " ) ) ;
nsoption_setnull_charp ( font_fantasy , ( char * ) strdup ( " DejaVu Serif " ) ) ;
2008-08-10 00:27:36 +04:00
2012-03-22 13:34:34 +04:00
if ( nsoption_charp ( font_unicode ) = = NULL )
2010-05-06 14:02:58 +04:00
{
2014-04-05 22:46:36 +04:00
BPTR lock = 0 ;
2010-05-06 14:02:58 +04:00
/* Search for some likely candidates */
2014-10-25 19:22:08 +04:00
if ( ( lock = Lock ( " FONTS:Code2000.font " , ACCESS_READ ) ) )
2010-05-06 14:02:58 +04:00
{
UnLock ( lock ) ;
2012-03-22 13:34:34 +04:00
nsoption_set_charp ( font_unicode ,
( char * ) strdup ( " Code2000 " ) ) ;
2010-05-06 14:02:58 +04:00
}
2014-10-25 19:22:08 +04:00
else if ( ( lock = Lock ( " FONTS:Bitstream Cyberbit.font " , ACCESS_READ ) ) )
2010-05-06 14:02:58 +04:00
{
UnLock ( lock ) ;
2012-03-22 13:34:34 +04:00
nsoption_set_charp ( font_unicode ,
( char * ) strdup ( " Bitstream Cyberbit " ) ) ;
}
2010-05-06 14:02:58 +04:00
}
2014-01-11 00:32:20 +04:00
if ( popupmenu_lib_ok = = FALSE )
nsoption_set_bool ( context_menu , false ) ;
2013-01-30 22:23:48 +04:00
# ifndef __amigaos4__
nsoption_set_bool ( download_notify , false ) ;
nsoption_set_bool ( font_antialiasing , false ) ;
nsoption_set_bool ( truecolour_mouse_pointers , false ) ;
# endif
2013-05-27 18:01:47 +04:00
return NSERROR_OK ;
2010-03-24 01:55:56 +03:00
}
2008-08-18 23:07:12 +04:00
2014-10-16 12:55:01 +04:00
static void ami_amiupdate ( void )
2010-03-24 01:55:56 +03:00
{
2011-04-22 17:55:25 +04:00
/* Create AppPath location for AmiUpdate use */
2014-04-05 22:46:36 +04:00
BPTR lock = 0 ;
2011-04-22 17:55:25 +04:00
2008-10-13 22:01:25 +04:00
if ( ( ( lock = Lock ( " ENVARC:AppPaths " , SHARED_LOCK ) ) = = 0 ) )
{
lock = CreateDir ( " ENVARC:AppPaths " ) ;
}
UnLock ( lock ) ;
2014-10-25 19:22:08 +04:00
if ( ( lock = Lock ( " PROGDIR: " , ACCESS_READ ) ) )
2008-10-13 22:01:25 +04:00
{
char filename [ 1024 ] ;
2014-04-05 22:46:36 +04:00
BPTR amiupdatefh ;
2008-10-13 22:01:25 +04:00
DevNameFromLock ( lock , ( STRPTR ) & filename , 1024L , DN_FULLPATH ) ;
amiupdatefh = FOpen ( " ENVARC:AppPaths/NetSurf " , MODE_NEWFILE , 0 ) ;
FPuts ( amiupdatefh , ( CONST_STRPTR ) & filename ) ;
FClose ( amiupdatefh ) ;
2011-04-22 17:55:25 +04:00
UnLock ( lock ) ;
2008-10-13 22:01:25 +04:00
}
2010-03-24 01:55:56 +03:00
}
2014-01-15 03:31:54 +04:00
static nsurl * gui_get_resource_url ( const char * path )
2011-02-24 01:27:55 +03:00
{
2011-10-05 12:32:52 +04:00
char buf [ 1024 ] ;
char path2 [ 1024 ] ;
nsurl * url = NULL ;
2011-02-24 02:29:24 +03:00
2011-10-05 12:32:52 +04:00
if ( ami_locate_resource ( buf , path ) = = false )
2011-03-13 21:33:57 +03:00
{
2011-10-05 12:32:52 +04:00
if ( ( strncmp ( path + strlen ( path ) - SLEN ( " .htm " ) , " .htm " , SLEN ( " .htm " ) ) = = 0 ) | |
( strncmp ( path + strlen ( path ) - SLEN ( " .html " ) , " .html " , SLEN ( " .html " ) ) = = 0 ) )
2011-03-13 21:33:57 +03:00
{
2011-03-14 21:53:13 +03:00
/* Try with RISC OS HTML filetype, might work */
2011-10-05 12:32:52 +04:00
strcpy ( path2 , path ) ;
strcat ( path2 , " ,faf " ) ;
2011-03-14 21:53:13 +03:00
2011-10-05 12:32:52 +04:00
if ( ami_locate_resource ( buf , path2 ) = = false )
2011-03-14 21:53:13 +03:00
{
return NULL ;
}
2011-03-13 21:33:57 +03:00
}
2011-03-14 21:53:13 +03:00
else return NULL ;
2011-03-13 21:33:57 +03:00
}
2011-02-24 02:29:24 +03:00
2014-05-27 02:43:36 +04:00
netsurf_path_to_nsurl ( buf , & url ) ;
2011-10-05 12:32:52 +04:00
return url ;
2011-02-24 01:27:55 +03:00
}
2012-04-07 21:16:32 +04:00
static void ami_gui_newprefs_hook ( struct Hook * hook , APTR window , APTR reserved )
{
2013-06-01 18:18:09 +04:00
ami_set_screen_defaults ( scrn ) ;
2012-04-07 21:16:32 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_openscreen ( void )
2009-07-04 20:12:27 +04:00
{
ULONG id = 0 ;
2012-02-25 00:00:51 +04:00
ULONG compositing ;
2012-03-22 13:34:34 +04:00
if ( nsoption_int ( screen_compositing ) = = - 1 )
2012-02-25 00:00:51 +04:00
compositing = ~ 0UL ;
2012-03-22 13:34:34 +04:00
else compositing = nsoption_int ( screen_compositing ) ;
2012-02-25 00:00:51 +04:00
2013-06-01 02:25:05 +04:00
if ( nsoption_charp ( pubscreen_name ) = = NULL )
2009-07-04 20:12:27 +04:00
{
2013-05-28 19:44:46 +04:00
if ( ( nsoption_charp ( screen_modeid ) ) & &
( strncmp ( nsoption_charp ( screen_modeid ) , " 0x " , 2 ) = = 0 ) )
2009-07-04 20:12:27 +04:00
{
2013-05-28 19:44:46 +04:00
id = strtoul ( nsoption_charp ( screen_modeid ) , NULL , 0 ) ;
2009-07-04 20:12:27 +04:00
}
else
{
struct ScreenModeRequester * screenmodereq = NULL ;
2014-10-25 19:22:08 +04:00
if ( ( screenmodereq = AllocAslRequest ( ASL_ScreenModeRequest , NULL ) ) ) {
2010-03-24 01:55:56 +03:00
if ( AslRequestTags ( screenmodereq ,
2012-08-08 02:09:40 +04:00
ASLSM_MinDepth , 0 ,
ASLSM_MaxDepth , 32 ,
2010-03-24 01:55:56 +03:00
TAG_DONE ) )
{
2012-03-22 13:34:34 +04:00
char * modeid = malloc ( 20 ) ;
2010-03-24 01:55:56 +03:00
id = screenmodereq - > sm_DisplayID ;
2012-03-22 13:34:34 +04:00
sprintf ( modeid , " 0x%lx " , id ) ;
2013-05-28 19:44:46 +04:00
nsoption_set_charp ( screen_modeid , modeid ) ;
nsoption_write ( current_user_options , NULL , NULL ) ;
2010-03-24 01:55:56 +03:00
}
2009-07-04 20:12:27 +04:00
FreeAslRequest ( screenmodereq ) ;
}
}
2014-04-06 18:24:24 +04:00
if ( screen_signal = = - 1 ) screen_signal = AllocSignal ( - 1 ) ;
2014-02-10 22:13:28 +04:00
LOG ( ( " Screen signal %d " , screen_signal ) ) ;
2009-07-04 20:12:27 +04:00
scrn = OpenScreenTags ( NULL ,
2011-06-18 21:58:36 +04:00
SA_DisplayID , id ,
SA_Title , nsscreentitle ,
SA_Type , PUBLICSCREEN ,
SA_PubName , " NetSurf " ,
2014-02-10 22:13:28 +04:00
SA_PubSig , screen_signal ,
SA_PubTask , FindTask ( 0 ) ,
2011-06-18 21:58:36 +04:00
SA_LikeWorkbench , TRUE ,
2012-02-25 00:00:51 +04:00
SA_Compositing , compositing ,
2009-07-04 20:12:27 +04:00
TAG_DONE ) ;
if ( scrn )
{
PubScreenStatus ( scrn , 0 ) ;
}
else
{
2014-04-06 18:22:18 +04:00
FreeSignal ( screen_signal ) ;
2014-04-06 18:24:24 +04:00
screen_signal = - 1 ;
2014-04-06 18:22:18 +04:00
2014-10-25 19:22:08 +04:00
if ( ( scrn = LockPubScreen ( " NetSurf " ) ) )
2009-07-04 20:12:27 +04:00
{
locked_screen = TRUE ;
}
else
{
2013-06-01 02:25:05 +04:00
nsoption_set_charp ( pubscreen_name ,
2012-03-22 13:34:34 +04:00
strdup ( " Workbench " ) ) ;
2009-07-04 20:12:27 +04:00
}
}
}
2013-06-01 02:25:05 +04:00
if ( nsoption_charp ( pubscreen_name ) ! = NULL )
2009-07-04 20:12:27 +04:00
{
2013-06-01 02:25:05 +04:00
scrn = LockPubScreen ( nsoption_charp ( pubscreen_name ) ) ;
2011-06-19 15:16:48 +04:00
if ( scrn = = NULL )
2009-07-04 20:12:27 +04:00
{
scrn = LockPubScreen ( " Workbench " ) ;
}
2011-06-19 15:16:48 +04:00
locked_screen = TRUE ;
2009-07-04 20:12:27 +04:00
}
2011-01-30 20:30:32 +03:00
2013-08-20 22:43:13 +04:00
ami_font_setdevicedpi ( id ) ;
2013-05-31 22:34:22 +04:00
ami_set_screen_defaults ( scrn ) ;
2014-01-11 00:03:22 +04:00
ami_help_new_screen ( scrn ) ;
2009-07-04 20:12:27 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_openscreenfirst ( void )
2009-09-29 02:17:09 +04:00
{
ami_openscreen ( ) ;
2009-10-03 15:00:10 +04:00
if ( ! browserglob . bm ) ami_init_layers ( & browserglob , 0 , 0 ) ;
2012-08-11 01:59:38 +04:00
ami_theme_throbber_setup ( ) ;
2009-09-29 02:17:09 +04:00
}
2014-01-19 02:10:18 +04:00
static void ami_gui_commandline ( int * argc , char * * argv )
2008-08-02 18:31:32 +04:00
{
2014-01-19 02:10:18 +04:00
int new_argc = 0 ;
2008-09-29 02:50:13 +04:00
struct RDArgs * args ;
2014-10-25 19:22:08 +04:00
CONST_STRPTR template = " NSOPTS/M,URL/K,FORCE/S " ;
2011-05-30 22:17:09 +04:00
long rarray [ ] = { 0 , 0 , 0 } ;
2008-09-29 02:50:13 +04:00
enum
{
2011-05-30 22:17:09 +04:00
A_NSOPTS , /* ignored */
2010-03-28 20:42:33 +04:00
A_URL ,
A_FORCE
2008-09-29 02:50:13 +04:00
} ;
2008-08-02 18:31:32 +04:00
2014-01-19 02:10:18 +04:00
if ( * argc = = 0 ) return ; // argc==0 is started from wb
2014-10-25 19:22:08 +04:00
if ( ( args = ReadArgs ( template , rarray , NULL ) ) ) {
2014-01-19 02:10:18 +04:00
if ( rarray [ A_URL ] ) {
LOG ( ( " URL %s specified on command line " , rarray [ A_URL ] ) ) ;
2014-03-13 23:37:01 +04:00
temp_homepage_url = ami_to_utf8_easy ( ( char * ) rarray [ A_URL ] ) ;
2014-01-19 02:10:18 +04:00
}
if ( rarray [ A_FORCE ] ) {
LOG ( ( " FORCE specified on command line " ) ) ;
cli_force = true ;
}
if ( rarray [ A_NSOPTS ] ) {
/* The NSOPTS/M parameter specified in the ReadArgs template is
* special . The / M means it collects all arguments that can ' t
* be assigned to any other parameter , and stores them in an
* array . We collect these and pass them as a fake argc / argv
* to nsoption_commandline ( ) .
* This trickery is necessary because if ReadArgs ( ) is called
* first , nsoption_commandline ( ) can no longer parse ( fetch ? )
* the arguments . If nsoption_commandline ( ) is called first ,
* then ReadArgs cannot fetch the arguments .
*/
char * * p = ( char * * ) rarray [ A_NSOPTS ] ;
do {
LOG ( ( " Arg [%d] assigned to NSOPTS/M by ReadArgs: %s " , new_argc , * p ) ) ;
new_argc + + ;
p + + ;
} while ( * p ! = NULL ) ;
nsoption_commandline ( & new_argc , ( char * * ) rarray [ A_NSOPTS ] , NULL ) ;
}
FreeArgs ( args ) ;
} else {
LOG ( ( " ReadArgs failed to parse command line " ) ) ;
}
}
static void gui_init2 ( int argc , char * * argv )
{
struct Screen * screen ;
BOOL notalreadyrunning ;
nsurl * url ;
nserror error ;
struct browser_window * bw = NULL ;
2008-11-16 17:42:40 +03:00
notalreadyrunning = ami_arexx_init ( ) ;
2008-11-15 18:28:17 +03:00
2010-10-05 23:14:46 +04:00
/* Treeview init code ends up calling a font function which needs this */
glob = & browserglob ;
2013-06-01 21:56:53 +04:00
/* ...and this ensures the treeview at least gets the WB colour palette to work with */
if ( scrn = = NULL ) {
2014-10-25 19:22:08 +04:00
if ( ( screen = LockPubScreen ( " Workbench " ) ) ) {
2013-06-01 21:56:53 +04:00
ami_set_screen_defaults ( screen ) ;
UnlockPubScreen ( NULL , screen ) ;
}
} else {
ami_set_screen_defaults ( scrn ) ;
}
2010-10-05 23:14:46 +04:00
/**/
2012-03-22 13:34:34 +04:00
ami_hotlist_initialise ( nsoption_charp ( hotlist_file ) ) ;
2010-10-05 23:14:46 +04:00
ami_cookies_initialise ( ) ;
ami_global_history_initialise ( ) ;
2014-05-25 03:57:48 +04:00
search_web_select_provider ( nsoption_int ( search_provider ) ) ;
2009-12-22 02:25:35 +03:00
2014-01-19 02:10:18 +04:00
if ( notalreadyrunning & &
( nsoption_bool ( startup_no_window ) = = false ) )
ami_openscreenfirst ( ) ;
2010-03-28 20:42:33 +04:00
2014-01-19 02:10:18 +04:00
if ( temp_homepage_url & & notalreadyrunning ) {
error = nsurl_create ( temp_homepage_url , & url ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY ,
2014-01-19 02:10:18 +04:00
url ,
NULL ,
NULL ,
& bw ) ;
nsurl_unref ( url ) ;
2008-11-16 17:42:40 +03:00
}
2014-01-19 02:10:18 +04:00
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
free ( temp_homepage_url ) ;
2008-11-09 02:08:55 +03:00
}
2014-01-19 02:10:18 +04:00
if ( cli_force = = true ) {
notalreadyrunning = TRUE ;
}
if ( argc = = 0 ) { // WB
2008-11-16 17:42:40 +03:00
struct WBStartup * WBenchMsg = ( struct WBStartup * ) argv ;
struct WBArg * wbarg ;
int first = 0 , i = 0 ;
char fullpath [ 1024 ] ;
for ( i = 0 , wbarg = WBenchMsg - > sm_ArgList ; i < WBenchMsg - > sm_NumArgs ; i + + , wbarg + + )
{
if ( i = = 0 ) continue ;
if ( ( wbarg - > wa_Lock ) & & ( * wbarg - > wa_Name ) )
{
2009-03-15 14:21:46 +03:00
DevNameFromLock ( wbarg - > wa_Lock , fullpath , 1024 , DN_FULLPATH ) ;
AddPart ( fullpath , wbarg - > wa_Name , 1024 ) ;
2008-11-16 17:42:40 +03:00
2014-05-27 02:43:36 +04:00
if ( ! temp_homepage_url ) {
2014-05-27 03:08:04 +04:00
nsurl * temp_url ;
2014-05-27 02:43:36 +04:00
if ( netsurf_path_to_nsurl ( fullpath , & temp_url ) = = NSERROR_OK ) {
2014-05-27 03:15:34 +04:00
temp_homepage_url = strdup ( nsurl_access ( temp_url ) ) ;
2014-05-27 02:43:36 +04:00
nsurl_unref ( temp_url ) ;
}
}
2008-11-16 17:42:40 +03:00
if ( notalreadyrunning )
{
2013-02-14 22:21:11 +04:00
error = nsurl_create ( temp_homepage_url , & url ) ;
if ( error = = NSERROR_OK ) {
if ( ! first )
{
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
NULL ,
& bw ) ;
first = 1 ;
}
else
{
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_CLONE | BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
bw ,
& bw ) ;
}
nsurl_unref ( url ) ;
2008-11-16 17:42:40 +03:00
}
2013-02-14 22:21:11 +04:00
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
2008-11-16 17:42:40 +03:00
}
free ( temp_homepage_url ) ;
temp_homepage_url = NULL ;
}
}
}
}
2013-06-02 19:26:25 +04:00
nsoption_setnull_charp ( homepage_url , ( char * ) strdup ( NETSURF_HOMEPAGE ) ) ;
2008-11-16 17:42:40 +03:00
if ( ! notalreadyrunning )
{
STRPTR sendcmd = NULL ;
if ( temp_homepage_url )
{
sendcmd = ASPrintf ( " OPEN \" %s \" NEW " , temp_homepage_url ) ;
free ( temp_homepage_url ) ;
}
else
{
2012-03-22 13:34:34 +04:00
sendcmd = ASPrintf ( " OPEN \" %s \" NEW " , nsoption_charp ( homepage_url ) ) ;
2008-11-16 17:42:40 +03:00
}
IDoMethod ( arexx_obj , AM_EXECUTE , sendcmd , " NETSURF " , NULL , NULL , NULL , NULL ) ;
FreeVec ( sendcmd ) ;
2011-06-19 15:16:48 +04:00
2014-10-12 12:58:54 +04:00
ami_quit = true ;
2008-11-16 17:42:40 +03:00
return ;
2008-11-09 02:08:55 +03:00
}
2008-11-16 17:42:40 +03:00
2009-09-28 22:00:40 +04:00
if ( IApplication )
{
2009-09-29 02:17:09 +04:00
if ( argc = = 0 )
{
2010-02-22 00:24:58 +03:00
ULONG noicon = TAG_IGNORE ;
2012-03-22 13:34:34 +04:00
if ( nsoption_bool ( hide_docky_icon ) )
noicon = REGAPP_NoIcon ;
2009-12-13 15:14:43 +03:00
2009-09-29 02:17:09 +04:00
ami_appid = RegisterApplication ( messages_get ( " NetSurf " ) ,
REGAPP_URLIdentifier , " netsurf-browser.org " ,
REGAPP_WBStartup , ( struct WBStartup * ) argv ,
2009-12-13 15:14:43 +03:00
noicon , TRUE ,
2009-09-29 02:17:09 +04:00
REGAPP_HasPrefsWindow , TRUE ,
REGAPP_CanCreateNewDocs , TRUE ,
REGAPP_UniqueApplication , TRUE ,
2013-10-12 13:26:28 +04:00
REGAPP_Description , messages_get ( " NetSurfDesc " ) ,
2009-09-29 02:17:09 +04:00
TAG_DONE ) ;
}
else
{
/* TODO: Specify icon when run from Shell */
ami_appid = RegisterApplication ( messages_get ( " NetSurf " ) ,
REGAPP_URLIdentifier , " netsurf-browser.org " ,
REGAPP_FileName , argv [ 0 ] ,
REGAPP_NoIcon , TRUE ,
REGAPP_HasPrefsWindow , TRUE ,
REGAPP_CanCreateNewDocs , TRUE ,
REGAPP_UniqueApplication , TRUE ,
2013-10-12 13:26:28 +04:00
REGAPP_Description , messages_get ( " NetSurfDesc " ) ,
2009-09-29 02:17:09 +04:00
TAG_DONE ) ;
}
2009-09-28 22:00:40 +04:00
GetApplicationAttrs ( ami_appid , APPATTR_Port , ( ULONG ) & applibport , TAG_DONE ) ;
2010-03-28 20:42:33 +04:00
if ( applibport ) applibsig = ( 1L < < applibport - > mp_SigBit ) ;
2009-09-28 22:00:40 +04:00
}
2013-02-14 22:21:11 +04:00
if ( ! bw & & ( nsoption_bool ( startup_no_window ) = = false ) ) {
error = nsurl_create ( nsoption_charp ( homepage_url ) , & url ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
NULL ,
NULL ) ;
nsurl_unref ( url ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
}
2008-08-02 18:31:32 +04:00
}
2014-10-26 16:11:05 +03:00
static void ami_update_buttons ( struct gui_window_2 * gwin )
{
long back = FALSE , forward = TRUE , tabclose = FALSE , stop = FALSE , reload = FALSE ;
long storage = FALSE ;
2014-11-16 17:44:40 +03:00
if ( ! browser_window_back_available ( gwin - > gw - > bw ) )
2014-10-26 16:11:05 +03:00
back = TRUE ;
2014-11-16 17:44:40 +03:00
if ( browser_window_forward_available ( gwin - > gw - > bw ) )
2014-10-26 16:11:05 +03:00
forward = FALSE ;
2014-11-16 17:44:40 +03:00
if ( ! browser_window_stop_available ( gwin - > gw - > bw ) )
2014-10-26 16:11:05 +03:00
stop = TRUE ;
2014-11-16 17:44:40 +03:00
if ( ! browser_window_reload_available ( gwin - > gw - > bw ) )
2014-10-26 16:11:05 +03:00
reload = TRUE ;
if ( nsoption_bool ( kiosk_mode ) = = false )
{
if ( gwin - > tabs < = 1 )
{
tabclose = TRUE ;
OffMenu ( gwin - > win , AMI_MENU_CLOSETAB ) ;
}
else
{
OnMenu ( gwin - > win , AMI_MENU_CLOSETAB ) ;
}
}
GetAttr ( GA_Disabled , gwin - > objects [ GID_BACK ] , ( uint32 * ) & storage ) ;
if ( storage ! = back )
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_BACK ] ,
gwin - > win , NULL , GA_Disabled , back , TAG_DONE ) ;
GetAttr ( GA_Disabled , gwin - > objects [ GID_FORWARD ] , ( uint32 * ) & storage ) ;
if ( storage ! = forward )
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_FORWARD ] ,
gwin - > win , NULL , GA_Disabled , forward , TAG_DONE ) ;
GetAttr ( GA_Disabled , gwin - > objects [ GID_RELOAD ] , ( uint32 * ) & storage ) ;
if ( storage ! = reload )
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_RELOAD ] ,
gwin - > win , NULL , GA_Disabled , reload , TAG_DONE ) ;
GetAttr ( GA_Disabled , gwin - > objects [ GID_STOP ] , ( uint32 * ) & storage ) ;
if ( storage ! = stop )
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_STOP ] ,
gwin - > win , NULL , GA_Disabled , stop , TAG_DONE ) ;
if ( ( gwin - > tabs ) & & ( ClickTabBase - > lib_Version < 53 ) )
{
GetAttr ( GA_Disabled , gwin - > objects [ GID_CLOSETAB ] , ( uint32 * ) & storage ) ;
if ( storage ! = tabclose )
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_CLOSETAB ] ,
gwin - > win , NULL , GA_Disabled , tabclose , TAG_DONE ) ;
}
}
2010-03-29 20:59:30 +04:00
2011-06-03 22:08:17 +04:00
void ami_gui_history ( struct gui_window_2 * gwin , bool back )
{
if ( back = = true )
{
2014-11-16 17:44:40 +03:00
if ( browser_window_back_available ( gwin - > gw - > bw ) )
browser_window_history_back ( gwin - > gw - > bw , false ) ;
2011-06-03 22:08:17 +04:00
}
else
{
2014-11-16 17:44:40 +03:00
if ( browser_window_forward_available ( gwin - > gw - > bw ) )
browser_window_history_forward ( gwin - > gw - > bw , false ) ;
2011-06-03 22:08:17 +04:00
}
ami_update_buttons ( gwin ) ;
}
2009-11-03 02:02:53 +03:00
int ami_key_to_nskey ( ULONG keycode , struct InputEvent * ie )
{
int nskey = 0 , chars ;
2014-10-25 19:22:08 +04:00
char buffer [ 20 ] ;
2011-09-13 01:56:15 +04:00
char * utf8 = NULL ;
2009-11-03 02:02:53 +03:00
if ( keycode > = IECODE_UP_PREFIX ) return 0 ;
switch ( keycode )
{
case RAWKEY_CRSRUP :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_PAGE_UP ;
}
else if ( ie - > ie_Qualifier & IEQUALIFIER_RALT )
{
nskey = KEY_TEXT_START ;
}
else nskey = KEY_UP ;
break ;
case RAWKEY_CRSRDOWN :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_PAGE_DOWN ;
}
else if ( ie - > ie_Qualifier & IEQUALIFIER_RALT )
{
nskey = KEY_TEXT_END ;
}
else nskey = KEY_DOWN ;
break ;
case RAWKEY_CRSRLEFT :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_LINE_START ;
}
else if ( ie - > ie_Qualifier & IEQUALIFIER_RALT )
{
nskey = KEY_WORD_LEFT ;
}
else nskey = KEY_LEFT ;
break ;
case RAWKEY_CRSRRIGHT :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_LINE_END ;
}
else if ( ie - > ie_Qualifier & IEQUALIFIER_RALT )
{
nskey = KEY_WORD_RIGHT ;
}
else nskey = KEY_RIGHT ;
break ;
case RAWKEY_ESC :
nskey = KEY_ESCAPE ;
break ;
case RAWKEY_PAGEUP :
nskey = KEY_PAGE_UP ;
break ;
case RAWKEY_PAGEDOWN :
nskey = KEY_PAGE_DOWN ;
break ;
case RAWKEY_HOME :
nskey = KEY_TEXT_START ;
break ;
case RAWKEY_END :
nskey = KEY_TEXT_END ;
break ;
case RAWKEY_BACKSPACE :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_DELETE_LINE_START ;
}
else nskey = KEY_DELETE_LEFT ;
break ;
case RAWKEY_DEL :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_DELETE_LINE_END ;
}
else nskey = KEY_DELETE_RIGHT ;
break ;
case RAWKEY_TAB :
if ( ie - > ie_Qualifier & IEQUALIFIER_RSHIFT )
{
nskey = KEY_SHIFT_TAB ;
}
else nskey = KEY_TAB ;
break ;
2009-11-04 11:06:52 +03:00
case RAWKEY_F5 :
2013-01-25 00:00:09 +04:00
case RAWKEY_HELP :
2009-11-04 11:06:52 +03:00
// don't translate
nskey = keycode ;
break ;
2009-11-03 02:02:53 +03:00
default :
if ( ( chars = MapRawKey ( ie , buffer , 20 , NULL ) ) > 0 )
{
2011-09-13 01:56:15 +04:00
utf8_from_local_encoding ( buffer , chars , & utf8 ) ;
nskey = utf8_to_ucs4 ( utf8 , utf8_char_byte_length ( utf8 ) ) ;
2009-11-03 02:02:53 +03:00
}
break ;
}
return nskey ;
}
2014-10-16 12:55:01 +04:00
static void ami_update_quals ( struct gui_window_2 * gwin )
2009-01-11 00:31:21 +03:00
{
2009-01-11 02:10:54 +03:00
uint32 quals = 0 ;
GetAttr ( WINDOW_Qualifier , gwin - > objects [ OID_MAIN ] , ( uint32 * ) & quals ) ;
2009-01-11 00:31:21 +03:00
gwin - > key_state = 0 ;
if ( ( quals & IEQUALIFIER_LSHIFT ) | | ( quals & IEQUALIFIER_RSHIFT ) )
{
gwin - > key_state | = BROWSER_MOUSE_MOD_1 ;
}
if ( quals & IEQUALIFIER_CONTROL )
{
gwin - > key_state | = BROWSER_MOUSE_MOD_2 ;
}
2009-09-01 01:48:57 +04:00
if ( ( quals & IEQUALIFIER_LALT ) | | ( quals & IEQUALIFIER_RALT ) )
{
gwin - > key_state | = BROWSER_MOUSE_MOD_3 ;
}
2009-01-11 00:31:21 +03:00
}
2014-11-15 16:52:06 +03:00
/* exported interface documented in amiga/gui.h */
nserror ami_gui_get_space_box ( Object * obj , struct IBox * * bbox )
2014-11-15 16:46:23 +03:00
{
if ( LIB_IS_AT_LEAST ( ( struct Library * ) SpaceBase , 53 , 6 ) ) {
* bbox = AllocVecTagList ( sizeof ( struct IBox ) , NULL ) ;
if ( * bbox = = NULL ) return NSERROR_NOMEM ;
GetAttr ( SPACE_RenderBox , obj , ( ULONG * ) * bbox ) ;
} else {
GetAttr ( SPACE_AreaBox , obj , ( ULONG * ) bbox ) ;
}
return NSERROR_OK ;
}
2014-11-15 16:52:06 +03:00
/* exported interface documented in amiga/gui.h */
void ami_gui_free_space_box ( struct IBox * bbox )
2014-11-15 16:46:23 +03:00
{
if ( LIB_IS_AT_LEAST ( ( struct Library * ) SpaceBase , 53 , 6 ) ) {
FreeVec ( bbox ) ;
}
}
2014-10-16 12:55:01 +04:00
static bool ami_spacebox_to_ns_coords ( struct gui_window_2 * gwin , int * x , int * y ,
2013-02-03 22:50:16 +04:00
int space_x , int space_y )
{
int ns_x = space_x ;
int ns_y = space_y ;
2014-11-16 17:44:40 +03:00
ns_x / = gwin - > gw - > bw - > scale ;
ns_y / = gwin - > gw - > bw - > scale ;
2013-02-03 22:50:16 +04:00
2014-11-16 17:44:40 +03:00
ns_x + = gwin - > gw - > scrollx ;
ns_y + = gwin - > gw - > scrolly ;
2013-02-03 22:50:16 +04:00
* x = ns_x ;
* y = ns_y ;
return true ;
}
2014-10-16 12:55:01 +04:00
static bool ami_mouse_to_ns_coords ( struct gui_window_2 * gwin , int * x , int * y ,
2011-12-02 16:47:11 +04:00
int mouse_x , int mouse_y )
2011-11-30 00:58:57 +04:00
{
int ns_x , ns_y ;
struct IBox * bbox ;
2011-12-02 16:47:11 +04:00
if ( mouse_x = = - 1 ) mouse_x = gwin - > win - > MouseX ;
if ( mouse_y = = - 1 ) mouse_y = gwin - > win - > MouseY ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) = = NSERROR_OK ) {
ns_x = ( ULONG ) ( mouse_x - bbox - > Left ) ;
ns_y = ( ULONG ) ( mouse_y - bbox - > Top ) ;
2011-11-30 00:58:57 +04:00
2014-11-15 16:46:23 +03:00
if ( ( ns_x < 0 ) | | ( ns_x > bbox - > Width ) | | ( ns_y < 0 ) | | ( ns_y > bbox - > Height ) )
return false ;
2011-11-30 00:58:57 +04:00
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
} else {
warn_user ( " NoMemory " , " " ) ;
2011-11-30 00:58:57 +04:00
return false ;
2014-11-15 16:46:23 +03:00
}
2011-11-30 00:58:57 +04:00
2013-02-03 22:50:16 +04:00
return ami_spacebox_to_ns_coords ( gwin , x , y , ns_x , ns_y ) ;
2011-11-30 00:58:57 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_gui_scroll_internal ( struct gui_window_2 * gwin , int xs , int ys )
2011-12-24 02:14:00 +04:00
{
struct IBox * bbox ;
int x , y ;
if ( ami_mouse_to_ns_coords ( gwin , & x , & y , - 1 , - 1 ) = = true )
{
2014-11-16 17:44:40 +03:00
if ( browser_window_scroll_at_point ( gwin - > gw - > bw , x , y ,
2011-12-24 02:14:00 +04:00
xs , ys ) = = false )
{
2014-11-16 17:44:40 +03:00
gui_window_get_scroll ( gwin - > gw ,
& gwin - > gw - > scrollx ,
& gwin - > gw - > scrolly ) ;
2011-12-24 02:14:00 +04:00
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2011-12-24 02:14:00 +04:00
switch ( xs )
{
case SCROLL_PAGE_UP :
2014-11-16 17:44:40 +03:00
xs = gwin - > gw - > scrollx - bbox - > Width ;
2011-12-24 02:14:00 +04:00
break ;
case SCROLL_PAGE_DOWN :
2014-11-16 17:44:40 +03:00
xs = gwin - > gw - > scrollx + bbox - > Width ;
2011-12-24 02:14:00 +04:00
break ;
case SCROLL_TOP :
xs = 0 ;
break ;
case SCROLL_BOTTOM :
2014-11-16 17:44:40 +03:00
xs = content_get_width ( gwin - > gw - > bw - > current_content ) ;
2011-12-24 02:14:00 +04:00
break ;
default :
2014-11-16 17:44:40 +03:00
xs + = gwin - > gw - > scrollx ;
2011-12-24 02:14:00 +04:00
break ;
}
switch ( ys )
{
case SCROLL_PAGE_UP :
2014-11-16 17:44:40 +03:00
ys = gwin - > gw - > scrolly - bbox - > Height ;
2011-12-24 02:14:00 +04:00
break ;
case SCROLL_PAGE_DOWN :
2014-11-16 17:44:40 +03:00
ys = gwin - > gw - > scrolly + bbox - > Height ;
2011-12-24 02:14:00 +04:00
break ;
case SCROLL_TOP :
ys = 0 ;
break ;
case SCROLL_BOTTOM :
2014-11-16 17:44:40 +03:00
ys = content_get_height ( gwin - > gw - > bw - > current_content ) ;
2011-12-24 02:14:00 +04:00
break ;
default :
2014-11-16 17:44:40 +03:00
ys + = gwin - > gw - > scrolly ;
2011-12-24 02:14:00 +04:00
break ;
}
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2014-11-16 17:44:40 +03:00
gui_window_set_scroll ( gwin - > gw , xs , ys ) ;
2011-12-24 02:14:00 +04:00
}
}
}
2014-10-16 12:55:01 +04:00
static struct IBox * ami_ns_rect_to_ibox ( struct gui_window_2 * gwin , const struct rect * rect )
2012-01-12 01:41:55 +04:00
{
struct IBox * bbox , * ibox ;
2013-10-12 16:11:13 +04:00
ibox = AllocVecTagList ( sizeof ( struct IBox ) , NULL ) ;
2012-01-12 01:41:55 +04:00
if ( ibox = = NULL ) return NULL ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return NULL ;
}
2012-01-12 01:41:55 +04:00
2014-11-16 17:44:40 +03:00
ibox - > Left = gwin - > win - > MouseX + ( rect - > x0 * gwin - > gw - > bw - > scale ) ;
ibox - > Top = gwin - > win - > MouseY + ( rect - > y0 * gwin - > gw - > bw - > scale ) ;
2012-01-12 01:41:55 +04:00
2014-11-16 17:44:40 +03:00
ibox - > Width = ( rect - > x1 - rect - > x0 ) * gwin - > gw - > bw - > scale ;
ibox - > Height = ( rect - > y1 - rect - > y0 ) * gwin - > gw - > bw - > scale ;
2012-01-12 01:41:55 +04:00
if ( ibox - > Left < bbox - > Left ) ibox - > Left = bbox - > Left ;
if ( ibox - > Top < bbox - > Top ) ibox - > Top = bbox - > Top ;
if ( ( ibox - > Left > ( bbox - > Left + bbox - > Width ) ) | |
( ibox - > Top > ( bbox - > Top + bbox - > Height ) ) | |
( ibox - > Width < 0 ) | | ( ibox - > Height < 0 ) )
{
FreeVec ( ibox ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2012-01-12 01:41:55 +04:00
return NULL ;
}
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
return ibox ;
2012-01-12 01:41:55 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_gui_trap_mouse ( struct gui_window_2 * gwin )
2012-01-12 01:41:55 +04:00
{
switch ( gwin - > drag_op )
{
case GDRAGGING_NONE :
case GDRAGGING_SCROLLBAR :
case GDRAGGING_OTHER :
break ;
default :
if ( gwin - > ptr_lock )
{
SetWindowAttrs ( gwin - > win , WA_GrabFocus , 10 ,
WA_MouseLimits , gwin - > ptr_lock , TAG_DONE ) ;
}
break ;
}
}
2014-10-16 12:55:01 +04:00
static void ami_gui_menu_update_all ( void )
2012-12-15 19:39:09 +04:00
{
struct nsObject * node ;
struct nsObject * nnode ;
struct gui_window_2 * gwin ;
if ( IsMinListEmpty ( window_list ) ) return ;
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
do {
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
if ( node - > Type = = AMINS_WINDOW )
{
ami_menu_update_checked ( gwin ) ;
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2012-12-15 19:39:09 +04:00
}
2014-10-25 23:03:14 +04:00
static void gui_window_get_dimensions ( struct gui_window * g , int * width , int * height ,
bool scaled )
{
struct IBox * bbox ;
if ( ! g ) return ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2014-10-25 23:03:14 +04:00
* width = bbox - > Width ;
* height = bbox - > Height ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2014-10-25 23:03:14 +04:00
if ( scaled )
{
2014-11-16 17:44:40 +03:00
* width / = g - > bw - > scale ;
* height / = g - > bw - > scale ;
2014-10-25 23:03:14 +04:00
}
}
2014-10-26 19:35:05 +03:00
/* Add a horizontal scroller, if not already present
* Returns true if changed , false otherwise */
static bool ami_gui_hscroll_add ( struct gui_window_2 * gwin )
{
struct TagItem attrs [ 2 ] ;
if ( gwin - > objects [ GID_HSCROLL ] ! = NULL ) return false ;
attrs [ 0 ] . ti_Tag = CHILD_MinWidth ;
attrs [ 0 ] . ti_Data = 0 ;
attrs [ 1 ] . ti_Tag = TAG_DONE ;
attrs [ 1 ] . ti_Data = 0 ;
gwin - > objects [ GID_HSCROLL ] = ScrollerObject ,
GA_ID , GID_HSCROLL ,
GA_RelVerify , TRUE ,
SCROLLER_Orientation , SORIENT_HORIZ ,
ICA_TARGET , ICTARGET_IDCMP ,
ScrollerEnd ;
IDoMethod ( gwin - > objects [ GID_HSCROLLLAYOUT ] , LM_ADDCHILD ,
gwin - > win , gwin - > objects [ GID_HSCROLL ] , attrs ) ;
return true ;
}
/* Remove the horizontal scroller, if present */
static bool ami_gui_hscroll_remove ( struct gui_window_2 * gwin )
{
if ( gwin - > objects [ GID_HSCROLL ] = = NULL ) return false ;
IDoMethod ( gwin - > objects [ GID_HSCROLLLAYOUT ] , LM_REMOVECHILD ,
gwin - > win , gwin - > objects [ GID_HSCROLL ] ) ;
gwin - > objects [ GID_HSCROLL ] = NULL ;
return true ;
}
2014-10-25 23:03:14 +04:00
/* Add a vertical scroller, if not already present
* Returns true if changed , false otherwise */
static bool ami_gui_vscroll_add ( struct gui_window_2 * gwin )
{
struct TagItem attrs [ 2 ] ;
if ( gwin - > objects [ GID_VSCROLL ] ! = NULL ) return false ;
attrs [ 0 ] . ti_Tag = CHILD_MinWidth ;
attrs [ 0 ] . ti_Data = 0 ;
attrs [ 1 ] . ti_Tag = TAG_DONE ;
attrs [ 1 ] . ti_Data = 0 ;
gwin - > objects [ GID_VSCROLL ] = ScrollerObject ,
GA_ID , GID_VSCROLL ,
GA_RelVerify , TRUE ,
ICA_TARGET , ICTARGET_IDCMP ,
ScrollerEnd ;
IDoMethod ( gwin - > objects [ GID_VSCROLLLAYOUT ] , LM_ADDCHILD ,
gwin - > win , gwin - > objects [ GID_VSCROLL ] , attrs ) ;
return true ;
}
/* Remove the vertical scroller, if present */
static bool ami_gui_vscroll_remove ( struct gui_window_2 * gwin )
{
if ( gwin - > objects [ GID_VSCROLL ] = = NULL ) return false ;
IDoMethod ( gwin - > objects [ GID_VSCROLLLAYOUT ] , LM_REMOVECHILD ,
gwin - > win , gwin - > objects [ GID_VSCROLL ] ) ;
gwin - > objects [ GID_VSCROLL ] = NULL ;
return true ;
}
/**
* Check the scroll bar requirements for a browser window , and add / remove
* the vertical scroller as appropriate . This should be the main entry
* point used to perform this task .
*
* \ param gwin " Shared " GUI window to check the state of
*/
2014-10-27 00:30:19 +03:00
static void ami_gui_scroller_update ( struct gui_window_2 * gwin )
2014-10-25 23:03:14 +04:00
{
2014-10-26 19:35:05 +03:00
int h = 1 , w = 1 , wh = 0 , ww = 0 ;
bool rethinkv = false ;
bool rethinkh = false ;
2014-10-25 23:03:14 +04:00
browser_scrolling hscroll = BW_SCROLLING_YES ;
browser_scrolling vscroll = BW_SCROLLING_YES ;
2014-11-16 17:44:40 +03:00
browser_window_get_scrollbar_type ( gwin - > gw - > bw , & hscroll , & vscroll ) ;
2014-10-25 23:03:14 +04:00
2014-11-16 17:44:40 +03:00
if ( browser_window_is_frameset ( gwin - > gw - > bw ) = = true ) {
2014-10-26 19:35:05 +03:00
rethinkv = ami_gui_vscroll_remove ( gwin ) ;
rethinkh = ami_gui_hscroll_remove ( gwin ) ;
2014-10-25 23:03:14 +04:00
} else {
2014-11-16 17:44:40 +03:00
if ( ( browser_window_get_extents ( gwin - > gw - > bw , false , & w , & h ) = = NSERROR_OK ) ) {
gui_window_get_dimensions ( gwin - > gw , & ww , & wh , false ) ;
2014-10-26 19:35:05 +03:00
}
if ( vscroll = = BW_SCROLLING_NO ) {
rethinkv = ami_gui_vscroll_remove ( gwin ) ;
} else {
if ( h > wh ) rethinkv = ami_gui_vscroll_add ( gwin ) ;
else rethinkv = ami_gui_vscroll_remove ( gwin ) ;
}
if ( hscroll = = BW_SCROLLING_NO ) {
rethinkh = ami_gui_hscroll_remove ( gwin ) ;
2014-10-25 23:03:14 +04:00
} else {
2014-10-26 19:35:05 +03:00
if ( w > ww ) rethinkh = ami_gui_hscroll_add ( gwin ) ;
else rethinkh = ami_gui_hscroll_remove ( gwin ) ;
2014-10-25 23:03:14 +04:00
}
}
2014-10-26 19:35:05 +03:00
if ( rethinkv | | rethinkh ) {
2014-10-25 23:03:14 +04:00
FlushLayoutDomainCache ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ) ;
RethinkLayout ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ,
gwin - > win , NULL , TRUE ) ;
2014-11-16 17:44:40 +03:00
browser_window_schedule_reformat ( gwin - > gw - > bw ) ;
2014-10-25 23:03:14 +04:00
ami_schedule_redraw ( gwin , true ) ;
}
}
2014-01-12 21:07:34 +04:00
/**
* function to add retrieved favicon to gui
*/
static void gui_window_set_icon ( struct gui_window * g , hlcache_handle * icon )
{
struct BitMap * bm = NULL ;
struct IBox * bbox ;
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
struct bitmap * icon_bitmap = NULL ;
2014-01-12 21:07:34 +04:00
if ( nsoption_bool ( kiosk_mode ) = = true ) return ;
if ( ! g ) return ;
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) ) GetAttr ( CLICKTAB_Current ,
g - > shared - > objects [ GID_TABS ] ,
( ULONG * ) & cur_tab ) ;
if ( ( icon ! = NULL ) & & ( ( icon_bitmap = content_get_bitmap ( icon ) ) ! = NULL ) )
{
bm = ami_bitmap_get_native ( icon_bitmap , 16 , 16 ,
g - > shared - > win - > RPort - > BitMap ) ;
}
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
{
RefreshGList ( ( struct Gadget * ) g - > shared - > objects [ GID_ICON ] ,
g - > shared - > win , NULL , 1 ) ;
if ( bm )
{
ULONG tag , tag_data , minterm ;
if ( ami_plot_screen_is_palettemapped ( ) = = false ) {
tag = BLITA_UseSrcAlpha ;
tag_data = ! icon_bitmap - > opaque ;
minterm = 0xc0 ;
} else {
tag = BLITA_MaskPlane ;
tag_data = ( ULONG ) ami_bitmap_get_mask ( icon_bitmap , 16 , 16 , bm ) ;
minterm = ( ABC | ABNC | ANBC ) ;
}
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_ICON ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2014-01-12 21:07:34 +04:00
BltBitMapTags ( BLITA_SrcX , 0 ,
BLITA_SrcY , 0 ,
BLITA_DestX , bbox - > Left ,
BLITA_DestY , bbox - > Top ,
BLITA_Width , 16 ,
BLITA_Height , 16 ,
BLITA_Source , bm ,
BLITA_Dest , g - > shared - > win - > RPort ,
BLITA_SrcType , BLITT_BITMAP ,
BLITA_DestType , BLITT_RASTPORT ,
BLITA_Minterm , minterm ,
tag , tag_data ,
TAG_DONE ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2014-01-12 21:07:34 +04:00
}
}
g - > favicon = icon ;
}
2014-07-05 22:00:21 +04:00
static void ami_gui_refresh_favicon ( void * p )
{
struct gui_window_2 * gwin = ( struct gui_window_2 * ) p ;
2014-11-16 17:44:40 +03:00
gui_window_set_icon ( gwin - > gw , gwin - > gw - > favicon ) ;
2014-07-05 22:00:21 +04:00
}
2014-10-26 20:00:18 +03:00
/* Gets the size that border gadget 1 (status) needs to be.
2014-10-26 20:08:23 +03:00
* Returns the width of the size gadget as a convenience .
2014-10-26 20:00:18 +03:00
*/
static ULONG ami_get_border_gadget_size ( struct gui_window_2 * gwin , ULONG * width , ULONG * height )
{
ULONG available_width ;
if ( ( sz_gad_width = = 0 ) | | ( sz_gad_height = = 0 ) ) {
struct DrawInfo * dri = GetScreenDrawInfo ( scrn ) ;
GetGUIAttrs ( NULL , dri ,
GUIA_SizeGadgetWidth , & sz_gad_width ,
GUIA_SizeGadgetHeight , & sz_gad_height ,
TAG_DONE ) ;
FreeScreenDrawInfo ( scrn , dri ) ;
}
available_width = gwin - > win - > Width - scrn - > WBorLeft - sz_gad_width ;
* width = available_width ;
* height = sz_gad_height ;
return sz_gad_width ;
}
static void ami_set_border_gadget_size ( struct gui_window_2 * gwin )
{
/* Reset gadget widths according to new calculation */
ULONG size1 , size2 , sz ;
sz = ami_get_border_gadget_size ( gwin , & size1 , & size2 ) ;
RefreshSetGadgetAttrs ( ( struct Gadget * ) ( APTR ) gwin - > objects [ GID_STATUS ] ,
gwin - > win , NULL ,
GA_Width , size1 ,
TAG_DONE ) ;
RefreshWindowFrame ( gwin - > win ) ;
}
2014-10-16 12:55:01 +04:00
static void ami_handle_msg ( void )
2008-08-02 18:31:32 +04:00
{
2014-10-25 19:22:08 +04:00
ULONG result , storage = 0 , x , y , xs , ys , width = 800 , height = 600 ;
uint16 code ;
2008-08-11 21:53:45 +04:00
struct IBox * bbox ;
2008-08-09 19:19:04 +04:00
struct nsObject * node ;
struct nsObject * nnode ;
2011-06-18 21:40:27 +04:00
struct gui_window_2 * gwin = NULL ;
2008-09-28 17:55:40 +04:00
struct InputEvent * ie ;
2008-10-05 03:29:17 +04:00
struct Node * tabnode ;
2014-04-05 22:43:55 +04:00
int nskey ;
2010-12-17 02:28:33 +03:00
struct timeval curtime ;
2010-12-19 02:34:56 +03:00
static int drag_x_move = 0 , drag_y_move = 0 ;
2014-03-13 23:37:01 +04:00
char * utf8 = NULL ;
2013-11-23 16:34:00 +04:00
nsurl * url ;
2008-08-02 18:31:32 +04:00
2008-12-06 13:43:25 +03:00
if ( IsMinListEmpty ( window_list ) )
{
/* no windows in list, so NetSurf should not be running */
2009-10-03 15:00:10 +04:00
ami_try_quit ( ) ;
2008-12-06 13:43:25 +03:00
return ;
}
2008-10-06 22:20:16 +04:00
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
2008-08-02 18:31:32 +04:00
2008-10-06 22:20:16 +04:00
do
2008-08-09 02:38:13 +04:00
{
2008-10-06 22:20:16 +04:00
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
2008-08-09 19:19:04 +04:00
gwin = node - > objstruct ;
2014-02-11 00:46:24 +04:00
if ( node - > Type = = AMINS_TVWINDOW ) {
if ( ami_tree_event ( ( struct treeview_window * ) gwin ) ) {
ami_try_quit ( ) ;
2008-09-28 17:55:40 +04:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2008-09-28 17:55:40 +04:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_FINDWINDOW ) {
if ( ami_search_event ( ) ) {
ami_try_quit ( ) ;
2008-12-14 02:25:42 +03:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2008-12-14 02:25:42 +03:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_HISTORYWINDOW ) {
if ( ami_history_event ( ( struct history_window * ) gwin ) ) {
ami_try_quit ( ) ;
2009-03-08 15:52:44 +03:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2009-03-08 15:52:44 +03:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_PRINTWINDOW ) {
if ( ami_print_event ( ( struct ami_print_window * ) gwin ) ) {
ami_try_quit ( ) ;
2009-11-01 17:53:04 +03:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2009-11-01 17:53:04 +03:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_GUIOPTSWINDOW ) {
if ( ami_gui_opts_event ( ) ) {
/* last window possibly closed, so exit with conditions ;) */
if ( scrn ) ami_try_quit ( ) ;
2009-06-21 02:29:43 +04:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2009-06-21 02:29:43 +04:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_DLWINDOW ) {
if ( ami_download_window_event ( ( struct gui_download_window * ) gwin ) ) {
ami_try_quit ( ) ;
2010-04-10 02:38:51 +04:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2010-04-10 02:38:51 +04:00
node = nnode ;
continue ;
}
2014-02-11 00:46:24 +04:00
} else if ( node - > Type = = AMINS_LOGINWINDOW ) {
if ( ami_401login_event ( ( struct gui_login_window * ) gwin ) ) {
ami_try_quit ( ) ;
2010-04-10 02:38:51 +04:00
break ;
2014-02-11 00:46:24 +04:00
} else {
2010-04-10 02:38:51 +04:00
node = nnode ;
continue ;
}
}
2008-09-28 17:55:40 +04:00
2008-08-09 19:19:04 +04:00
while ( ( result = RA_HandleInput ( gwin - > objects [ OID_MAIN ] , & code ) ) ! = WMHI_LASTMSG )
{
2012-04-29 19:59:37 +04:00
//printf("%ld: %ld (switch)\n",code, result & WMHI_CLASSMASK);
2008-08-09 19:19:04 +04:00
switch ( result & WMHI_CLASSMASK ) // class
2008-09-05 02:41:26 +04:00
{
2008-08-09 19:19:04 +04:00
case WMHI_MOUSEMOVE :
2012-01-12 01:41:55 +04:00
ami_gui_trap_mouse ( gwin ) ; /* re-assert mouse area */
2010-12-19 02:34:56 +03:00
drag_x_move = 0 ;
drag_y_move = 0 ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
break ;
}
2008-08-11 21:53:45 +04:00
2014-11-16 17:44:40 +03:00
x = ( ULONG ) ( ( gwin - > win - > MouseX - bbox - > Left ) / gwin - > gw - > bw - > scale ) ;
y = ( ULONG ) ( ( gwin - > win - > MouseY - bbox - > Top ) / gwin - > gw - > bw - > scale ) ;
2009-01-25 03:36:30 +03:00
2009-08-31 01:43:14 +04:00
ami_get_hscroll_pos ( gwin , ( ULONG * ) & xs ) ;
ami_get_vscroll_pos ( gwin , ( ULONG * ) & ys ) ;
x + = xs ;
y + = ys ;
2008-08-11 21:53:45 +04:00
width = bbox - > Width ;
height = bbox - > Height ;
2008-08-18 23:07:12 +04:00
2012-11-12 03:17:00 +04:00
if ( gwin - > mouse_state & BROWSER_MOUSE_DRAG_ON )
2010-10-20 02:22:03 +04:00
{
ami_drag_icon_move ( ) ;
2012-11-12 03:17:00 +04:00
if ( ami_autoscroll = = TRUE ) {
if ( ( gwin - > win - > MouseX < bbox - > Left ) & &
( ( gwin - > win - > MouseX - bbox - > Left ) > - AMI_DRAG_THRESHOLD ) )
drag_x_move = gwin - > win - > MouseX - bbox - > Left ;
if ( ( gwin - > win - > MouseX > ( bbox - > Left + bbox - > Width ) ) & &
( ( gwin - > win - > MouseX - ( bbox - > Left + bbox - > Width ) ) < AMI_DRAG_THRESHOLD ) )
drag_x_move = gwin - > win - > MouseX - ( bbox - > Left + bbox - > Width ) ;
if ( ( gwin - > win - > MouseY < bbox - > Top ) & &
( ( gwin - > win - > MouseY - bbox - > Top ) > - AMI_DRAG_THRESHOLD ) )
drag_y_move = gwin - > win - > MouseY - bbox - > Top ;
if ( ( gwin - > win - > MouseY > ( bbox - > Top + bbox - > Height ) ) & &
( ( gwin - > win - > MouseY - ( bbox - > Top + bbox - > Height ) ) < AMI_DRAG_THRESHOLD ) )
drag_y_move = gwin - > win - > MouseY - ( bbox - > Top + bbox - > Height ) ;
}
2010-10-20 02:22:03 +04:00
}
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2008-08-11 21:53:45 +04:00
if ( ( x > = xs ) & & ( y > = ys ) & & ( x < width + xs ) & & ( y < height + ys ) )
2008-08-09 19:19:04 +04:00
{
2009-01-11 02:10:54 +03:00
ami_update_quals ( gwin ) ;
2011-02-28 22:31:35 +03:00
ami_context_menu_mouse_trap ( gwin , TRUE ) ;
2008-10-20 22:06:46 +04:00
2008-08-18 23:07:12 +04:00
if ( gwin - > mouse_state & BROWSER_MOUSE_PRESS_1 )
{
2014-11-16 17:44:40 +03:00
browser_window_mouse_track ( gwin - > gw - > bw , BROWSER_MOUSE_DRAG_1 | gwin - > key_state , x , y ) ;
2008-08-18 23:07:12 +04:00
gwin - > mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON ;
}
else if ( gwin - > mouse_state & BROWSER_MOUSE_PRESS_2 )
{
2014-11-16 17:44:40 +03:00
browser_window_mouse_track ( gwin - > gw - > bw , BROWSER_MOUSE_DRAG_2 | gwin - > key_state , x , y ) ;
2008-08-18 23:07:12 +04:00
gwin - > mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON ;
}
else
{
2014-11-16 17:44:40 +03:00
browser_window_mouse_track ( gwin - > gw - > bw , gwin - > mouse_state | gwin - > key_state , x , y ) ;
2008-08-18 23:07:12 +04:00
}
2008-08-09 19:19:04 +04:00
}
2008-09-04 02:02:41 +04:00
else
{
2011-02-28 22:31:35 +03:00
ami_context_menu_mouse_trap ( gwin , FALSE ) ;
2008-10-20 22:06:46 +04:00
2013-01-06 04:21:15 +04:00
if ( ! gwin - > mouse_state ) ami_set_pointer ( gwin , GUI_POINTER_DEFAULT , true ) ;
2008-09-04 02:02:41 +04:00
}
2008-08-09 19:19:04 +04:00
break ;
case WMHI_MOUSEBUTTONS :
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2009-08-31 01:43:14 +04:00
2014-11-16 17:44:40 +03:00
x = ( ULONG ) ( ( gwin - > win - > MouseX - bbox - > Left ) / gwin - > gw - > bw - > scale ) ;
y = ( ULONG ) ( ( gwin - > win - > MouseY - bbox - > Top ) / gwin - > gw - > bw - > scale ) ;
2009-01-25 03:36:30 +03:00
2009-08-31 01:43:14 +04:00
ami_get_hscroll_pos ( gwin , ( ULONG * ) & xs ) ;
ami_get_vscroll_pos ( gwin , ( ULONG * ) & ys ) ;
x + = xs ;
y + = ys ;
2008-08-11 21:53:45 +04:00
width = bbox - > Width ;
height = bbox - > Height ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2009-01-11 02:10:54 +03:00
ami_update_quals ( gwin ) ;
2009-01-11 00:31:21 +03:00
2008-08-11 21:53:45 +04:00
if ( ( x > = xs ) & & ( y > = ys ) & & ( x < width + xs ) & & ( y < height + ys ) )
2008-08-09 19:19:04 +04:00
{
2008-08-19 22:31:56 +04:00
//code = code>>16;
2008-08-09 19:19:04 +04:00
switch ( code )
{
case SELECTDOWN :
2014-11-16 17:44:40 +03:00
browser_window_mouse_click ( gwin - > gw - > bw , BROWSER_MOUSE_PRESS_1 | gwin - > key_state , x , y ) ;
2008-08-18 23:07:12 +04:00
gwin - > mouse_state = BROWSER_MOUSE_PRESS_1 ;
2008-08-09 19:19:04 +04:00
break ;
case MIDDLEDOWN :
2014-11-16 17:44:40 +03:00
browser_window_mouse_click ( gwin - > gw - > bw , BROWSER_MOUSE_PRESS_2 | gwin - > key_state , x , y ) ;
2008-08-18 23:07:12 +04:00
gwin - > mouse_state = BROWSER_MOUSE_PRESS_2 ;
2008-08-09 19:19:04 +04:00
break ;
}
}
2008-09-04 02:02:41 +04:00
if ( x < xs ) x = xs ;
if ( y < ys ) y = ys ;
if ( x > = width + xs ) x = width + xs - 1 ;
if ( y > = height + ys ) y = height + ys - 1 ;
switch ( code )
{
2011-02-28 22:31:35 +03:00
case MENUDOWN :
2011-09-02 21:31:47 +04:00
ami_context_menu_show ( gwin , x , y ) ;
2011-02-28 22:31:35 +03:00
break ;
2008-09-04 02:02:41 +04:00
case SELECTUP :
if ( gwin - > mouse_state & BROWSER_MOUSE_PRESS_1 )
{
2014-10-25 19:22:08 +04:00
CurrentTime ( ( ULONG * ) & curtime . tv_sec , ( ULONG * ) & curtime . tv_usec ) ;
2010-12-17 02:28:33 +03:00
gwin - > mouse_state = BROWSER_MOUSE_CLICK_1 ;
if ( gwin - > lastclick . tv_sec )
{
if ( DoubleClick ( gwin - > lastclick . tv_sec ,
gwin - > lastclick . tv_usec ,
2013-02-12 23:12:14 +04:00
curtime . tv_sec , curtime . tv_usec ) ) {
if ( gwin - > prev_mouse_state & BROWSER_MOUSE_DOUBLE_CLICK ) {
gwin - > mouse_state | = BROWSER_MOUSE_TRIPLE_CLICK ;
} else {
gwin - > mouse_state | = BROWSER_MOUSE_DOUBLE_CLICK ;
}
}
2010-12-17 02:28:33 +03:00
}
2014-11-16 17:44:40 +03:00
browser_window_mouse_click ( gwin - > gw - > bw ,
2010-12-17 02:28:33 +03:00
gwin - > mouse_state | gwin - > key_state , x , y ) ;
2013-02-12 23:12:14 +04:00
if ( gwin - > mouse_state & BROWSER_MOUSE_TRIPLE_CLICK )
2010-12-17 02:28:33 +03:00
{
gwin - > lastclick . tv_sec = 0 ;
gwin - > lastclick . tv_usec = 0 ;
}
else
{
gwin - > lastclick . tv_sec = curtime . tv_sec ;
gwin - > lastclick . tv_usec = curtime . tv_usec ;
}
2008-09-04 02:02:41 +04:00
}
else
{
2014-11-16 17:44:40 +03:00
browser_window_mouse_track ( gwin - > gw - > bw , 0 , x , y ) ;
2008-09-04 02:02:41 +04:00
}
2013-02-12 23:12:14 +04:00
gwin - > prev_mouse_state = gwin - > mouse_state ;
2008-09-04 02:02:41 +04:00
gwin - > mouse_state = 0 ;
break ;
2010-12-17 02:28:33 +03:00
2008-09-04 02:02:41 +04:00
case MIDDLEUP :
if ( gwin - > mouse_state & BROWSER_MOUSE_PRESS_2 )
{
2014-10-25 19:22:08 +04:00
CurrentTime ( ( ULONG * ) & curtime . tv_sec , ( ULONG * ) & curtime . tv_usec ) ;
2010-12-17 02:28:33 +03:00
gwin - > mouse_state = BROWSER_MOUSE_CLICK_2 ;
if ( gwin - > lastclick . tv_sec )
{
if ( DoubleClick ( gwin - > lastclick . tv_sec ,
gwin - > lastclick . tv_usec ,
2013-02-12 23:12:14 +04:00
curtime . tv_sec , curtime . tv_usec ) ) {
if ( gwin - > prev_mouse_state & BROWSER_MOUSE_DOUBLE_CLICK ) {
gwin - > mouse_state | = BROWSER_MOUSE_TRIPLE_CLICK ;
} else {
gwin - > mouse_state | = BROWSER_MOUSE_DOUBLE_CLICK ;
}
}
2010-12-17 02:28:33 +03:00
}
2014-11-16 17:44:40 +03:00
browser_window_mouse_click ( gwin - > gw - > bw ,
2010-12-17 02:28:33 +03:00
gwin - > mouse_state | gwin - > key_state , x , y ) ;
2013-02-12 23:12:14 +04:00
if ( gwin - > mouse_state & BROWSER_MOUSE_TRIPLE_CLICK )
2010-12-17 02:28:33 +03:00
{
gwin - > lastclick . tv_sec = 0 ;
gwin - > lastclick . tv_usec = 0 ;
}
else
{
gwin - > lastclick . tv_sec = curtime . tv_sec ;
gwin - > lastclick . tv_usec = curtime . tv_usec ;
}
2008-09-04 02:02:41 +04:00
}
else
{
2014-11-16 17:44:40 +03:00
browser_window_mouse_track ( gwin - > gw - > bw , 0 , x , y ) ;
2008-09-04 02:02:41 +04:00
}
2013-02-12 23:12:14 +04:00
gwin - > prev_mouse_state = gwin - > mouse_state ;
2008-09-04 02:02:41 +04:00
gwin - > mouse_state = 0 ;
break ;
2011-06-03 22:08:17 +04:00
case SIDEUP :
ami_gui_history ( gwin , true ) ;
break ;
2011-09-24 19:20:05 +04:00
case EXTRAUP :
2011-06-03 22:08:17 +04:00
ami_gui_history ( gwin , false ) ;
break ;
2008-09-04 02:02:41 +04:00
}
2009-03-25 03:03:43 +03:00
2010-07-29 01:33:51 +04:00
if ( drag_save_data & & ! gwin - > mouse_state )
2009-03-25 03:03:43 +03:00
ami_drag_save ( gwin - > win ) ;
2008-08-09 19:19:04 +04:00
break ;
case WMHI_GADGETUP :
2009-09-05 02:00:09 +04:00
switch ( result & WMHI_GADGETMASK )
2008-08-09 19:19:04 +04:00
{
2008-10-05 03:29:17 +04:00
case GID_TABS :
2014-02-06 23:35:52 +04:00
if ( gwin - > objects [ GID_TABS ] = = NULL ) break ;
2010-02-14 03:46:53 +03:00
GetAttrs ( gwin - > objects [ GID_TABS ] ,
CLICKTAB_NodeClosed , & tabnode , TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
if ( tabnode ) {
struct gui_window * closedgw ;
2010-02-14 03:46:53 +03:00
GetClickTabNodeAttrs ( tabnode ,
2014-11-16 17:24:18 +03:00
TNA_UserData , & closedgw ,
2010-02-14 03:46:53 +03:00
TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
browser_window_destroy ( closedgw - > bw ) ;
} else {
2010-02-14 03:46:53 +03:00
ami_switch_tab ( gwin , true ) ;
}
2008-10-06 01:20:12 +04:00
break ;
2008-10-05 03:29:17 +04:00
2008-10-06 01:20:12 +04:00
case GID_CLOSETAB :
2014-11-16 17:44:40 +03:00
browser_window_destroy ( gwin - > gw - > bw ) ;
2008-10-05 03:29:17 +04:00
break ;
2010-02-14 17:00:33 +03:00
case GID_ADDTAB :
2014-01-03 22:20:47 +04:00
ami_gui_new_blank_tab ( gwin ) ;
2010-02-14 17:00:33 +03:00
break ;
2008-08-09 19:19:04 +04:00
case GID_URL :
2014-05-25 03:57:48 +04:00
{
nserror ret ;
nsurl * url ;
2010-02-13 21:03:05 +03:00
GetAttr ( STRINGA_TextVal ,
( Object * ) gwin - > objects [ GID_URL ] ,
( ULONG * ) & storage ) ;
2014-05-25 03:57:48 +04:00
utf8 = ami_to_utf8_easy ( ( const char * ) storage ) ;
2014-03-13 23:37:01 +04:00
2014-05-25 03:57:48 +04:00
ret = search_web_omni ( utf8 , SEARCH_WEB_OMNI_NONE , & url ) ;
ami_utf8_free ( utf8 ) ;
if ( ret = = NSERROR_OK ) {
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:40:04 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
nsurl_unref ( url ) ;
}
2014-05-25 03:57:48 +04:00
if ( ret ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( ret ) , 0 ) ;
}
}
2008-08-09 19:19:04 +04:00
break ;
2009-12-23 02:04:59 +03:00
case GID_TOOLBARLAYOUT :
/* Need fixing: never gets here */
2014-05-25 03:57:48 +04:00
search_web_select_provider ( - 1 ) ;
2009-12-23 02:04:59 +03:00
break ;
2014-06-15 18:48:55 +04:00
case GID_SEARCH_ICON :
GetAttr ( CHOOSER_Selected , gwin - > objects [ GID_SEARCH_ICON ] , ( ULONG * ) & storage ) ;
search_web_select_provider ( storage ) ;
break ;
2009-12-23 02:04:59 +03:00
case GID_SEARCHSTRING :
2014-05-25 03:57:48 +04:00
{
nserror ret ;
nsurl * url ;
2010-02-13 21:03:05 +03:00
GetAttr ( STRINGA_TextVal ,
( Object * ) gwin - > objects [ GID_SEARCHSTRING ] ,
( ULONG * ) & storage ) ;
2014-03-13 23:37:01 +04:00
2014-05-25 03:57:48 +04:00
utf8 = ami_to_utf8_easy ( ( const char * ) storage ) ;
ret = search_web_omni ( utf8 , SEARCH_WEB_OMNI_SEARCHONLY , & url ) ;
ami_utf8_free ( utf8 ) ;
if ( ret = = NSERROR_OK ) {
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:40:04 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
2014-05-25 03:57:48 +04:00
nsurl_unref ( url ) ;
}
if ( ret ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( ret ) , 0 ) ;
2013-02-14 19:09:28 +04:00
}
2014-05-25 03:57:48 +04:00
}
2009-12-23 02:04:59 +03:00
break ;
2008-08-09 19:19:04 +04:00
case GID_HOME :
2013-02-14 19:09:28 +04:00
{
if ( nsurl_create ( nsoption_charp ( homepage_url ) , & url ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , 0 ) ;
} else {
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:40:04 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
nsurl_unref ( url ) ;
}
}
2008-08-09 19:19:04 +04:00
break ;
case GID_STOP :
2014-11-16 17:44:40 +03:00
if ( browser_window_stop_available ( gwin - > gw - > bw ) )
browser_window_stop ( gwin - > gw - > bw ) ;
2008-08-09 19:19:04 +04:00
break ;
case GID_RELOAD :
2009-01-11 02:10:54 +03:00
ami_update_quals ( gwin ) ;
2009-01-11 00:31:21 +03:00
2014-11-16 17:44:40 +03:00
if ( browser_window_reload_available ( gwin - > gw - > bw ) )
2008-10-26 15:25:26 +03:00
{
2009-03-24 21:28:02 +03:00
if ( gwin - > key_state & BROWSER_MOUSE_MOD_1 )
{
2014-11-16 17:44:40 +03:00
browser_window_reload ( gwin - > gw - > bw , true ) ;
2009-03-24 21:28:02 +03:00
}
else
{
2014-11-16 17:44:40 +03:00
browser_window_reload ( gwin - > gw - > bw , false ) ;
2009-03-24 21:28:02 +03:00
}
2008-10-26 15:25:26 +03:00
}
2008-08-09 19:19:04 +04:00
break ;
2008-08-10 00:27:36 +04:00
case GID_BACK :
2011-06-03 22:08:17 +04:00
ami_gui_history ( gwin , true ) ;
2008-08-10 00:27:36 +04:00
break ;
case GID_FORWARD :
2011-06-03 22:08:17 +04:00
ami_gui_history ( gwin , false ) ;
2008-08-10 00:27:36 +04:00
break ;
2008-08-10 13:57:41 +04:00
2013-11-23 16:34:00 +04:00
case GID_FAVE :
GetAttr ( STRINGA_TextVal ,
( Object * ) gwin - > objects [ GID_URL ] ,
( ULONG * ) & storage ) ;
if ( nsurl_create ( ( const char * ) storage , & url ) = = NSERROR_OK ) {
if ( hotlist_has_url ( url ) ) {
hotlist_remove_url ( url ) ;
} else {
hotlist_add_url ( url ) ;
}
nsurl_unref ( url ) ;
}
ami_gui_update_hotlist_button ( gwin ) ;
break ;
2012-12-01 04:27:46 +04:00
case GID_HOTLIST :
2008-08-10 13:57:41 +04:00
default :
2008-08-31 15:21:47 +04:00
// printf("GADGET: %ld\n",(result & WMHI_GADGETMASK));
2008-08-10 13:57:41 +04:00
break ;
2008-08-09 19:19:04 +04:00
}
break ;
2008-08-25 17:32:26 +04:00
case WMHI_RAWKEY :
2012-12-11 00:26:40 +04:00
ami_update_quals ( gwin ) ;
2008-08-25 17:32:26 +04:00
storage = result & WMHI_GADGETMASK ;
2009-07-18 15:36:41 +04:00
if ( storage > = IECODE_UP_PREFIX ) break ;
2008-09-28 17:55:40 +04:00
GetAttr ( WINDOW_InputEvent , gwin - > objects [ OID_MAIN ] , ( ULONG * ) & ie ) ;
2008-10-26 15:25:26 +03:00
2009-11-03 02:02:53 +03:00
nskey = ami_key_to_nskey ( storage , ie ) ;
if ( ie - > ie_Qualifier & IEQUALIFIER_RCOMMAND )
2008-08-25 17:32:26 +04:00
{
2009-01-25 03:36:30 +03:00
/* We are duplicating the menu shortcuts here, as if RMBTRAP is active
* ( ie . when context menus are enabled and the mouse is over the browser
* rendering area ) , Intuition also does not catch the menu shortcut
2009-02-01 16:01:46 +03:00
* key presses . Context menus need to be changed to use MENUVERIFY not RMBTRAP */
2009-11-03 02:02:53 +03:00
switch ( nskey )
{
2009-11-04 02:17:57 +03:00
case ' n ' :
2013-02-14 22:21:11 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) ) {
nsurl * urlns ;
nserror error ;
error = nsurl_create ( nsoption_charp ( homepage_url ) , & urlns ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_CLONE | BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
urlns ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2013-02-14 22:21:11 +04:00
NULL ) ;
nsurl_unref ( urlns ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
}
2009-11-04 02:17:57 +03:00
break ;
case ' t ' :
2013-02-14 22:21:11 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) ) {
nsurl * urlns ;
nserror error ;
error = nsurl_create ( nsoption_charp ( homepage_url ) , & urlns ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_CLONE | BW_CREATE_HISTORY |
BW_CREATE_TAB ,
2013-02-14 22:21:11 +04:00
urlns ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2013-02-14 22:21:11 +04:00
NULL ) ;
nsurl_unref ( urlns ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
}
2009-11-04 02:17:57 +03:00
break ;
case ' k ' :
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2014-11-16 17:44:40 +03:00
browser_window_destroy ( gwin - > gw - > bw ) ;
2009-11-04 02:17:57 +03:00
break ;
2011-10-15 18:09:35 +04:00
case ' o ' :
ami_file_open ( gwin ) ;
break ;
2011-10-15 18:55:03 +04:00
case ' s ' :
2011-10-23 17:15:44 +04:00
ami_file_save_req ( AMINS_SAVE_SOURCE , gwin ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw - > current_content ) ;
2011-10-15 18:55:03 +04:00
break ;
2009-11-04 02:17:57 +03:00
case ' p ' :
2014-11-16 17:44:40 +03:00
ami_print_ui ( gwin - > gw - > bw - > current_content ) ;
2009-11-04 02:17:57 +03:00
break ;
case ' q ' :
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2009-11-04 02:17:57 +03:00
ami_quit_netsurf ( ) ;
break ;
2009-11-03 02:12:28 +03:00
case ' a ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_SELECT_ALL ) ;
2009-11-03 02:12:28 +03:00
break ;
2010-07-24 20:39:37 +04:00
case ' x ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_CUT_SELECTION ) ;
2010-07-24 20:39:37 +04:00
break ;
2009-11-03 02:02:53 +03:00
case ' c ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_COPY_SELECTION ) ;
browser_window_key_press ( gwin - > gw - > bw , KEY_CLEAR_SELECTION ) ;
2009-11-04 11:14:17 +03:00
break ;
2010-07-24 20:39:37 +04:00
2009-11-03 02:02:53 +03:00
case ' v ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_PASTE ) ;
2009-11-03 02:02:53 +03:00
break ;
2009-11-04 02:17:57 +03:00
case ' z ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_UNDO ) ;
2013-10-01 21:51:27 +04:00
break ;
case ' y ' :
2014-11-16 17:44:40 +03:00
browser_window_key_press ( gwin - > gw - > bw , KEY_REDO ) ;
2009-11-04 02:17:57 +03:00
break ;
case ' f ' :
2014-11-16 17:44:40 +03:00
ami_search_open ( gwin - > gw ) ;
2009-11-04 02:17:57 +03:00
break ;
case ' h ' :
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2010-10-05 23:14:46 +04:00
ami_tree_open ( hotlist_window , AMI_TREE_HOTLIST ) ;
2009-11-04 02:17:57 +03:00
break ;
2013-02-03 23:14:25 +04:00
case ' - ' :
2014-11-16 17:44:40 +03:00
if ( browser_window_get_scale ( gwin - > gw - > bw ) > 0.1 )
browser_window_set_scale ( gwin - > gw - > bw ,
browser_window_get_scale ( gwin - > gw - > bw ) - 0.1 , false ) ;
2013-02-03 23:14:25 +04:00
break ;
case ' = ' :
2014-11-16 17:44:40 +03:00
browser_window_set_scale ( gwin - > gw - > bw , 1.0 , false ) ;
2013-02-03 23:14:25 +04:00
break ;
case ' + ' :
2014-11-16 17:44:40 +03:00
browser_window_set_scale ( gwin - > gw - > bw ,
browser_window_get_scale ( gwin - > gw - > bw ) + 0.1 , false ) ;
2013-02-03 23:14:25 +04:00
break ;
/* The following aren't available from the menu at the moment */
2009-11-04 02:17:57 +03:00
case ' r ' : // reload
2014-11-16 17:44:40 +03:00
if ( browser_window_reload_available ( gwin - > gw - > bw ) )
browser_window_reload ( gwin - > gw - > bw , false ) ;
2009-11-04 02:17:57 +03:00
break ;
2014-01-11 00:35:49 +04:00
2009-11-04 02:17:57 +03:00
case ' u ' : // open url
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2012-03-29 02:17:27 +04:00
ActivateLayoutGadget ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ,
gwin - > win , NULL , ( uint32 ) gwin - > objects [ GID_URL ] ) ;
2009-11-04 02:17:57 +03:00
break ;
2009-11-03 02:02:53 +03:00
}
}
else
{
2014-11-16 17:44:40 +03:00
if ( ! browser_window_key_press ( gwin - > gw - > bw , nskey ) )
2009-11-03 02:12:28 +03:00
{
switch ( nskey )
{
case KEY_UP :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , 0 , - NSA_KBD_SCROLL_PX ) ;
2009-11-03 02:12:28 +03:00
break ;
case KEY_DOWN :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , 0 , + NSA_KBD_SCROLL_PX ) ;
2009-11-03 02:12:28 +03:00
break ;
case KEY_LEFT :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , - NSA_KBD_SCROLL_PX , 0 ) ;
2009-11-03 02:12:28 +03:00
break ;
case KEY_RIGHT :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , + NSA_KBD_SCROLL_PX , 0 ) ;
2009-11-03 02:12:28 +03:00
break ;
2009-11-04 02:17:57 +03:00
case KEY_PAGE_UP :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , 0 , SCROLL_PAGE_UP ) ;
2009-11-04 02:17:57 +03:00
break ;
case KEY_PAGE_DOWN :
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , 0 , SCROLL_PAGE_DOWN ) ;
2009-11-04 02:17:57 +03:00
break ;
case KEY_LINE_START : // page left
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , SCROLL_PAGE_UP , 0 ) ;
2009-11-04 02:17:57 +03:00
break ;
case KEY_LINE_END : // page right
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , SCROLL_PAGE_DOWN , 0 ) ;
2009-11-04 02:17:57 +03:00
break ;
case KEY_TEXT_START : // home
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , SCROLL_TOP , SCROLL_TOP ) ;
2009-11-04 02:17:57 +03:00
break ;
case KEY_TEXT_END : // end
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , SCROLL_BOTTOM , SCROLL_BOTTOM ) ;
2009-11-04 02:17:57 +03:00
break ;
2009-11-04 11:06:52 +03:00
2009-12-13 14:52:58 +03:00
case KEY_WORD_RIGHT : // alt+right
ami_change_tab ( gwin , 1 ) ;
break ;
case KEY_WORD_LEFT : // alt+left
ami_change_tab ( gwin , - 1 ) ;
break ;
2011-06-25 20:00:02 +04:00
case KEY_DELETE_LEFT : // backspace
ami_gui_history ( gwin , true ) ;
break ;
2009-11-04 11:06:52 +03:00
case RAWKEY_F5 : // reload
2014-11-16 17:44:40 +03:00
if ( browser_window_reload_available ( gwin - > gw - > bw ) )
browser_window_reload ( gwin - > gw - > bw , false ) ;
2009-11-04 11:06:52 +03:00
break ;
2013-01-25 00:00:09 +04:00
case RAWKEY_HELP : // help
2014-02-07 21:51:12 +04:00
ami_help_open ( AMI_HELP_GUI , scrn ) ;
2013-01-25 00:00:09 +04:00
break ;
2009-11-03 02:12:28 +03:00
}
}
2008-08-25 17:32:26 +04:00
}
break ;
2008-08-11 21:53:45 +04:00
case WMHI_NEWSIZE :
2008-09-28 00:55:11 +04:00
switch ( node - > Type )
{
case AMINS_WINDOW :
2014-10-26 20:00:18 +03:00
ami_set_border_gadget_size ( gwin ) ;
2014-11-16 17:44:40 +03:00
ami_throbber_redraw_schedule ( 0 , gwin - > gw ) ;
2014-07-05 22:00:21 +04:00
ami_schedule ( 0 , ami_gui_refresh_favicon , gwin ) ;
2014-11-16 17:44:40 +03:00
browser_window_schedule_reformat ( gwin - > gw - > bw ) ;
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( gwin , true ) ;
2008-09-28 00:55:11 +04:00
break ;
}
2008-08-11 21:53:45 +04:00
break ;
2008-08-19 22:31:56 +04:00
case WMHI_CLOSEWINDOW :
2008-10-06 11:07:33 +04:00
ami_close_all_tabs ( gwin ) ;
2008-09-05 02:41:26 +04:00
break ;
2009-07-04 20:12:27 +04:00
case WMHI_ICONIFY :
{
2009-07-04 22:01:46 +04:00
struct bitmap * bm ;
2014-11-16 17:44:40 +03:00
bm = urldb_get_thumbnail ( hlcache_handle_get_url ( gwin - > gw - > bw - > current_content ) ) ;
if ( ! bm ) bm = content_get_bitmap ( gwin - > gw - > bw - > current_content ) ;
2011-07-03 15:05:18 +04:00
gwin - > dobj = amiga_icon_from_bitmap ( bm ) ;
2014-11-16 17:44:40 +03:00
amiga_icon_superimpose_favicon_internal ( gwin - > gw - > favicon ,
2011-10-08 03:12:12 +04:00
gwin - > dobj ) ;
2011-07-03 15:05:18 +04:00
HideWindow ( gwin - > win ) ;
2012-04-28 23:43:46 +04:00
gwin - > appicon = AddAppIcon ( ( ULONG ) gwin - > objects [ OID_MAIN ] ,
( ULONG ) gwin , gwin - > win - > Title , appport ,
0 , gwin - > dobj , NULL ) ;
2011-07-03 15:20:00 +04:00
curbw = NULL ;
2009-07-04 20:12:27 +04:00
}
break ;
2010-03-15 22:00:21 +03:00
case WMHI_INACTIVE :
2014-11-16 17:44:40 +03:00
gwin - > gw - > c_h_temp = gwin - > gw - > c_h ;
gui_window_remove_caret ( gwin - > gw ) ;
2010-03-15 22:00:21 +03:00
break ;
2008-10-26 02:22:34 +03:00
case WMHI_ACTIVE :
2014-11-16 17:44:40 +03:00
if ( gwin - > gw - > bw ) curbw = gwin - > gw - > bw ;
if ( gwin - > gw - > c_h_temp )
gwin - > gw - > c_h = gwin - > gw - > c_h_temp ;
2008-10-26 02:22:34 +03:00
break ;
2008-09-05 02:41:26 +04:00
case WMHI_INTUITICK :
2008-09-08 22:14:14 +04:00
break ;
2008-08-09 19:19:04 +04:00
2008-09-05 02:41:26 +04:00
default :
2012-02-25 22:42:33 +04:00
//printf("class: %ld\n",(result & WMHI_CLASSMASK));
2008-09-05 02:41:26 +04:00
break ;
2008-08-09 19:19:04 +04:00
}
2008-08-10 13:57:41 +04:00
2008-08-22 01:41:42 +04:00
if ( win_destroyed )
{
2008-09-05 02:41:26 +04:00
/* we can't be sure what state our window_list is in, so let's
2008-08-22 01:41:42 +04:00
jump out of the function and start again */
win_destroyed = false ;
return ;
}
2008-08-10 13:57:41 +04:00
2010-12-19 02:34:56 +03:00
if ( drag_x_move | | drag_y_move )
{
2014-11-16 17:44:40 +03:00
gui_window_get_scroll ( gwin - > gw ,
& gwin - > gw - > scrollx , & gwin - > gw - > scrolly ) ;
2010-12-19 02:34:56 +03:00
2014-11-16 17:44:40 +03:00
gui_window_set_scroll ( gwin - > gw ,
gwin - > gw - > scrollx + drag_x_move ,
gwin - > gw - > scrolly + drag_y_move ) ;
2010-12-19 02:34:56 +03:00
}
2008-08-22 01:41:42 +04:00
// ReplyMsg((struct Message *)message);
2008-08-02 18:31:32 +04:00
}
2008-08-10 13:57:41 +04:00
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2011-09-13 02:38:51 +04:00
2012-11-01 00:50:22 +04:00
if ( ami_menu_window_close )
{
2012-11-28 23:29:43 +04:00
if ( ami_menu_window_close = = ( void * ) AMI_MENU_WINDOW_CLOSE_ALL )
2012-11-01 00:50:22 +04:00
ami_quit_netsurf ( ) ;
else
ami_close_all_tabs ( ami_menu_window_close ) ;
ami_menu_window_close = NULL ;
}
2012-12-15 19:39:09 +04:00
if ( ami_menu_check_toggled ) {
ami_gui_menu_update_all ( ) ;
ami_menu_check_toggled = false ;
}
2008-09-05 02:41:26 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_gui_appicon_remove ( struct gui_window_2 * gwin )
2011-07-03 15:05:18 +04:00
{
if ( gwin - > appicon )
{
RemoveAppIcon ( gwin - > appicon ) ;
amiga_icon_free ( gwin - > dobj ) ;
gwin - > appicon = NULL ;
}
}
2014-10-16 12:55:01 +04:00
static void ami_handle_appmsg ( void )
2008-09-05 02:41:26 +04:00
{
struct AppMessage * appmsg ;
2008-10-05 03:29:17 +04:00
struct gui_window_2 * gwin ;
2011-12-02 16:47:11 +04:00
int x , y ;
2008-09-07 19:58:11 +04:00
struct WBArg * appwinargs ;
STRPTR filename ;
2011-12-02 16:47:11 +04:00
int i = 0 ;
2008-09-04 02:02:41 +04:00
2014-10-25 19:22:08 +04:00
while ( ( appmsg = ( struct AppMessage * ) GetMsg ( appport ) ) )
2008-09-04 02:02:41 +04:00
{
2012-04-28 23:43:46 +04:00
gwin = ( struct gui_window_2 * ) appmsg - > am_UserData ;
2008-09-07 19:58:11 +04:00
2009-07-04 20:12:27 +04:00
if ( appmsg - > am_Type = = AMTYPE_APPICON )
{
2011-07-03 15:05:18 +04:00
ami_gui_appicon_remove ( gwin ) ;
ShowWindow ( gwin - > win , WINDOW_FRONTMOST ) ;
2011-07-03 15:20:00 +04:00
ActivateWindow ( gwin - > win ) ;
2009-07-04 20:12:27 +04:00
}
2011-07-03 15:05:18 +04:00
else if ( appmsg - > am_Type = = AMTYPE_APPWINDOW )
2008-09-07 19:58:11 +04:00
{
2011-12-02 16:47:11 +04:00
for ( i = 0 ; i < appmsg - > am_NumArgs ; + + i )
2008-09-05 02:41:26 +04:00
{
2014-10-25 19:22:08 +04:00
if ( ( appwinargs = & appmsg - > am_ArgList [ i ] ) )
2008-09-07 19:58:11 +04:00
{
2014-10-25 19:22:08 +04:00
if ( ( filename = AllocVecTagList ( 1024 , NULL ) ) )
2008-09-07 19:58:11 +04:00
{
2011-12-02 16:47:11 +04:00
if ( appwinargs - > wa_Lock )
2008-09-07 19:58:11 +04:00
{
2011-12-02 16:47:11 +04:00
NameFromLock ( appwinargs - > wa_Lock , filename , 1024 ) ;
2008-09-07 19:58:11 +04:00
}
2011-12-02 16:47:11 +04:00
AddPart ( filename , appwinargs - > wa_Name , 1024 ) ;
2008-09-07 19:58:11 +04:00
2011-12-02 16:47:11 +04:00
if ( ami_mouse_to_ns_coords ( gwin , & x , & y ,
appmsg - > am_MouseX , appmsg - > am_MouseY ) = = false )
2008-09-07 19:58:11 +04:00
{
2013-02-14 19:09:28 +04:00
nsurl * url ;
2008-09-07 19:58:11 +04:00
2014-05-27 02:43:36 +04:00
if ( netsurf_path_to_nsurl ( filename , & url ) ! = NSERROR_OK ) {
2013-02-14 19:09:28 +04:00
warn_user ( " NoMemory " , 0 ) ;
2011-12-02 16:47:11 +04:00
}
else
{
2013-02-14 19:09:28 +04:00
if ( i = = 0 )
{
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:40:04 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
ActivateWindow ( gwin - > win ) ;
}
else
{
2014-02-10 18:08:45 +04:00
browser_window_create ( BW_CREATE_CLONE | BW_CREATE_HISTORY |
BW_CREATE_TAB ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2013-02-14 22:21:11 +04:00
NULL ) ;
2013-02-14 19:09:28 +04:00
}
nsurl_unref ( url ) ;
2008-09-07 19:58:11 +04:00
}
}
else
{
2014-11-16 17:44:40 +03:00
if ( browser_window_drop_file_at_point ( gwin - > gw - > bw , x , y , filename ) = = false )
2008-09-07 19:58:11 +04:00
{
2013-02-14 19:09:28 +04:00
nsurl * url ;
2011-12-02 16:47:11 +04:00
2014-05-27 02:43:36 +04:00
if ( netsurf_path_to_nsurl ( filename , & url ) ! = NSERROR_OK ) {
2013-02-14 19:09:28 +04:00
warn_user ( " NoMemory " , 0 ) ;
2011-12-02 16:47:11 +04:00
}
else
2008-09-07 19:58:11 +04:00
{
2013-02-14 19:09:28 +04:00
if ( i = = 0 )
{
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:53:22 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
ActivateWindow ( gwin - > win ) ;
}
else
{
2014-02-10 18:08:45 +04:00
browser_window_create ( BW_CREATE_CLONE | BW_CREATE_HISTORY |
BW_CREATE_TAB ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2013-02-14 22:21:11 +04:00
NULL ) ;
2013-02-14 19:09:28 +04:00
}
nsurl_unref ( url ) ;
2008-09-07 19:58:11 +04:00
}
}
}
2011-12-02 16:47:11 +04:00
FreeVec ( filename ) ;
2008-09-07 19:58:11 +04:00
}
}
2008-09-05 02:41:26 +04:00
}
}
2008-09-04 02:02:41 +04:00
ReplyMsg ( ( struct Message * ) appmsg ) ;
}
2008-08-02 18:31:32 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_handle_applib ( void )
2009-09-28 22:00:40 +04:00
{
struct ApplicationMsg * applibmsg ;
2009-09-29 02:17:09 +04:00
struct browser_window * bw ;
2013-02-14 22:21:11 +04:00
nsurl * url ;
nserror error ;
2009-09-28 22:00:40 +04:00
2010-03-28 20:42:33 +04:00
if ( ! applibport ) return ;
2009-09-28 22:00:40 +04:00
while ( ( applibmsg = ( struct ApplicationMsg * ) GetMsg ( applibport ) ) )
{
switch ( applibmsg - > type )
{
2009-09-29 02:17:09 +04:00
case APPLIBMT_NewBlankDoc :
2013-02-14 22:21:11 +04:00
{
error = nsurl_create ( nsoption_charp ( homepage_url ) , & url ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
NULL ,
& bw ) ;
nsurl_unref ( url ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
}
2009-09-29 02:17:09 +04:00
break ;
case APPLIBMT_OpenDoc :
{
2011-07-23 18:06:13 +04:00
struct ApplicationOpenPrintDocMsg * applibopdmsg =
( struct ApplicationOpenPrintDocMsg * ) applibmsg ;
2013-02-14 22:21:11 +04:00
2014-05-27 02:43:36 +04:00
error = netsurf_path_to_nsurl ( applibopdmsg - > fileName , & url ) ;
2013-02-14 22:21:11 +04:00
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY ,
2013-02-14 22:21:11 +04:00
url ,
NULL ,
NULL ,
& bw ) ;
nsurl_unref ( url ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
}
2009-09-29 02:17:09 +04:00
}
break ;
2009-09-28 22:00:40 +04:00
case APPLIBMT_ToFront :
2009-09-29 02:17:09 +04:00
if ( curbw )
{
ScreenToFront ( scrn ) ;
WindowToFront ( curbw - > window - > shared - > win ) ;
ActivateWindow ( curbw - > window - > shared - > win ) ;
}
2009-09-28 22:00:40 +04:00
break ;
case APPLIBMT_OpenPrefs :
ScreenToFront ( scrn ) ;
ami_gui_opts_open ( ) ;
break ;
case APPLIBMT_Quit :
case APPLIBMT_ForceQuit :
ami_quit_netsurf ( ) ;
break ;
2010-02-13 20:31:10 +03:00
case APPLIBMT_CustomMsg :
{
2011-07-23 18:06:13 +04:00
struct ApplicationCustomMsg * applibcustmsg =
( struct ApplicationCustomMsg * ) applibmsg ;
2013-10-29 01:21:07 +04:00
LOG ( ( " Ringhio BackMsg received: %s " , applibcustmsg - > customMsg ) ) ;
OpenWorkbenchObjectA ( applibcustmsg - > customMsg , NULL ) ;
2010-02-13 20:31:10 +03:00
}
break ;
2009-09-28 22:00:40 +04:00
}
ReplyMsg ( ( struct Message * ) applibmsg ) ;
}
}
2008-09-05 02:41:26 +04:00
void ami_get_msg ( void )
2008-08-02 18:31:32 +04:00
{
2008-09-05 02:41:26 +04:00
ULONG winsignal = 1L < < sport - > mp_SigBit ;
ULONG appsig = 1L < < appport - > mp_SigBit ;
2008-09-08 22:14:14 +04:00
ULONG schedulesig = 1L < < msgport - > mp_SigBit ;
2012-12-08 03:35:57 +04:00
ULONG ctrlcsig = SIGBREAKF_CTRL_C ;
2014-07-03 23:53:28 +04:00
uint32 signal = 0 ;
fd_set read_fd_set , write_fd_set , except_fd_set ;
int max_fd = - 1 ;
2009-10-16 01:35:29 +04:00
struct TimerRequest * timermsg = NULL ;
2009-08-29 18:00:57 +04:00
struct MsgPort * printmsgport = ami_print_get_msgport ( ) ;
2014-02-07 21:45:00 +04:00
ULONG printsig = 0 ;
2014-02-10 22:42:50 +04:00
ULONG helpsignal = ami_help_signal ( ) ;
2014-02-07 21:45:00 +04:00
if ( printmsgport ) printsig = 1L < < printmsgport - > mp_SigBit ;
2014-07-03 23:53:28 +04:00
uint32 signalmask = winsignal | appsig | schedulesig | rxsig |
2014-07-05 12:36:43 +04:00
printsig | applibsig | helpsignal ;
2014-07-03 23:53:28 +04:00
if ( ( fetcher_fdset ( & read_fd_set , & write_fd_set , & except_fd_set , & max_fd ) = = NSERROR_OK ) & &
( max_fd ! = - 1 ) ) {
/* max_fd is the highest fd in use, but waitselect() needs to know how many
* are in use , so we add 1. */
2014-07-05 12:36:43 +04:00
if ( waitselect ( max_fd + 1 , & read_fd_set , & write_fd_set , & except_fd_set ,
NULL , ( unsigned int * ) & signalmask ) ! = - 1 ) {
signal = signalmask ;
} else {
LOG ( ( " waitselect() returned error " ) ) ;
/* \todo Fix Ctrl-C handling.
* WaitSelect ( ) from bsdsocket . library returns - 1 if the task was
* signalled with a Ctrl - C . waitselect ( ) from newlib . library does not .
* Adding the Ctrl - C signal to our user signal mask causes a Ctrl - C to
* occur sporadically . Otherwise we never get a - 1 except on error .
* NetSurf still terminates at the Wait ( ) when network activity is over .
*/
}
2014-07-03 23:53:28 +04:00
} else {
/* If fetcher_fdset fails or no network activity, do it the old fashioned way. */
signalmask | = ctrlcsig ;
signal = Wait ( signalmask ) ;
}
2008-08-02 18:31:32 +04:00
2008-09-05 02:41:26 +04:00
if ( signal & winsignal )
ami_handle_msg ( ) ;
2011-02-10 00:52:28 +03:00
if ( signal & appsig )
2008-09-05 02:41:26 +04:00
ami_handle_appmsg ( ) ;
2011-02-10 00:52:28 +03:00
if ( signal & rxsig )
2008-09-29 23:35:30 +04:00
ami_arexx_handle ( ) ;
2011-02-10 00:52:28 +03:00
if ( signal & applibsig )
2009-09-28 22:00:40 +04:00
ami_handle_applib ( ) ;
2011-02-10 00:52:28 +03:00
2014-02-10 22:42:50 +04:00
if ( signal & printsig ) {
2009-08-29 18:00:57 +04:00
while ( GetMsg ( printmsgport ) ) ; //ReplyMsg
ami_print_cont ( ) ;
}
2011-02-10 00:52:28 +03:00
2014-02-10 22:42:50 +04:00
if ( signal & schedulesig ) {
2014-10-25 19:22:08 +04:00
if ( ( timermsg = ( struct TimerRequest * ) GetMsg ( msgport ) ) ) {
2011-07-23 18:06:13 +04:00
ReplyMsg ( ( struct Message * ) timermsg ) ;
2011-02-17 00:29:39 +03:00
schedule_run ( FALSE ) ;
2011-02-10 00:52:28 +03:00
}
2008-09-08 22:14:14 +04:00
}
2012-12-08 03:35:57 +04:00
2014-02-10 22:42:50 +04:00
if ( signal & helpsignal )
ami_help_process ( ) ;
2012-12-08 03:35:57 +04:00
if ( signal & ctrlcsig )
2012-12-08 22:08:00 +04:00
ami_quit_netsurf_delayed ( ) ;
2008-09-05 02:41:26 +04:00
}
2008-08-02 18:31:32 +04:00
2009-12-13 14:52:58 +03:00
void ami_change_tab ( struct gui_window_2 * gwin , int direction )
{
2014-11-16 17:44:40 +03:00
struct Node * tab_node = gwin - > gw - > tab_node ;
2009-12-13 14:52:58 +03:00
struct Node * ptab ;
ULONG ptabnum = 0 ;
if ( gwin - > tabs < = 1 ) return ;
if ( direction > 0 )
{
ptab = GetSucc ( tab_node ) ;
}
else
{
ptab = GetPred ( tab_node ) ;
}
if ( ! ptab ) return ;
GetClickTabNodeAttrs ( ptab , TNA_Number , ( ULONG * ) & ptabnum , TAG_DONE ) ;
2010-02-13 21:03:05 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_TABS ] , gwin - > win , NULL ,
2009-12-13 14:52:58 +03:00
CLICKTAB_Current , ptabnum ,
TAG_DONE ) ;
ami_switch_tab ( gwin , true ) ;
}
2014-11-16 17:44:40 +03:00
void ami_switch_tab ( struct gui_window_2 * gwin , bool redraw )
2008-10-05 17:17:18 +04:00
{
struct Node * tabnode ;
2009-09-09 02:59:47 +04:00
struct IBox * bbox ;
2008-10-05 17:17:18 +04:00
2011-07-03 02:40:45 +04:00
/* Clear the last new tab list */
2014-11-16 17:44:40 +03:00
gwin - > gw - > last_new_tab = NULL ;
2011-07-03 02:40:45 +04:00
2008-10-05 17:17:18 +04:00
if ( gwin - > tabs = = 0 ) return ;
2014-11-16 17:44:40 +03:00
gui_window_get_scroll ( gwin - > gw ,
& gwin - > gw - > scrollx , & gwin - > gw - > scrolly ) ;
2008-11-09 02:08:55 +03:00
2010-02-13 21:03:05 +03:00
GetAttr ( CLICKTAB_CurrentNode , ( Object * ) gwin - > objects [ GID_TABS ] ,
( ULONG * ) & tabnode ) ;
2008-10-05 17:17:18 +04:00
GetClickTabNodeAttrs ( tabnode ,
2014-11-16 17:24:18 +03:00
TNA_UserData , & gwin - > gw ,
2014-07-05 22:00:21 +04:00
TAG_DONE ) ;
2014-11-16 17:44:40 +03:00
curbw = gwin - > gw - > bw ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2009-09-09 02:59:47 +04:00
2014-11-16 17:44:40 +03:00
if ( ! gwin - > gw - > bw - > current_content )
2009-09-09 02:59:47 +04:00
{
2010-02-14 15:51:30 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_URL ] ,
gwin - > win , NULL , STRINGA_TextVal , " " , TAG_DONE ) ;
2009-09-09 02:59:47 +04:00
p96RectFill ( gwin - > win - > RPort , bbox - > Left , bbox - > Top ,
bbox - > Width + bbox - > Left , bbox - > Height + bbox - > Top , 0xffffffff ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2009-09-09 02:59:47 +04:00
return ;
}
2008-10-05 17:17:18 +04:00
2012-08-05 14:37:27 +04:00
ami_plot_release_pens ( & gwin - > shared_pens ) ;
2008-10-05 17:17:18 +04:00
ami_update_buttons ( gwin ) ;
2014-11-16 17:44:40 +03:00
ami_menu_update_disabled ( gwin - > gw , gwin - > gw - > bw - > current_content ) ;
2008-10-05 17:17:18 +04:00
if ( redraw )
{
2014-11-16 17:44:40 +03:00
gui_window_set_icon ( gwin - > gw , gwin - > gw - > favicon ) ;
2009-12-19 16:42:48 +03:00
2011-10-03 22:08:52 +04:00
p96RectFill ( gwin - > win - > RPort , bbox - > Left , bbox - > Top ,
bbox - > Width + bbox - > Left , bbox - > Height + bbox - > Top , 0xffffffff ) ;
2014-11-16 17:44:40 +03:00
browser_window_update ( gwin - > gw - > bw , false ) ;
2008-10-05 17:17:18 +04:00
2014-11-16 17:44:40 +03:00
gui_window_set_scroll ( gwin - > gw ,
gwin - > gw - > scrollx , gwin - > gw - > scrolly ) ;
2009-05-31 19:17:35 +04:00
gwin - > redraw_scroll = false ;
2008-11-09 17:02:04 +03:00
2014-11-16 17:44:40 +03:00
browser_window_refresh_url_bar ( gwin - > gw - > bw ) ;
2013-11-23 17:46:57 +04:00
ami_gui_update_hotlist_button ( gwin ) ;
2014-10-27 00:30:19 +03:00
ami_gui_scroller_update ( gwin ) ;
2014-11-16 17:44:40 +03:00
ami_throbber_redraw_schedule ( 0 , gwin - > gw ) ;
2008-10-05 17:17:18 +04:00
}
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2008-10-05 17:17:18 +04:00
}
2008-10-06 21:47:31 +04:00
void ami_quit_netsurf ( void )
{
struct nsObject * node ;
struct nsObject * nnode ;
struct gui_window_2 * gwin ;
2014-02-11 01:08:36 +04:00
if ( ! IsMinListEmpty ( window_list ) ) {
2009-09-29 02:17:09 +04:00
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
2008-10-06 21:47:31 +04:00
2014-02-11 01:08:36 +04:00
do {
2009-09-29 02:17:09 +04:00
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
2008-10-06 21:47:31 +04:00
2014-02-11 01:08:36 +04:00
switch ( node - > Type ) {
2009-09-29 02:17:09 +04:00
case AMINS_TVWINDOW :
ami_tree_close ( ( struct treeview_window * ) gwin ) ;
break ;
2008-10-06 21:47:31 +04:00
2009-09-29 02:17:09 +04:00
case AMINS_WINDOW :
2014-02-11 01:12:02 +04:00
/* This also closes windows that are attached to the
* gui_window , such as local history and find . */
2013-07-27 17:46:20 +04:00
ShowWindow ( gwin - > win , WINDOW_BACKMOST ) ;
2013-07-27 17:19:51 +04:00
ami_close_all_tabs ( gwin ) ;
2009-09-29 02:17:09 +04:00
break ;
2014-02-11 00:30:08 +04:00
case AMINS_GUIOPTSWINDOW :
ami_gui_opts_close ( ) ;
break ;
2009-09-29 02:17:09 +04:00
2014-02-11 01:08:36 +04:00
case AMINS_DLWINDOW :
ami_download_window_abort ( ( struct gui_download_window * ) gwin ) ;
break ;
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2012-11-01 00:50:22 +04:00
win_destroyed = true ;
2009-09-29 02:17:09 +04:00
}
2008-10-06 21:47:31 +04:00
2014-02-11 01:08:36 +04:00
if ( IsMinListEmpty ( window_list ) ) {
2008-10-06 21:47:31 +04:00
/* last window closed, so exit */
2014-10-12 12:58:54 +04:00
ami_quit = true ;
2008-10-06 21:47:31 +04:00
}
}
2012-12-08 22:08:00 +04:00
void ami_quit_netsurf_delayed ( void )
{
2012-12-09 23:39:48 +04:00
int res = - 1 ;
# ifdef __amigaos4__
2012-12-08 22:08:00 +04:00
char * utf8text = ami_utf8_easy ( messages_get ( " TCPIPShutdown " ) ) ;
char * utf8gadgets = ami_utf8_easy ( messages_get ( " AbortShutdown " ) ) ;
DisplayBeep ( NULL ) ;
2012-12-10 00:00:11 +04:00
res = TimedDosRequesterTags ( TDR_ImageType , TDRIMAGE_INFO ,
2012-12-08 22:08:00 +04:00
TDR_TitleString , messages_get ( " NetSurf " ) ,
TDR_FormatString , utf8text ,
TDR_GadgetString , utf8gadgets ,
TDR_Timeout , 5 ,
TDR_Inactive , TRUE ,
TAG_DONE ) ;
free ( utf8text ) ;
free ( utf8gadgets ) ;
2012-12-09 23:39:48 +04:00
# endif
2012-12-08 22:08:00 +04:00
if ( res = = - 1 ) { /* Requester timed out */
nsoption_set_bool ( tab_close_warn , false ) ;
ami_quit_netsurf ( ) ;
}
}
2014-10-16 12:55:01 +04:00
static void ami_gui_close_screen ( struct Screen * scrn , BOOL locked_screen , BOOL donotwait )
2011-06-16 22:46:43 +04:00
{
2011-09-11 03:25:49 +04:00
if ( scrn = = NULL ) return ;
2014-02-10 22:13:28 +04:00
if ( CloseScreen ( scrn ) = = TRUE ) {
2014-02-10 23:21:47 +04:00
if ( locked_screen = = FALSE ) {
FreeSignal ( screen_signal ) ;
2014-02-11 00:31:06 +04:00
screen_signal = - 1 ;
2014-02-10 23:21:47 +04:00
scrn = NULL ;
}
2014-02-10 22:13:28 +04:00
return ;
}
2013-01-25 00:08:59 +04:00
if ( locked_screen = = TRUE ) return ;
2014-02-11 00:18:18 +04:00
if ( donotwait = = TRUE ) return ;
2011-06-16 22:46:43 +04:00
2013-01-25 00:08:59 +04:00
/* If this is our own screen, wait for visitor windows to close */
2014-02-10 22:13:28 +04:00
if ( screen_signal ! = - 1 ) {
2014-02-07 01:23:24 +04:00
ULONG scrnsig = 1 < < screen_signal ;
LOG ( ( " Waiting for visitor windows to close... (signal) " ) ) ;
Wait ( scrnsig ) ;
}
2014-01-25 00:35:31 +04:00
while ( CloseScreen ( scrn ) = = FALSE ) {
2014-02-07 01:23:24 +04:00
LOG ( ( " Waiting for visitor windows to close... (polling) " ) ) ;
2014-01-25 00:35:31 +04:00
Delay ( 50 ) ;
}
2014-02-07 01:23:24 +04:00
FreeSignal ( screen_signal ) ;
2014-02-10 22:42:50 +04:00
screen_signal = - 1 ;
2014-02-10 22:13:28 +04:00
scrn = NULL ;
}
void ami_try_quit ( void )
{
2014-02-11 00:40:08 +04:00
if ( ! IsMinListEmpty ( window_list ) ) return ;
2014-02-10 22:13:28 +04:00
if ( nsoption_bool ( close_no_quit ) = = false )
{
2014-10-12 12:58:54 +04:00
ami_quit = true ;
2014-02-10 22:13:28 +04:00
return ;
}
else
{
2014-02-11 00:18:18 +04:00
ami_gui_close_screen ( scrn , locked_screen , TRUE ) ;
2014-02-10 22:13:28 +04:00
}
2011-06-16 22:46:43 +04:00
}
2014-01-11 18:20:30 +04:00
static void gui_quit ( void )
2008-08-02 18:31:32 +04:00
{
2010-03-24 01:27:33 +03:00
ami_theme_throbber_free ( ) ;
2008-09-11 23:33:40 +04:00
2012-03-22 13:34:34 +04:00
urldb_save ( nsoption_charp ( url_file ) ) ;
urldb_save_cookies ( nsoption_charp ( cookie_file ) ) ;
ami_hotlist_free ( nsoption_charp ( hotlist_file ) ) ;
2008-10-12 01:38:04 +04:00
ami_cookies_free ( ) ;
ami_global_history_free ( ) ;
2008-08-09 19:19:04 +04:00
2009-09-28 22:00:40 +04:00
if ( IApplication & & ami_appid )
UnregisterApplication ( ami_appid , NULL ) ;
2008-12-08 00:50:04 +03:00
ami_arexx_cleanup ( ) ;
2009-07-09 22:52:55 +04:00
ami_free_layers ( & browserglob ) ;
2008-12-26 22:04:57 +03:00
2009-01-16 23:05:21 +03:00
ami_close_fonts ( ) ;
2014-02-11 00:23:09 +04:00
ami_help_free ( ) ;
2013-09-28 17:58:03 +04:00
LOG ( ( " Closing screen " ) ) ;
2014-02-11 00:18:18 +04:00
ami_gui_close_screen ( scrn , locked_screen , FALSE ) ;
2008-08-23 20:17:51 +04:00
FreeVec ( nsscreentitle ) ;
2008-10-25 20:37:08 +04:00
2013-09-28 17:58:03 +04:00
LOG ( ( " Freeing menu items " ) ) ;
2011-06-18 21:40:27 +04:00
ami_context_menu_free ( ) ;
2013-08-20 22:39:18 +04:00
ami_menu_free_glyphs ( ) ;
2010-10-05 23:14:46 +04:00
2013-09-28 17:58:03 +04:00
LOG ( ( " Freeing mouse pointers " ) ) ;
2010-03-24 01:27:33 +03:00
ami_mouse_pointers_free ( ) ;
2013-09-28 17:58:03 +04:00
LOG ( ( " Freeing clipboard " ) ) ;
2008-10-25 20:37:08 +04:00
ami_clipboard_free ( ) ;
2013-09-28 17:58:03 +04:00
2008-09-04 02:02:41 +04:00
FreeSysObject ( ASOT_PORT , appport ) ;
2008-09-05 02:41:26 +04:00
FreeSysObject ( ASOT_PORT , sport ) ;
2008-09-04 02:02:41 +04:00
2011-10-15 18:09:35 +04:00
ami_file_req_free ( ) ;
2009-01-11 00:31:21 +03:00
ami_openurl_close ( ) ;
2014-02-07 21:45:00 +04:00
FreeStringClass ( urlStringClass ) ;
2008-08-09 02:38:13 +04:00
2013-09-28 17:58:03 +04:00
LOG ( ( " Freeing scheduler " ) ) ;
2011-02-17 00:29:39 +03:00
ami_schedule_free ( ) ;
2008-08-10 00:27:36 +04:00
FreeObjList ( window_list ) ;
2012-03-29 02:17:27 +04:00
FreeVec ( current_user_options ) ;
FreeVec ( current_user_dir ) ;
2014-06-30 01:35:52 +04:00
FreeVec ( current_user_faviconcache ) ;
2012-03-29 02:17:27 +04:00
FreeVec ( current_user ) ;
2014-11-08 22:23:02 +03:00
ami_libs_close ( ) ;
2008-08-10 00:27:36 +04:00
}
2014-06-30 01:35:52 +04:00
char * ami_gui_get_cache_favicon_name ( nsurl * url , bool only_if_avail )
{
STRPTR filename = NULL ;
BPTR lock = 0 ;
2014-10-25 19:22:08 +04:00
if ( ( filename = ASPrintf ( " %s/%x " , current_user_faviconcache , nsurl_hash ( url ) ) ) ) {
2014-06-30 01:35:52 +04:00
LOG ( ( " favicon cache location: %s " , filename ) ) ;
if ( only_if_avail = = true ) {
2014-10-25 19:22:08 +04:00
if ( ( lock = Lock ( filename , ACCESS_READ ) ) ) {
2014-06-30 01:35:52 +04:00
UnLock ( lock ) ;
return filename ;
}
} else {
return filename ;
}
}
return NULL ;
}
static void ami_gui_cache_favicon ( nsurl * url , struct bitmap * favicon )
{
STRPTR filename = NULL ;
2014-10-25 19:22:08 +04:00
if ( ( filename = ami_gui_get_cache_favicon_name ( url , false ) ) ) {
2014-06-30 01:35:52 +04:00
if ( favicon ) bitmap_save ( favicon , filename , AMI_BITMAP_FORCE_OVERWRITE ) ;
FreeVec ( filename ) ;
}
}
2013-11-23 16:23:56 +04:00
void ami_gui_update_hotlist_button ( struct gui_window_2 * gwin )
{
char * url ;
nsurl * nsurl ;
GetAttr ( STRINGA_TextVal ,
( Object * ) gwin - > objects [ GID_URL ] ,
( ULONG * ) & url ) ;
if ( nsurl_create ( url , & nsurl ) = = NSERROR_OK ) {
if ( hotlist_has_url ( nsurl ) ) {
2013-11-23 17:11:30 +04:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_FAVE ] , gwin - > win , NULL ,
BUTTON_RenderImage , gwin - > objects [ GID_FAVE_RMV ] , TAG_DONE ) ;
2014-06-30 01:35:52 +04:00
2014-11-16 17:44:40 +03:00
if ( gwin - > gw - > favicon )
ami_gui_cache_favicon ( nsurl , content_get_bitmap ( gwin - > gw - > favicon ) ) ;
2013-11-23 16:23:56 +04:00
} else {
2013-11-23 17:11:30 +04:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_FAVE ] , gwin - > win , NULL ,
BUTTON_RenderImage , gwin - > objects [ GID_FAVE_ADD ] , TAG_DONE ) ;
2013-11-23 16:23:56 +04:00
}
nsurl_unref ( nsurl ) ;
}
}
2013-09-12 15:29:47 +04:00
static bool ami_gui_hotlist_add ( void * userdata , int level , int item , const char * title , nsurl * url , bool is_folder )
2012-11-28 23:29:43 +04:00
{
2013-09-12 15:29:47 +04:00
struct ami_gui_tb_userdata * tb_userdata = ( struct ami_gui_tb_userdata * ) userdata ;
2012-11-28 23:29:43 +04:00
struct Node * speed_button_node ;
2013-09-12 15:29:47 +04:00
if ( level ! = 1 ) return false ;
if ( item > AMI_GUI_TOOLBAR_MAX ) return false ;
if ( is_folder = = true ) return false ;
tb_userdata - > gw - > hotlist_toolbar_lab [ item ] = ami_utf8_easy ( title ) ;
2012-11-28 23:29:43 +04:00
2013-09-12 15:29:47 +04:00
speed_button_node = AllocSpeedButtonNode ( item ,
SBNA_Text , tb_userdata - > gw - > hotlist_toolbar_lab [ item ] ,
SBNA_UserData , ( void * ) url ,
2012-11-28 23:29:43 +04:00
TAG_DONE ) ;
2013-09-12 15:29:47 +04:00
AddTail ( tb_userdata - > sblist , speed_button_node ) ;
2012-11-28 23:29:43 +04:00
2013-09-12 15:29:47 +04:00
tb_userdata - > items + + ;
return true ;
2012-11-28 23:29:43 +04:00
}
2014-10-16 12:55:01 +04:00
static int ami_gui_hotlist_scan ( struct tree * tree , struct List * speed_button_list , struct gui_window_2 * gwin )
2012-11-28 23:29:43 +04:00
{
2013-09-12 15:29:47 +04:00
struct ami_gui_tb_userdata userdata ;
userdata . gw = gwin ;
userdata . sblist = speed_button_list ;
userdata . items = 0 ;
2012-11-28 23:29:43 +04:00
2013-09-12 15:29:47 +04:00
ami_hotlist_scan ( ( void * ) & userdata , 0 , messages_get ( " HotlistToolbar " ) , ami_gui_hotlist_add ) ;
return userdata . items ;
2012-11-28 23:29:43 +04:00
}
2014-10-16 12:55:01 +04:00
static void ami_gui_hotlist_toolbar_add ( struct gui_window_2 * gwin )
2012-11-28 23:29:43 +04:00
{
2012-12-15 17:39:40 +04:00
struct TagItem attrs [ 2 ] ;
attrs [ 0 ] . ti_Tag = CHILD_MinWidth ;
attrs [ 0 ] . ti_Data = 0 ;
attrs [ 1 ] . ti_Tag = TAG_DONE ;
attrs [ 1 ] . ti_Data = 0 ;
2012-11-28 23:29:43 +04:00
NewList ( & gwin - > hotlist_toolbar_list ) ;
if ( ami_gui_hotlist_scan ( ami_tree_get_tree ( hotlist_window ) , & gwin - > hotlist_toolbar_list , gwin ) > 0 ) {
gwin - > objects [ GID_HOTLIST ] =
SpeedBarObject ,
GA_ID , GID_HOTLIST ,
GA_RelVerify , TRUE ,
2012-12-01 04:27:46 +04:00
ICA_TARGET , ICTARGET_IDCMP ,
2012-11-29 02:42:23 +04:00
SPEEDBAR_BevelStyle , BVS_NONE ,
2012-11-28 23:29:43 +04:00
SPEEDBAR_Buttons , & gwin - > hotlist_toolbar_list ,
SpeedBarEnd ;
2012-11-29 02:42:23 +04:00
gwin - > objects [ GID_HOTLISTSEPBAR ] =
BevelObject ,
BEVEL_Style , BVS_SBAR_VERT ,
BevelEnd ;
2012-11-28 23:29:43 +04:00
IDoMethod ( gwin - > objects [ GID_HOTLISTLAYOUT ] , LM_ADDCHILD ,
2012-12-15 17:39:40 +04:00
gwin - > win , gwin - > objects [ GID_HOTLIST ] , attrs ) ;
2012-11-29 02:42:23 +04:00
IDoMethod ( gwin - > objects [ GID_HOTLISTLAYOUT ] , LM_ADDIMAGE ,
gwin - > win , gwin - > objects [ GID_HOTLISTSEPBAR ] , NULL ) ;
2012-11-30 02:13:42 +04:00
FlushLayoutDomainCache ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ) ;
RethinkLayout ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ,
gwin - > win , NULL , TRUE ) ;
2012-12-01 19:15:12 +04:00
2014-11-16 17:44:40 +03:00
if ( gwin - > gw - > bw ) {
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( gwin , true ) ;
2012-12-01 19:15:12 +04:00
}
2012-11-28 23:29:43 +04:00
}
2012-11-30 02:13:42 +04:00
}
2014-10-25 19:22:08 +04:00
static void ami_gui_hotlist_toolbar_free ( struct gui_window_2 * gwin , struct List * speed_button_list )
2012-11-30 02:13:42 +04:00
{
int i ;
struct Node * node ;
struct Node * nnode ;
2014-10-26 20:08:23 +03:00
if ( nsoption_bool ( kiosk_mode ) = = true ) return ;
2012-11-30 02:13:42 +04:00
if ( IsListEmpty ( speed_button_list ) ) return ;
node = GetHead ( speed_button_list ) ;
do {
nnode = GetSucc ( node ) ;
Remove ( node ) ;
FreeSpeedButtonNode ( node ) ;
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2012-11-30 02:13:42 +04:00
for ( i = 0 ; i < AMI_GUI_TOOLBAR_MAX ; i + + ) {
if ( gwin - > hotlist_toolbar_lab [ i ] ) {
free ( gwin - > hotlist_toolbar_lab [ i ] ) ;
gwin - > hotlist_toolbar_lab [ i ] = NULL ;
}
}
}
2014-10-25 19:22:08 +04:00
static void ami_gui_hotlist_toolbar_remove ( struct gui_window_2 * gwin )
2012-11-30 02:13:42 +04:00
{
IDoMethod ( gwin - > objects [ GID_HOTLISTLAYOUT ] , LM_REMOVECHILD ,
gwin - > win , gwin - > objects [ GID_HOTLIST ] ) ;
IDoMethod ( gwin - > objects [ GID_HOTLISTLAYOUT ] , LM_REMOVECHILD ,
gwin - > win , gwin - > objects [ GID_HOTLISTSEPBAR ] ) ;
2012-11-28 23:41:18 +04:00
FlushLayoutDomainCache ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ) ;
RethinkLayout ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ,
gwin - > win , NULL , TRUE ) ;
2012-11-30 02:13:42 +04:00
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( gwin , true ) ;
2012-11-30 02:13:42 +04:00
}
2014-10-25 19:22:08 +04:00
static void ami_gui_hotlist_toolbar_update ( struct gui_window_2 * gwin )
2012-11-30 02:13:42 +04:00
{
if ( IsListEmpty ( & gwin - > hotlist_toolbar_list ) ) {
ami_gui_hotlist_toolbar_add ( gwin ) ;
return ;
}
/* Below should be SetAttr according to Autodocs */
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_HOTLIST ] ,
gwin - > win , NULL ,
SPEEDBAR_Buttons , ~ 0 ,
TAG_DONE ) ;
ami_gui_hotlist_toolbar_free ( gwin , & gwin - > hotlist_toolbar_list ) ;
if ( ami_gui_hotlist_scan ( ami_tree_get_tree ( hotlist_window ) , & gwin - > hotlist_toolbar_list , gwin ) > 0 ) {
SetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_HOTLIST ] ,
gwin - > win , NULL ,
SPEEDBAR_Buttons , & gwin - > hotlist_toolbar_list ,
TAG_DONE ) ;
} else {
ami_gui_hotlist_toolbar_remove ( gwin ) ;
}
}
2014-07-01 01:37:05 +04:00
/**
* Update hotlist toolbar and recreate the menu for all windows
*/
void ami_gui_hotlist_update_all ( void )
2012-11-30 02:13:42 +04:00
{
struct nsObject * node ;
struct nsObject * nnode ;
struct gui_window_2 * gwin ;
if ( IsMinListEmpty ( window_list ) ) return ;
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
do {
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
if ( node - > Type = = AMINS_WINDOW )
{
ami_gui_hotlist_toolbar_update ( gwin ) ;
2014-07-01 01:37:05 +04:00
ami_menu_refresh ( gwin ) ;
2012-11-30 02:13:42 +04:00
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2012-11-28 23:29:43 +04:00
}
2014-10-25 19:22:08 +04:00
static void ami_toggletabbar ( struct gui_window_2 * gwin , bool show )
2010-02-14 03:46:53 +03:00
{
if ( ClickTabBase - > lib_Version < 53 ) return ;
if ( show )
{
2010-02-14 18:32:54 +03:00
struct TagItem attrs [ 3 ] ;
attrs [ 0 ] . ti_Tag = CHILD_WeightedWidth ;
attrs [ 0 ] . ti_Data = 0 ;
attrs [ 1 ] . ti_Tag = CHILD_WeightedHeight ;
attrs [ 1 ] . ti_Data = 0 ;
attrs [ 2 ] . ti_Tag = TAG_DONE ;
attrs [ 2 ] . ti_Data = 0 ;
2010-02-14 17:00:33 +03:00
2010-02-14 03:46:53 +03:00
gwin - > objects [ GID_TABS ] = ClickTabObject ,
GA_ID , GID_TABS ,
GA_RelVerify , TRUE ,
GA_Underscore , 13 , // disable kb shortcuts
CLICKTAB_Labels , & gwin - > tab_list ,
CLICKTAB_LabelTruncate , TRUE ,
CLICKTAB_CloseImage , gwin - > objects [ GID_CLOSETAB_BM ] ,
CLICKTAB_FlagImage , gwin - > objects [ GID_TABS_FLAG ] ,
ClickTabEnd ;
2010-02-14 17:00:33 +03:00
gwin - > objects [ GID_ADDTAB ] = ButtonObject ,
GA_ID , GID_ADDTAB ,
GA_RelVerify , TRUE ,
2010-03-18 00:43:23 +03:00
GA_HintInfo , gwin - > helphints [ GID_ADDTAB ] ,
2010-02-14 17:00:33 +03:00
GA_Text , " + " ,
BUTTON_RenderImage , gwin - > objects [ GID_ADDTAB_BM ] ,
ButtonEnd ;
2010-02-14 03:46:53 +03:00
IDoMethod ( gwin - > objects [ GID_TABLAYOUT ] , LM_ADDCHILD ,
gwin - > win , gwin - > objects [ GID_TABS ] , NULL ) ;
2010-02-14 17:00:33 +03:00
2010-02-14 18:32:54 +03:00
IDoMethod ( gwin - > objects [ GID_TABLAYOUT ] , LM_ADDCHILD ,
gwin - > win , gwin - > objects [ GID_ADDTAB ] , attrs ) ;
2010-02-14 03:46:53 +03:00
}
else
{
IDoMethod ( gwin - > objects [ GID_TABLAYOUT ] , LM_REMOVECHILD ,
gwin - > win , gwin - > objects [ GID_TABS ] ) ;
2010-02-14 17:00:33 +03:00
2010-02-14 18:32:54 +03:00
IDoMethod ( gwin - > objects [ GID_TABLAYOUT ] , LM_REMOVECHILD ,
2010-02-14 17:00:33 +03:00
gwin - > win , gwin - > objects [ GID_ADDTAB ] ) ;
2014-02-06 23:35:52 +04:00
gwin - > objects [ GID_TABS ] = NULL ;
gwin - > objects [ GID_ADDTAB ] = NULL ;
2010-02-14 03:46:53 +03:00
}
FlushLayoutDomainCache ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ) ;
RethinkLayout ( ( struct Gadget * ) gwin - > objects [ GID_MAIN ] ,
gwin - > win , NULL , TRUE ) ;
2014-11-16 17:44:40 +03:00
if ( gwin - > gw - > bw ) browser_window_update ( gwin - > gw - > bw , false ) ;
2010-02-14 03:46:53 +03:00
}
2012-12-10 00:39:10 +04:00
void ami_gui_tabs_toggle_all ( void )
{
struct nsObject * node ;
struct nsObject * nnode ;
struct gui_window_2 * gwin ;
if ( IsMinListEmpty ( window_list ) ) return ;
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
do {
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
if ( node - > Type = = AMINS_WINDOW )
{
if ( gwin - > tabs = = 1 ) {
if ( nsoption_bool ( tab_always_show ) = = true ) {
ami_toggletabbar ( gwin , true ) ;
} else {
ami_toggletabbar ( gwin , false ) ;
}
}
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2012-12-10 00:39:10 +04:00
}
2014-10-25 19:22:08 +04:00
static void ami_gui_search_ico_refresh ( void * p )
2014-07-05 21:44:44 +04:00
{
search_web_select_provider ( - 1 ) ;
}
2014-10-26 18:41:44 +03:00
/**
* Count windows , and optionally tabs .
*
* \ param window window to count tabs of
2014-10-26 19:12:34 +03:00
* \ param tabs if window > 0 , will be updated to contain the number of tabs
* in that window , unchanged otherwise
2014-10-26 18:41:44 +03:00
* \ return number of windows currently open
*/
int ami_gui_count_windows ( int window , int * tabs )
{
int windows = 0 ;
struct nsObject * node , * nnode ;
struct gui_window_2 * gwin ;
if ( ! IsMinListEmpty ( window_list ) ) {
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
do {
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
if ( node - > Type = = AMINS_WINDOW ) {
windows + + ;
if ( window = = windows ) * tabs = gwin - > tabs ;
}
} while ( ( node = nnode ) ) ;
}
return windows ;
}
2014-01-03 22:17:25 +04:00
nserror ami_gui_new_blank_tab ( struct gui_window_2 * gwin )
{
nsurl * url ;
nserror error ;
struct browser_window * bw = NULL ;
error = nsurl_create ( nsoption_charp ( homepage_url ) , & url ) ;
if ( error = = NSERROR_OK ) {
2014-02-10 18:08:45 +04:00
error = browser_window_create ( BW_CREATE_HISTORY |
BW_CREATE_TAB ,
2014-01-03 22:17:25 +04:00
url ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2014-01-03 22:17:25 +04:00
& bw ) ;
nsurl_unref ( url ) ;
}
if ( error ! = NSERROR_OK ) {
warn_user ( messages_get_errorcode ( error ) , 0 ) ;
return error ;
}
2014-02-09 03:06:24 +04:00
2014-01-03 22:17:25 +04:00
return NSERROR_OK ;
}
2014-01-12 02:34:12 +04:00
static struct gui_window *
gui_window_create ( struct browser_window * bw ,
2014-02-09 17:07:39 +04:00
struct gui_window * existing ,
gui_window_create_flags flags )
2008-08-02 18:31:32 +04:00
{
2012-04-29 20:13:53 +04:00
struct gui_window * g = NULL ;
2014-10-26 19:12:34 +03:00
ULONG offset = 0 ;
ULONG curx = nsoption_int ( window_x ) , cury = nsoption_int ( window_y ) ;
ULONG curw = nsoption_int ( window_width ) , curh = nsoption_int ( window_height ) ;
Added ability to load toolbar images from a different path.
Default is still TBImages: (ie AISS, http://www.masonicons.de)
All of the following must be present, in any format that bitmap.image will load
(usually this means any picture.datatype subclasses):
home, home_g, home_s - Home button
nav_east, nav_east_g, nav_east_s - History forward
nav_west, nav_west_g, nav_west_s - History back
reload, reload_g, reload_s - Reload
stop, stop_g, stop_s - Stop
The _g and _s files are ghosted and selected versions respectively.
To set the path, use toolbar_images:<path> in Options.
svn path=/trunk/netsurf/; revision=5304
2008-09-12 01:32:55 +04:00
char nav_west [ 100 ] , nav_west_s [ 100 ] , nav_west_g [ 100 ] ;
char nav_east [ 100 ] , nav_east_s [ 100 ] , nav_east_g [ 100 ] ;
char stop [ 100 ] , stop_s [ 100 ] , stop_g [ 100 ] ;
char reload [ 100 ] , reload_s [ 100 ] , reload_g [ 100 ] ;
char home [ 100 ] , home_s [ 100 ] , home_g [ 100 ] ;
2009-02-18 23:04:59 +03:00
char closetab [ 100 ] , closetab_s [ 100 ] , closetab_g [ 100 ] ;
2010-02-14 17:00:33 +03:00
char addtab [ 100 ] , addtab_s [ 100 ] , addtab_g [ 100 ] ;
2013-11-23 17:11:30 +04:00
char fave [ 100 ] , unfave [ 100 ] ;
2009-09-06 15:23:35 +04:00
char tabthrobber [ 100 ] ;
2012-04-29 03:23:29 +04:00
ULONG refresh_mode = WA_SmartRefresh ;
2013-04-10 22:36:38 +04:00
ULONG idcmp_sizeverify = IDCMP_SIZEVERIFY ;
2008-09-04 02:02:41 +04:00
2012-03-22 13:34:34 +04:00
if ( ! scrn ) ami_openscreenfirst ( ) ;
2009-09-29 02:17:09 +04:00
2014-02-09 17:31:48 +04:00
if ( nsoption_bool ( kiosk_mode ) ) flags & = ~ GW_CREATE_TAB ;
2013-04-10 22:36:38 +04:00
if ( nsoption_bool ( resize_with_contents ) ) idcmp_sizeverify = 0 ;
2009-02-07 19:40:56 +03:00
bw - > scale = 1.0 ;
2008-10-05 18:22:02 +04:00
2014-10-26 19:12:34 +03:00
/* Offset the new window by titlebar + 1 as per AmigaOS style guide.
* If we don ' t have a clone window we offset by all windows open . */
offset = scrn - > WBorTop + scrn - > Font - > ta_YSize + 1 ;
if ( existing ) {
curx = existing - > shared - > win - > LeftEdge ;
cury = existing - > shared - > win - > TopEdge + offset ;
curw = existing - > shared - > win - > Width ;
curh = existing - > shared - > win - > Height ;
} else {
if ( nsoption_bool ( kiosk_mode ) = = false ) {
cury + = offset * ami_gui_count_windows ( 0 , NULL ) ;
}
2008-09-04 02:02:41 +04:00
}
2014-10-26 19:12:34 +03:00
if ( curh > ( scrn - > Height - cury ) ) curh = scrn - > Height - cury ;
2013-10-12 16:11:13 +04:00
g = AllocVecTags ( sizeof ( struct gui_window ) , AVT_ClearWithValue , 0 , TAG_DONE ) ;
2008-08-09 02:38:13 +04:00
2012-04-29 20:13:53 +04:00
if ( ! g )
2008-08-02 18:31:32 +04:00
{
2008-09-29 02:50:13 +04:00
warn_user ( " NoMemory " , " " ) ;
2008-08-31 01:32:05 +04:00
return NULL ;
2008-08-02 18:31:32 +04:00
}
2012-04-29 20:13:53 +04:00
NewList ( & g - > dllist ) ;
2013-02-03 18:01:48 +04:00
g - > deferred_rects = NewObjList ( ) ;
2014-11-16 17:24:18 +03:00
g - > bw = bw ;
2009-03-28 15:50:19 +03:00
2014-02-09 17:07:39 +04:00
if ( ( flags & GW_CREATE_TAB ) & & existing )
2008-10-05 03:29:17 +04:00
{
2014-02-09 17:07:39 +04:00
g - > shared = existing - > shared ;
2012-04-29 20:13:53 +04:00
g - > tab = g - > shared - > next_tab ;
2014-07-12 18:44:14 +04:00
g - > shared - > tabs + + ; /* do this early so functions know to update the tabs */
2008-08-31 01:32:05 +04:00
2014-07-12 18:44:14 +04:00
if ( ( g - > shared - > tabs = = 2 ) & & ( nsoption_bool ( tab_always_show ) = = false ) ) {
2012-04-29 20:13:53 +04:00
ami_toggletabbar ( g - > shared , true ) ;
2014-07-12 18:44:14 +04:00
}
2010-02-14 03:46:53 +03:00
2012-04-29 20:13:53 +04:00
SetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] ,
g - > shared - > win , NULL ,
2010-02-14 03:46:53 +03:00
CLICKTAB_Labels , ~ 0 ,
2008-10-05 03:29:17 +04:00
TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
g - > tab_node = AllocClickTabNode ( TNA_Text , messages_get ( " NetSurf " ) ,
TNA_Number , g - > tab ,
TNA_UserData , g ,
2010-02-14 03:46:53 +03:00
TNA_CloseGadget , TRUE ,
2008-10-05 03:29:17 +04:00
TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
if ( nsoption_bool ( new_tab_last ) ) {
2012-04-29 20:13:53 +04:00
AddTail ( & g - > shared - > tab_list , g - > tab_node ) ;
2014-11-16 17:24:18 +03:00
} else {
2014-02-09 17:19:46 +04:00
struct Node * insert_after = existing - > tab_node ;
2011-07-03 02:40:45 +04:00
2014-02-09 17:07:39 +04:00
if ( existing - > last_new_tab )
insert_after = existing - > last_new_tab ;
2012-04-29 20:13:53 +04:00
Insert ( & g - > shared - > tab_list , g - > tab_node , insert_after ) ;
2014-02-09 17:07:39 +04:00
existing - > last_new_tab = g - > tab_node ;
2011-07-03 02:04:51 +04:00
}
2008-10-05 03:29:17 +04:00
2012-04-29 20:13:53 +04:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] ,
g - > shared - > win , NULL ,
CLICKTAB_Labels , & g - > shared - > tab_list ,
2008-10-05 03:29:17 +04:00
TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
if ( nsoption_bool ( new_tab_is_active ) ) {
RefreshSetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] ,
g - > shared - > win , NULL ,
CLICKTAB_Current , g - > tab ,
2008-10-05 17:17:18 +04:00
TAG_DONE ) ;
}
2014-11-16 17:24:18 +03:00
if ( ClickTabBase - > lib_Version < 53 ) {
RethinkLayout ( ( struct Gadget * ) g - > shared - > objects [ GID_TABLAYOUT ] ,
g - > shared - > win , NULL , TRUE ) ;
}
2008-10-05 03:29:17 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > next_tab + + ;
2008-10-05 17:17:18 +04:00
2013-05-28 19:44:46 +04:00
if ( nsoption_bool ( new_tab_is_active ) ) ami_switch_tab ( g - > shared , false ) ;
2008-10-05 03:29:17 +04:00
2012-04-29 20:13:53 +04:00
ami_update_buttons ( g - > shared ) ;
2014-07-05 22:00:21 +04:00
ami_schedule ( 0 , ami_gui_refresh_favicon , g - > shared ) ;
2008-11-09 02:08:55 +03:00
2012-04-29 20:13:53 +04:00
return g ;
2008-10-05 03:29:17 +04:00
}
2013-10-12 16:11:13 +04:00
g - > shared = AllocVecTags ( sizeof ( struct gui_window_2 ) , AVT_ClearWithValue , 0 , TAG_DONE ) ;
2008-10-05 03:29:17 +04:00
2012-04-29 20:13:53 +04:00
if ( ! g - > shared )
2008-10-05 03:29:17 +04:00
{
warn_user ( " NoMemory " , " " ) ;
return NULL ;
}
2012-08-05 14:37:27 +04:00
NewMinList ( & g - > shared - > shared_pens ) ;
2012-08-05 14:28:48 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > scrollerhook . h_Entry = ( void * ) ami_scroller_hook ;
g - > shared - > scrollerhook . h_Data = g - > shared ;
2008-08-25 17:32:26 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > favicon_hook . h_Entry = ( void * ) ami_set_favicon_render_hook ;
g - > shared - > favicon_hook . h_Data = g - > shared ;
2012-04-29 19:59:37 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > throbber_hook . h_Entry = ( void * ) ami_set_throbber_render_hook ;
g - > shared - > throbber_hook . h_Data = g - > shared ;
2012-04-29 19:59:37 +04:00
2012-04-07 21:16:32 +04:00
newprefs_hook . h_Entry = ( void * ) ami_gui_newprefs_hook ;
newprefs_hook . h_Data = 0 ;
2012-04-29 03:23:29 +04:00
if ( nsoption_bool ( window_simple_refresh ) = = true ) {
refresh_mode = WA_SimpleRefresh ;
} else {
refresh_mode = WA_SmartRefresh ;
}
2012-03-22 13:34:34 +04:00
if ( ! nsoption_bool ( kiosk_mode ) )
2011-09-04 22:53:54 +04:00
{
ULONG addtabclosegadget = TAG_IGNORE ;
ULONG iconifygadget = FALSE ;
2013-06-01 02:25:05 +04:00
if ( nsoption_charp ( pubscreen_name ) & &
2012-03-22 13:34:34 +04:00
( locked_screen = = TRUE ) & &
2013-06-01 02:25:05 +04:00
( strcmp ( nsoption_charp ( pubscreen_name ) , " Workbench " ) = = 0 ) )
2011-09-04 22:53:54 +04:00
iconifygadget = TRUE ;
2012-04-29 20:13:53 +04:00
ami_create_menu ( g - > shared ) ;
2011-09-04 22:53:54 +04:00
2012-04-29 20:13:53 +04:00
NewList ( & g - > shared - > tab_list ) ;
g - > tab_node = AllocClickTabNode ( TNA_Text , messages_get ( " NetSurf " ) ,
2011-09-04 22:53:54 +04:00
TNA_Number , 0 ,
2014-11-16 17:24:18 +03:00
TNA_UserData , g ,
2011-09-04 22:53:54 +04:00
TNA_CloseGadget , TRUE ,
TAG_DONE ) ;
2012-04-29 20:13:53 +04:00
AddTail ( & g - > shared - > tab_list , g - > tab_node ) ;
2011-09-04 22:53:54 +04:00
2014-06-15 18:39:49 +04:00
g - > shared - > web_search_list = ami_gui_opts_websearch ( ) ;
g - > shared - > search_bm = NULL ;
2012-04-29 20:13:53 +04:00
g - > shared - > tabs = 1 ;
g - > shared - > next_tab = 1 ;
2011-09-04 22:53:54 +04:00
2013-10-12 16:43:33 +04:00
g - > shared - > svbuffer = AllocVecTags ( 2000 , AVT_ClearWithValue , 0 , TAG_DONE ) ;
2011-09-04 22:53:54 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_BACK ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarBack " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_FORWARD ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarForward " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_STOP ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarStop " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_RELOAD ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarReload " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_HOME ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarHome " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_URL ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarURL " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_SEARCHSTRING ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarWebSearch " ) ) ;
2012-04-29 20:13:53 +04:00
g - > shared - > helphints [ GID_ADDTAB ] =
2012-05-07 19:06:48 +04:00
translate_escape_chars ( messages_get ( " HelpToolbarAddTab " ) ) ;
2011-09-04 22:53:54 +04:00
2013-11-23 16:23:56 +04:00
ami_get_theme_filename ( nav_west , " theme_nav_west " , false ) ;
ami_get_theme_filename ( nav_west_s , " theme_nav_west_s " , false ) ;
ami_get_theme_filename ( nav_west_g , " theme_nav_west_g " , false ) ;
ami_get_theme_filename ( nav_east , " theme_nav_east " , false ) ;
ami_get_theme_filename ( nav_east_s , " theme_nav_east_s " , false ) ;
ami_get_theme_filename ( nav_east_g , " theme_nav_east_g " , false ) ;
ami_get_theme_filename ( stop , " theme_stop " , false ) ;
ami_get_theme_filename ( stop_s , " theme_stop_s " , false ) ;
ami_get_theme_filename ( stop_g , " theme_stop_g " , false ) ;
ami_get_theme_filename ( reload , " theme_reload " , false ) ;
ami_get_theme_filename ( reload_s , " theme_reload_s " , false ) ;
ami_get_theme_filename ( reload_g , " theme_reload_g " , false ) ;
ami_get_theme_filename ( home , " theme_home " , false ) ;
ami_get_theme_filename ( home_s , " theme_home_s " , false ) ;
ami_get_theme_filename ( home_g , " theme_home_g " , false ) ;
ami_get_theme_filename ( closetab , " theme_closetab " , false ) ;
ami_get_theme_filename ( closetab_s , " theme_closetab_s " , false ) ;
ami_get_theme_filename ( closetab_g , " theme_closetab_g " , false ) ;
ami_get_theme_filename ( addtab , " theme_addtab " , false ) ;
ami_get_theme_filename ( addtab_s , " theme_addtab_s " , false ) ;
ami_get_theme_filename ( addtab_g , " theme_addtab_g " , false ) ;
ami_get_theme_filename ( tabthrobber , " theme_tab_loading " , false ) ;
ami_get_theme_filename ( fave , " theme_fave " , false ) ;
2013-11-23 17:11:30 +04:00
ami_get_theme_filename ( unfave , " theme_unfave " , false ) ;
g - > shared - > objects [ GID_FAVE_ADD ] = BitMapObject ,
BITMAP_SourceFile , fave ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ;
g - > shared - > objects [ GID_FAVE_RMV ] = BitMapObject ,
BITMAP_SourceFile , unfave ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ;
2011-09-04 22:53:54 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_ADDTAB_BM ] = BitMapObject ,
2011-09-04 22:53:54 +04:00
BITMAP_SourceFile , addtab ,
BITMAP_SelectSourceFile , addtab_s ,
BITMAP_DisabledSourceFile , addtab_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ;
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_CLOSETAB_BM ] = BitMapObject ,
2011-09-04 22:53:54 +04:00
BITMAP_SourceFile , closetab ,
BITMAP_SelectSourceFile , closetab_s ,
BITMAP_DisabledSourceFile , closetab_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ;
if ( ClickTabBase - > lib_Version < 53 )
{
addtabclosegadget = LAYOUT_AddChild ;
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_CLOSETAB ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_CLOSETAB ,
GA_RelVerify , TRUE ,
2012-04-29 20:13:53 +04:00
BUTTON_RenderImage , g - > shared - > objects [ GID_CLOSETAB_BM ] ,
2011-09-04 22:53:54 +04:00
ButtonEnd ;
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_TABS ] = ClickTabObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_TABS ,
GA_RelVerify , TRUE ,
GA_Underscore , 13 , // disable kb shortcuts
2012-04-29 20:13:53 +04:00
CLICKTAB_Labels , & g - > shared - > tab_list ,
2011-09-04 22:53:54 +04:00
CLICKTAB_LabelTruncate , TRUE ,
ClickTabEnd ;
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_ADDTAB ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_ADDTAB ,
GA_RelVerify , TRUE ,
GA_Text , " + " ,
2012-04-29 20:13:53 +04:00
BUTTON_RenderImage , g - > shared - > objects [ GID_ADDTAB_BM ] ,
2011-09-04 22:53:54 +04:00
ButtonEnd ;
}
else
{
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_TABS_FLAG ] = BitMapObject ,
2011-09-04 22:53:54 +04:00
BITMAP_SourceFile , tabthrobber ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ;
}
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ OID_MAIN ] = WindowObject ,
2014-06-15 18:39:49 +04:00
WA_ScreenTitle , nsscreentitle ,
WA_Activate , TRUE ,
WA_DepthGadget , TRUE ,
WA_DragBar , TRUE ,
WA_CloseGadget , TRUE ,
WA_SizeGadget , TRUE ,
2011-09-04 22:53:54 +04:00
WA_Top , cury ,
WA_Left , curx ,
WA_Width , curw ,
WA_Height , curh ,
2013-03-20 12:22:03 +04:00
WA_PubScreen , scrn ,
2011-09-04 22:53:54 +04:00
WA_ReportMouse , TRUE ,
2012-04-29 03:23:29 +04:00
refresh_mode , TRUE ,
2011-09-04 22:53:54 +04:00
WA_SizeBBottom , TRUE ,
2014-06-15 18:39:49 +04:00
WA_IDCMP , IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
IDCMP_RAWKEY | idcmp_sizeverify |
IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
IDCMP_REFRESHWINDOW |
IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE ,
2011-09-04 22:53:54 +04:00
WINDOW_IconifyGadget , iconifygadget ,
2012-04-29 20:13:53 +04:00
WINDOW_NewMenu , g - > shared - > menu ,
2012-04-29 19:59:37 +04:00
WINDOW_MenuUserData , WGUD_HOOK ,
WINDOW_NewPrefsHook , & newprefs_hook ,
2012-04-29 20:13:53 +04:00
WINDOW_IDCMPHook , & g - > shared - > scrollerhook ,
2012-04-29 03:23:29 +04:00
WINDOW_IDCMPHookBits , IDCMP_IDCMPUPDATE | IDCMP_REFRESHWINDOW |
2011-09-04 22:53:54 +04:00
IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY ,
2012-04-29 19:59:37 +04:00
WINDOW_SharedPort , sport ,
WINDOW_BuiltInScroll , TRUE ,
2011-09-04 22:53:54 +04:00
WINDOW_GadgetHelp , TRUE ,
2012-04-29 20:13:53 +04:00
WINDOW_UserData , g - > shared ,
2014-06-15 18:39:49 +04:00
WINDOW_ParentGroup , g - > shared - > objects [ GID_MAIN ] = VGroupObject ,
LAYOUT_SpaceOuter , TRUE ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_TOOLBARLAYOUT ] = HGroupObject ,
2011-09-04 22:53:54 +04:00
LAYOUT_VertAlignment , LALIGN_CENTER ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_BACK ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_BACK ,
GA_RelVerify , TRUE ,
GA_Disabled , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_BACK ] ,
2011-09-04 22:53:54 +04:00
BUTTON_RenderImage , BitMapObject ,
BITMAP_SourceFile , nav_west ,
BITMAP_SelectSourceFile , nav_west_s ,
BITMAP_DisabledSourceFile , nav_west_g ,
2010-02-14 17:00:33 +03:00
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
2011-09-04 22:53:54 +04:00
BitMapEnd ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_FORWARD ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_FORWARD ,
GA_RelVerify , TRUE ,
GA_Disabled , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_FORWARD ] ,
2011-09-04 22:53:54 +04:00
BUTTON_RenderImage , BitMapObject ,
BITMAP_SourceFile , nav_east ,
BITMAP_SelectSourceFile , nav_east_s ,
BITMAP_DisabledSourceFile , nav_east_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_STOP ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_STOP ,
GA_RelVerify , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_STOP ] ,
2011-09-04 22:53:54 +04:00
BUTTON_RenderImage , BitMapObject ,
BITMAP_SourceFile , stop ,
BITMAP_SelectSourceFile , stop_s ,
BITMAP_DisabledSourceFile , stop_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_RELOAD ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_RELOAD ,
GA_RelVerify , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_RELOAD ] ,
2011-09-04 22:53:54 +04:00
BUTTON_RenderImage , BitMapObject ,
BITMAP_SourceFile , reload ,
BITMAP_SelectSourceFile , reload_s ,
BITMAP_DisabledSourceFile , reload_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_HOME ] = ButtonObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_HOME ,
GA_RelVerify , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_HOME ] ,
2011-09-04 22:53:54 +04:00
BUTTON_RenderImage , BitMapObject ,
BITMAP_SourceFile , home ,
BITMAP_SelectSourceFile , home_s ,
BITMAP_DisabledSourceFile , home_g ,
BITMAP_Screen , scrn ,
BITMAP_Masking , TRUE ,
BitMapEnd ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2013-11-24 18:37:44 +04:00
LAYOUT_AddChild , HGroupObject , // FavIcon, URL bar and hotlist star
LAYOUT_VertAlignment , LALIGN_CENTER ,
LAYOUT_AddChild , g - > shared - > objects [ GID_ICON ] = SpaceObject ,
GA_ID , GID_ICON ,
SPACE_MinWidth , 16 ,
SPACE_MinHeight , 16 ,
SPACE_Transparent , FALSE ,
2014-07-01 11:28:07 +04:00
// SPACE_RenderHook, &g->shared->favicon_hook,
2013-11-24 18:37:44 +04:00
SpaceEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
LAYOUT_AddChild , g - > shared - > objects [ GID_URL ] =
NewObject ( urlStringClass , NULL ,
STRINGA_MaxChars , 2000 ,
GA_ID , GID_URL ,
GA_RelVerify , TRUE ,
GA_HintInfo , g - > shared - > helphints [ GID_URL ] ,
GA_TabCycle , TRUE ,
STRINGA_Buffer , g - > shared - > svbuffer ,
STRINGVIEW_Header , URLHistory_GetList ( ) ,
2014-04-03 22:06:09 +04:00
TAG_DONE ) ,
2013-11-24 18:37:44 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_FAVE ] = ButtonObject ,
GA_ID , GID_FAVE ,
GA_RelVerify , TRUE ,
// GA_HintInfo, g->shared->helphints[GID_FAVE],
BUTTON_RenderImage , g - > shared - > objects [ GID_FAVE_ADD ] ,
ButtonEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
LayoutEnd ,
2011-09-04 22:53:54 +04:00
// GA_ID, GID_TOOLBARLAYOUT,
// GA_RelVerify, TRUE,
// LAYOUT_RelVerify, TRUE,
LAYOUT_WeightBar , TRUE ,
LAYOUT_AddChild , HGroupObject ,
LAYOUT_VertAlignment , LALIGN_CENTER ,
2014-06-15 18:39:49 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_SEARCH_ICON ] = ChooserObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_SEARCH_ICON ,
2014-06-15 18:48:55 +04:00
GA_RelVerify , TRUE ,
2014-06-15 18:39:49 +04:00
CHOOSER_DropDown , TRUE ,
CHOOSER_Labels , g - > shared - > web_search_list ,
CHOOSER_MaxLabels , 40 , /* Same as options GUI */
ChooserEnd ,
2011-09-04 22:53:54 +04:00
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_SEARCHSTRING ] = StringObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_SEARCHSTRING ,
STRINGA_TextVal , NULL ,
GA_RelVerify , TRUE ,
2012-04-29 20:13:53 +04:00
GA_HintInfo , g - > shared - > helphints [ GID_SEARCHSTRING ] ,
2011-09-04 22:53:54 +04:00
StringEnd ,
LayoutEnd ,
2012-12-07 03:40:13 +04:00
CHILD_WeightedWidth , nsoption_int ( web_search_width ) ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_THROBBER ] = SpaceObject ,
2011-09-04 22:53:54 +04:00
GA_ID , GID_THROBBER ,
SPACE_MinWidth , throbber_width ,
SPACE_MinHeight , throbber_height ,
SPACE_Transparent , TRUE ,
2012-04-29 20:13:53 +04:00
// SPACE_RenderHook, &g->shared->throbber_hook,
2011-09-04 22:53:54 +04:00
SpaceEnd ,
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
LayoutEnd ,
CHILD_WeightedHeight , 0 ,
LAYOUT_AddImage , BevelObject ,
BEVEL_Style , BVS_SBAR_VERT ,
BevelEnd ,
CHILD_WeightedHeight , 0 ,
2012-11-29 02:42:23 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_HOTLISTLAYOUT ] = VGroupObject ,
2012-11-28 23:44:40 +04:00
LAYOUT_SpaceInner , FALSE ,
LayoutEnd ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_TABLAYOUT ] = HGroupObject ,
2011-09-04 22:53:54 +04:00
LAYOUT_SpaceInner , FALSE ,
2012-04-29 20:13:53 +04:00
addtabclosegadget , g - > shared - > objects [ GID_CLOSETAB ] ,
2011-09-04 22:53:54 +04:00
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
2012-04-29 20:13:53 +04:00
addtabclosegadget , g - > shared - > objects [ GID_TABS ] ,
2011-09-04 22:53:54 +04:00
CHILD_CacheDomain , FALSE ,
2012-04-29 20:13:53 +04:00
addtabclosegadget , g - > shared - > objects [ GID_ADDTAB ] ,
2011-09-04 22:53:54 +04:00
CHILD_WeightedWidth , 0 ,
CHILD_WeightedHeight , 0 ,
LayoutEnd ,
CHILD_WeightedHeight , 0 ,
2014-10-25 18:08:04 +04:00
LAYOUT_AddChild , g - > shared - > objects [ GID_VSCROLLLAYOUT ] = HGroupObject ,
2014-10-26 19:35:05 +03:00
LAYOUT_AddChild , g - > shared - > objects [ GID_HSCROLLLAYOUT ] = VGroupObject ,
LAYOUT_AddChild , g - > shared - > objects [ GID_BROWSER ] = SpaceObject ,
GA_ID , GID_BROWSER ,
SPACE_Transparent , TRUE ,
SpaceEnd ,
EndGroup ,
2014-10-25 16:17:49 +04:00
EndGroup ,
2011-09-04 22:53:54 +04:00
EndGroup ,
EndWindow ;
}
else
{
/* borderless kiosk mode window */
2012-04-29 20:13:53 +04:00
g - > tab = 0 ;
g - > shared - > tabs = 0 ;
g - > tab_node = NULL ;
2011-09-04 22:53:54 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ OID_MAIN ] = WindowObject ,
2011-09-04 22:53:54 +04:00
WA_ScreenTitle , nsscreentitle ,
WA_Activate , TRUE ,
WA_DepthGadget , FALSE ,
WA_DragBar , FALSE ,
WA_CloseGadget , FALSE ,
WA_Borderless , TRUE ,
WA_RMBTrap , TRUE ,
WA_Top , 0 ,
WA_Left , 0 ,
WA_Width , scrn - > Width ,
WA_Height , scrn - > Height ,
WA_SizeGadget , FALSE ,
2013-03-20 12:22:03 +04:00
WA_PubScreen , scrn ,
2012-04-29 03:23:29 +04:00
WA_ReportMouse , TRUE ,
refresh_mode , TRUE ,
WA_IDCMP , IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
2011-09-04 22:53:54 +04:00
IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
2012-04-29 03:23:29 +04:00
IDCMP_RAWKEY | IDCMP_REFRESHWINDOW |
2011-09-04 22:53:54 +04:00
IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
IDCMP_EXTENDEDMOUSE ,
2012-04-29 20:13:53 +04:00
WINDOW_IDCMPHook , & g - > shared - > scrollerhook ,
2012-04-29 03:23:29 +04:00
WINDOW_IDCMPHookBits , IDCMP_IDCMPUPDATE |
IDCMP_EXTENDEDMOUSE | IDCMP_REFRESHWINDOW ,
2011-09-04 22:53:54 +04:00
WINDOW_SharedPort , sport ,
2012-04-29 20:13:53 +04:00
WINDOW_UserData , g - > shared ,
2011-09-04 22:53:54 +04:00
WINDOW_BuiltInScroll , TRUE ,
2014-10-25 17:41:10 +04:00
WINDOW_ParentGroup , g - > shared - > objects [ GID_MAIN ] = HGroupObject ,
LAYOUT_SpaceOuter , TRUE ,
2014-10-26 19:35:05 +03:00
LAYOUT_AddChild , g - > shared - > objects [ GID_VSCROLLLAYOUT ] = HGroupObject ,
LAYOUT_AddChild , g - > shared - > objects [ GID_HSCROLLLAYOUT ] = VGroupObject ,
LAYOUT_AddChild , g - > shared - > objects [ GID_BROWSER ] = SpaceObject ,
GA_ID , GID_BROWSER ,
SPACE_Transparent , TRUE ,
SpaceEnd ,
EndGroup ,
EndGroup ,
2011-09-04 22:53:54 +04:00
EndGroup ,
EndWindow ;
}
2008-08-11 21:53:45 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > win = ( struct Window * ) RA_OpenWindow ( g - > shared - > objects [ OID_MAIN ] ) ;
2008-08-10 13:57:41 +04:00
2012-04-29 20:13:53 +04:00
if ( ! g - > shared - > win )
2008-08-31 01:32:05 +04:00
{
2008-09-29 02:50:13 +04:00
warn_user ( " NoMemory " , " " ) ;
2012-04-29 20:13:53 +04:00
FreeVec ( g - > shared ) ;
FreeVec ( g ) ;
2008-08-31 01:32:05 +04:00
return NULL ;
}
2012-03-22 13:34:34 +04:00
if ( nsoption_bool ( kiosk_mode ) = = false )
2009-08-29 03:12:18 +04:00
{
2014-10-26 20:00:18 +03:00
ULONG sz , width , height ;
2013-08-20 22:43:13 +04:00
struct DrawInfo * dri = GetScreenDrawInfo ( scrn ) ;
2014-10-26 20:00:18 +03:00
sz = ami_get_border_gadget_size ( g - > shared ,
( ULONG * ) & width , ( ULONG * ) & height ) ;
2009-08-29 03:12:18 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > objects [ GID_STATUS ] = NewObject (
2009-08-29 03:12:18 +04:00
NULL ,
" frbuttonclass " ,
GA_ID , GID_STATUS ,
2012-02-12 03:17:47 +04:00
GA_Left , scrn - > WBorLeft + 2 ,
2014-10-26 20:00:18 +03:00
GA_RelBottom , - ( ( 2 + height + scrn - > WBorBottom - scrn - > RastPort . TxHeight ) / 2 ) ,
GA_Width , width ,
2009-08-29 03:12:18 +04:00
GA_DrawInfo , dri ,
GA_BottomBorder , TRUE ,
2009-09-16 02:49:33 +04:00
GA_ReadOnly , TRUE ,
GA_Image , ( struct Image * ) NewObject (
NULL ,
2012-04-01 01:49:50 +04:00
" gaugeiclass " ,
2012-02-12 03:17:47 +04:00
IA_Top , 2 - ( scrn - > RastPort . TxHeight ) ,
2012-04-02 22:05:09 +04:00
IA_Left , - 4 ,
2012-02-12 03:17:47 +04:00
IA_Height , 4 + scrn - > RastPort . TxHeight ,
2009-09-16 02:49:33 +04:00
IA_InBorder , TRUE ,
2012-04-01 01:49:50 +04:00
IA_Label , NULL ,
IA_Screen , scrn ,
GAUGEIA_Level , 0 ,
2009-09-16 02:49:33 +04:00
TAG_DONE ) ,
2009-08-29 03:12:18 +04:00
TAG_DONE ) ;
2012-04-29 20:13:53 +04:00
AddGList ( g - > shared - > win , ( struct Gadget * ) g - > shared - > objects [ GID_STATUS ] ,
2009-08-29 03:12:18 +04:00
( UWORD ) ~ 0 , - 1 , NULL ) ;
2014-11-16 17:24:18 +03:00
/* Apparently you can't set GA_Width on creation time for frbuttonclass */
2009-09-16 02:49:33 +04:00
2012-04-29 20:13:53 +04:00
SetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_STATUS ] ,
g - > shared - > win , NULL ,
2014-10-26 20:00:18 +03:00
GA_Width , width ,
2009-09-16 02:49:33 +04:00
TAG_DONE ) ;
2012-04-29 20:13:53 +04:00
RefreshGadgets ( ( APTR ) g - > shared - > objects [ GID_STATUS ] ,
g - > shared - > win , NULL ) ;
2012-11-28 23:29:43 +04:00
2013-08-20 22:43:13 +04:00
FreeScreenDrawInfo ( scrn , dri ) ;
2012-11-28 23:29:43 +04:00
ami_gui_hotlist_toolbar_add ( g - > shared ) ; /* is this the right place for this? */
2012-12-10 00:00:11 +04:00
if ( nsoption_bool ( tab_always_show ) ) ami_toggletabbar ( g - > shared , true ) ;
2009-08-29 03:12:18 +04:00
}
2008-08-10 00:27:36 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > rmbtrapped = FALSE ;
2014-11-16 17:24:18 +03:00
g - > shared - > gw = g ;
2008-10-26 02:22:34 +03:00
curbw = bw ;
2012-04-29 20:13:53 +04:00
g - > shared - > appwin = AddAppWindowA ( ( ULONG ) g - > shared - > objects [ OID_MAIN ] ,
( ULONG ) g - > shared , g - > shared - > win , appport , NULL ) ;
2012-04-28 23:43:46 +04:00
2012-04-29 20:13:53 +04:00
g - > shared - > node = AddObject ( window_list , AMINS_WINDOW ) ;
g - > shared - > node - > objstruct = g - > shared ;
2008-08-02 18:31:32 +04:00
2009-07-09 22:52:55 +04:00
glob = & browserglob ;
2009-09-29 02:17:09 +04:00
if ( locked_screen ) UnlockPubScreen ( NULL , scrn ) ;
2014-05-25 03:57:48 +04:00
2014-07-05 21:44:44 +04:00
ami_schedule ( 0 , ami_gui_search_ico_refresh , NULL ) ;
2009-12-22 02:25:35 +03:00
2013-06-02 19:26:25 +04:00
ScreenToFront ( scrn ) ;
2012-04-29 20:13:53 +04:00
return g ;
2008-08-02 18:31:32 +04:00
}
2008-10-06 11:07:33 +04:00
void ami_close_all_tabs ( struct gui_window_2 * gwin )
{
struct Node * tab ;
struct Node * ntab ;
2012-12-08 21:47:57 +04:00
if ( ( gwin - > tabs > 1 ) & & ( nsoption_bool ( tab_close_warn ) = = true ) ) {
char * req_body = ami_utf8_easy ( messages_get ( " MultiTabClose " ) ) ;
2012-12-09 23:41:06 +04:00
int32 res = ami_warn_user_multi ( req_body , " Yes " , " No " , gwin - > win ) ;
2012-12-08 21:47:57 +04:00
free ( req_body ) ;
2012-12-10 00:00:59 +04:00
if ( res = = 0 ) return ;
2012-12-08 21:47:57 +04:00
}
2008-10-06 11:07:33 +04:00
if ( gwin - > tabs )
{
tab = GetHead ( & gwin - > tab_list ) ;
2008-10-06 22:20:16 +04:00
do
2008-10-06 11:07:33 +04:00
{
2008-10-06 22:20:16 +04:00
ntab = GetSucc ( tab ) ;
2008-10-06 11:07:33 +04:00
GetClickTabNodeAttrs ( tab ,
2014-11-16 17:24:18 +03:00
TNA_UserData , & gwin - > gw ,
2008-10-06 11:07:33 +04:00
TAG_DONE ) ;
2014-11-16 17:24:18 +03:00
browser_window_destroy ( gwin - > gw - > bw ) ;
2014-10-25 19:22:08 +04:00
} while ( ( tab = ntab ) ) ;
2008-10-06 11:07:33 +04:00
}
else
{
2014-11-16 17:24:18 +03:00
browser_window_destroy ( gwin - > gw - > bw ) ;
2008-10-06 11:07:33 +04:00
}
}
2014-01-12 02:34:12 +04:00
static void gui_window_destroy ( struct gui_window * g )
2008-08-02 18:31:32 +04:00
{
2008-10-05 17:17:18 +04:00
struct Node * ptab ;
2014-10-25 19:22:08 +04:00
int ptabnum = 0 ;
2010-03-17 02:55:39 +03:00
int gid ;
2008-10-05 17:17:18 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2009-03-15 14:29:33 +03:00
if ( g - > shared - > searchwin & & ( g - > shared - > searchwin - > gwin = = g ) )
{
ami_search_close ( ) ;
win_destroyed = true ;
}
2009-01-11 01:57:23 +03:00
2009-03-15 14:29:33 +03:00
if ( g - > hw )
{
ami_history_close ( g - > hw ) ;
win_destroyed = true ;
}
2009-03-15 14:21:46 +03:00
2009-03-28 15:50:19 +03:00
ami_free_download_list ( & g - > dllist ) ;
2013-02-03 18:01:48 +04:00
FreeObjList ( g - > deferred_rects ) ;
2014-10-23 21:48:31 +04:00
gui_window_stop_throbber ( g ) ;
2009-03-28 15:50:19 +03:00
2010-02-14 03:46:53 +03:00
curbw = NULL ;
2008-10-05 03:29:17 +04:00
if ( g - > shared - > tabs > 1 )
{
2010-02-13 21:03:05 +03:00
SetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] , g - > shared - > win , NULL ,
2008-10-05 17:17:18 +04:00
CLICKTAB_Labels , ~ 0 ,
TAG_DONE ) ;
2010-02-14 18:32:54 +03:00
GetAttr ( CLICKTAB_Current , g - > shared - > objects [ GID_TABS ] ,
( ULONG * ) & ptabnum ) ;
if ( ptabnum = = g - > tab )
{
ptab = GetSucc ( g - > tab_node ) ;
if ( ! ptab ) ptab = GetPred ( g - > tab_node ) ;
GetClickTabNodeAttrs ( ptab , TNA_Number , ( ULONG * ) & ptabnum , TAG_DONE ) ;
}
2008-10-05 17:17:18 +04:00
Remove ( g - > tab_node ) ;
FreeClickTabNode ( g - > tab_node ) ;
2010-02-13 21:03:05 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] , g - > shared - > win , NULL ,
2008-10-05 17:17:18 +04:00
CLICKTAB_Labels , & g - > shared - > tab_list ,
CLICKTAB_Current , ptabnum ,
TAG_DONE ) ;
2009-09-01 02:10:05 +04:00
if ( ClickTabBase - > lib_Version < 53 )
2010-02-13 21:03:05 +03:00
RethinkLayout ( ( struct Gadget * ) g - > shared - > objects [ GID_TABLAYOUT ] , g - > shared - > win , NULL , TRUE ) ;
2008-10-05 17:17:18 +04:00
2008-10-05 03:29:17 +04:00
g - > shared - > tabs - - ;
2008-10-05 17:17:18 +04:00
ami_switch_tab ( g - > shared , true ) ;
2014-08-25 23:20:16 +04:00
ami_schedule ( 0 , ami_gui_refresh_favicon , g - > shared ) ;
2010-02-14 03:46:53 +03:00
2012-12-10 00:05:22 +04:00
if ( ( g - > shared - > tabs = = 1 ) & & ( nsoption_bool ( tab_always_show ) = = false ) )
2010-02-14 03:46:53 +03:00
ami_toggletabbar ( g - > shared , false ) ;
2010-03-18 01:15:03 +03:00
ami_utf8_free ( g - > tabtitle ) ;
2008-10-05 17:17:18 +04:00
FreeVec ( g ) ;
2008-10-05 03:29:17 +04:00
return ;
}
2012-08-05 14:28:48 +04:00
ami_plot_release_pens ( & g - > shared - > shared_pens ) ;
2013-04-12 00:26:42 +04:00
ami_schedule_redraw_remove ( g - > shared ) ;
2012-08-05 14:28:48 +04:00
2008-10-05 03:29:17 +04:00
DisposeObject ( g - > shared - > objects [ OID_MAIN ] ) ;
2011-07-03 15:05:18 +04:00
ami_gui_appicon_remove ( g - > shared ) ;
2012-04-28 23:43:46 +04:00
if ( g - > shared - > appwin ) RemoveAppWindow ( g - > shared - > appwin ) ;
2009-07-23 15:23:34 +04:00
2012-11-30 02:13:42 +04:00
ami_gui_hotlist_toolbar_free ( g - > shared , & g - > shared - > hotlist_toolbar_list ) ;
2011-03-01 01:12:34 +03:00
/* These aren't freed by the above.
2012-08-04 18:44:57 +04:00
* TODO : nav_west etc need freeing too ? */
2011-03-01 01:12:34 +03:00
DisposeObject ( g - > shared - > objects [ GID_ADDTAB_BM ] ) ;
DisposeObject ( g - > shared - > objects [ GID_CLOSETAB_BM ] ) ;
DisposeObject ( g - > shared - > objects [ GID_TABS_FLAG ] ) ;
2013-11-23 17:11:30 +04:00
DisposeObject ( g - > shared - > objects [ GID_FAVE_ADD ] ) ;
DisposeObject ( g - > shared - > objects [ GID_FAVE_RMV ] ) ;
2011-03-01 01:12:34 +03:00
2014-06-15 18:39:49 +04:00
ami_gui_opts_websearch_free ( g - > shared - > web_search_list ) ;
if ( g - > shared - > search_bm ) DisposeObject ( g - > shared - > search_bm ) ;
2010-10-05 23:14:46 +04:00
ami_free_menulabs ( g - > shared ) ;
2010-03-18 01:15:03 +03:00
free ( g - > shared - > wintitle ) ;
2009-08-29 14:16:19 +04:00
ami_utf8_free ( g - > shared - > status ) ;
2009-07-23 15:23:34 +04:00
FreeVec ( g - > shared - > svbuffer ) ;
2010-03-17 02:55:39 +03:00
for ( gid = 0 ; gid < GID_LAST ; gid + + )
free ( g - > shared - > helphints [ gid ] ) ;
2008-10-05 03:29:17 +04:00
DelObject ( g - > shared - > node ) ;
2008-10-05 17:17:18 +04:00
if ( g - > tab_node )
{
Remove ( g - > tab_node ) ;
FreeClickTabNode ( g - > tab_node ) ;
}
FreeVec ( g ) ; // g->shared should be freed by DelObject()
2008-08-09 19:19:04 +04:00
if ( IsMinListEmpty ( window_list ) )
{
/* last window closed, so exit */
2009-10-03 15:00:10 +04:00
ami_try_quit ( ) ;
2008-08-09 19:19:04 +04:00
}
2008-08-10 13:57:41 +04:00
win_destroyed = true ;
2008-08-02 18:31:32 +04:00
}
2014-01-12 14:27:41 +04:00
static void gui_window_set_title ( struct gui_window * g , const char * title )
2008-08-02 18:31:32 +04:00
{
2008-10-05 03:29:17 +04:00
struct Node * node ;
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2009-09-16 02:49:33 +04:00
char * utf8title ;
2008-10-19 15:33:05 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2009-09-16 02:49:33 +04:00
if ( ! title ) return ;
2008-10-05 03:29:17 +04:00
2009-09-18 01:44:07 +04:00
utf8title = ami_utf8_easy ( ( char * ) title ) ;
2014-07-12 19:09:08 +04:00
if ( g - > tab_node ) // && (g->shared->tabs > 1))
2008-10-05 03:29:17 +04:00
{
2009-09-18 01:44:07 +04:00
node = g - > tab_node ;
2008-10-19 15:33:05 +04:00
2010-06-26 20:26:05 +04:00
if ( ( g - > tabtitle = = NULL ) | | ( strcmp ( utf8title , g - > tabtitle ) ) )
{
SetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] ,
2010-02-13 21:03:05 +03:00
g - > shared - > win , NULL ,
2010-06-26 20:26:05 +04:00
CLICKTAB_Labels , ~ 0 ,
2009-09-16 02:49:33 +04:00
TAG_DONE ) ;
2008-10-05 03:29:17 +04:00
2010-06-26 20:26:05 +04:00
SetClickTabNodeAttrs ( node , TNA_Text , utf8title ,
2014-07-12 19:09:08 +04:00
TNA_HintInfo , utf8title ,
TAG_DONE ) ;
2010-03-18 01:15:03 +03:00
2010-06-26 20:26:05 +04:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_TABS ] ,
g - > shared - > win , NULL ,
CLICKTAB_Labels , & g - > shared - > tab_list ,
TAG_DONE ) ;
if ( g - > tabtitle ) ami_utf8_free ( g - > tabtitle ) ;
g - > tabtitle = utf8title ;
if ( ClickTabBase - > lib_Version < 53 )
RethinkLayout ( ( struct Gadget * ) g - > shared - > objects [ GID_TABLAYOUT ] ,
g - > shared - > win , NULL , TRUE ) ;
}
2008-10-05 03:29:17 +04:00
2011-11-10 18:22:02 +04:00
GetAttr ( CLICKTAB_Current , g - > shared - > objects [ GID_TABS ] ,
( ULONG * ) & cur_tab ) ;
2010-02-14 03:46:53 +03:00
}
2009-09-16 02:49:33 +04:00
2010-02-14 03:46:53 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
2009-09-18 01:44:07 +04:00
{
if ( ( g - > shared - > wintitle = = NULL ) | | ( strcmp ( utf8title , g - > shared - > wintitle ) ) )
{
2010-03-18 01:15:03 +03:00
if ( g - > shared - > wintitle ) free ( g - > shared - > wintitle ) ;
g - > shared - > wintitle = strdup ( utf8title ) ;
2009-09-18 01:44:07 +04:00
SetWindowTitles ( g - > shared - > win , g - > shared - > wintitle , nsscreentitle ) ;
2009-09-16 02:49:33 +04:00
}
2008-10-05 03:29:17 +04:00
}
2008-08-02 18:31:32 +04:00
}
2013-04-04 22:59:35 +04:00
static void ami_redraw_callback ( void * p )
2013-04-04 22:31:42 +04:00
{
2013-04-04 22:59:35 +04:00
struct gui_window_2 * gwin = ( struct gui_window_2 * ) p ;
2014-06-30 19:40:56 +04:00
if ( gwin - > redraw_required ) {
2013-04-04 22:31:42 +04:00
ami_do_redraw ( gwin ) ;
}
2014-11-16 17:44:40 +03:00
ami_gui_window_update_box_deferred ( gwin - > gw , true ) ;
2013-04-04 22:31:42 +04:00
2014-11-16 17:44:40 +03:00
if ( gwin - > gw - > c_h )
2013-04-04 22:31:42 +04:00
{
2014-11-16 17:44:40 +03:00
gui_window_place_caret ( gwin - > gw , gwin - > gw - > c_x ,
gwin - > gw - > c_y , gwin - > gw - > c_h , NULL ) ;
2013-04-04 22:31:42 +04:00
}
}
2013-04-04 22:59:35 +04:00
/**
* Schedule a redraw of the browser window - Amiga - specific function
*
* \ param gwin a struct gui_window_2
* \ param full_redraw set to true to schedule a full redraw ,
should only be set to false when called from gui_window_update_box ( )
*/
2013-04-04 22:46:33 +04:00
void ami_schedule_redraw ( struct gui_window_2 * gwin , bool full_redraw )
2013-04-04 22:31:42 +04:00
{
2014-10-26 16:22:02 +03:00
int ms = 1 ;
2013-04-12 00:20:25 +04:00
if ( full_redraw ) gwin - > redraw_required = true ;
2014-03-08 18:13:27 +04:00
ami_schedule ( ms , ami_redraw_callback , gwin ) ;
2013-04-04 22:31:42 +04:00
}
2013-04-12 00:26:42 +04:00
static void ami_schedule_redraw_remove ( struct gui_window_2 * gwin )
{
2014-03-08 18:13:27 +04:00
ami_schedule ( - 1 , ami_redraw_callback , gwin ) ;
2013-04-12 00:26:42 +04:00
}
2013-04-04 22:46:33 +04:00
static void ami_do_redraw_tiled ( struct gui_window_2 * gwin , bool busy ,
2012-02-26 19:44:14 +04:00
int left , int top , int width , int height ,
int sx , int sy , struct IBox * bbox , struct redraw_context * ctx )
2012-02-25 22:42:33 +04:00
{
2012-02-26 19:44:14 +04:00
int x , y ;
2012-02-25 22:42:33 +04:00
struct rect clip ;
2014-11-16 17:44:40 +03:00
int tile_x_scale = ( int ) ( nsoption_int ( redraw_tile_size_x ) / gwin - > gw - > bw - > scale ) ;
int tile_y_scale = ( int ) ( nsoption_int ( redraw_tile_size_y ) / gwin - > gw - > bw - > scale ) ;
2013-01-03 23:26:51 +04:00
2012-08-05 14:28:48 +04:00
browserglob . shared_pens = & gwin - > shared_pens ;
2012-02-25 22:42:33 +04:00
if ( top < 0 ) {
height + = top ;
top = 0 ;
}
if ( left < 0 ) {
width + = left ;
left = 0 ;
}
if ( top < sy ) {
height + = ( top - sy ) ;
top = sy ;
}
if ( left < sx ) {
width + = ( left - sx ) ;
left = sx ;
}
if ( ( ( top - sy ) + height ) > bbox - > Height )
height = bbox - > Height - ( top - sy ) ;
if ( ( ( left - sx ) + width ) > bbox - > Width )
width = bbox - > Width - ( left - sx ) ;
if ( width < = 0 ) return ;
if ( height < = 0 ) return ;
2013-01-13 23:06:51 +04:00
if ( busy ) ami_set_pointer ( gwin , GUI_POINTER_WAIT , false ) ;
2013-01-06 15:40:37 +04:00
2012-03-03 19:41:14 +04:00
for ( y = top ; y < ( top + height ) ; y + = tile_y_scale ) {
2012-02-25 22:42:33 +04:00
clip . y0 = 0 ;
2012-03-22 13:34:34 +04:00
clip . y1 = nsoption_int ( redraw_tile_size_y ) ;
2013-01-12 18:06:48 +04:00
if ( clip . y1 > height ) clip . y1 = height ;
2014-11-16 17:44:40 +03:00
if ( ( ( ( y - sy ) * gwin - > gw - > bw - > scale ) + clip . y1 ) > bbox - > Height )
clip . y1 = bbox - > Height - ( ( y - sy ) * gwin - > gw - > bw - > scale ) ;
2012-02-25 22:42:33 +04:00
2012-03-03 19:41:14 +04:00
for ( x = left ; x < ( left + width ) ; x + = tile_x_scale ) {
2012-02-25 22:42:33 +04:00
clip . x0 = 0 ;
2012-03-22 13:34:34 +04:00
clip . x1 = nsoption_int ( redraw_tile_size_x ) ;
2013-01-12 18:06:48 +04:00
if ( clip . x1 > width ) clip . x1 = width ;
2014-11-16 17:44:40 +03:00
if ( ( ( ( x - sx ) * gwin - > gw - > bw - > scale ) + clip . x1 ) > bbox - > Width )
clip . x1 = bbox - > Width - ( ( x - sx ) * gwin - > gw - > bw - > scale ) ;
2012-02-25 22:42:33 +04:00
2014-11-16 17:44:40 +03:00
if ( browser_window_redraw ( gwin - > gw - > bw ,
2012-03-03 19:41:14 +04:00
clip . x0 - ( int ) x ,
clip . y0 - ( int ) y ,
2012-02-26 19:44:14 +04:00
& clip , ctx ) )
2012-02-25 22:42:33 +04:00
{
ami_clearclipreg ( & browserglob ) ;
BltBitMapTags ( BLITA_SrcType , BLITT_BITMAP ,
BLITA_Source , browserglob . bm ,
BLITA_SrcX , 0 ,
BLITA_SrcY , 0 ,
BLITA_DestType , BLITT_RASTPORT ,
BLITA_Dest , gwin - > win - > RPort ,
2014-11-16 17:44:40 +03:00
BLITA_DestX , bbox - > Left + ( int ) ( ( x - sx ) * gwin - > gw - > bw - > scale ) ,
BLITA_DestY , bbox - > Top + ( int ) ( ( y - sy ) * gwin - > gw - > bw - > scale ) ,
2012-03-03 19:41:14 +04:00
BLITA_Width , ( int ) ( clip . x1 ) ,
BLITA_Height , ( int ) ( clip . y1 ) ,
2012-02-25 22:42:33 +04:00
TAG_DONE ) ;
}
}
}
2013-01-03 23:26:51 +04:00
2013-01-13 23:06:51 +04:00
if ( busy ) ami_reset_pointer ( gwin ) ;
2012-02-25 22:42:33 +04:00
}
2009-06-03 23:44:43 +04:00
/**
* Redraw an area of the browser window - Amiga - specific function
*
* \ param g a struct gui_window
2011-03-04 22:13:23 +03:00
* \ param bw a struct browser_window
2014-11-11 18:46:04 +03:00
* \ param busy busy flag passed to tiled redraw .
2009-06-03 23:44:43 +04:00
* \ param x0 top - left co - ordinate ( in document co - ordinates )
* \ param y0 top - left co - ordinate ( in document co - ordinates )
* \ param x1 bottom - right co - ordinate ( in document co - ordinates )
* \ param y1 bottom - right co - ordinate ( in document co - ordinates )
*/
2013-04-04 22:46:33 +04:00
static void ami_do_redraw_limits ( struct gui_window * g , struct browser_window * bw , bool busy ,
2011-02-11 22:03:01 +03:00
int x0 , int y0 , int x1 , int y1 )
2008-08-02 18:31:32 +04:00
{
2009-02-01 02:45:25 +03:00
struct IBox * bbox ;
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2010-06-05 14:37:02 +04:00
ULONG sx , sy ;
2014-04-05 22:43:55 +04:00
2011-06-30 19:48:07 +04:00
struct redraw_context ctx = {
. interactive = true ,
2011-12-24 02:39:25 +04:00
. background_images = true ,
2011-06-30 19:48:07 +04:00
. plot = & amiplot
} ;
2009-02-01 02:45:25 +03:00
if ( ! g ) return ;
2011-03-04 22:13:23 +03:00
if ( browser_window_redraw_ready ( bw ) = = false ) return ;
2009-02-01 02:45:25 +03:00
2010-06-05 13:59:38 +04:00
sx = g - > scrollx ;
sy = g - > scrolly ;
2010-02-14 03:46:53 +03:00
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) ) GetAttr ( CLICKTAB_Current ,
2010-02-13 21:03:05 +03:00
g - > shared - > objects [ GID_TABS ] , ( ULONG * ) & cur_tab ) ;
2009-02-01 02:45:25 +03:00
2010-02-14 03:46:53 +03:00
if ( ! ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) ) )
2009-02-01 02:45:25 +03:00
return ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2009-02-01 02:45:25 +03:00
2013-02-03 22:21:28 +04:00
ami_do_redraw_tiled ( g - > shared , busy , x0 , y0 ,
( x1 - x0 ) * bw - > scale , ( y1 - y0 ) * bw - > scale , sx , sy , bbox , & ctx ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2012-02-25 22:42:33 +04:00
return ;
2008-08-02 18:31:32 +04:00
}
2014-01-13 03:50:54 +04:00
static void gui_window_redraw_window ( struct gui_window * g )
2008-08-15 21:19:57 +04:00
{
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2008-10-05 18:22:02 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2010-02-14 03:46:53 +03:00
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) ) GetAttr ( CLICKTAB_Current ,
2010-02-13 21:03:05 +03:00
g - > shared - > objects [ GID_TABS ] , ( ULONG * ) & cur_tab ) ;
2008-10-05 18:22:02 +04:00
2010-02-14 03:46:53 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( g - > shared , true ) ;
2008-08-15 21:19:57 +04:00
}
2013-02-14 00:23:17 +04:00
static void ami_gui_window_update_box_deferred ( struct gui_window * g , bool draw )
2008-08-15 21:19:57 +04:00
{
2013-02-03 18:01:48 +04:00
struct nsObject * node ;
struct nsObject * nnode ;
struct rect * rect ;
2009-08-18 17:06:28 +04:00
if ( ! g ) return ;
2013-02-03 18:01:48 +04:00
if ( IsMinListEmpty ( g - > deferred_rects ) ) return ;
2013-02-14 00:23:17 +04:00
if ( draw = = true ) {
2013-02-05 23:44:21 +04:00
ami_set_pointer ( g - > shared , GUI_POINTER_WAIT , false ) ;
} else {
LOG ( ( " Ignoring deferred box redraw queue " ) ) ;
}
2013-02-03 18:01:48 +04:00
node = ( struct nsObject * ) GetHead ( ( struct List * ) g - > deferred_rects ) ;
do {
2013-02-14 00:23:17 +04:00
if ( draw = = true ) {
2013-02-03 18:01:48 +04:00
rect = ( struct rect * ) node - > objstruct ;
2014-11-16 17:44:40 +03:00
ami_do_redraw_limits ( g , g - > bw , false ,
2013-02-03 18:01:48 +04:00
rect - > x0 , rect - > y0 , rect - > x1 , rect - > y1 ) ;
2013-02-05 23:44:21 +04:00
}
2013-02-03 18:01:48 +04:00
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
DelObject ( node ) ;
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2013-02-03 18:01:48 +04:00
2013-02-14 00:23:17 +04:00
if ( draw = = true ) ami_reset_pointer ( g - > shared ) ;
2013-02-05 23:44:21 +04:00
}
2013-02-14 00:23:17 +04:00
static bool ami_gui_window_update_box_deferred_check ( struct MinList * deferred_rects ,
2013-02-05 23:44:21 +04:00
const struct rect * new_rect )
{
2014-01-05 20:01:03 +04:00
struct nsObject * node ;
struct nsObject * nnode ;
2013-02-05 23:44:21 +04:00
struct rect * rect ;
if ( IsMinListEmpty ( deferred_rects ) ) return true ;
node = ( struct nsObject * ) GetHead ( ( struct List * ) deferred_rects ) ;
do {
2013-02-06 22:44:41 +04:00
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
2013-02-05 23:44:21 +04:00
rect = ( struct rect * ) node - > objstruct ;
2013-02-06 22:44:41 +04:00
if ( ( rect - > x0 < = new_rect - > x0 ) & &
( rect - > y0 < = new_rect - > y0 ) & &
( rect - > x1 > = new_rect - > x1 ) & &
( rect - > y1 > = new_rect - > y1 ) ) {
2013-02-05 23:44:21 +04:00
return false ;
}
2013-02-06 22:44:41 +04:00
if ( ( new_rect - > x0 < = rect - > x0 ) & &
( new_rect - > y0 < = rect - > y0 ) & &
( new_rect - > x1 > = rect - > x1 ) & &
( new_rect - > y1 > = rect - > y1 ) ) {
LOG ( ( " Removing queued redraw that is a subset of new box redraw " ) ) ;
DelObject ( node ) ;
/* Don't return - we might find more */
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2013-02-05 23:44:21 +04:00
return true ;
2013-02-03 18:01:48 +04:00
}
2014-01-13 03:50:54 +04:00
static void gui_window_update_box ( struct gui_window * g , const struct rect * rect )
2013-02-03 18:01:48 +04:00
{
struct nsObject * nsobj ;
struct rect * deferred_rect ;
if ( ! g ) return ;
2013-02-14 00:23:17 +04:00
if ( ami_gui_window_update_box_deferred_check ( g - > deferred_rects , rect ) ) {
2013-10-12 16:11:13 +04:00
deferred_rect = AllocVecTagList ( sizeof ( struct rect ) , NULL ) ;
2013-02-05 23:44:21 +04:00
CopyMem ( rect , deferred_rect , sizeof ( struct rect ) ) ;
nsobj = AddObject ( g - > deferred_rects , AMINS_RECT ) ;
nsobj - > objstruct = deferred_rect ;
} else {
2013-02-06 22:44:41 +04:00
LOG ( ( " Ignoring duplicate or subset of queued box redraw " ) ) ;
2013-02-05 23:44:21 +04:00
}
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( g - > shared , false ) ;
2008-08-15 21:19:57 +04:00
}
2014-06-30 19:40:56 +04:00
/**
* callback from core to reformat a window .
*/
static void amiga_window_reformat ( struct gui_window * gw )
{
struct IBox * bbox ;
if ( gw ! = NULL ) {
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gw - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2014-11-16 17:44:40 +03:00
browser_window_reformat ( gw - > bw , false , bbox - > Width , bbox - > Height ) ;
2014-06-30 19:40:56 +04:00
gw - > shared - > redraw_scroll = false ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2014-06-30 19:40:56 +04:00
}
}
2013-04-04 22:46:33 +04:00
static void ami_do_redraw ( struct gui_window_2 * gwin )
2008-08-02 18:31:32 +04:00
{
2014-10-25 19:22:08 +04:00
ULONG hcurrent , vcurrent , xoffset , yoffset , width = 800 , height = 600 ;
2008-08-11 21:53:45 +04:00
struct IBox * bbox ;
2013-01-03 23:32:21 +04:00
ULONG oldh = gwin - > oldh , oldv = gwin - > oldv ;
2011-03-05 17:36:55 +03:00
struct RastPort * temprp ;
2008-08-09 19:19:04 +04:00
2014-11-16 17:44:40 +03:00
if ( browser_window_redraw_ready ( gwin - > gw - > bw ) = = false ) return ;
2011-03-04 22:13:23 +03:00
2013-01-03 23:32:21 +04:00
ami_get_hscroll_pos ( gwin , ( ULONG * ) & hcurrent ) ;
ami_get_vscroll_pos ( gwin , ( ULONG * ) & vcurrent ) ;
2008-08-07 22:44:28 +04:00
2014-11-16 17:44:40 +03:00
gwin - > gw - > scrollx = hcurrent ;
gwin - > gw - > scrolly = vcurrent ;
2011-12-24 16:49:55 +04:00
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2008-08-11 21:53:45 +04:00
width = bbox - > Width ;
height = bbox - > Height ;
xoffset = bbox - > Left ;
yoffset = bbox - > Top ;
2008-08-10 00:27:36 +04:00
2013-01-03 23:32:21 +04:00
if ( gwin - > redraw_scroll )
2009-06-01 00:14:15 +04:00
{
if ( ( abs ( vcurrent - oldv ) > height ) | | ( abs ( hcurrent - oldh ) > width ) )
2013-01-03 23:32:21 +04:00
gwin - > redraw_scroll = false ;
2009-06-19 22:32:31 +04:00
2013-01-03 23:32:21 +04:00
if ( gwin - > new_content ) gwin - > redraw_scroll = false ;
2014-11-16 17:44:40 +03:00
// if(gwin->gw->bw->scale != 1.0) gwin->redraw_scroll = false;
2011-02-24 02:11:26 +03:00
}
2008-08-10 00:27:36 +04:00
2013-01-03 23:32:21 +04:00
if ( gwin - > redraw_scroll )
2009-01-11 00:31:21 +03:00
{
2013-02-10 16:13:39 +04:00
struct rect rect ;
2013-02-03 22:50:16 +04:00
2014-11-16 17:44:40 +03:00
gwin - > gw - > c_h_temp = gwin - > gw - > c_h ;
gui_window_remove_caret ( gwin - > gw ) ;
2010-03-15 21:48:14 +03:00
2013-01-03 23:32:21 +04:00
ScrollWindowRaster ( gwin - > win , hcurrent - oldh , vcurrent - oldv ,
xoffset , yoffset , xoffset + width - 1 , yoffset + height - 1 ) ;
2009-02-02 00:28:59 +03:00
2014-11-16 17:44:40 +03:00
gwin - > gw - > c_h = gwin - > gw - > c_h_temp ;
2010-03-15 21:48:14 +03:00
2012-08-04 18:44:57 +04:00
if ( vcurrent > oldv ) /* Going down */
2009-02-05 15:20:23 +03:00
{
2013-02-10 16:13:39 +04:00
ami_spacebox_to_ns_coords ( gwin , & rect . x0 , & rect . y0 , 0 , height - ( vcurrent - oldv ) - 1 ) ;
ami_spacebox_to_ns_coords ( gwin , & rect . x1 , & rect . y1 , width + 1 , height + 1 ) ;
2014-11-16 17:44:40 +03:00
gui_window_update_box ( gwin - > gw , & rect ) ;
2009-02-05 15:20:23 +03:00
}
2012-08-04 18:44:57 +04:00
else if ( vcurrent < oldv ) /* Going up */
2009-02-05 15:20:23 +03:00
{
2013-02-10 16:13:39 +04:00
ami_spacebox_to_ns_coords ( gwin , & rect . x0 , & rect . y0 , 0 , 0 ) ;
ami_spacebox_to_ns_coords ( gwin , & rect . x1 , & rect . y1 , width + 1 , oldv - vcurrent + 1 ) ;
2014-11-16 17:44:40 +03:00
gui_window_update_box ( gwin - > gw , & rect ) ;
2009-02-05 15:20:23 +03:00
}
2009-02-02 00:28:59 +03:00
2012-08-04 18:44:57 +04:00
if ( hcurrent > oldh ) /* Going right */
2009-02-05 15:20:23 +03:00
{
2013-02-10 16:13:39 +04:00
ami_spacebox_to_ns_coords ( gwin , & rect . x0 , & rect . y0 , width - ( hcurrent - oldh ) , 0 ) ;
ami_spacebox_to_ns_coords ( gwin , & rect . x1 , & rect . y1 , width + 1 , height + 1 ) ;
2014-11-16 17:44:40 +03:00
gui_window_update_box ( gwin - > gw , & rect ) ;
2009-02-05 15:20:23 +03:00
}
2012-08-04 18:44:57 +04:00
else if ( hcurrent < oldh ) /* Going left */
2009-02-05 15:20:23 +03:00
{
2013-02-10 16:13:39 +04:00
ami_spacebox_to_ns_coords ( gwin , & rect . x0 , & rect . y0 , 0 , 0 ) ;
ami_spacebox_to_ns_coords ( gwin , & rect . x1 , & rect . y1 , oldh - hcurrent + 1 , height + 1 ) ;
2014-11-16 17:44:40 +03:00
gui_window_update_box ( gwin - > gw , & rect ) ;
2009-02-05 15:20:23 +03:00
}
2008-08-15 21:19:57 +04:00
}
else
{
2011-02-12 13:39:21 +03:00
struct rect clip ;
2011-06-30 19:48:07 +04:00
struct redraw_context ctx = {
. interactive = true ,
2011-12-24 02:39:25 +04:00
. background_images = true ,
2011-06-30 19:48:07 +04:00
. plot = & amiplot
} ;
2011-02-12 13:39:21 +03:00
2011-03-05 17:36:55 +03:00
glob = & browserglob ;
2009-02-01 02:45:25 +03:00
2012-03-22 13:34:34 +04:00
if ( nsoption_bool ( direct_render ) = = false )
2011-03-05 17:36:55 +03:00
{
2013-01-13 23:06:51 +04:00
ami_do_redraw_tiled ( gwin , true , hcurrent , vcurrent , width , height , hcurrent , vcurrent , bbox , & ctx ) ;
2011-03-05 17:36:55 +03:00
}
else
{
2013-01-03 23:32:21 +04:00
browserglob . shared_pens = & gwin - > shared_pens ;
2011-03-05 17:36:55 +03:00
temprp = browserglob . rp ;
2013-01-03 23:32:21 +04:00
browserglob . rp = gwin - > win - > RPort ;
2011-03-05 17:36:55 +03:00
clip . x0 = bbox - > Left ;
clip . y0 = bbox - > Top ;
clip . x1 = bbox - > Left + bbox - > Width ;
clip . y1 = bbox - > Top + bbox - > Height ;
2011-03-04 22:05:12 +03:00
2013-01-06 04:21:15 +04:00
ami_set_pointer ( gwin , GUI_POINTER_WAIT , false ) ;
2014-11-16 17:44:40 +03:00
if ( browser_window_redraw ( gwin - > gw - > bw , clip . x0 - hcurrent , clip . y0 - vcurrent , & clip , & ctx ) )
2011-03-05 17:36:55 +03:00
{
2012-02-25 22:42:33 +04:00
ami_clearclipreg ( & browserglob ) ;
browserglob . rp = temprp ;
2011-03-05 17:36:55 +03:00
}
2013-01-03 23:26:51 +04:00
2013-01-06 04:21:15 +04:00
ami_reset_pointer ( gwin ) ;
2011-02-13 22:59:32 +03:00
}
2013-02-10 16:13:39 +04:00
/* Tell NetSurf not to bother with the next queued box redraw, as we've redrawn everything. */
2014-11-16 17:44:40 +03:00
ami_gui_window_update_box_deferred ( gwin - > gw , false ) ;
2009-01-15 23:03:15 +03:00
}
2008-08-10 00:27:36 +04:00
2013-01-03 23:32:21 +04:00
ami_update_buttons ( gwin ) ;
2008-08-11 21:53:45 +04:00
2013-01-03 23:32:21 +04:00
gwin - > oldh = hcurrent ;
gwin - > oldv = vcurrent ;
2008-08-30 20:57:35 +04:00
2013-01-03 23:32:21 +04:00
gwin - > redraw_scroll = false ;
gwin - > redraw_required = false ;
gwin - > new_content = false ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2008-08-02 18:31:32 +04:00
}
2014-10-25 19:22:08 +04:00
static void ami_refresh_window ( struct gui_window_2 * gwin )
2012-02-25 00:00:51 +04:00
{
2012-04-29 03:23:29 +04:00
/* simplerefresh only */
2012-02-25 00:00:51 +04:00
struct IBox * bbox ;
2012-04-29 02:53:50 +04:00
int x0 , x1 , y0 , y1 , sx , sy ;
2014-04-05 22:43:55 +04:00
struct RegionRectangle * regrect ;
2012-02-25 00:00:51 +04:00
2014-11-16 17:44:40 +03:00
sx = gwin - > gw - > scrollx ;
sy = gwin - > gw - > scrolly ;
2012-04-29 02:53:50 +04:00
2013-01-13 23:06:51 +04:00
ami_set_pointer ( gwin , GUI_POINTER_WAIT , false ) ;
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2013-01-13 23:06:51 +04:00
2012-02-25 00:00:51 +04:00
BeginRefresh ( gwin - > win ) ;
2012-04-29 02:53:50 +04:00
x0 = ( ( gwin - > win - > RPort - > Layer - > DamageList - > bounds . MinX - bbox - > Left ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sx - 1 ;
2012-04-29 02:53:50 +04:00
x1 = ( ( gwin - > win - > RPort - > Layer - > DamageList - > bounds . MaxX - bbox - > Left ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sx + 2 ;
2012-04-29 02:53:50 +04:00
y0 = ( ( gwin - > win - > RPort - > Layer - > DamageList - > bounds . MinY - bbox - > Top ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sy - 1 ;
2012-04-29 02:53:50 +04:00
y1 = ( ( gwin - > win - > RPort - > Layer - > DamageList - > bounds . MaxY - bbox - > Top ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sy + 2 ;
2012-02-25 03:18:24 +04:00
regrect = gwin - > win - > RPort - > Layer - > DamageList - > RegionRectangle ;
2012-02-25 00:00:51 +04:00
2014-11-16 17:44:40 +03:00
ami_do_redraw_limits ( gwin - > gw , gwin - > gw - > bw , false , x0 , y0 , x1 , y1 ) ;
2012-02-25 00:00:51 +04:00
2012-02-25 03:18:24 +04:00
while ( regrect )
{
2012-04-29 02:53:50 +04:00
x0 = ( ( regrect - > bounds . MinX - bbox - > Left ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sx - 1 ;
2012-04-29 02:53:50 +04:00
x1 = ( ( regrect - > bounds . MaxX - bbox - > Left ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sx + 2 ;
2012-04-29 02:53:50 +04:00
y0 = ( ( regrect - > bounds . MinY - bbox - > Top ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sy - 1 ;
2012-04-29 02:53:50 +04:00
y1 = ( ( regrect - > bounds . MaxY - bbox - > Top ) /
2014-11-16 17:44:40 +03:00
browser_window_get_scale ( gwin - > gw - > bw ) ) + sy + 2 ;
2012-02-25 03:18:24 +04:00
regrect = regrect - > Next ;
2014-11-16 17:44:40 +03:00
ami_do_redraw_limits ( gwin - > gw , gwin - > gw - > bw , false , x0 , y0 , x1 , y1 ) ;
2012-02-25 03:18:24 +04:00
}
2012-02-25 00:00:51 +04:00
EndRefresh ( gwin - > win , TRUE ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2013-01-13 23:06:51 +04:00
ami_reset_pointer ( gwin ) ;
2012-02-25 00:00:51 +04:00
}
2009-08-29 03:12:18 +04:00
void ami_get_hscroll_pos ( struct gui_window_2 * gwin , ULONG * xs )
{
2010-02-13 21:03:05 +03:00
if ( gwin - > objects [ GID_HSCROLL ] )
2009-08-29 03:12:18 +04:00
{
2014-10-26 19:42:00 +03:00
GetAttr ( SCROLLER_Top , ( Object * ) gwin - > objects [ GID_HSCROLL ] , xs ) ;
} else {
* xs = 0 ;
2009-08-29 03:12:18 +04:00
}
2009-08-31 01:43:14 +04:00
2014-11-16 17:44:40 +03:00
* xs / = gwin - > gw - > bw - > scale ;
2009-08-31 01:43:14 +04:00
}
void ami_get_vscroll_pos ( struct gui_window_2 * gwin , ULONG * ys )
{
2014-10-25 18:08:04 +04:00
if ( gwin - > objects [ GID_VSCROLL ] ) {
GetAttr ( SCROLLER_Top , gwin - > objects [ GID_VSCROLL ] , ys ) ;
} else {
* ys = 0 ;
}
2014-11-16 17:44:40 +03:00
* ys / = gwin - > gw - > bw - > scale ;
2009-08-29 03:12:18 +04:00
}
2014-01-13 05:08:15 +04:00
static bool gui_window_get_scroll ( struct gui_window * g , int * sx , int * sy )
2008-08-02 18:31:32 +04:00
{
2009-08-29 03:12:18 +04:00
ami_get_hscroll_pos ( g - > shared , ( ULONG * ) sx ) ;
2009-08-31 01:43:14 +04:00
ami_get_vscroll_pos ( g - > shared , ( ULONG * ) sy ) ;
2014-10-18 02:18:58 +04:00
return true ;
2008-08-02 18:31:32 +04:00
}
2014-01-13 05:08:15 +04:00
static void gui_window_set_scroll ( struct gui_window * g , int sx , int sy )
2008-08-02 18:31:32 +04:00
{
2010-06-05 14:37:02 +04:00
struct IBox * bbox ;
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2008-10-06 01:20:12 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2014-11-16 17:44:40 +03:00
if ( ! g - > bw | | ! g - > bw - > current_content ) return ;
2010-06-05 14:37:02 +04:00
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2010-06-05 14:37:02 +04:00
if ( sx < 0 ) sx = 0 ;
if ( sy < 0 ) sy = 0 ;
2014-11-16 17:44:40 +03:00
if ( sx > = content_get_width ( g - > bw - > current_content ) - bbox - > Width )
sx = content_get_width ( g - > bw - > current_content ) - bbox - > Width ;
if ( sy > = ( content_get_height ( g - > bw - > current_content ) - bbox - > Height ) )
sy = content_get_height ( g - > bw - > current_content ) - bbox - > Height ;
2010-06-05 14:37:02 +04:00
2014-11-16 17:44:40 +03:00
if ( content_get_width ( g - > bw - > current_content ) < = bbox - > Width ) sx = 0 ;
if ( content_get_height ( g - > bw - > current_content ) < = bbox - > Height ) sy = 0 ;
2008-10-06 21:47:31 +04:00
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2010-02-14 03:46:53 +03:00
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) )
GetAttr ( CLICKTAB_Current ,
g - > shared - > objects [ GID_TABS ] , ( ULONG * ) & cur_tab ) ;
2008-08-31 01:32:05 +04:00
2010-02-14 03:46:53 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
2008-10-06 01:20:12 +04:00
{
2014-10-25 18:08:04 +04:00
if ( g - > shared - > objects [ GID_VSCROLL ] ) {
RefreshSetGadgetAttrs ( ( struct Gadget * ) ( APTR ) g - > shared - > objects [ GID_VSCROLL ] ,
g - > shared - > win , NULL ,
2014-11-16 17:44:40 +03:00
SCROLLER_Top , ( ULONG ) ( sy * g - > bw - > scale ) ,
2008-10-06 01:20:12 +04:00
TAG_DONE ) ;
2014-10-25 18:08:04 +04:00
}
2008-08-09 19:19:04 +04:00
2010-02-13 21:03:05 +03:00
if ( g - > shared - > objects [ GID_HSCROLL ] )
2009-08-29 03:12:18 +04:00
{
2010-02-13 21:03:05 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) ( APTR ) g - > shared - > objects [ GID_HSCROLL ] ,
2009-08-29 03:12:18 +04:00
g - > shared - > win , NULL ,
2014-11-16 17:44:40 +03:00
SCROLLER_Top , ( ULONG ) ( sx * g - > bw - > scale ) ,
2009-08-29 03:12:18 +04:00
TAG_DONE ) ;
}
2014-10-26 19:42:00 +03:00
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( g - > shared , true ) ;
2009-05-31 19:19:46 +04:00
2012-03-22 13:34:34 +04:00
if ( nsoption_bool ( faster_scroll ) = = true ) g - > shared - > redraw_scroll = true ;
2009-06-04 22:19:27 +04:00
else g - > shared - > redraw_scroll = false ;
2009-03-09 10:21:19 +03:00
g - > scrollx = sx ;
g - > scrolly = sy ;
2009-03-29 03:51:39 +04:00
2014-11-16 17:44:40 +03:00
// history_set_current_scroll(g->bw->history,g->scrollx,g->scrolly);
2008-10-19 15:33:05 +04:00
}
2009-06-19 22:32:31 +04:00
// g->shared->new_content = false;
2008-08-02 18:31:32 +04:00
}
2014-01-13 15:38:35 +04:00
static void gui_window_update_extent ( struct gui_window * g )
2008-08-02 18:31:32 +04:00
{
2014-10-18 02:18:58 +04:00
struct IBox * bbox ;
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2008-08-17 20:22:40 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2014-11-16 17:44:40 +03:00
if ( ! g - > bw - > current_content ) return ;
2014-10-18 02:18:58 +04:00
2010-02-14 03:46:53 +03:00
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) ) GetAttr ( CLICKTAB_Current ,
2010-02-13 21:03:05 +03:00
g - > shared - > objects [ GID_TABS ] , ( ULONG * ) & cur_tab ) ;
2008-10-19 15:33:05 +04:00
2010-02-14 03:46:53 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
2008-10-19 15:33:05 +04:00
{
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2008-08-09 19:19:04 +04:00
2014-10-25 18:08:04 +04:00
if ( g - > shared - > objects [ GID_VSCROLL ] ) {
RefreshSetGadgetAttrs ( ( struct Gadget * ) ( APTR ) g - > shared - > objects [ GID_VSCROLL ] , g - > shared - > win , NULL ,
2014-11-16 17:44:40 +03:00
SCROLLER_Total , ( ULONG ) ( content_get_height ( g - > bw - > current_content ) * g - > bw - > scale ) ,
2014-10-25 18:08:04 +04:00
SCROLLER_Visible , bbox - > Height ,
2008-10-19 15:33:05 +04:00
TAG_DONE ) ;
2014-10-25 18:08:04 +04:00
}
2008-08-09 19:19:04 +04:00
2010-02-13 21:03:05 +03:00
if ( g - > shared - > objects [ GID_HSCROLL ] )
2009-08-29 03:12:18 +04:00
{
2010-02-13 21:03:05 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) ( APTR ) g - > shared - > objects [ GID_HSCROLL ] ,
2009-08-29 03:12:18 +04:00
g - > shared - > win , NULL ,
2014-11-16 17:44:40 +03:00
SCROLLER_Total , ( ULONG ) ( content_get_width ( g - > bw - > current_content ) * g - > bw - > scale ) ,
2009-08-29 03:12:18 +04:00
SCROLLER_Visible , bbox - > Width ,
TAG_DONE ) ;
}
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2008-10-19 15:33:05 +04:00
}
2014-10-27 01:22:15 +03:00
ami_gui_scroller_update ( g - > shared ) ;
2009-06-20 13:57:26 +04:00
g - > shared - > new_content = true ;
2008-08-02 18:31:32 +04:00
}
2014-01-13 18:51:27 +04:00
static void gui_window_set_status ( struct gui_window * g , const char * text )
2008-08-02 18:31:32 +04:00
{
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2009-08-29 14:16:19 +04:00
char * utf8text ;
2010-02-11 21:49:03 +03:00
ULONG size ;
UWORD chars ;
struct TextExtent textex ;
2008-10-19 15:33:05 +04:00
if ( ! g ) return ;
2009-08-14 21:53:28 +04:00
if ( ! text ) return ;
2010-02-13 21:03:05 +03:00
if ( ! g - > shared - > objects [ GID_STATUS ] ) return ;
2008-10-19 15:33:05 +04:00
2010-02-14 03:46:53 +03:00
if ( g - > tab_node & & ( g - > shared - > tabs > 1 ) ) GetAttr ( CLICKTAB_Current ,
2010-02-13 21:03:05 +03:00
g - > shared - > objects [ GID_TABS ] , ( ULONG * ) & cur_tab ) ;
2008-10-19 15:33:05 +04:00
2010-02-14 03:46:53 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) )
2008-10-19 15:33:05 +04:00
{
2009-09-04 22:10:15 +04:00
utf8text = ami_utf8_easy ( ( char * ) text ) ;
2009-10-16 01:35:29 +04:00
if ( utf8text = = NULL ) return ;
2009-08-29 14:16:19 +04:00
2010-02-13 21:03:05 +03:00
GetAttr ( GA_Width , g - > shared - > objects [ GID_STATUS ] , ( ULONG * ) & size ) ;
2010-02-11 21:49:03 +03:00
chars = TextFit ( & scrn - > RastPort , utf8text , strlen ( utf8text ) ,
2010-04-02 14:49:18 +04:00
& textex , NULL , 1 , size - 4 , scrn - > RastPort . TxHeight ) ;
2010-01-09 02:13:20 +03:00
2010-02-11 21:49:03 +03:00
utf8text [ chars ] = 0 ;
2010-01-09 02:13:20 +03:00
2010-02-13 21:03:05 +03:00
SetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_STATUS ] ,
2010-02-11 21:49:03 +03:00
g - > shared - > win , NULL ,
GA_Text , utf8text ,
TAG_DONE ) ;
2009-08-29 03:12:18 +04:00
2010-02-13 21:03:05 +03:00
RefreshGList ( ( struct Gadget * ) g - > shared - > objects [ GID_STATUS ] ,
g - > shared - > win , NULL , 1 ) ;
2009-08-29 14:16:19 +04:00
2010-02-11 21:49:03 +03:00
if ( g - > shared - > status ) ami_utf8_free ( g - > shared - > status ) ;
g - > shared - > status = utf8text ;
2008-10-19 15:33:05 +04:00
}
2008-08-02 18:31:32 +04:00
}
2014-11-03 01:30:45 +03:00
static nserror gui_window_set_url ( struct gui_window * g , nsurl * url )
2008-08-02 18:31:32 +04:00
{
2014-10-25 19:22:08 +04:00
int cur_tab = 0 ;
2008-10-05 17:17:18 +04:00
2014-11-09 04:10:52 +03:00
if ( ! g ) return NSERROR_OK ;
2008-08-31 01:32:05 +04:00
2014-11-03 01:30:45 +03:00
if ( ( g - > tab_node ) & & ( g - > shared - > tabs > 1 ) ) {
GetAttr ( CLICKTAB_Current ,
g - > shared - > objects [ GID_TABS ] ,
( ULONG * ) & cur_tab ) ;
}
2008-10-05 17:17:18 +04:00
2014-11-03 01:30:45 +03:00
if ( ( cur_tab = = g - > tab ) | | ( g - > shared - > tabs < = 1 ) ) {
2010-02-13 21:03:05 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) g - > shared - > objects [ GID_URL ] ,
2014-11-03 01:30:45 +03:00
g - > shared - > win , NULL , STRINGA_TextVal ,
nsurl_access ( url ) , TAG_DONE ) ;
2008-10-05 17:17:18 +04:00
}
2011-07-16 17:53:22 +04:00
ami_update_buttons ( g - > shared ) ;
2014-10-29 03:17:11 +03:00
return NSERROR_OK ;
2008-08-02 18:31:32 +04:00
}
2009-12-18 02:55:02 +03:00
2012-04-29 19:59:37 +04:00
static uint32 ami_set_favicon_render_hook ( struct Hook * hook , APTR space ,
struct gpRender * msg )
{
2014-07-05 22:00:21 +04:00
ami_schedule ( 0 , ami_gui_refresh_favicon , hook - > h_Data ) ;
2012-04-29 19:59:37 +04:00
return 0 ;
}
2009-12-18 02:55:02 +03:00
/**
2014-05-25 03:57:48 +04:00
* Gui callback when search provider details are updated .
*
* \ param provider_name The providers name .
* \ param ico_bitmap The icon bitmap representing the provider .
* \ return NSERROR_OK on success else error code .
2009-12-18 02:55:02 +03:00
*/
2014-05-25 04:14:01 +04:00
static nserror gui_search_web_provider_update ( const char * provider_name ,
2014-05-25 03:57:48 +04:00
struct bitmap * ico_bitmap )
2009-12-18 02:55:02 +03:00
{
2009-12-22 02:25:35 +03:00
struct BitMap * bm = NULL ;
struct nsObject * node ;
struct nsObject * nnode ;
struct gui_window_2 * gwin ;
2014-05-25 04:14:01 +04:00
if ( IsMinListEmpty ( window_list ) ) return NSERROR_BAD_PARAMETER ;
if ( nsoption_bool ( kiosk_mode ) = = true ) return NSERROR_BAD_PARAMETER ;
2011-10-08 01:53:35 +04:00
2014-05-25 03:57:48 +04:00
if ( ico_bitmap ! = NULL ) {
2012-08-08 02:07:16 +04:00
bm = ami_bitmap_get_native ( ico_bitmap , 16 , 16 , NULL ) ;
2014-05-25 03:57:48 +04:00
}
2011-07-02 23:38:54 +04:00
2009-12-22 02:25:35 +03:00
node = ( struct nsObject * ) GetHead ( ( struct List * ) window_list ) ;
do {
nnode = ( struct nsObject * ) GetSucc ( ( struct Node * ) node ) ;
gwin = node - > objstruct ;
2011-09-05 02:35:11 +04:00
if ( node - > Type = = AMINS_WINDOW )
2009-12-22 02:25:35 +03:00
{
2014-06-15 18:39:49 +04:00
if ( gwin - > search_bm ! = NULL )
DisposeObject ( gwin - > search_bm ) ;
gwin - > search_bm = BitMapObject ,
2014-06-15 18:48:55 +04:00
BITMAP_Screen , scrn ,
2014-06-15 18:39:49 +04:00
BITMAP_Width , 16 ,
BITMAP_Height , 16 ,
BITMAP_BitMap , bm ,
BitMapEnd ;
2010-03-18 00:43:23 +03:00
RefreshSetGadgetAttrs ( ( struct Gadget * ) gwin - > objects [ GID_SEARCH_ICON ] ,
gwin - > win , NULL ,
2014-05-25 03:57:48 +04:00
GA_HintInfo , provider_name ,
2014-06-15 18:39:49 +04:00
GA_Image , gwin - > search_bm ,
2010-03-18 00:43:23 +03:00
TAG_DONE ) ;
2009-12-22 02:25:35 +03:00
}
2014-10-25 19:22:08 +04:00
} while ( ( node = nnode ) ) ;
2014-05-25 03:57:48 +04:00
return NSERROR_OK ;
2009-12-18 02:55:02 +03:00
}
2012-04-29 19:59:37 +04:00
static uint32 ami_set_throbber_render_hook ( struct Hook * hook , APTR space ,
struct gpRender * msg )
{
2014-07-05 21:44:44 +04:00
struct gui_window_2 * gwin = hook - > h_Data ;
2014-11-16 17:44:40 +03:00
ami_throbber_redraw_schedule ( 0 , gwin - > gw ) ;
2012-04-29 19:59:37 +04:00
return 0 ;
}
2014-01-13 18:51:27 +04:00
static void gui_window_place_caret ( struct gui_window * g , int x , int y , int height ,
2013-03-06 02:53:33 +04:00
const struct rect * clip )
2008-08-02 18:31:32 +04:00
{
2008-08-22 01:41:42 +04:00
struct IBox * bbox ;
2014-10-25 19:22:08 +04:00
int xs , ys ;
2008-08-22 01:41:42 +04:00
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2008-09-28 00:55:11 +04:00
gui_window_remove_caret ( g ) ;
2011-03-20 01:40:02 +03:00
xs = g - > scrollx ;
ys = g - > scrolly ;
2008-08-22 01:41:42 +04:00
2008-10-05 03:29:17 +04:00
SetAPen ( g - > shared - > win - > RPort , 3 ) ;
2008-09-28 01:33:00 +04:00
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) g - > shared - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return ;
}
2009-03-28 18:43:12 +03:00
if ( ( y - ys + height ) > ( bbox - > Height ) ) height = bbox - > Height - y + ys ;
2014-11-15 16:46:23 +03:00
if ( ( ( x - xs ) < = 0 ) | | ( ( x - xs + 2 ) > = ( bbox - > Width ) ) | | ( ( y - ys ) < = 0 ) | | ( ( y - ys ) > = ( bbox - > Height ) ) ) {
ami_gui_free_space_box ( bbox ) ;
return ;
}
2008-09-28 01:33:00 +04:00
2011-03-19 16:00:45 +03:00
g - > c_w = 2 ;
2010-09-19 16:38:23 +04:00
2009-04-29 21:05:40 +04:00
SetDrMd ( g - > shared - > win - > RPort , COMPLEMENT ) ;
2011-03-19 16:00:45 +03:00
RectFill ( g - > shared - > win - > RPort , x + bbox - > Left - xs , y + bbox - > Top - ys ,
x + bbox - > Left + g - > c_w - xs , y + bbox - > Top + height - ys ) ;
2009-04-29 21:05:40 +04:00
SetDrMd ( g - > shared - > win - > RPort , JAM1 ) ;
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2008-10-19 15:33:05 +04:00
g - > c_x = x ;
g - > c_y = y ;
g - > c_h = height ;
2010-07-24 20:39:37 +04:00
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2010-09-19 16:38:23 +04:00
OnMenu ( g - > shared - > win , AMI_MENU_PASTE ) ;
2008-08-02 18:31:32 +04:00
}
2014-01-13 18:51:27 +04:00
static void gui_window_remove_caret ( struct gui_window * g )
2008-08-02 18:31:32 +04:00
{
2008-08-31 01:32:05 +04:00
if ( ! g ) return ;
2010-09-19 16:58:25 +04:00
if ( g - > c_h = = 0 ) return ;
2008-08-31 01:32:05 +04:00
2012-03-22 13:34:34 +04:00
if ( ( nsoption_bool ( kiosk_mode ) = = false ) )
2010-09-19 16:38:23 +04:00
OffMenu ( g - > shared - > win , AMI_MENU_PASTE ) ;
2010-07-24 20:39:37 +04:00
2014-11-16 17:44:40 +03:00
ami_do_redraw_limits ( g , g - > bw , false , g - > c_x , g - > c_y ,
2011-03-19 16:00:45 +03:00
g - > c_x + g - > c_w + 1 , g - > c_y + g - > c_h + 1 ) ;
2008-09-23 00:41:01 +04:00
2008-10-19 15:33:05 +04:00
g - > c_h = 0 ;
2008-08-02 18:31:32 +04:00
}
2014-01-13 02:55:26 +04:00
static void gui_window_new_content ( struct gui_window * g )
2008-08-02 18:31:32 +04:00
{
2010-03-28 19:51:05 +04:00
hlcache_handle * c ;
2009-05-23 23:06:58 +04:00
2014-11-16 17:44:40 +03:00
if ( g & & g - > shared & & g - > bw & & g - > bw - > current_content )
c = g - > bw - > current_content ;
2009-05-23 23:06:58 +04:00
else return ;
2009-05-17 14:40:42 +04:00
2009-08-23 19:59:41 +04:00
ami_clearclipreg ( & browserglob ) ;
2009-06-03 11:14:24 +04:00
g - > shared - > new_content = true ;
2009-06-14 16:34:53 +04:00
g - > scrollx = 0 ;
g - > scrolly = 0 ;
2009-06-19 22:32:31 +04:00
g - > shared - > oldh = 0 ;
g - > shared - > oldv = 0 ;
2009-12-22 02:25:35 +03:00
g - > favicon = NULL ;
2012-08-05 14:28:48 +04:00
ami_plot_release_pens ( & g - > shared - > shared_pens ) ;
2010-07-24 23:57:27 +04:00
ami_menu_update_disabled ( g , c ) ;
2013-11-23 16:23:56 +04:00
ami_gui_update_hotlist_button ( g - > shared ) ;
2014-10-27 00:30:19 +03:00
ami_gui_scroller_update ( g - > shared ) ;
2008-08-02 18:31:32 +04:00
}
2014-01-12 21:07:34 +04:00
static bool gui_window_drag_start ( struct gui_window * g , gui_drag_type type ,
2012-01-11 20:45:17 +04:00
const struct rect * rect )
2008-08-02 18:31:32 +04:00
{
2012-01-12 01:41:55 +04:00
g - > shared - > drag_op = type ;
if ( rect ) g - > shared - > ptr_lock = ami_ns_rect_to_ibox ( g - > shared , rect ) ;
if ( type = = GDRAGGING_NONE )
{
2012-01-15 19:57:02 +04:00
SetWindowAttrs ( g - > shared - > win , WA_GrabFocus , 0 ,
2012-01-12 01:41:55 +04:00
WA_MouseLimits , NULL , TAG_DONE ) ;
2012-01-15 19:57:02 +04:00
if ( g - > shared - > ptr_lock )
2012-01-12 01:41:55 +04:00
{
2012-01-15 19:57:02 +04:00
FreeVec ( g - > shared - > ptr_lock ) ;
g - > shared - > ptr_lock = NULL ;
2012-01-12 01:41:55 +04:00
}
}
2009-06-19 22:32:31 +04:00
return true ;
2008-08-02 18:31:32 +04:00
}
2008-08-11 21:53:45 +04:00
void ami_scroller_hook ( struct Hook * hook , Object * object , struct IntuiMessage * msg )
{
2011-11-30 00:58:57 +04:00
ULONG gid ;
2008-10-12 01:38:04 +04:00
struct gui_window_2 * gwin = hook - > h_Data ;
2009-03-29 03:51:39 +04:00
struct IntuiWheelData * wheel ;
2012-12-01 04:27:46 +04:00
struct Node * node = NULL ;
2013-02-14 19:09:28 +04:00
nsurl * url ;
2009-03-29 03:51:39 +04:00
switch ( msg - > Class )
{
case IDCMP_IDCMPUPDATE :
2011-02-10 00:52:28 +03:00
gid = GetTagData ( GA_ID , 0 , msg - > IAddress ) ;
2009-03-29 03:51:39 +04:00
switch ( gid )
2009-08-29 03:12:18 +04:00
{
2009-09-05 02:00:09 +04:00
case GID_HSCROLL :
2014-10-25 18:08:04 +04:00
case GID_VSCROLL :
2012-03-22 13:34:34 +04:00
if ( nsoption_bool ( faster_scroll ) = = true ) gwin - > redraw_scroll = true ;
2011-02-24 02:11:26 +03:00
else gwin - > redraw_scroll = false ;
2010-06-05 13:59:38 +04:00
2013-04-04 22:31:42 +04:00
ami_schedule_redraw ( gwin , true ) ;
2009-12-23 16:29:10 +03:00
break ;
2012-12-01 04:27:46 +04:00
case GID_HOTLIST :
2014-10-25 19:22:08 +04:00
if ( ( node = ( struct Node * ) GetTagData ( SPEEDBAR_SelectedNode , 0 , msg - > IAddress ) ) ) {
2013-09-12 15:35:55 +04:00
GetSpeedButtonNodeAttrs ( node , SBNA_UserData , ( ULONG * ) & url , TAG_DONE ) ;
2013-02-14 19:09:28 +04:00
2013-09-12 15:35:55 +04:00
if ( gwin - > key_state & BROWSER_MOUSE_MOD_2 ) {
2014-02-10 18:08:45 +04:00
browser_window_create ( BW_CREATE_TAB ,
2013-02-18 16:24:49 +04:00
url ,
NULL ,
2014-11-16 17:44:40 +03:00
gwin - > gw - > bw ,
2013-02-18 16:24:49 +04:00
NULL ) ;
2013-09-12 15:35:55 +04:00
} else {
2014-11-16 17:44:40 +03:00
browser_window_navigate ( gwin - > gw - > bw ,
2013-02-14 19:09:28 +04:00
url ,
NULL ,
2014-02-11 02:40:04 +04:00
BW_NAVIGATE_HISTORY ,
2013-02-14 19:09:28 +04:00
NULL ,
NULL ,
NULL ) ;
2012-12-09 22:52:07 +04:00
}
2012-12-01 04:27:46 +04:00
}
break ;
2009-03-29 03:51:39 +04:00
}
break ;
case IDCMP_EXTENDEDMOUSE :
if ( msg - > Code = = IMSGCODE_INTUIWHEELDATA )
{
wheel = ( struct IntuiWheelData * ) msg - > IAddress ;
2011-12-24 02:14:00 +04:00
ami_gui_scroll_internal ( gwin , wheel - > WheelX * 50 , wheel - > WheelY * 50 ) ;
2009-03-29 03:51:39 +04:00
}
break ;
2009-08-01 17:16:16 +04:00
case IDCMP_SIZEVERIFY :
break ;
2012-02-25 00:00:51 +04:00
case IDCMP_REFRESHWINDOW :
ami_refresh_window ( gwin ) ;
break ;
2012-02-25 03:18:24 +04:00
default :
printf ( " UNHANDLED EVENT %ld \n " , msg - > Class ) ;
break ;
2008-08-15 21:19:57 +04:00
}
// ReplyMsg((struct Message *)msg);
2008-08-11 21:53:45 +04:00
}
2010-07-24 23:57:27 +04:00
/* return the text box at posn x,y in window coordinates
x , y are updated to be document co - ordinates */
2010-07-24 20:39:37 +04:00
2012-10-11 23:13:38 +04:00
bool ami_text_box_at_point ( struct gui_window_2 * gwin , ULONG * x , ULONG * y )
2010-07-24 20:39:37 +04:00
{
struct IBox * bbox ;
2014-11-15 16:46:23 +03:00
ULONG xs , ys ;
2014-11-02 18:46:42 +03:00
struct browser_window_features data ;
2010-09-17 00:55:25 +04:00
2014-11-15 16:46:23 +03:00
if ( ami_gui_get_space_box ( ( Object * ) gwin - > objects [ GID_BROWSER ] , & bbox ) ! = NSERROR_OK ) {
warn_user ( " NoMemory " , " " ) ;
return false ;
}
2010-07-24 20:39:37 +04:00
2010-07-28 01:41:21 +04:00
ami_get_hscroll_pos ( gwin , ( ULONG * ) & xs ) ;
2010-07-24 23:57:27 +04:00
* x = * x - ( bbox - > Left ) + xs ;
2010-07-24 20:39:37 +04:00
2010-07-28 01:41:21 +04:00
ami_get_vscroll_pos ( gwin , ( ULONG * ) & ys ) ;
2010-07-24 23:57:27 +04:00
* y = * y - ( bbox - > Top ) + ys ;
2010-07-24 20:39:37 +04:00
2014-11-15 16:46:23 +03:00
ami_gui_free_space_box ( bbox ) ;
2010-07-24 20:39:37 +04:00
2014-11-16 17:44:40 +03:00
browser_window_get_features ( gwin - > gw - > bw , * x , * y , & data ) ;
2010-07-24 20:39:37 +04:00
2012-08-21 01:03:59 +04:00
if ( data . form_features = = CTX_FORM_TEXT )
return true ;
2010-07-24 20:39:37 +04:00
2012-08-21 01:03:59 +04:00
return false ;
2010-07-24 20:39:37 +04:00
}
2011-02-28 22:31:35 +03:00
BOOL ami_gadget_hit ( Object * obj , int x , int y )
{
int top , left , width , height ;
GetAttrs ( obj ,
GA_Left , & left ,
GA_Top , & top ,
GA_Width , & width ,
GA_Height , & height ,
TAG_DONE ) ;
if ( ( x > = left ) & & ( x < = ( left + width ) ) & & ( y > = top ) & & ( y < = ( top + height ) ) )
return TRUE ;
else return FALSE ;
}
2011-05-08 02:21:41 +04:00
Object * ami_gui_splash_open ( void )
{
2011-09-07 22:38:08 +04:00
Object * win_obj , * bm_obj ;
2011-05-08 02:21:41 +04:00
struct Window * win ;
struct Screen * wbscreen = LockPubScreen ( " Workbench " ) ;
2011-09-07 22:38:08 +04:00
uint32 top = 0 , left = 0 ;
STRPTR ver_string ;
2011-09-08 03:01:53 +04:00
struct TextAttr tattr ;
struct TextFont * tfont ;
2011-05-08 02:21:41 +04:00
win_obj = WindowObject ,
2011-09-07 22:38:08 +04:00
WA_Borderless , TRUE ,
2011-05-08 02:21:41 +04:00
WA_ToolBox , TRUE ,
WA_BusyPointer , TRUE ,
WINDOW_Position , WPOS_CENTERSCREEN ,
WINDOW_LockWidth , TRUE ,
WINDOW_LockHeight , TRUE ,
2011-09-07 00:58:26 +04:00
WINDOW_ParentGroup , LayoutObject ,
2011-09-07 22:38:08 +04:00
LAYOUT_AddImage , bm_obj = BitMapObject ,
BITMAP_SourceFile , " PROGDIR:Resources/splash.png " ,
2011-05-08 02:21:41 +04:00
BITMAP_Screen , wbscreen ,
BitMapEnd ,
LayoutEnd ,
EndWindow ;
2014-09-20 16:38:38 +04:00
LOG ( ( " Attempting to open splash window... " ) ) ;
2011-05-08 02:21:41 +04:00
win = RA_OpenWindow ( win_obj ) ;
2011-09-07 22:38:08 +04:00
GetAttrs ( bm_obj , IA_Top , & top ,
IA_Left , & left ,
TAG_DONE ) ;
2011-09-08 03:01:53 +04:00
SetRPAttrs ( win - > RPort , RPTAG_APenColor , 0x003F6DFE , TAG_DONE ) ;
SetDrMd ( win - > RPort , JAM1 ) ;
2011-09-07 22:38:08 +04:00
2011-12-24 16:57:42 +04:00
tattr . ta_Name = " DejaVu Serif Italic.font " ;
2011-09-08 03:01:53 +04:00
tattr . ta_YSize = 24 ;
tattr . ta_Style = 0 ;
tattr . ta_Flags = 0 ;
2014-10-25 19:22:08 +04:00
if ( ( tfont = ami_font_open_disk_font ( & tattr ) ) )
2011-12-24 16:57:42 +04:00
{
2011-09-08 03:01:53 +04:00
SetFont ( win - > RPort , tfont ) ;
2011-12-24 16:57:42 +04:00
}
else
{
tattr . ta_Name = " DejaVu Serif Oblique.font " ;
2014-10-25 19:22:08 +04:00
if ( ( tfont = ami_font_open_disk_font ( & tattr ) ) )
2011-12-24 16:57:42 +04:00
SetFont ( win - > RPort , tfont ) ;
}
2011-09-08 03:01:53 +04:00
Move ( win - > RPort , left + 5 , top + 25 ) ;
2011-09-07 22:38:08 +04:00
Text ( win - > RPort , " Initialising... " , strlen ( " Initialising... " ) ) ;
2011-09-08 03:01:53 +04:00
if ( tfont ) ami_font_close_disk_font ( tfont ) ;
tattr . ta_Name = " DejaVu Sans.font " ;
tattr . ta_YSize = 16 ;
tattr . ta_Style = 0 ;
tattr . ta_Flags = 0 ;
2014-10-25 19:22:08 +04:00
if ( ( tfont = ami_font_open_disk_font ( & tattr ) ) )
2011-09-08 03:01:53 +04:00
SetFont ( win - > RPort , tfont ) ;
2012-02-12 22:02:49 +04:00
ver_string = ASPrintf ( " %s " , netsurf_version ) ;
2011-09-07 22:38:08 +04:00
Move ( win - > RPort , left + 185 , top + 220 ) ;
Text ( win - > RPort , ver_string , strlen ( ver_string ) ) ;
2011-09-08 03:01:53 +04:00
if ( ver_string ) FreeVec ( ver_string ) ;
if ( tfont ) ami_font_close_disk_font ( tfont ) ;
2011-09-07 22:38:08 +04:00
2011-05-08 02:21:41 +04:00
UnlockPubScreen ( NULL , wbscreen ) ;
return win_obj ;
}
void ami_gui_splash_close ( Object * win_obj )
{
2014-09-20 16:38:38 +04:00
if ( win_obj = = NULL ) return ;
LOG ( ( " Closing splash window " ) ) ;
DisposeObject ( win_obj ) ;
2011-05-08 02:21:41 +04:00
}
2014-01-05 20:01:03 +04:00
2014-01-14 02:54:19 +04:00
static void gui_file_gadget_open ( struct gui_window * g , hlcache_handle * hl ,
2014-01-05 20:01:03 +04:00
struct form_control * gadget )
{
2014-09-20 16:38:38 +04:00
LOG ( ( " File open dialog request for %p/%p " , g , gadget ) ) ;
2014-01-06 03:04:28 +04:00
if ( AslRequestTags ( filereq ,
ASLFR_Window , g - > shared - > win ,
ASLFR_SleepWindow , TRUE ,
ASLFR_TitleText , messages_get ( " NetSurf " ) ,
ASLFR_Screen , scrn ,
ASLFR_DoSaveMode , FALSE ,
TAG_DONE ) ) {
char fname [ 1024 ] ;
strlcpy ( fname , filereq - > fr_Drawer , 1024 ) ;
AddPart ( fname , filereq - > fr_File , 1024 ) ;
2014-11-16 17:44:40 +03:00
browser_window_set_gadget_filename ( g - > bw , gadget , fname ) ;
2014-01-06 03:04:28 +04:00
}
2014-01-05 20:01:03 +04:00
}
2014-11-16 17:06:12 +03:00
/* exported function documented in amiga/gui.h */
uint32 ami_gui_get_app_id ( void )
{
return ami_appid ;
}
2014-01-15 23:37:05 +04:00
static struct gui_window_table amiga_window_table = {
2014-01-12 21:07:34 +04:00
. create = gui_window_create ,
. destroy = gui_window_destroy ,
2014-01-13 03:50:54 +04:00
. redraw = gui_window_redraw_window ,
. update = gui_window_update_box ,
2014-01-13 05:08:15 +04:00
. get_scroll = gui_window_get_scroll ,
. set_scroll = gui_window_set_scroll ,
2014-01-13 15:38:35 +04:00
. get_dimensions = gui_window_get_dimensions ,
. update_extent = gui_window_update_extent ,
2014-06-30 19:40:56 +04:00
. reformat = amiga_window_reformat ,
2014-01-12 21:07:34 +04:00
. set_icon = gui_window_set_icon ,
. set_title = gui_window_set_title ,
. set_url = gui_window_set_url ,
2014-01-13 18:51:27 +04:00
. set_status = gui_window_set_status ,
. place_caret = gui_window_place_caret ,
. remove_caret = gui_window_remove_caret ,
2014-01-12 21:07:34 +04:00
. drag_start = gui_window_drag_start ,
2014-01-13 02:55:26 +04:00
. new_content = gui_window_new_content ,
2014-10-24 23:45:21 +04:00
. create_form_select_menu = gui_create_form_select_menu ,
2014-01-14 02:54:19 +04:00
. file_gadget_open = gui_file_gadget_open ,
. drag_save_object = gui_drag_save_object ,
. drag_save_selection = gui_drag_save_selection ,
. start_selection = gui_start_selection ,
2014-01-13 18:51:27 +04:00
/* from theme */
. set_pointer = gui_window_set_pointer ,
2014-01-12 21:07:34 +04:00
. start_throbber = gui_window_start_throbber ,
. stop_throbber = gui_window_stop_throbber ,
/* from download */
. save_link = gui_window_save_link ,
} ;
2014-05-07 19:14:18 +04:00
2014-01-23 03:19:57 +04:00
static struct gui_fetch_table amiga_fetch_table = {
. filetype = fetch_filetype ,
. get_resource_url = gui_get_resource_url ,
} ;
2014-01-12 21:07:34 +04:00
2014-05-25 03:57:48 +04:00
static struct gui_search_web_table amiga_search_web_table = {
. provider_update = gui_search_web_provider_update ,
} ;
2014-01-15 23:37:05 +04:00
static struct gui_browser_table amiga_browser_table = {
2014-03-08 18:13:27 +04:00
. schedule = ami_schedule ,
2014-01-23 03:19:57 +04:00
2014-01-12 02:34:12 +04:00
. quit = gui_quit ,
2014-01-15 03:31:54 +04:00
. launch_url = gui_launch_url ,
. cert_verify = gui_cert_verify ,
2014-01-16 04:52:17 +04:00
. login = gui_401login_open ,
2014-01-11 18:20:30 +04:00
} ;
/** Normal entry point from OS */
int main ( int argc , char * * argv )
{
setbuf ( stderr , NULL ) ;
char messages [ 100 ] ;
char script [ 1024 ] ;
char temp [ 1024 ] ;
2014-05-16 12:55:38 +04:00
STRPTR current_user_cache = NULL ;
2014-01-11 18:20:30 +04:00
BPTR lock = 0 ;
int32 user = 0 ;
nserror ret ;
2014-09-20 16:38:38 +04:00
2014-05-10 13:22:10 +04:00
struct netsurf_table amiga_table = {
2014-01-15 23:37:05 +04:00
. browser = & amiga_browser_table ,
. window = & amiga_window_table ,
2014-01-16 18:43:48 +04:00
. clipboard = amiga_clipboard_table ,
2014-01-15 23:37:05 +04:00
. download = amiga_download_table ,
2014-01-23 03:19:57 +04:00
. fetch = & amiga_fetch_table ,
2014-05-27 02:43:36 +04:00
. file = amiga_file_table ,
2014-02-02 02:17:36 +04:00
. utf8 = amiga_utf8_table ,
2014-03-19 02:32:52 +04:00
. search = amiga_search_table ,
2014-05-25 03:57:48 +04:00
. search_web = & amiga_search_web_table ,
2014-05-16 12:55:38 +04:00
. llcache = filesystem_llcache_table ,
2014-01-15 23:37:05 +04:00
} ;
2014-01-11 18:20:30 +04:00
2014-07-05 12:36:43 +04:00
signal ( SIGINT , SIG_IGN ) ;
2014-05-10 13:22:10 +04:00
ret = netsurf_register ( & amiga_table ) ;
if ( ret ! = NSERROR_OK ) {
2014-11-11 00:59:51 +03:00
ami_misc_fatal_error ( " NetSurf operation table failed registration " ) ;
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
2014-05-10 13:22:10 +04:00
}
2014-09-20 16:38:38 +04:00
/* initialise logging. Not fatal if it fails but not much we
* can do about it either .
*/
nslog_init ( NULL , & argc , argv ) ;
2014-11-09 02:48:48 +03:00
/* Need to do this before opening any splash windows etc... */
2014-11-09 03:05:44 +03:00
if ( ( ami_libs_open ( ) = = false ) ) {
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
2014-11-09 03:05:44 +03:00
}
2014-11-09 02:48:48 +03:00
2014-09-20 16:38:38 +04:00
/* Open splash window */
Object * splash_window = ami_gui_splash_open ( ) ;
2014-01-11 18:20:30 +04:00
/* Open popupmenu.library just to check the version.
* Versions older than 53.11 are dangerous , so we
* forcibly disable context menus if these are in use .
*/
popupmenu_lib_ok = FALSE ;
2014-10-25 19:22:08 +04:00
if ( ( PopupMenuBase = OpenLibrary ( " popupmenu.library " , 53 ) ) ) {
2014-01-11 18:20:30 +04:00
LOG ( ( " popupmenu.library v%d.%d " ,
PopupMenuBase - > lib_Version , PopupMenuBase - > lib_Revision ) ) ;
if ( LIB_IS_AT_LEAST ( ( struct Library * ) PopupMenuBase , 53 , 11 ) )
popupmenu_lib_ok = TRUE ;
CloseLibrary ( PopupMenuBase ) ;
}
user = GetVar ( " user " , temp , 1024 , GVF_GLOBAL_ONLY ) ;
current_user = ASPrintf ( " %s " , ( user = = - 1 ) ? " Default " : temp ) ;
current_user_dir = ASPrintf ( " PROGDIR:Users/%s " , current_user ) ;
2014-10-25 19:22:08 +04:00
if ( ( lock = CreateDirTree ( current_user_dir ) ) )
2014-01-11 18:20:30 +04:00
UnLock ( lock ) ;
current_user_options = ASPrintf ( " %s/Choices " , current_user_dir ) ;
2014-05-16 12:55:38 +04:00
current_user_cache = ASPrintf ( " %s/Cache " , current_user_dir ) ;
2014-06-30 01:35:52 +04:00
current_user_faviconcache = ASPrintf ( " %s/IconCache " , current_user_dir ) ;
2014-05-16 12:55:38 +04:00
2014-10-25 19:22:08 +04:00
if ( ( lock = CreateDirTree ( current_user_cache ) ) ) UnLock ( lock ) ;
if ( ( lock = CreateDirTree ( current_user_faviconcache ) ) ) UnLock ( lock ) ;
2014-01-11 18:20:30 +04:00
ami_mime_init ( " PROGDIR:Resources/mimetypes " ) ;
sprintf ( temp , " %s/mimetypes.user " , current_user_dir ) ;
ami_mime_init ( temp ) ;
2014-11-11 02:50:28 +03:00
if ( ami_schedule_create ( ) = = false ) {
ami_misc_fatal_error ( " Failed to initialise scheduler " ) ;
return RETURN_FAIL ;
}
2014-01-11 18:20:30 +04:00
amiga_plugin_hack_init ( ) ;
2014-04-06 02:12:07 +04:00
ret = amiga_datatypes_init ( ) ;
2014-01-11 18:20:30 +04:00
/* user options setup */
ret = nsoption_init ( ami_set_options , & nsoptions , & nsoptions_default ) ;
if ( ret ! = NSERROR_OK ) {
2014-11-11 00:59:51 +03:00
ami_misc_fatal_error ( " Options failed to initialise " ) ;
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
2014-01-11 18:20:30 +04:00
}
nsoption_read ( current_user_options , NULL ) ;
2014-01-19 02:10:18 +04:00
ami_gui_commandline ( & argc , argv ) ; /* calls nsoption_commandline */
2014-01-11 18:20:30 +04:00
2014-11-10 21:56:09 +03:00
if ( ami_locate_resource ( messages , " Messages " ) = = false ) {
2014-11-11 00:59:51 +03:00
ami_misc_fatal_error ( " Cannot open Messages file " ) ;
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
}
2014-05-16 12:55:38 +04:00
ret = netsurf_init ( messages , current_user_cache ) ;
2014-01-11 18:20:30 +04:00
if ( ret ! = NSERROR_OK ) {
2014-11-11 00:59:51 +03:00
ami_misc_fatal_error ( " NetSurf failed to initialise " ) ;
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
2014-01-11 18:20:30 +04:00
}
2014-05-16 12:55:38 +04:00
if ( current_user_cache ! = NULL ) FreeVec ( current_user_cache ) ;
2014-04-06 02:12:07 +04:00
ret = amiga_icon_init ( ) ;
2014-01-11 18:20:30 +04:00
2014-11-10 21:56:09 +03:00
if ( ami_open_resources ( ) = = false ) { /* alloc ports/asl reqs, open libraries/devices */
2014-11-11 00:59:51 +03:00
ami_misc_fatal_error ( " Unable to allocate resources " ) ;
2014-11-10 21:56:09 +03:00
return RETURN_FAIL ;
}
2014-05-25 13:26:34 +04:00
search_web_init ( nsoption_charp ( search_engines_file ) ) ;
2014-11-10 21:57:38 +03:00
ami_clipboard_init ( ) ;
ami_openurl_open ( ) ;
2014-11-10 22:01:30 +03:00
ami_amiupdate ( ) ; /* set env-vars for AmiUpdate */
ami_init_fonts ( ) ;
ami_context_menu_init ( ) ;
save_complete_init ( ) ;
ami_theme_init ( ) ;
ami_init_mouse_pointers ( ) ;
2014-11-10 21:57:38 +03:00
win_destroyed = false ;
nsscreentitle = ASPrintf ( " NetSurf %s " , netsurf_version ) ;
ami_font_setdevicedpi ( 0 ) ; /* for early font requests, eg treeview init */
window_list = NewObjList ( ) ;
urldb_load ( nsoption_charp ( url_file ) ) ;
urldb_load_cookies ( nsoption_charp ( cookie_file ) ) ;
2014-01-11 18:20:30 +04:00
gui_init2 ( argc , argv ) ;
ami_gui_splash_close ( splash_window ) ;
strlcpy ( script , nsoption_charp ( arexx_dir ) , 1024 ) ;
AddPart ( script , nsoption_charp ( arexx_startup ) , 1024 ) ;
ami_arexx_execute ( script ) ;
2014-10-12 12:58:54 +04:00
while ( ! ami_quit ) {
ami_get_msg ( ) ;
}
2014-01-11 18:20:30 +04:00
strlcpy ( script , nsoption_charp ( arexx_dir ) , 1024 ) ;
AddPart ( script , nsoption_charp ( arexx_shutdown ) , 1024 ) ;
ami_arexx_execute ( script ) ;
ami_mime_free ( ) ;
2014-11-10 21:58:58 +03:00
netsurf_exit ( ) ;
return RETURN_OK ;
2014-01-11 18:20:30 +04:00
}
2014-11-10 21:58:58 +03:00