menu.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 227 行
C
227 行
/*************************************************************************** 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 start_menu_atexit (s_window_t *window){ tbar_data_t *tbar_data; tbar_data = (tbar_data_t *) window->client->user_data; if (window->parent->type & WINDOW_CHILD) { taskbar_start_menu_handler_rh(window->parent, NULL, NULL); } tbar_data->tbar_smenu->running = 0;}smenu_prog_t * start_menu_list_find_menu (smenu_prog_t *prog, s_list_t *list){ int p = 0; smenu_prog_t *s; smenu_prog_t *sp; while (!s_list_eol(list, p)) { sp = (smenu_prog_t *) s_list_get(list, p++); if (sp->type == SMENU_MENU) { if (strcmp(sp->name, prog->menu) == 0) { return sp; } if ((s = start_menu_list_find_menu(prog, sp->progs)) != NULL) { return s; } } } return NULL;}void start_menu_handler (s_window_t *window, s_event_t *event, s_handler_t *handler){ smenu_prog_t *sprog; tbar_data_t *tbar_data; sprog = (smenu_prog_t *) handler->user_data; tbar_data = (tbar_data_t *) window->client->user_data; if (sprog->type == SMENU_PROG) { desktop_self_system(sprog->exec); return; } else if (sprog->type == SMENU_MENU) { start_menu_start(window, sprog->progs, window->surface->buf.x + window->surface->buf.w - 12, window->surface->buf.y + handler->mouse.y + handler->mouse.h); }}void start_menu_start (s_window_t *pwindow, s_list_t *progs, int wx, int wy){ int fy; int fx; int fw; int fh; int p = 0; char *file; char *vbuf; char *tbuf; s_font_t *font; s_image_t *img; s_surface_t s; s_window_t *temp; s_handler_t *hndl; smenu_prog_t *sprog; tbar_data_t *tbar_data; fx = 30; fy = 22; fw = 150; fh = progs->nb_elt * fy + 13; tbar_data = (tbar_data_t *) pwindow->client->user_data; tbar_data->tbar_smenu->running = 1; s_client_init(&temp); s_window_new(temp, WINDOW_TEMP | NO_FORM, pwindow); s_window_set_coor(temp, 0, wx, wy - fh - 1, fw, fh); s_fillbox(temp->surface, 0, 0, temp->surface->buf.w, temp->surface->buf.h, s_rgbcolor(temp->surface, 0, 0, 0)); s_fillbox(temp->surface, 1, 1, temp->surface->buf.w - 2, temp->surface->buf.h - 2, s_rgbcolor(temp->surface, 255, 255, 255)); s_fillbox(temp->surface, 1, 1, 24, temp->surface->buf.h - 2, s_rgbcolor(temp->surface, 197, 198, 189)); s_font_init(&font, "arial.ttf"); s_font_set_size(font, 13); while (!s_list_eol(progs, p)) { sprog = (smenu_prog_t *) s_list_get(progs, p++); if ((sprog->icon != NULL) && (*(sprog->icon) != '\0')) { s_image_init(&img); file = (char *) s_malloc(sizeof(char) * (strlen(DESKTOPDIR "/img/icons/") + strlen(sprog->icon) + 1)); sprintf(file, "%s/img/icons/%s", DESKTOPDIR, sprog->icon); s_image_img(file, img); s_image_get_handler(img); tbuf = (char *) s_malloc(temp->surface->bytesperpixel * 18 * 18); vbuf = (char *) s_malloc(temp->surface->bytesperpixel * img->w * img->h + 1); s_getsurfacevirtual(&s, img->w, img->h, temp->surface->bitsperpixel, vbuf); s_fillbox(&s, 0, 0, img->w, img->h, s_rgbcolor(&s, 197, 198, 199)); s_putboxrgba(&s, 0, 0, img->w, img->h, img->rgba); s_scalebox(temp->surface, img->w, img->h, vbuf, 18, 18, tbuf); s_putbox(temp->surface, 4, 2 + fy - 16, 18, 18, tbuf); s_image_uninit(img); s_free(file); s_free(vbuf); s_free(tbuf); } s_font_set_str(font, sprog->name); s_font_get_glyph(font); s_image_get_handler(font->img); s_putboxrgba(temp->surface, fx, fy - font->yMax, font->img->w, font->img->h, font->img->rgba); s_handler_init(&hndl); hndl->type = MOUSE_HANDLER; hndl->mouse.x = fx; hndl->mouse.y = fy - font->img->h + font->img->handler.y; hndl->mouse.w = fw - 50; hndl->mouse.h = font->img->h; hndl->mouse.p = start_menu_handler; hndl->mouse.button = MOUSE_LEFTBUTTON; hndl->user_data = sprog; s_handler_add(temp, hndl); if (sprog->type == SMENU_MENU) { s_font_set_str(font, ">"); s_font_get_glyph(font); s_image_get_handler(font->img); s_putboxrgba(temp->surface, fw - font->img->w - 10, fy - font->yMax, font->img->w, font->img->h, font->img->rgba); } fy += 22; } s_font_uninit(font); s_client_atexit(temp, start_menu_atexit); temp->client->user_data = tbar_data; s_window_show(temp); s_client_main(temp);}void start_menu_setup (s_window_t *twindow, s_config_t *cfg){ int i; int j; char *str; char *ptr; char *tmp; s_config_cat_t *cat; s_config_var_t *var; smenu_prog_t *sprog; tbar_data_t *tbar_data; tbar_data = (tbar_data_t *) twindow->client->user_data; i = 0; while (!s_list_eol(cfg->category, i)) { cat = s_list_get(cfg->category, i++); if (strcmp(cat->name, "taskbar_prog") == 0) { j = 0; while (!s_list_eol(cat->variable, j)) { sprog = (smenu_prog_t *) s_calloc(1, sizeof(smenu_prog_t)); sprog->progs = (s_list_t *) s_malloc(sizeof(s_list_t)); s_list_init(sprog->progs); var = s_list_get(cat->variable, j++); sprog->name = strdup(var->name); tmp = strdup(var->value); str = tmp; ptr = strchr(str, '|'); *ptr = '\0'; sprog->icon = strdup(str); str = ptr + 1; ptr = strchr(str, '|'); *ptr = '\0'; sprog->exec = strdup(str); str = ptr + 1; sprog->menu = strdup(str); s_free(tmp); if ((sprog->name != NULL) && (*(sprog->name) != '\0')) { if ((sprog->exec != NULL) && (*(sprog->exec) != '\0')) { sprog->type = SMENU_PROG; } else { sprog->type = SMENU_MENU; } if ((sprog->menu != NULL) && (*(sprog->menu) != '\0')) { smenu_prog_t *sp; if ((sp = start_menu_list_find_menu(sprog, tbar_data->tbar_smenu->progs)) != NULL) { s_list_add(sp->progs, sprog, -1); } else { goto add_top; } } else {add_top: s_list_add(tbar_data->tbar_smenu->progs, sprog, -1); } } else { s_free(sprog->name); s_free(sprog->icon); s_free(sprog->exec); s_free(sprog->menu); s_free(sprog->progs); s_free(sprog); } } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?