diff options
Diffstat (limited to 'frontends/atari/misc.c')
-rw-r--r-- | frontends/atari/misc.c | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/frontends/atari/misc.c b/frontends/atari/misc.c new file mode 100644 index 000000000..8688b93fd --- /dev/null +++ b/frontends/atari/misc.c @@ -0,0 +1,408 @@ +/* + * Copyright 2010 Ole Loots <ole@monochrom.net> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <string.h> + +#include <sys/types.h> +#include <mint/osbind.h> + +#include "utils/dirent.h" +#include "content/content.h" +#include "content/hlcache.h" +#include "desktop/cookie_manager.h" +#include "desktop/mouse.h" +#include "desktop/tree.h" +#include "utils/nsoption.h" +#include "utils/messages.h" +#include "utils/utils.h" +#include "utils/log.h" +#include "utils/file.h" +#include "content/fetch.h" + +#include "atari/gui.h" +#include "atari/toolbar.h" + +#include "atari/misc.h" +#include "atari/encoding.h" +#include "atari/gemtk/gemtk.h" +#include "cflib.h" + +extern void * h_gem_rsrc; + +struct is_process_running_callback_data { + const char * fname; + bool found; +}; + +/* exported function documented in atari/misc/h */ +nserror atari_warn_user(const char *warning, const char *detail) +{ + size_t len = 1 + ((warning != NULL) ? strlen(messages_get(warning)) : + 0) + ((detail != 0) ? strlen(detail) : 0); + char message[len]; + snprintf(message, len, messages_get(warning), detail); + + printf("%s\n", message); + gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, message); + + return NSERROR_OK; +} + +void die(const char *error) +{ + printf("%s\n", error); + gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, error); + exit(1); +} + + +struct gui_window * find_guiwin_by_aes_handle(short handle){ + + struct gui_window * gw; + gw = window_list; + + if( handle == 0 ){ + return( NULL ); + } + + while(gw != NULL) { + if(gw->root->win != NULL + && gemtk_wm_get_handle(gw->root->win) == handle) { + return(gw); + } + else + gw = gw->next; + } + + return( NULL ); +} + + +static int scan_process_list(scan_process_callback cb, void *data) +{ + int pid, count = 0; + DIR *dir; + char*dirname; + struct dirent *de; + + if (( dir = opendir("U:/kern")) == NULL) + return(0); + + while ((de = readdir( dir)) != NULL) { + dirname = de->d_name; + + if( dirname[0] != '1' && dirname[0] != '2' && dirname[0] != '3' && dirname[0] != '4' && dirname[0] != '5' + && dirname[0] != '6' && dirname[0] != '7' && dirname[0] != '8' && dirname[0] != '9') + continue; + + count++; + if (cb != NULL) { + /* when callback returns negative value, we stop scanning: */ + pid = atoi(dirname); + if (cb(pid, data)<0) { + break; + } + } + } + + closedir(dir); + + return(count); +} + +static int proc_running_callback(int pid, void * arg) +{ + char buf[PATH_MAX], fnamepath[256]; + FILE *fp; + int nread; + struct is_process_running_callback_data *data; + + data = (struct is_process_running_callback_data *)arg; + + sprintf(fnamepath, "U:\\kern\\%d\\fname", pid); + printf("checking: %s\n", fnamepath); + + fp = fopen(fnamepath, "r"); + if(!fp) + return(0); + + nread = fread(buf, 1, PATH_MAX-1, fp); + fclose(fp); + nread = MIN(PATH_MAX-1, nread); + + if (nread > 0) { + buf[nread] = 0; + + char *lastslash = strrchr(buf, '/'); + + if(lastslash == NULL) + lastslash = strrchr(buf, '\\'); + + if(lastslash==NULL) + lastslash = buf; + else + lastslash++; + + if(strcasecmp(lastslash, data->fname)==0){ + /* found process, check status: */ + sprintf(fnamepath, "U:\\kern\\%d\\status", pid); + fp = fopen(fnamepath, "r"); + if (fp) { + nread = fread(buf, 1, PATH_MAX-1, fp); + fclose(fp); + if (nread>0) { + nread = MIN(PATH_MAX-1,nread); + } + buf[nread] = 0; + if (strstr(buf, "zombie")==NULL) { + data->found = true; + return(-1); + } + } + + } + } + return(0); +} + +bool is_process_running(const char * name) +{ + struct is_process_running_callback_data data = {name, false}; + + scan_process_list(proc_running_callback, &data); + + return( (data.found==1) ? true : false ); +} + + +void gem_set_cursor( MFORM_EX * cursor ) +{ + static unsigned char flags = 255; + static int number = 255; + if( flags == cursor->flags && number == cursor->number ) + return; + if( cursor->flags & MFORM_EX_FLAG_USERFORM ) { + gemtk_obj_mouse_sprite(cursor->tree, cursor->number); + } else { + graf_mouse(cursor->number, NULL ); + } + number = cursor->number; + flags = cursor->flags; +} + + +/* exported interface documented in atari/misc.h */ +long nkc_to_input_key(short nkc, long * ucs4_out) +{ + unsigned char ascii = (nkc & 0xFF); + long ik = 0; + + // initialize result: + *ucs4_out = 0; + + // sanitize input key: + nkc = (nkc & (NKF_CTRL|NKF_SHIFT|0xFF)); + + /* shift + cntrl key: */ + if( ((nkc & NKF_CTRL) == NKF_CTRL) && ((nkc & (NKF_SHIFT))!=0) ) { + + } + /* cntrl key only: */ + else if( (nkc & NKF_CTRL) == NKF_CTRL ) { + switch ( ascii ) { + case 'A': + ik = NS_KEY_SELECT_ALL; + break; + + case 'C': + ik = NS_KEY_COPY_SELECTION; + break; + + case 'X': + ik = NS_KEY_CUT_SELECTION; + break; + + case 'V': + ik = NS_KEY_PASTE; + break; + + default: + break; + } + } + /* shift key only: */ + else if( (nkc & NKF_SHIFT) != 0 ) { + switch( ascii ) { + case NK_TAB: + ik = NS_KEY_SHIFT_TAB; + break; + + case NK_LEFT: + ik = NS_KEY_LINE_START; + break; + + case NK_RIGHT: + ik = NS_KEY_LINE_END; + break; + + case NK_UP: + ik = NS_KEY_PAGE_UP; + break; + + case NK_DOWN: + ik = NS_KEY_PAGE_DOWN; + break; + + default: + break; + } + } + /* No modifier keys: */ + else { + switch( ascii ) { + + case NK_INS: + ik = NS_KEY_PASTE; + break; + + case NK_BS: + ik = NS_KEY_DELETE_LEFT; + break; + + case NK_DEL: + ik = NS_KEY_DELETE_RIGHT; + break; + + case NK_TAB: + ik = NS_KEY_TAB; + break; + + + case NK_ENTER: + ik = NS_KEY_NL; + break; + + case NK_RET: + ik = NS_KEY_CR; + break; + + case NK_ESC: + ik = NS_KEY_ESCAPE; + break; + + case NK_CLRHOME: + ik = NS_KEY_TEXT_START; + break; + + case NK_RIGHT: + ik = NS_KEY_RIGHT; + break; + + case NK_LEFT: + ik = NS_KEY_LEFT; + break; + + case NK_UP: + ik = NS_KEY_UP; + break; + + case NK_UNDO: + ik = NS_KEY_UNDO; + break; + + case NK_DOWN: + ik = NS_KEY_DOWN; + break; + + case NK_M_PGUP: + ik = NS_KEY_PAGE_UP; + break; + + case NK_M_PGDOWN: + ik = NS_KEY_PAGE_DOWN; + break; + + default: + break; + } + } + + if( ik == 0 && ( (nkc & NKF_CTRL)==0) ) { + if (ascii >= 9 ) { + *ucs4_out = atari_to_ucs4(ascii); + } + } + return ( ik ); +} + +/** + * Show default file selector + * + * \param title The selector title. + * \param name Default file name + * \return a static char pointer or null if the user aborted the selection. + */ +const char * file_select(const char * title, const char * name) { + + static char path[PATH_MAX]=""; // First usage : current directory + static char fullname[PATH_MAX]=""; + char tmpname[255]; + char * use_title = (char*)title; + + if( strlen(name)>254) + return( NULL ); + + strcpy(tmpname, name); + + if( use_title == NULL ){ + use_title = (char*)""; + } + + if (select_file(path, tmpname, (char*)"*", use_title, NULL)) { + snprintf(fullname, PATH_MAX, "%s%s", path, tmpname); + return((const char*)&fullname); + } + + return( NULL ); +} + + +void dbg_grect(const char * str, GRECT * r) +{ + printf("%s: x: %d, y: %d, w: %d, h: %d (x2: %d, y2: %d)\n", str, + r->g_x, r->g_y, r->g_w, r->g_h, r->g_x + r->g_w, r->g_y + r->g_h); +} + +void dbg_pxy(const char * str, short * pxy ) +{ + printf("%s: x: %d, y: %d, w: %d, h: %d\n", str, + pxy[0], pxy[1], pxy[2], pxy[3] ); +} + +void dbg_rect(const char * str, int * pxy) +{ + printf("%s: x0: %d, y0: %d, x1: %d, y1: %d (w: %d, h: %d)\n", str, + pxy[0], pxy[1], pxy[2], pxy[3], + pxy[2] - pxy[0], + pxy[3] - pxy[1] ); +} + |