desktop.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 272 行
C
272 行
/*************************************************************************** begin : Tue Oct 5 2004 copyright : (C) 2004 - 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "desktop.h"void desktop_background (s_window_t *window, char *file){ int x; int y; char *vbuf; s_surface_t s; int imagex = 0; int imagey = 0; s_image_t *img; unsigned int *mat; dtop_data_t *dtop_data; dtop_data = (dtop_data_t *) window->client->user_data; s_fillbox(window->surface, 0, 0, window->surface->buf.w, window->surface->buf.h, s_rgbcolor(window->surface, 0, 0, 0)); s_image_init(&img); s_image_img(file, img); if (img->w < window->surface->buf.w) { imagex = (window->surface->buf.w - img->w) / 2; } if (img->h < window->surface->buf.h) { imagey = (window->surface->buf.h - img->h) / 2; } vbuf = (char *) s_malloc(window->surface->bytesperpixel * img->w * img->h + 1); s_getsurfacevirtual(&s, img->w, img->h, window->surface->bitsperpixel, vbuf); mat = img->rgba; for (y = 0; y < img->h; y++) { for (x = 0; x < img->w; x++) { if (~*mat & 0xff) { s_setpixelrgb(&s, x, y, (*mat >> 0x18) & 0xFF, (*mat >> 0x10) & 0xFF, (*mat >> 0x08) & 0xFF); } mat++; } } if (dtop_data->scale_img) { s_scalebox(window->surface, img->w, img->h, vbuf, window->surface->buf.w, window->surface->buf.h, window->surface->vbuf); } else { x = (window->surface->buf.w - img->w) / 2; y = (window->surface->buf.h - img->h) / 2; s_putbox(window->surface, 0, 0, img->w, img->h, vbuf); } s_free(vbuf); s_image_uninit(img);}void desktop_icon_handler (s_window_t *window, s_event_t *event, s_handler_t *handler){ int p = 0; dtop_prog_t *dtopp; dtop_data_t *dtop_data; dtop_data = (dtop_data_t *) window->client->user_data;#if 0 s_client_quit(window); return;#endif if (event->mouse->clicks != 2) { return; } while (!s_list_eol(dtop_data->progs, p)) { dtopp = (dtop_prog_t *) s_list_get(dtop_data->progs, p++); if (dtopp == (dtop_prog_t *) handler->user_data) { desktop_self_system(dtopp->exec); break; } }}void desktop_icon (s_window_t *window, dtop_prog_t *dtopp){ char *file; s_font_t *font; s_image_t *img; s_handler_t *hndl; file = (char *) s_malloc(sizeof(char) * (strlen(DESKTOPDIR "/img/icons/") + strlen(dtopp->icon) + 1)); sprintf(file, "%s/img/icons/%s", DESKTOPDIR, dtopp->icon); s_image_init(&img); s_image_img(file, img); s_image_get_handler(img); s_putboxrgba(window->surface, dtopp->x, dtopp->y + (32 - img->h) / 2, img->w, img->h, img->rgba); s_font_init(&font, "arial.ttf"); s_font_set_str(font, dtopp->name); s_font_set_size(font, 11); s_font_get_glyph(font); s_image_get_handler(font->img); s_putboxrgba(window->surface, dtopp->x + (img->w - font->img->w) / 2, dtopp->y + 35, font->img->w, font->img->h, font->img->rgba); s_handler_init(&hndl); hndl->type = MOUSE_HANDLER; hndl->mouse.x = dtopp->x + img->handler.x; hndl->mouse.y = dtopp->y + img->handler.y; hndl->mouse.w = img->handler.w; hndl->mouse.h = img->handler.h; hndl->mouse.c = desktop_icon_handler; hndl->mouse.button = MOUSE_LEFTBUTTON; hndl->user_data = dtopp; s_handler_add(window, hndl); s_image_uninit(img); s_font_uninit(font); s_free(file);}void desktop_icons (s_window_t *window){ int p = 0; dtop_prog_t *dtopp; dtop_data_t *dtop_data; dtop_data = (dtop_data_t *) window->client->user_data; while (!s_list_eol(dtop_data->progs, p)) { dtopp = (dtop_prog_t *) s_list_get(dtop_data->progs, p++); desktop_icon(window, dtopp); }}void desktop_atexit (s_window_t *window){ dtop_data_t *dtop_data; dtop_data = (dtop_data_t *) window->client->user_data; while (!s_list_eol(dtop_data->progs, 0)) { dtop_prog_t *dtopp = (dtop_prog_t *) s_list_get(dtop_data->progs, 0); s_free(dtopp->name); s_free(dtopp->icon); s_free(dtopp->exec); s_free(dtopp); s_list_remove(dtop_data->progs, 0); } s_free(dtop_data->progs); s_free(dtop_data->bg_image); s_free(dtop_data);}void desktop_start (s_window_t *window, s_config_t *cfg){ int i; int j; char *str; char *ptr; char *tmp; char *bgpath; dtop_prog_t *dtopp; s_config_cat_t *cat; s_config_var_t *var; dtop_data_t *dtop_data; s_window_set_coor(window, NO_FORM, 0, 0, window->surface->width, window->surface->height - 30); s_window_set_alwaysontop(window, -1); s_window_set_resizeable(window, 0); s_free(window->surface->vbuf); window->surface->width = window->surface->buf.w; window->surface->height = window->surface->buf.h; window->surface->vbuf = (char *) s_malloc(window->surface->width * window->surface->height * window->surface->bytesperpixel); dtop_data = (dtop_data_t *) s_calloc(1, sizeof(dtop_data_t)); dtop_data->progs = (s_list_t *) s_malloc(sizeof(s_list_t)); s_list_init(dtop_data->progs); i = 0; while (!s_list_eol(cfg->category, i)) { cat = s_list_get(cfg->category, i++); if (strcmp(cat->name, "desktop") == 0) { j = 0; while (!s_list_eol(cat->variable, j)) { var = s_list_get(cat->variable, j++); if (strcmp(var->name, "show_desktop") == 0) { dtop_data->show_desktop = atoi(var->value); } else if (strcmp(var->name, "scale_img") == 0) { dtop_data->scale_img = atoi(var->value); } else if (strcmp(var->name, "bg_image") == 0) { dtop_data->bg_image = strdup(var->value); } else if (strcmp(var->name, "bg_color") == 0) { char *ptr = strchr(var->value, 'x'); if (ptr != NULL) { ptr++; } else { ptr = var->value; } dtop_data->bg_color = (s_image_hex2int(ptr + 0) << 0x10) | (s_image_hex2int(ptr + 2) << 0x08) | (s_image_hex2int(ptr + 4) << 0x00); } } } else if (strcmp(cat->name, "desktop_prog") == 0) { j = 0; while (!s_list_eol(cat->variable, j)) { var = s_list_get(cat->variable, j++); dtopp = (dtop_prog_t *) s_calloc(1, sizeof(dtop_prog_t)); dtopp->name = strdup(var->name); tmp = strdup(var->value); str = tmp; ptr = strchr(str, '|'); *ptr = '\0'; dtopp->icon = strdup(str); str = ptr + 1; ptr = strchr(str, '|'); *ptr = '\0'; dtopp->exec = strdup(str); str = ptr + 1; ptr = strchr(str, '|'); *ptr = '\0'; dtopp->x = atoi(str); str = ptr + 1; dtopp->y = atoi(str); s_free(tmp); if ((dtopp->name != NULL) && (*(dtopp->name) != '\0') && (dtopp->icon != NULL) && (*(dtopp->icon) != '\0') && (dtopp->exec != NULL) && (*(dtopp->exec) != '\0')) { s_list_add(dtop_data->progs, dtopp, -1); } else { s_free(dtopp->name); s_free(dtopp->icon); s_free(dtopp->exec); s_free(dtopp); } } } } window->client->user_data = (void *) dtop_data; s_client_atexit(window, desktop_atexit); s_fillbox(window->surface, 0, 0, window->surface->width, window->surface->height, s_rgbcolor(window->surface, dtop_data->bg_color >> 0x10 & 0xFF, dtop_data->bg_color >> 0x08 & 0xFF, dtop_data->bg_color >> 0x00 & 0xFF)); if ((dtop_data->bg_image != NULL) && (*(dtop_data->bg_image) != '\0')) { bgpath = (char *) s_malloc(sizeof(char) * (strlen(DESKTOPDIR "/img/wpaper/") + strlen(dtop_data->bg_image) + 1)); sprintf(bgpath, "%s/img/wpaper/%s", DESKTOPDIR, dtop_data->bg_image); desktop_background(window, bgpath); s_free(bgpath); } desktop_icons(window); if (dtop_data->show_desktop == 1) { s_window_show(window); } s_client_main(window);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?