📄 ctk-gtksim-service.c
字号:
/*#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 + -