⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctk-gtksim-service.c

📁 伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看
💻 C
📖 第 1 页 / 共 2 页
字号:
/*#include "ctk/ctk-draw-service.h"*/#include "ctk-gtksim-draw.h"#include "ctk-gtksim.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 GdkGC *get_color(unsigned short r, unsigned short g, unsigned short b){  GdkGCValues values;  GdkColor color;  color.pixel = 0;  color.red = r;  color.green = g;  color.blue = b;  if(gdk_colormap_alloc_color(gdk_colormap_get_system(),			      &color, FALSE, TRUE)) {  }    values.foreground = color;    return gdk_gc_new_with_values(ctk_gtksim_drawing_area->window,				&values,				GDK_GC_FOREGROUND);}/*--------------------------------------------------------------------------*/static voids_ctk_draw_init(void){  GtkWidget *image;    image = gtk_image_new_from_file(CTK_GTKSIM_SERVICE_PNGDIR "/background.png");  background = gtk_image_get_pixbuf(GTK_IMAGE(image));  image = gtk_image_new_from_file(CTK_GTKSIM_SERVICE_PNGDIR "/windowborder.png");  windowborder = gtk_image_get_pixbuf(GTK_IMAGE(image));  image = gtk_image_new_from_file(CTK_GTKSIM_SERVICE_PNGDIR "/menubar.png");  menubar = gtk_image_get_pixbuf(GTK_IMAGE(image));  ctk_gtksim_init();  ctk_gtksim_draw_init();    blue = get_color(0, 0, 0xffff);  white = get_color(0xffff, 0xffff, 0xffff);  lightgray = get_color(0xefff, 0xefff, 0xefff);  midgray = get_color(0xdfff, 0xdfff, 0xdfff);  darkgray = get_color(0xcfff, 0xcfff, 0xcfff);  ddarkgray = get_color(0xafff, 0xafff, 0xafff);  black = get_color(0, 0, 0);    }/*--------------------------------------------------------------------------*/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,		    GDK_RGB_DITHER_NONE, 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,		    GDK_RGB_DITHER_NONE, 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){  unsigned char text[1000];  unsigned char x, y;  int width, xpos;  int i, j;  GdkGC *bgcol, *buttoncol, *color, *inv_color;  struct ctk_gtksim_draw_font *buttonfont, *textfont, *textfont_bold;  int monospace;  unsigned char *bitmap;    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);      for(j = 0; j < w->w; ++j) {	if(text[j] >= 0x80) {	  text[j] = text[j] & 0x7f;	}	if(text[j] == 0) {	  text[j] = ' ';	}      }      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);      strncpy(text, &w->widget.label.text[i * w->w], w->w);      for(j = 0; j < w->w; ++j) {	if(text[j] >= 0x80) {	  gdk_draw_rectangle(ctk_gtksim_pixmap,			     black,			     FALSE,			     (x + j) * RASTER_X - 2,			     y * RASTER_Y + MENUBAR_HEIGHT,			     RASTER_X + 2,			     BUTTON_HEIGHT + 1);	}      }    }    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) ||       focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_DIALOG)) {      gdk_draw_rectangle(ctk_gtksim_pixmap,			 black,			 FALSE,			 x * RASTER_X - BUTTON_X_BORDER,			 y * RASTER_Y - BUTTON_Y_BORDER + MENUBAR_HEIGHT,			 w->w * RASTER_X + BUTTON_X_BORDER * 2,			 BUTTON_HEIGHT + BUTTON_Y_BORDER);      /*      gdk_draw_rectangle(ctk_gtksim_pixmap,		    ctk_gtksim_drawing_area->style->black_gc,			 FALSE,			 x * RASTER_X - BUTTON_X_BORDER - 1,			 y * RASTER_Y - BUTTON_Y_BORDER - 1,

⌨️ 快捷键说明

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