home *** CD-ROM | disk | FTP | other *** search
-
- /* objects.c.task
- *
- * Dreamscape - C++ class library for RISC OS
- * Copyright (c) 1996 Mark Seaborn <mseaborn@argonet.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- * See the Dreamscape documentation for more information.
- */
-
- #include <stdlib.h>
- #include <string.h>
- #include "OS:toolbox.h"
- #include "OS:messagetrans.h"
- #include "OS:hourglass.h"
- #include "OS:wimp.h"
-
- #include "task.h"
- #include "tboxevent.h"
- #include "wimpevent.h"
- #include "wimpmsg.h"
- #include "x.h"
-
-
- toolbox_block dscape_task_ids_;
- messagetrans_control_block dscape_task_messages_;
- osspriteop_area *dscape_task_sprites_;
- wimp_t dscape_task_handle_ = 0;
-
- static char *temp_message = 0;
-
- static void error_handler(const toolbox_action *event,
- const toolbox_block *ids);
- static bool quit_handler(const wimp_message *message, void *handle);
- static void error_reporter(const char *error);
-
- void dscape_task_poll(void)
- {
- wimp_block event;
- wimp_event_no id;
- x_declare(error);
- dscape_task_ensure();
-
- id = wimp_poll(0, &event, 0);
- x_try {
- hourglass_on();
- dscape_wimpevent_dispatch_event(&event, &dscape_task_ids_, id);
- hourglass_off();
- }
- x_catch(error) {
- hourglass_smash();
- dscape_task_report_error(error->errmess);
- }
- }
-
- void dscape_task_poll_forever(void)
- {
- wimp_block event;
- wimp_event_no id;
- x_declare(error);
- dscape_task_ensure();
-
- while(1) {
- id = wimp_poll(0, &event, 0);
- x_try {
- hourglass_on();
- dscape_wimpevent_dispatch_event(&event, &dscape_task_ids_, id);
- hourglass_off();
- }
- x_catch(error) {
- hourglass_smash();
- dscape_task_report_error(error->errmess);
- }
- }
- }
-
- void dscape_task_ensure(void)
- {
- if(!dscape_task_handle_) {
- int all_events = 0;
- dscape_task_handle_ = toolbox_initialise(0, 310, (wimp_message_list *)
- &all_events, (toolbox_action_list *) &all_events,
- dscape_task_directory_, &dscape_task_messages_, &dscape_task_ids_, 0,
- &dscape_task_sprites_);
- dscape_tboxevent_register_s_handler(action_ERROR, error_handler);
- dscape_wimpmsg_register_handler(message_QUIT, quit_handler, 0);
- x_error_reporter = error_reporter;
- }
- }
-
- void dscape_task_quit(void)
- {
- hourglass_off();
- exit(0);
- }
-
- void dscape_task_report_error(const char *error)
- {
- x_report_error(error);
- }
-
- static void error_reporter(const char *error)
- {
- os_error block;
- const char *task_name = messagetrans_lookup(&dscape_task_messages_,
- "_TaskName", 0, 0, 0, 0, 0, 0, 0),
- *task_sprite = messagetrans_lookup(&dscape_task_messages_,
- "_TaskSprite", 0, 0, 0, 0, 0, 0, 0);
- block.errnum = 0;
- strncpy(block.errmess, error, 250)[250] = 0;
- wimp_report_error_by_category(&block, wimp_ERROR_BOX_OK_ICON |
- wimp_ERROR_BOX_GIVEN_CATEGORY | (wimp_ERROR_BOX_CATEGORY_ERROR <<
- wimp_ERROR_BOX_CATEGORY_SHIFT), task_name, task_sprite,
- (osspriteop_area *) 1, 0);
- }
-
- int dscape_task_msgcpy4(const char *token, const char *arg0,
- const char *arg1, const char *arg2, const char *arg3,
- char *buffer, int size)
- {
- if(buffer) {
- int used;
- messagetrans_lookup(&dscape_task_messages_, token, buffer, size,
- arg0, arg1, arg2, arg3, &used);
- return used;
- }
- else {
- return 256;
- }
- }
-
- const char *dscape_task_msg4(const char *token, const char *arg0,
- const char *arg1, const char *arg2, const char *arg3)
- {
- int used;
- if(temp_message) free(temp_message);
- temp_message = malloc(256);
- messagetrans_lookup(&dscape_task_messages_, token, temp_message, 256,
- arg0, arg1, arg2, arg3, &used);
- return temp_message = realloc(temp_message, used+1);
- }
-
- static void error_handler(const toolbox_action *event,
- const toolbox_block *ids)
- {
- dscape_task_report_error(event->data.error.errmess);
- }
-
- static bool quit_handler(const wimp_message *message, void *handle)
- {
- dscape_task_quit();
- return 1;
- }
-