adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 1 | /** |
| 2 | * \file |
| 3 | * The program handler, used for loading programs and starting the |
| 4 | * screensaver. |
| 5 | * \author Adam Dunkels <adam@dunkels.com> |
| 6 | * |
| 7 | * The Contiki program handler is responsible for the Contiki menu and |
| 8 | * the desktop icons, as well as for loading programs and displaying a |
| 9 | * dialog with a message telling which program that is loading. |
| 10 | * |
| 11 | * The program handler also is responsible for starting the |
| 12 | * screensaver when the CTK detects that it should be started. |
| 13 | */ |
| 14 | |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 15 | /* |
| 16 | * Copyright (c) 2003, Adam Dunkels. |
| 17 | * All rights reserved. |
| 18 | * |
| 19 | * Redistribution and use in source and binary forms, with or without |
| 20 | * modification, are permitted provided that the following conditions |
| 21 | * are met: |
| 22 | * 1. Redistributions of source code must retain the above copyright |
| 23 | * notice, this list of conditions and the following disclaimer. |
| 24 | * 2. Redistributions in binary form must reproduce the above |
| 25 | * copyright notice, this list of conditions and the following |
| 26 | * disclaimer in the documentation and/or other materials provided |
| 27 | * with the distribution. |
adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 28 | * 3. The name of the author may not be used to endorse or promote |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 29 | * products derived from this software without specific prior |
| 30 | * written permission. |
| 31 | * |
| 32 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
| 33 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 34 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 35 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| 36 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
| 38 | * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 39 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| 40 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 41 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 42 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 43 | * |
adamdunkels | 6b3c858 | 2003-04-08 19:25:38 +0000 | [diff] [blame] | 44 | * This file is part of the Contiki desktop OS |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 45 | * |
oliverschmidt | a920953 | 2006-05-14 23:23:30 +0000 | [diff] [blame] | 46 | * $Id: program-handler.c,v 1.32 2006/05/14 23:23:30 oliverschmidt Exp $ |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 47 | * |
| 48 | */ |
| 49 | |
adamdunkels | db300d2 | 2004-02-24 09:57:49 +0000 | [diff] [blame] | 50 | #include <string.h> |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 51 | #include <stdlib.h> |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 52 | |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 53 | #include "ek.h" |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 54 | #include "petsciiconv.h" |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 55 | #include "ctk.h" |
| 56 | #include "ctk-draw.h" |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 57 | #include "ctk-conf.h" |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 58 | |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 59 | #include "log.h" |
| 60 | |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 61 | #include "loader.h" |
| 62 | |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 63 | #include "program-handler.h" |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 64 | |
oliverschmidt | cd5e89a | 2005-02-15 14:31:52 +0000 | [diff] [blame] | 65 | #include "program-handler-conf.h" |
| 66 | |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 67 | /* Menus */ |
| 68 | static struct ctk_menu contikimenu; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 69 | |
oliverschmidt | cd5e89a | 2005-02-15 14:31:52 +0000 | [diff] [blame] | 70 | #ifndef PROGRAM_HANDLER_CONF_MAX_NUMDSCS |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 71 | #define MAX_NUMDSCS 10 |
oliverschmidt | cd5e89a | 2005-02-15 14:31:52 +0000 | [diff] [blame] | 72 | #else /* PROGRAM_HANDLER_CONF_MAX_NUMDSCS */ |
| 73 | #define MAX_NUMDSCS PROGRAM_HANDLER_CONF_MAX_NUMDSCS |
| 74 | #endif /* PROGRAM_HANDLER_CONF_MAX_NUMDSCS */ |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 75 | |
| 76 | static struct dsc *contikidsc[MAX_NUMDSCS]; |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 77 | static unsigned char contikidsclast = 0; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 78 | |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 79 | #ifndef PROGRAM_HANDLER_CONF_QUIT_MENU |
| 80 | #define QUIT_MENU 0 |
| 81 | #else /* PROGRAM_HANDLER_CONF_QUIT_MENU */ |
| 82 | #define QUIT_MENU PROGRAM_HANDLER_CONF_QUIT_MENU |
| 83 | #endif /* PROGRAM_HANDLER_CONF_QUIT_MENU */ |
| 84 | |
| 85 | #if QUIT_MENU |
| 86 | |
| 87 | static unsigned char quitmenuitem; |
| 88 | |
oliverschmidt | a920953 | 2006-05-14 23:23:30 +0000 | [diff] [blame] | 89 | /* "Quit" dialog */ |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 90 | static struct ctk_window quitdialog; |
| 91 | static struct ctk_label quitdialoglabel = |
| 92 | {CTK_LABEL(2, 1, 20, 1, "Really quit Contiki?")}; |
| 93 | static struct ctk_button quityesbutton = |
| 94 | {CTK_BUTTON(4, 3, 3, "Yes")}; |
| 95 | static struct ctk_button quitnobutton = |
| 96 | {CTK_BUTTON(16, 3, 2, "No")}; |
| 97 | |
| 98 | #endif /* QUIT_MENU */ |
| 99 | |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 100 | #if WITH_LOADER_ARCH |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 101 | |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 102 | /* "Run..." window */ |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 103 | static struct ctk_window runwindow; |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 104 | static unsigned char runmenuitem; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 105 | static struct ctk_label namelabel = |
| 106 | {CTK_LABEL(0, 0, 13, 1, "Program name:")}; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 107 | static char name[31]; |
| 108 | static struct ctk_textentry nameentry = |
adamdunkels | dc57fb0 | 2003-04-10 07:05:18 +0000 | [diff] [blame] | 109 | {CTK_TEXTENTRY(0, 1, 14, 1, name, 30)}; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 110 | static struct ctk_button loadbutton = |
adamdunkels | dc57fb0 | 2003-04-10 07:05:18 +0000 | [diff] [blame] | 111 | {CTK_BUTTON(10, 2, 4, "Load")}; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 112 | |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 113 | static struct ctk_window loadingdialog; |
| 114 | static struct ctk_label loadingmsg = |
| 115 | {CTK_LABEL(0, 0, 8, 1, "Starting")}; |
| 116 | static struct ctk_label loadingname = |
| 117 | {CTK_LABEL(9, 0, 16, 1, name)}; |
| 118 | |
| 119 | static struct ctk_window errordialog; |
| 120 | static struct ctk_label errormsg = |
| 121 | {CTK_LABEL(0, 1, 22, 1, "Error loading program:")}; |
adamdunkels | 506d6c4 | 2003-08-20 20:52:22 +0000 | [diff] [blame] | 122 | static char errorfilename[22]; |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 123 | static struct ctk_label errorfilelabel = |
adamdunkels | 506d6c4 | 2003-08-20 20:52:22 +0000 | [diff] [blame] | 124 | {CTK_LABEL(0, 3, 22, 1, errorfilename)}; |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 125 | static struct ctk_label errortype = |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 126 | {CTK_LABEL(4, 5, 16, 1, "")}; |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 127 | static struct ctk_button errorokbutton = |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 128 | {CTK_BUTTON(9, 7, 2, "Ok")}; |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 129 | |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 130 | #endif /* WITH_LOADER_ARCH */ |
| 131 | |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 132 | /*static DISPATCHER_SIGHANDLER(program_handler_sighandler, s, data); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 133 | static struct dispatcher_proc p = |
adamdunkels | c1272b2 | 2003-04-11 20:11:40 +0000 | [diff] [blame] | 134 | {DISPATCHER_PROC("Program handler", NULL, program_handler_sighandler, NULL)}; |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 135 | static ek_id_t id;*/ |
| 136 | EK_EVENTHANDLER(program_handler_eventhandler, ev, data); |
| 137 | EK_PROCESS(p, "Program handler", EK_PRIO_NORMAL, |
| 138 | program_handler_eventhandler, NULL, NULL); |
| 139 | static ek_id_t id = EK_ID_NONE; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 140 | |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 141 | static const char * const errormsgs[] = { |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 142 | "Ok", |
| 143 | "Read error", |
| 144 | "Header error", |
| 145 | "OS error", |
| 146 | "Data format error", |
adamdunkels | 46dbaed | 2003-07-31 23:47:30 +0000 | [diff] [blame] | 147 | "Out of memory", |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 148 | "File not found", |
| 149 | "No loader" |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 150 | }; |
| 151 | |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 152 | #define LOADER_EVENT_LOAD 1 |
| 153 | #define LOADER_EVENT_DISPLAY_NAME 2 |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 154 | |
| 155 | static char *displayname; |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 156 | |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 157 | #if CTK_CONF_SCREENSAVER |
oliverschmidt | 1df710f | 2005-05-12 23:55:18 +0000 | [diff] [blame] | 158 | char program_handler_screensaver[20]; |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 159 | #endif /* CTK_CONF_SCREENSAVER */ |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 160 | |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 161 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 162 | /** |
| 163 | * Add a program to the program handler. |
| 164 | * |
| 165 | * \param dsc The DSC description structure for the program to be added. |
| 166 | * |
| 167 | * \param menuname The name that the program should have in the |
| 168 | * Contiki menu. |
| 169 | * |
| 170 | * \param desktop Flag which specifies if the program should show up |
| 171 | * as an icon on the desktop or not. |
| 172 | */ |
| 173 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 174 | void |
| 175 | program_handler_add(struct dsc *dsc, char *menuname, |
| 176 | unsigned char desktop) |
| 177 | { |
| 178 | contikidsc[contikidsclast++] = dsc; |
| 179 | ctk_menuitem_add(&contikimenu, menuname); |
| 180 | if(desktop) { |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 181 | CTK_ICON_ADD(dsc->icon, id); |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 182 | } |
| 183 | } |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 184 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 185 | /** |
| 186 | * Initializes the program handler. |
| 187 | * |
| 188 | * Is called by the initialization before any programs have been added |
| 189 | * with program_handler_add(). |
| 190 | * |
| 191 | */ |
| 192 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 193 | void |
| 194 | program_handler_init(void) |
| 195 | { |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 196 | id = ek_start(&p); |
| 197 | ctk_menu_new(&contikimenu, "Contiki"); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 198 | } |
| 199 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 200 | #ifdef WITH_LOADER_ARCH |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 201 | #define NUM_PNARGS 6 |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 202 | #define NAMELEN 16 |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 203 | struct pnarg { |
| 204 | char name[NAMELEN]; |
| 205 | char *arg; |
| 206 | }; |
| 207 | static struct pnarg pnargs[NUM_PNARGS]; |
| 208 | static struct pnarg * |
| 209 | pnarg_copy(char *name, char *arg) |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 210 | { |
| 211 | char i; |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 212 | struct pnarg *pnargsptr; |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 213 | |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 214 | pnargsptr = pnargs; |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 215 | /* Allocate a place in the loadernames table. */ |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 216 | for(i = 0; i < NUM_PNARGS; ++i) { |
| 217 | if(*(pnargsptr->name) == 0) { |
| 218 | strncpy(pnargsptr->name, name, NAMELEN); |
| 219 | pnargsptr->arg = arg; |
| 220 | return pnargsptr; |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 221 | } |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 222 | ++pnargsptr; |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 223 | } |
| 224 | return NULL; |
| 225 | } |
| 226 | |
| 227 | static void |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 228 | pnarg_free(struct pnarg *pn) |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 229 | { |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 230 | *(pn->name) = 0; |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 231 | } |
| 232 | #endif /* WITH_LOADER_ARCH */ |
| 233 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 234 | /** |
| 235 | * Loads a program and displays a dialog telling the user about it. |
| 236 | * |
| 237 | * \param name The name of the program to be loaded. |
| 238 | * |
| 239 | * \param arg An argument which is passed to the new process when it |
| 240 | * is loaded. |
| 241 | */ |
| 242 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | c1272b2 | 2003-04-11 20:11:40 +0000 | [diff] [blame] | 243 | void |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 244 | program_handler_load(char *name, char *arg) |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 245 | { |
adamdunkels | c1272b2 | 2003-04-11 20:11:40 +0000 | [diff] [blame] | 246 | #ifdef WITH_LOADER_ARCH |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 247 | struct pnarg *pnarg; |
| 248 | |
| 249 | pnarg = pnarg_copy(name, arg); |
| 250 | if(pnarg != NULL) { |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 251 | ek_post(id, LOADER_EVENT_DISPLAY_NAME, pnarg); |
adamdunkels | 4a5eadf | 2003-08-05 22:02:52 +0000 | [diff] [blame] | 252 | } else { |
| 253 | ctk_label_set_text(&errortype, "Out of memory"); |
| 254 | ctk_dialog_open(&errordialog); |
| 255 | } |
adamdunkels | 12467a7 | 2003-04-24 17:21:12 +0000 | [diff] [blame] | 256 | /* ctk_redraw(); */ |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 257 | /* ctk_window_redraw(&loadingdialog);*/ |
adamdunkels | c1272b2 | 2003-04-11 20:11:40 +0000 | [diff] [blame] | 258 | #endif /* WITH_LOADER_ARCH */ |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 259 | } |
adamdunkels | c1272b2 | 2003-04-11 20:11:40 +0000 | [diff] [blame] | 260 | |
| 261 | #ifdef WITH_LOADER_ARCH |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 262 | #define RUN(prg, name, arg) program_handler_load(prg, arg) |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 263 | #else /* WITH_LOADER_ARCH */ |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 264 | #define RUN(prg, initfunc, arg) initfunc(arg) |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 265 | #endif /* WITH_LOADER_ARCH */ |
adamdunkels | 78c03dc | 2003-04-09 13:45:05 +0000 | [diff] [blame] | 266 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 3529869 | 2003-08-31 22:16:49 +0000 | [diff] [blame] | 267 | /** |
| 268 | * Configures the name of the screensaver to be loaded when |
| 269 | * appropriate. |
| 270 | * |
| 271 | * \param name The name of the screensaver or NULL if no screensaver |
| 272 | * should be used. |
| 273 | */ |
| 274 | /*-----------------------------------------------------------------------------------*/ |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 275 | #if CTK_CONF_SCREENSAVER |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 276 | void |
oliverschmidt | 124c3ee | 2005-05-12 21:27:20 +0000 | [diff] [blame] | 277 | program_handler_setscreensaver(char *name) |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 278 | { |
adamdunkels | 15e26dd | 2003-08-11 22:24:20 +0000 | [diff] [blame] | 279 | if(name == NULL) { |
oliverschmidt | 1df710f | 2005-05-12 23:55:18 +0000 | [diff] [blame] | 280 | program_handler_screensaver[0] = 0; |
adamdunkels | 15e26dd | 2003-08-11 22:24:20 +0000 | [diff] [blame] | 281 | } else { |
oliverschmidt | 1df710f | 2005-05-12 23:55:18 +0000 | [diff] [blame] | 282 | strncpy(program_handler_screensaver, name, sizeof(program_handler_screensaver)); |
adamdunkels | 15e26dd | 2003-08-11 22:24:20 +0000 | [diff] [blame] | 283 | } |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 284 | } |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 285 | #endif /* CTK_CONF_SCREENSAVER */ |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 286 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 287 | static void |
| 288 | make_windows(void) |
| 289 | { |
| 290 | #ifdef WITH_LOADER_ARCH |
| 291 | ctk_window_new(&runwindow, 16, 3, "Run"); |
| 292 | |
| 293 | CTK_WIDGET_ADD(&runwindow, &namelabel); |
| 294 | CTK_WIDGET_ADD(&runwindow, &nameentry); |
| 295 | CTK_WIDGET_ADD(&runwindow, &loadbutton); |
| 296 | |
| 297 | CTK_WIDGET_FOCUS(&runwindow, &nameentry); |
| 298 | |
| 299 | ctk_dialog_new(&loadingdialog, 25, 1); |
| 300 | CTK_WIDGET_ADD(&loadingdialog, &loadingmsg); |
| 301 | CTK_WIDGET_ADD(&loadingdialog, &loadingname); |
| 302 | |
| 303 | ctk_dialog_new(&errordialog, 22, 8); |
| 304 | CTK_WIDGET_ADD(&errordialog, &errormsg); |
| 305 | CTK_WIDGET_ADD(&errordialog, &errorfilelabel); |
| 306 | CTK_WIDGET_ADD(&errordialog, &errortype); |
| 307 | CTK_WIDGET_ADD(&errordialog, &errorokbutton); |
| 308 | CTK_WIDGET_FOCUS(&errordialog, &errorokbutton); |
| 309 | #endif /* WITH_LOADER_ARCH */ |
| 310 | } |
| 311 | /*-----------------------------------------------------------------------------------*/ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 312 | /*static |
| 313 | DISPATCHER_SIGHANDLER(program_handler_sighandler, s, data)*/ |
| 314 | EK_EVENTHANDLER(program_handler_eventhandler, ev, data) |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 315 | { |
adamdunkels | e937ded | 2003-10-01 07:53:57 +0000 | [diff] [blame] | 316 | #ifdef WITH_LOADER_ARCH |
| 317 | unsigned char err; |
adamdunkels | e063517 | 2003-08-09 13:31:18 +0000 | [diff] [blame] | 318 | struct dsc *dsc; |
adamdunkels | e937ded | 2003-10-01 07:53:57 +0000 | [diff] [blame] | 319 | #endif /* WITH_LOADER_ARCH */ |
| 320 | unsigned char i; |
adamdunkels | e063517 | 2003-08-09 13:31:18 +0000 | [diff] [blame] | 321 | struct dsc **dscp; |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 322 | /* DISPATCHER_SIGHANDLER_ARGS(s, data);*/ |
| 323 | EK_EVENTHANDLER_ARGS(ev, data); |
| 324 | |
| 325 | if(ev == EK_EVENT_INIT) { |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 326 | /* Create the menus */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 327 | ctk_menu_add(&contikimenu); |
| 328 | #if WITH_LOADER_ARCH |
| 329 | runmenuitem = ctk_menuitem_add(&contikimenu, "Run program..."); |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 330 | |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 331 | make_windows(); |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 332 | #endif /* WITH_LOADER_ARCH */ |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 333 | #if QUIT_MENU |
| 334 | quitmenuitem = ctk_menuitem_add(&contikimenu, "Quit"); |
| 335 | #endif /* QUIT_MENU */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 336 | |
| 337 | displayname = NULL; |
| 338 | |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 339 | #if CTK_CONF_SCREENSAVER |
oliverschmidt | 1df710f | 2005-05-12 23:55:18 +0000 | [diff] [blame] | 340 | program_handler_screensaver[0] = 0; |
oliverschmidt | 533f7e2 | 2005-01-24 23:20:50 +0000 | [diff] [blame] | 341 | #endif /* CTK_CONF_SCREENSAVER */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 342 | |
| 343 | } else if(ev == ctk_signal_button_activate) { |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 344 | #ifdef WITH_LOADER_ARCH |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 345 | if(data == (ek_data_t)&loadbutton) { |
| 346 | ctk_window_close(&runwindow); |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 347 | program_handler_load(name, NULL); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 348 | } else if(data == (ek_data_t)&errorokbutton) { |
| 349 | ctk_dialog_close(); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 350 | } |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 351 | #endif /* WITH_LOADER_ARCH */ |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 352 | #if QUIT_MENU |
| 353 | if(data == (ek_data_t)&quityesbutton) { |
| 354 | ctk_draw_init(); |
| 355 | exit(EXIT_SUCCESS); |
| 356 | } else if(data == (ek_data_t)&quitnobutton) { |
| 357 | ctk_dialog_close(); |
| 358 | } |
| 359 | #endif /* QUIT_MENU */ |
adamdunkels | e063517 | 2003-08-09 13:31:18 +0000 | [diff] [blame] | 360 | dscp = &contikidsc[0]; |
| 361 | for(i = 0; i < CTK_CONF_MAXMENUITEMS; ++i) { |
| 362 | if(*dscp != NULL && |
| 363 | data == (ek_data_t)(*dscp)->icon) { |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 364 | RUN((*dscp)->prgname, (*dscp)->init, NULL); |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 365 | break; |
| 366 | } |
adamdunkels | e063517 | 2003-08-09 13:31:18 +0000 | [diff] [blame] | 367 | ++dscp; |
| 368 | } |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 369 | } else if(ev == ctk_signal_menu_activate) { |
adamdunkels | 43c3d1d | 2003-04-17 19:00:00 +0000 | [diff] [blame] | 370 | if((struct ctk_menu *)data == &contikimenu) { |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 371 | #if WITH_LOADER_ARCH |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 372 | dsc = contikidsc[contikimenu.active]; |
adamdunkels | e063517 | 2003-08-09 13:31:18 +0000 | [diff] [blame] | 373 | if(dsc != NULL) { |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 374 | RUN(dsc->prgname, dsc->init, NULL); |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 375 | } else if(contikimenu.active == runmenuitem) { |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 376 | make_windows(); |
adamdunkels | b1a88e2 | 2004-09-09 21:15:55 +0000 | [diff] [blame] | 377 | ctk_window_close(&runwindow); |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 378 | ctk_window_open(&runwindow); |
adamdunkels | 46dbaed | 2003-07-31 23:47:30 +0000 | [diff] [blame] | 379 | CTK_WIDGET_FOCUS(&runwindow, &nameentry); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 380 | } |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 381 | #else /* WITH_LOADER_ARCH */ |
| 382 | if(contikidsc[contikimenu.active] != NULL) { |
| 383 | RUN(contikidsc[contikimenu.active]->prgname, |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 384 | contikidsc[contikimenu.active]->init, |
| 385 | NULL); |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 386 | } |
| 387 | #endif /* WITH_LOADER_ARCH */ |
oliverschmidt | 0c64f87 | 2006-05-07 23:02:54 +0000 | [diff] [blame] | 388 | #if QUIT_MENU |
| 389 | if(contikimenu.active == quitmenuitem) { |
| 390 | ctk_dialog_new(&quitdialog, 24, 5); |
| 391 | CTK_WIDGET_ADD(&quitdialog, &quitdialoglabel); |
| 392 | CTK_WIDGET_ADD(&quitdialog, &quityesbutton); |
| 393 | CTK_WIDGET_ADD(&quitdialog, &quitnobutton); |
| 394 | CTK_WIDGET_FOCUS(&quitdialog, &quitnobutton); |
| 395 | ctk_dialog_open(&quitdialog); |
| 396 | } |
| 397 | #endif /* QUIT_MENU */ |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 398 | } |
| 399 | #if CTK_CONF_SCREENSAVER |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 400 | } else if(ev == ctk_signal_screensaver_start) { |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 401 | #if WITH_LOADER_ARCH |
oliverschmidt | 1df710f | 2005-05-12 23:55:18 +0000 | [diff] [blame] | 402 | if(program_handler_screensaver[0] != 0) { |
| 403 | program_handler_load(program_handler_screensaver, NULL); |
adamdunkels | 8a8138b | 2003-08-09 23:30:37 +0000 | [diff] [blame] | 404 | } |
| 405 | #endif /* WITH_LOADER_ARCH */ |
| 406 | #endif /* CTK_CONF_SCREENSAVER */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 407 | } else if(ev == LOADER_EVENT_DISPLAY_NAME) { |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 408 | #if WITH_LOADER_ARCH |
| 409 | if(displayname == NULL) { |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 410 | make_windows(); |
| 411 | |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 412 | ctk_label_set_text(&loadingname, ((struct pnarg *)data)->name); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 413 | ctk_dialog_open(&loadingdialog); |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 414 | /* dispatcher_emit(loader_signal_load, data, id);*/ |
| 415 | ek_post(id, LOADER_EVENT_LOAD, data); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 416 | displayname = data; |
| 417 | } else { |
| 418 | /* Try again. */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 419 | /* dispatcher_emit(loader_signal_display_name, data, id);*/ |
| 420 | ek_post(id, LOADER_EVENT_DISPLAY_NAME, data); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 421 | } |
| 422 | #endif /* WITH_LOADER_ARCH */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 423 | } else if(ev == LOADER_EVENT_LOAD) { |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 424 | #if WITH_LOADER_ARCH |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 425 | if(displayname == data) { |
| 426 | ctk_dialog_close(); |
| 427 | displayname = NULL; |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 428 | log_message("Loading ", ((struct pnarg *)data)->name); |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 429 | err = LOADER_LOAD(((struct pnarg *)data)->name, |
| 430 | ((struct pnarg *)data)->arg); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 431 | if(err != LOADER_OK) { |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 432 | make_windows(); |
adamdunkels | 506d6c4 | 2003-08-20 20:52:22 +0000 | [diff] [blame] | 433 | errorfilename[0] = '"'; |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 434 | strncpy(errorfilename + 1, ((struct pnarg *)data)->name, |
| 435 | sizeof(errorfilename) - 2); |
| 436 | errorfilename[1 + strlen(((struct pnarg *)data)->name)] = '"'; |
adamdunkels | 4d2d276 | 2003-09-04 19:34:22 +0000 | [diff] [blame] | 437 | ctk_label_set_text(&errortype, (char *)errormsgs[err]); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 438 | ctk_dialog_open(&errordialog); |
adamdunkels | 0eeeba7 | 2004-08-20 21:32:41 +0000 | [diff] [blame] | 439 | log_message((char *)errormsgs[err], errorfilename); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 440 | } |
adamdunkels | 8bb5cca | 2003-08-24 22:41:31 +0000 | [diff] [blame] | 441 | pnarg_free(data); |
adamdunkels | 1953928 | 2003-08-05 23:27:23 +0000 | [diff] [blame] | 442 | } else { |
| 443 | /* Try again. */ |
adamdunkels | f2f8cb2 | 2004-07-04 11:35:07 +0000 | [diff] [blame] | 444 | /* dispatcher_emit(loader_signal_display_name, data, id);*/ |
| 445 | ek_post(id, LOADER_EVENT_DISPLAY_NAME, data); |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 446 | } |
adamdunkels | 045437c | 2003-06-30 20:49:01 +0000 | [diff] [blame] | 447 | #endif /* WITH_LOADEER_ARCH */ |
adamdunkels | 4292c86 | 2003-04-08 17:56:43 +0000 | [diff] [blame] | 448 | } |
| 449 | } |
| 450 | /*-----------------------------------------------------------------------------------*/ |