editor.c

来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 339 行

C
339
字号
/* * Copyright (c) 2004, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is part of the Contiki operating system. * * Author: Adam Dunkels <adam@sics.se> * * $Id: editor.c,v 1.1 2007/05/23 23:34:33 oliverschmidt Exp $ */#define EDITOR_CONF_WIDTH 32#define EDITOR_CONF_HEIGHT 16#define EDITOR_CONF_MAX_FILENAME_LEN 16#include "contiki.h"#include "contiki-lib.h"#include "ctk/ctk.h"#include "cfs/cfs.h"#include "lib/ctk-filedialog.h"#define ISO_nl 0x0aPROCESS(editor_process, "Editor");static struct ctk_window window;#define LINE_LEN 60#define NUM_LINES EDITOR_CONF_HEIGHTstruct line {  struct line *next, *prev;  char text[LINE_LEN];};MEMB(linesmem, struct line, NUM_LINES);static struct line *lines;static struct {  unsigned char x, y;  struct ctk_label labels[NUM_LINES];} editor_state;static struct ctk_button openbutton =  {CTK_BUTTON(0, 0, 4, "Open")};static char statustext[EDITOR_CONF_WIDTH + 1];static struct ctk_label statuslabel =  {CTK_LABEL(0, EDITOR_CONF_HEIGHT + 2, EDITOR_CONF_WIDTH, 1, statustext)};static struct ctk_menu menu;static unsigned char menuitem_new, menuitem_open, menuitem_save;static char filename[EDITOR_CONF_MAX_FILENAME_LEN];static struct ctk_filedialog_state filedialog;enum {  OPEN_EVENT};/*---------------------------------------------------------------------------*/static voidshow_statustext(char *text1, char *text2){  int len;  len = strlen(text1);  if(len < sizeof(statustext)) {    strncpy(statustext, text1, sizeof(statustext));    strncpy(statustext + len, text2, sizeof(statustext) - len);    CTK_WIDGET_REDRAW(&statuslabel);  }  }/*---------------------------------------------------------------------------*/static voideditor_start(void){  unsigned char i;  register struct ctk_label *label;  struct line *l, *m;  m = NULL;    for(i = 0; i < NUM_LINES; ++i) {    label = &editor_state.labels[i];    l = (struct line *)memb_alloc(&linesmem);        if(l != NULL) {      l->next = NULL;      l->prev = m;      if(m == NULL) {	/* First line */	lines = l;      } else {	m->next = l;      }      CTK_LABEL_NEW(label, 0, i + 1, EDITOR_CONF_WIDTH, 1, l->text);      CTK_WIDGET_SET_FLAG(label, CTK_WIDGET_FLAG_MONOSPACE);      CTK_WIDGET_ADD(&window, label);    }    m = l;  }}/*---------------------------------------------------------------------------*/static voideditor_eventhandler(process_event_t ev, process_data_t data){  char *textptr, *textptr2;  unsigned char len;    if(ev == ctk_signal_keypress) {    /*    CTK_WIDGET_FOCUS(t->label.window, &t->label);*/    textptr = &(editor_state.labels[editor_state.y].text[editor_state.x]);    *textptr &= 0x7f;    CTK_WIDGET_REDRAW(&(editor_state.labels[editor_state.y]));        switch((ctk_arch_key_t)data) {    case CH_CURS_DOWN:      ++editor_state.y;      if(editor_state.y >= EDITOR_CONF_HEIGHT) {	editor_state.y = EDITOR_CONF_HEIGHT - 1;      }      break;    case CH_CURS_UP:      if(editor_state.y > 0) {	--editor_state.y;      }      break;    case CH_CURS_RIGHT:      if(editor_state.x < strlen(editor_state.labels[editor_state.y].text)) {	++editor_state.x;      }      break;    case CH_CURS_LEFT:      if(editor_state.x > 0) {	--editor_state.x;      } else {	if(editor_state.y > 0) {	  --editor_state.y;	  editor_state.x = strlen(editor_state.labels[editor_state.y].text);	}      }      break;    case CH_ENTER:      editor_state.x = 0;      ++editor_state.y;      if(editor_state.y >= EDITOR_CONF_HEIGHT) {	editor_state.y = EDITOR_CONF_HEIGHT - 1;      }      break;    case CH_DEL:      /*      len = t->label.w - t->xpos;      if(t->xpos > 0 && len > 0) {	strncpy(textptr - 1, textptr,		len);	*(textptr + len - 1) = 0;	--t->xpos;	}*/      break;    default:      len = EDITOR_CONF_WIDTH - editor_state.x;      if(len > 0) {	textptr2 = textptr + len - 1;	while(textptr2 + 1 > textptr) {	  *(textptr2 + 1) = *textptr2;	  --textptr2;	}		*textptr = (char)data;	++editor_state.x;	if(editor_state.x == EDITOR_CONF_WIDTH) {	  editor_state.x = 0;	  if(editor_state.y < EDITOR_CONF_HEIGHT - 1) {	    ++editor_state.y;	  }	}      }      break;    }    textptr = &(editor_state.labels[editor_state.y].text[editor_state.x]);    *textptr |= 0x80;    CTK_WIDGET_REDRAW(&(editor_state.labels[editor_state.y]));    /*  } else if(s == ctk_signal_widget_activate &&	    data == (process_data_t)t) {    textptr = &(t->label.text[t->ypos * t->label.w + t->xpos]);    *textptr &= 0x7f;    t->xpos = 0;    if(t->ypos < t->label.h - 1) {      ++t->ypos;    }    textptr = &(t->label.text[t->ypos * t->label.w + t->xpos]);    *textptr |= 0x80;    CTK_WIDGET_REDRAW(&t->label);*/    }}/*---------------------------------------------------------------------------*/static voidopen_file(char *name){  int fd;  struct line *l;  char line[LINE_LEN];  char *cptr;  int i, len, clen;    fd = cfs_open(name, 0);  if(fd < 0) {    show_statustext("Could not open file ", name);    return;  }  l = lines;  cptr = l->text;  clen = LINE_LEN;    do {    /* Read a portion of the input file */    len = cfs_read(fd, line, LINE_LEN);        /* Split the input into lines. */    for(i = 0; i < len; ++i) {      if(line[i] == ISO_nl ||	 clen == 0) {	*cptr = 0;	l = l->next;	if(l != NULL) {	  cptr = l->text;	  clen = LINE_LEN;	} else {	  len = -1;	  break;	}      } else {	*cptr++ = line[i];	--clen;      }    }  } while(len > 0);  cfs_close(fd);}/*---------------------------------------------------------------------------*/static voidquit(void){  ctk_window_close(&window);  process_exit(&editor_process);  LOADER_UNLOAD();}/*---------------------------------------------------------------------------*/PROCESS_THREAD(editor_process, ev, data){  PROCESS_BEGIN();    memb_init(&linesmem);    ctk_window_new(&window,		 EDITOR_CONF_WIDTH + 2,		 EDITOR_CONF_HEIGHT + 3,		 "Editor");    CTK_WIDGET_ADD(&window, &openbutton);  CTK_WIDGET_ADD(&window, &statuslabel);    CTK_WIDGET_FOCUS(&window, &openbutton);    editor_start();    ctk_window_open(&window);  while(1) {    PROCESS_WAIT_EVENT();    if(ctk_filedialog_eventhandler(&filedialog, ev, data)) {          } else {      if(ev == PROCESS_EVENT_EXIT) {	quit();      } else if(ev == OPEN_EVENT) {	/*    printf("Open file '%s'\n", (char *)data);*/	open_file((char *)data);	ctk_window_redraw(&window);      } else {		if(ev == ctk_signal_window_close &&	   data == (process_data_t)&window) {	  quit();	} else if(ev == ctk_signal_widget_activate) {	  if(data == (process_data_t)&openbutton) {	    ctk_filedialog_open(&filedialog, "Open", OPEN_EVENT);	  }	} else {	  editor_eventhandler(ev, data);	}      }    }  }    PROCESS_END();}/*---------------------------------------------------------------------------*//*LOADER_INIT_FUNC(editor_init, arg){  arg_free(arg);  id = ek_start(&p);}*//*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?