ctk-graphic.c

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

C
810
字号
/* * 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. The name of the author may not be used to endorse or promote *    products derived from this software without specific prior *    written permission.   * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. * * $Id: ctk-graphic.c,v 1.1 2007/05/23 23:19:13 oliverschmidt Exp $ * */#include "ctk-draw-service.h"#include "ctk-graphic-draw.h"#include "ctk-graphic.h"#include <string.h>#define WINDOWBORDER_WIDTH  1#define WINDOWBORDER_HEIGHT 1#define WINDOWTITLE_HEIGHT  3#define MENU_HEIGHT         1#define MENUBAR_HEIGHT      12#define FONT_BASELINE 12#define MENUBAR_FONT_BASELINE 7#define RASTER_X 8#define RASTER_Y 14#define BUTTON_HEIGHT 12#define BUTTON_X_BORDER 4#define BUTTON_Y_BORDER 1#define TEXTENTRY_HEIGHT 12#define TEXTENTRY_X_BORDER 4#define TEXTENTRY_Y_BORDER 1static GdkGC *white, *lightgray, *midgray, *darkgray, *ddarkgray, *black,  *blue;static GdkPixbuf *background, *windowborder, *menubar;static voiddraw_widget(struct ctk_widget *w,	    unsigned char winx,	    unsigned char winy,	    unsigned char clipx,	    unsigned char clipy,	    unsigned char clipy1,	    unsigned char clipy2,	    unsigned char focus);/*--------------------------------------------------------------------------*/static voids_ctk_draw_init(void){  GtkWidget *image;    image = gtk_image_new_from_file("background.png");  background = gtk_image_get_pixbuf(GTK_IMAGE(image));  image = gtk_image_new_from_file("windowborder.png");  windowborder = gtk_image_get_pixbuf(GTK_IMAGE(image));  image = gtk_image_new_from_file("menubar.png");  menubar = gtk_image_get_pixbuf(GTK_IMAGE(image));  ctk_graphic_draw_init();}/*--------------------------------------------------------------------------*/static voids_ctk_draw_clear(unsigned char y1, unsigned char y2){  if(background == NULL) {    gdk_draw_rectangle(ctk_gtksim_pixmap,		       darkgray,		       TRUE,		       0,		       y1 * RASTER_Y + MENUBAR_HEIGHT,		       CTK_GTKSIM_SCREEN_WIDTH,		       (y2 - y1) * RASTER_Y);  } else {    gdk_draw_pixbuf(ctk_gtksim_pixmap,		    darkgray,		    background,		    0,		    y1 * RASTER_Y,		    0,		    y1 * RASTER_Y + MENUBAR_HEIGHT,		    CTK_GTKSIM_SCREEN_WIDTH,		    (y2 - y1) * RASTER_Y,		    NULL, 0, 0);      }}/*--------------------------------------------------------------------------*/static voids_ctk_draw_clear_window(struct ctk_window *window,			unsigned char focus,			unsigned char clipy1,			unsigned char clipy2){  int x, y;  x = window->x;  y = window->y + MENU_HEIGHT;    /* Clear window */  if(focus == CTK_FOCUS_WINDOW) {    gdk_draw_rectangle(ctk_gtksim_pixmap,		       white,		       TRUE,		       x * RASTER_X - 1,		       y * RASTER_Y - 1 + MENUBAR_HEIGHT,		       (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X + 2, 		       (window->h + WINDOWTITLE_HEIGHT +			            WINDOWBORDER_HEIGHT) * RASTER_Y + 2);  } else {    gdk_draw_rectangle(ctk_gtksim_pixmap,		       lightgray,		       TRUE,		       x * RASTER_X - 1,		       y * RASTER_Y - 1 + MENUBAR_HEIGHT,		       (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X + 2, 		       (window->h + WINDOWTITLE_HEIGHT +			            WINDOWBORDER_HEIGHT) * RASTER_Y + 2);      }}/*--------------------------------------------------------------------------*/static voids_ctk_draw_window(struct ctk_window *window,		  unsigned char focus,		  unsigned char clipy1,		  unsigned char clipy2){  struct ctk_widget *w;  unsigned char wfocus;  int x, y, x1, y1, x2, y2;  x = window->x;  y = window->y + MENU_HEIGHT;    x1 = x + WINDOWBORDER_WIDTH;  y1 = y + WINDOWTITLE_HEIGHT;  x2 = x1 + window->w;  y2 = y1 + window->h;  /* Draw window border */  gdk_draw_rectangle(ctk_gtksim_pixmap,		     darkgray,		     FALSE,		     x * RASTER_X,		     y * RASTER_Y + MENUBAR_HEIGHT,		     (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,		     (window->h + WINDOWTITLE_HEIGHT +		                  WINDOWBORDER_HEIGHT) * RASTER_Y);  if(ctk_mode_get() == CTK_MODE_WINDOWMOVE) {    if(focus == CTK_FOCUS_WINDOW) {      gdk_draw_rectangle(ctk_gtksim_pixmap,			 white,			 TRUE,			 x * RASTER_X + 1,			 y * RASTER_Y + MENUBAR_HEIGHT + 1,			 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,			 (window->h + WINDOWTITLE_HEIGHT +			  WINDOWBORDER_HEIGHT) * RASTER_Y - 2);    } else {      gdk_draw_rectangle(ctk_gtksim_pixmap,			 midgray,			 TRUE,			 x * RASTER_X + 1,			 y * RASTER_Y + MENUBAR_HEIGHT + 1,			 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,			 (window->h + WINDOWTITLE_HEIGHT +			  WINDOWBORDER_HEIGHT) * RASTER_Y - 2);    }    return;  }    if(windowborder == NULL) {    gdk_draw_rectangle(ctk_gtksim_pixmap,		       midgray,		       TRUE,		       x * RASTER_X,		       y * RASTER_Y + MENUBAR_HEIGHT,		       (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,		       WINDOWTITLE_HEIGHT * RASTER_Y);  } else {    gdk_draw_pixbuf(ctk_gtksim_pixmap,		    midgray,		    windowborder,		    0, 0,		    x * RASTER_X,		    y * RASTER_Y + MENUBAR_HEIGHT,		    (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,		    WINDOWTITLE_HEIGHT * RASTER_Y,		    NULL, 0, 0);      }      gdk_draw_line(ctk_gtksim_pixmap,		darkgray,		x * RASTER_X,		(y + WINDOWTITLE_HEIGHT) * RASTER_Y - 1 + MENUBAR_HEIGHT,		(x + window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,		(y + WINDOWTITLE_HEIGHT) * RASTER_Y - 1 + MENUBAR_HEIGHT);    /* Draw inactive widgets. */  for(w = window->inactive; w != NULL; w = w->next) {    draw_widget(w, x1, y1, x2, y2,		clipy1, clipy2,		focus);  }    /* Draw active widgets. */  for(w = window->active; w != NULL; w = w->next) {      wfocus = focus;    if(w == window->focused) {      wfocus |= CTK_FOCUS_WIDGET;    }   draw_widget(w, x1, y1, x2, y2, 	       clipy1, clipy2,	       wfocus);  }  ctk_gtksim_set_redrawflag();}/*--------------------------------------------------------------------------*/static voids_ctk_draw_dialog(struct ctk_window *window){  struct ctk_widget *w;  unsigned char wfocus, focus;  int x, y, x1, y1, x2, y2;  focus = CTK_FOCUS_DIALOG;  x = window->x;  y = window->y + MENU_HEIGHT;    x1 = x + WINDOWBORDER_WIDTH;  y1 = y + WINDOWTITLE_HEIGHT;  x2 = x1 + window->w;  y2 = y1 + window->h;    /* Draw window border */  gdk_draw_rectangle(ctk_gtksim_pixmap,		     black,		     FALSE,		     x * RASTER_X,		     y * RASTER_Y + MENUBAR_HEIGHT,		     (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,		     (window->h + WINDOWTITLE_HEIGHT +		                  WINDOWBORDER_HEIGHT) * RASTER_Y);      gdk_draw_rectangle(ctk_gtksim_pixmap,		     white,		     TRUE,		     x * RASTER_X + 1,		     y * RASTER_Y + 1 + MENUBAR_HEIGHT,		     (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,		     (window->h + WINDOWTITLE_HEIGHT +                                  WINDOWBORDER_HEIGHT) * RASTER_Y - 2);    /* Draw inactive widgets. */  for(w = window->inactive; w != NULL; w = w->next) {    draw_widget(w, x1, y1, x2, y2,		y1, y2,		focus);  }    /* Draw active widgets. */  for(w = window->active; w != NULL; w = w->next) {      wfocus = focus;    if(w == window->focused) {      wfocus |= CTK_FOCUS_WIDGET;    }   draw_widget(w, x1, y1, x2, y2, 	       y1, y2,	       wfocus);  }  ctk_gtksim_set_redrawflag();  }/*--------------------------------------------------------------------------*/static voiddraw_widget(struct ctk_widget *w,	    unsigned char winx, unsigned char winy,	    unsigned char clipx,	    unsigned char clipy,	    unsigned char clipy1,	    unsigned char clipy2,	    unsigned char focus){  char text[1000];  unsigned char x, y;  int width, xpos;  int i;  GdkGC *bgcol, *buttoncol;  struct ctk_gtksim_draw_font *buttonfont, *textfont, *textfont_bold;  int monospace;    x = winx + w->x;  y = winy + w->y;  if(focus & CTK_FOCUS_WINDOW) {    bgcol = white;  } else {    bgcol = lightgray;  }  if(focus & CTK_FOCUS_WINDOW) {    buttoncol = lightgray;  } else {    buttoncol = midgray;  }  monospace = w->flags & CTK_WIDGET_FLAG_MONOSPACE;  if(monospace) {    textfont = &ctk_gtksim_draw_font_monospace;    textfont_bold = &ctk_gtksim_draw_font_monospace_bold;  } else {    textfont = &ctk_gtksim_draw_font_normal;    textfont_bold = &ctk_gtksim_draw_font_bold;  }    switch(w->type) {  case CTK_WIDGET_SEPARATOR:    gdk_draw_line(ctk_gtksim_pixmap,		  darkgray,		  x * RASTER_X,		  y * RASTER_Y + RASTER_Y / 2 + MENUBAR_HEIGHT,		  (x + w->w) * RASTER_X,		  y * RASTER_Y + RASTER_Y / 2 + MENUBAR_HEIGHT);    break;  case CTK_WIDGET_LABEL:    gdk_draw_rectangle(ctk_gtksim_pixmap,		       bgcol,		       TRUE,		       x * RASTER_X,		       y * RASTER_Y + MENUBAR_HEIGHT,		       w->w * RASTER_X,		       w->h * RASTER_Y);    for(i = 0; i < w->h; ++i) {      strncpy(text, &w->widget.label.text[i * w->w], w->w);      text[w->w] = 0;      ctk_gtksim_draw_string(textfont,			     &ctk_gtksim_draw_color_black,			     RASTER_X * x,			     RASTER_Y * (y + i) + MENUBAR_HEIGHT,			     text, monospace);    }    break;  case CTK_WIDGET_BUTTON:    if(w == (struct ctk_widget *)&w->window->titlebutton) {      buttonfont = &ctk_gtksim_draw_font_bold;    } else {      buttonfont = textfont;    }    ++x;        width = ctk_gtksim_draw_string_width(buttonfont,					 w->widget.button.text,					 monospace);    if(focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_WINDOW)) {      gdk_draw_rectangle(ctk_gtksim_pixmap,			 black,			 FALSE,

⌨️ 快捷键说明

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