blob: a5fe420ed88c80aaeebad95a27f3fca156c4c7d5 [file] [log] [blame]
adamdunkels4292c862003-04-08 17:56:43 +00001/*
2 * Copyright (c) 2002, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer in the documentation and/or other materials provided
13 * with the distribution.
adamdunkels06f897e2004-06-06 05:59:20 +000014 * 3. The name of the author may not be used to endorse or promote
adamdunkels4292c862003-04-08 17:56:43 +000015 * products derived from this software without specific prior
16 * written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
24 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * This file is part of the Contiki desktop environment
31 *
oliverschmidt01e9d1e2005-03-13 22:14:43 +000032 * $Id: processes.c,v 1.14 2005/03/13 22:14:43 oliverschmidt Exp $
adamdunkels4292c862003-04-08 17:56:43 +000033 *
34 */
35
adamdunkelsf2f8cb22004-07-04 11:35:07 +000036#include "ek.h"
adamdunkels4292c862003-04-08 17:56:43 +000037#include "ctk.h"
adamdunkels4292c862003-04-08 17:56:43 +000038#include "loader.h"
39
adamdunkels56dc3632004-09-09 21:10:16 +000040#include <string.h>
41
adamdunkels8bb556e2003-04-09 19:25:37 +000042#define MAX_PROCESSLABELS 13
adamdunkels4292c862003-04-08 17:56:43 +000043static struct ctk_window processwindow;
adamdunkels8bb556e2003-04-09 19:25:37 +000044static unsigned char ids[MAX_PROCESSLABELS][4];
adamdunkels4292c862003-04-08 17:56:43 +000045static struct ctk_label processidlabels[MAX_PROCESSLABELS];
46static struct ctk_label processnamelabels[MAX_PROCESSLABELS];
47
adamdunkels1a798bc2003-07-31 23:45:52 +000048static struct ctk_label killlabel =
49 {CTK_LABEL(0, 14, 12, 1, "Kill process")};
oliverschmidt01e9d1e2005-03-13 22:14:43 +000050static char killprocnum[4];
adamdunkels1a798bc2003-07-31 23:45:52 +000051static struct ctk_textentry killtextentry =
oliverschmidt01e9d1e2005-03-13 22:14:43 +000052 {CTK_TEXTENTRY(13, 14, 3, 1, killprocnum, 3)};
adamdunkels1a798bc2003-07-31 23:45:52 +000053static struct ctk_button killbutton =
oliverschmidt01e9d1e2005-03-13 22:14:43 +000054 {CTK_BUTTON(19, 14, 2, "Ok")};
adamdunkels4292c862003-04-08 17:56:43 +000055static struct ctk_button processupdatebutton =
adamdunkels1a798bc2003-07-31 23:45:52 +000056 {CTK_BUTTON(0, 15, 6, "Update")};
adamdunkels4292c862003-04-08 17:56:43 +000057static struct ctk_button processclosebutton =
oliverschmidt01e9d1e2005-03-13 22:14:43 +000058 {CTK_BUTTON(19, 15, 5, "Close")};
adamdunkels4292c862003-04-08 17:56:43 +000059
adamdunkelsf2f8cb22004-07-04 11:35:07 +000060/*static DISPATCHER_SIGHANDLER(processes_sighandler, s, data);
adamdunkels4292c862003-04-08 17:56:43 +000061static struct dispatcher_proc p =
62 {DISPATCHER_PROC("Process listing", NULL, processes_sighandler, NULL)};
adamdunkelsf2f8cb22004-07-04 11:35:07 +000063 static ek_id_t id;*/
64EK_EVENTHANDLER(processes_eventhandler, ev, data);
65EK_PROCESS(p, "Process listing", EK_PRIO_NORMAL,
66 processes_eventhandler, NULL, NULL);
67static ek_id_t id = EK_ID_NONE;
68
69enum {
70 EVENT_UPDATE
71};
adamdunkels4292c862003-04-08 17:56:43 +000072
73/*-----------------------------------------------------------------------------------*/
74static void
75update_processwindow(void)
76{
77 unsigned char i, j, *idsptr;
adamdunkelsf2f8cb22004-07-04 11:35:07 +000078 struct ek_proc *p;
adamdunkels4292c862003-04-08 17:56:43 +000079
adamdunkelsb1a3d232003-06-30 20:48:10 +000080 /* Step through each possible process ID and see if there is a
81 matching process. */
82 j = 0;
adamdunkelsb0da0e02004-08-20 21:31:53 +000083 for(p = EK_PROCS(); p != NULL && j < MAX_PROCESSLABELS; p = p->next) {
adamdunkelsb1a3d232003-06-30 20:48:10 +000084 idsptr = ids[j];
85 i = p->id;
86 idsptr[0] = '0' + i / 100;
87 if(idsptr[0] == '0') {
88 idsptr[0] = ' ';
adamdunkels4292c862003-04-08 17:56:43 +000089 }
adamdunkels1a798bc2003-07-31 23:45:52 +000090 idsptr[1] = '0' + (i / 10) % 10;
adamdunkelsb1a3d232003-06-30 20:48:10 +000091 idsptr[2] = '0' + i % 10;
92 idsptr[3] = 0;
93 CTK_LABEL_NEW(&processidlabels[j],
94 0, j + 1, 3, 1, idsptr);
95 CTK_WIDGET_ADD(&processwindow, &processidlabels[j]);
96
97 CTK_LABEL_NEW(&processnamelabels[j],
oliverschmidt01e9d1e2005-03-13 22:14:43 +000098 4, j + 1, 22, 1, (char *)p->name);
adamdunkelsb1a3d232003-06-30 20:48:10 +000099 CTK_WIDGET_ADD(&processwindow, &processnamelabels[j]);
adamdunkels1a798bc2003-07-31 23:45:52 +0000100
adamdunkelsb1a3d232003-06-30 20:48:10 +0000101 ++j;
102 }
adamdunkels4292c862003-04-08 17:56:43 +0000103
adamdunkels1a798bc2003-07-31 23:45:52 +0000104 CTK_WIDGET_ADD(&processwindow, &killlabel);
105
106 CTK_WIDGET_ADD(&processwindow, &killtextentry);
107 CTK_WIDGET_ADD(&processwindow, &killbutton);
108
adamdunkels4292c862003-04-08 17:56:43 +0000109 CTK_WIDGET_ADD(&processwindow, &processupdatebutton);
110 CTK_WIDGET_ADD(&processwindow, &processclosebutton);
111 CTK_WIDGET_FOCUS(&processwindow, &processupdatebutton);
112}
113/*-----------------------------------------------------------------------------------*/
adamdunkels8bb5cca2003-08-24 22:41:31 +0000114LOADER_INIT_FUNC(processes_init, arg)
adamdunkels4292c862003-04-08 17:56:43 +0000115{
adamdunkels8bb5cca2003-08-24 22:41:31 +0000116 arg_free(arg);
117
adamdunkels4292c862003-04-08 17:56:43 +0000118 if(id == EK_ID_NONE) {
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000119 id = ek_start(&p);
120 }
adamdunkels4292c862003-04-08 17:56:43 +0000121}
122/*-----------------------------------------------------------------------------------*/
123static void
adamdunkels0137b442003-04-08 23:27:33 +0000124processes_quit(void)
adamdunkels4292c862003-04-08 17:56:43 +0000125{
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000126 ek_exit();
adamdunkels4292c862003-04-08 17:56:43 +0000127 id = EK_ID_NONE;
128 LOADER_UNLOAD();
adamdunkels4292c862003-04-08 17:56:43 +0000129}
130/*-----------------------------------------------------------------------------------*/
adamdunkels1a798bc2003-07-31 23:45:52 +0000131static void
132killproc(void)
133{
134 int procnum;
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000135 unsigned char i, j;
136 struct ek_proc *p;
137
adamdunkels1a798bc2003-07-31 23:45:52 +0000138 /* Find first zero char in killprocnum string. */
139 for(i = 0; killprocnum[i] != 0 &&
140 i < sizeof(killprocnum); ++i);
141
142 if(i == 0) {
143 return;
144 }
145
146 procnum = 0;
147
148 for(j = 0; j < i; ++j) {
149 procnum = procnum * 10 + (killprocnum[j] - '0');
150 killprocnum[j] = 0;
151 }
152
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000153 /* Make sure the process ID exists. */
154 for(p = EK_PROCS(); p != NULL; p = p->next) {
155 if(EK_PROC_ID(p) == procnum) {
156 break;
157 }
158 }
159
160 if(p != NULL) {
161 ek_post(procnum, EK_EVENT_REQUEST_EXIT, NULL);
162 ek_post(id, EVENT_UPDATE, NULL);
adamdunkels856c68b2004-09-05 07:16:22 +0000163 CTK_TEXTENTRY_CLEAR(&killtextentry);
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000164 CTK_WIDGET_REDRAW(&killtextentry);
165 CTK_WIDGET_FOCUS(&processwindow, &processupdatebutton);
166 CTK_WIDGET_REDRAW(&killbutton);
167 CTK_WIDGET_REDRAW(&processupdatebutton);
168 }
adamdunkels1a798bc2003-07-31 23:45:52 +0000169}
170/*-----------------------------------------------------------------------------------*/
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000171/*static
172 DISPATCHER_SIGHANDLER(processes_sighandler, s, data)*/
173EK_EVENTHANDLER(processes_eventhandler, ev, data)
adamdunkels4292c862003-04-08 17:56:43 +0000174{
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000175/* DISPATCHER_SIGHANDLER_ARGS(s, data);*/
176 EK_EVENTHANDLER_ARGS(ev, data);
177
178
179 if(ev == EK_EVENT_INIT) {
oliverschmidt01e9d1e2005-03-13 22:14:43 +0000180 ctk_window_new(&processwindow, 26, 16, "Processes");
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000181 update_processwindow();
182
183 ctk_window_open(&processwindow);
184 } else if(ev == EVENT_UPDATE) {
185 ctk_window_clear(&processwindow);
186 update_processwindow();
187 ctk_window_open(&processwindow);
188 } else if(ev == ctk_signal_button_activate) {
adamdunkels4292c862003-04-08 17:56:43 +0000189 if(data == (ek_data_t)&processupdatebutton) {
190 ctk_window_clear(&processwindow);
191 update_processwindow();
adamdunkels1a798bc2003-07-31 23:45:52 +0000192 ctk_window_open(&processwindow);
adamdunkels4292c862003-04-08 17:56:43 +0000193 } else if(data == (ek_data_t)&processclosebutton) {
194 ctk_window_close(&processwindow);
adamdunkels0137b442003-04-08 23:27:33 +0000195 processes_quit();
adamdunkelsb1a3d232003-06-30 20:48:10 +0000196 /* ctk_desktop_redraw(processwindow.desktop); */
adamdunkels1a798bc2003-07-31 23:45:52 +0000197 } else if(data == (ek_data_t)&killbutton) {
198 killproc();
adamdunkels4292c862003-04-08 17:56:43 +0000199 }
adamdunkelsf2f8cb22004-07-04 11:35:07 +0000200 } else if(ev == EK_EVENT_REQUEST_EXIT ||
201 (ev == ctk_signal_window_close &&
adamdunkels1a798bc2003-07-31 23:45:52 +0000202 data == (ek_data_t)&processwindow)) {
203 ctk_window_close(&processwindow);
adamdunkels0137b442003-04-08 23:27:33 +0000204 processes_quit();
adamdunkels4292c862003-04-08 17:56:43 +0000205 }
206}
207/*-----------------------------------------------------------------------------------*/