📄 simplecalc.c
字号:
switch (action) { case NUM0: if (position == 0) { updateDisplay(); break; } case NUM1 ... NUM9: emtk_label_hide(exponent_id); insertChar(action - NUM0 + '0'); current_register->value = getDouble(); updateDisplay(); break; case ADD: temp = current_register->value; if (stack_length(stack) > 1) { setDisplay(evaluate()); updateDisplay(); } current_register->op = OP_ADD; current_register = register_new(); current_register->value = temp; stack_push(stack, current_register); clearBuffer(); break; case SUB: temp = current_register->value; if (stack_length(stack) > 1) { setDisplay(evaluate()); updateDisplay(); } current_register->op = OP_SUB; current_register = register_new(); current_register->value = temp; stack_push(stack, current_register); clearBuffer(); break; case MUL: current_register->op = OP_MUL; current_register = register_new(); stack_push(stack, current_register); clearBuffer(); break; case DIV: current_register->op = OP_DIV; current_register = register_new(); stack_push(stack, current_register); clearBuffer(); break; case SQRT: current_register->value = sqrt(current_register->value); setDisplay(current_register->value); updateDisplay(); clearBuffer(); break; case SIGN: current_register->value *= -1; if (position > 0) { if (current_register->value >= 0) position--; else position++; } else { position = 1; } setDisplay(current_register->value); updateDisplay(); break; case PERCENT: current_register->value = current_register->value / 100; setDisplay(current_register->value); updateDisplay(); clearBuffer(); break; case EQ: setDisplay(evaluate()); updateDisplay(); clearBuffer(); position = 0; break; case ALLCLEAR: all_clear(); clearBuffer(); updateDisplay(); break; case CLEAR: current_register->value = 0; clearBuffer(); updateDisplay(); break; case DOT: if (!decimal) { if (position == 0) { insertChar('0'); } insertChar('.'); decimal = TRUE; } updateDisplay(); break; case MEMADD: memory += current_register->value; if (memory != 0.0) emtk_label_show(memory_id); else emtk_label_hide(memory_id); break; case MEMSUB: memory -= current_register->value; if (memory != 0.0) emtk_label_show(memory_id); else emtk_label_hide(memory_id); break; case MEMCLEAR: memory = 0.0; emtk_label_hide(memory_id); break; case MEMRELEASE: current_register->value = memory; setDisplay(memory); updateDisplay(); break; case BACK: if (position > 1) { buffer[--position] = '\0'; } else if (position == 1) { position--; buffer[0] = '0'; buffer[1] = '.'; } updateDisplay(); current_register->value = getDouble(); break; }}static void drawWnd(int wid, WindowRect *rect) { int i; int ascent, descent; int font, small_fn, width; font = lookupFont("en_US", LARGE_FONT); small_fn = lookupFont("en_US", SMALL_FONT); for (i = 0; buttondefs[i].on != NULL; i++) { #ifdef TEXT_ONLY_BUTTON buttons[i] = emtk_button_new(wid, COL(buttondefs[i].col), ROW(buttondefs[i].row), buttondefs[i].w, buttondefs[i].h, font, buttondefs[i].str, buttondefs[i].key, btnHandler, (void *) buttondefs[i].action); emtk_button_set_border_width(buttons[i], 1);#else buttons[i] = emtk_button_new(wid, COL(buttondefs[i].col), ROW(buttondefs[i].row), buttondefs[i].w, buttondefs[i].h, font, "", buttondefs[i].key, btnHandler, (void *) buttondefs[i].action); emtk_button_set_pixmap(buttons[i], buttondefs[i].on, buttondefs[i].off, FALSE); emtk_button_set_border_width(buttons[i], 0);#endif emtk_window_add_object(wid, buttons[i]); } emtk_get_font_height(font, &ascent, &descent); display_id = emtk_label_new(wid, 20, ascent+descent+2, font, FALSE, NULL_DISPLAY); width = emtk_string_display_length("8888888888888.", font) + 23; exponent_id = emtk_label_new(wid, width, 18, small_fn, FALSE, ""); memory_id = emtk_label_new(wid, 5, 18, small_fn, FALSE, "M"); emtk_window_add_object(wid, display_id); emtk_window_add_object(wid, exponent_id); emtk_window_add_object(wid, memory_id); emtk_label_hide(memory_id); }#ifdef MERGE_EMTK_LAUNCHERextern void launcher_app_close_callback();#endifstatic void closeHandler(int window, void *data) { int *feedback = (int *) data; *feedback = EMTK_APP_WINDOW_DESTROY_WITH_EMTK_CLOSE; stack_free(stack); //emtk_app_close(); #ifdef MERGE_EMTK_LAUNCHER emtk_app_close_window(app_window); launcher_app_close_callback();#else //emtk_app_close();#endif /* MERGE_EMTK_LAUNCHER */}static void init() { app_window = emtk_app_window_new(_("Calculator"), FONT2, drawWnd, closeHandler, NULL); position = 0; memory = 0.0; stack = stack_new(); current_register = register_new(); stack_push(stack, current_register);}#ifdef LAUNCHER_SUPPORTstatic void simplecalc_desktop_msg(MSG *mesg, gpointer user_data) { g_return_if_fail(mesg != NULL); if (mesg->type == MSG_TYPE_COMMAND && mesg->subtype == MSG_COMMAND_CLOSE) { emtk_app_close_window(app_window); }}#endif /* LAUNCHER_SUPPORT */#ifdef MERGE_EMTK_LAUNCHERint simpcalc_main(int argc, char **argv)#elseint main(int argc, char **argv)#endif /* MERGE_EMTK_LAUNCHER */{#if !defined(MERGE_EMTK_LAUNCHER)#ifdef LAUNCHER_SUPPORT DESKTOP_CHANNEL channel; if (!desktop_channel_listen_connect(&channel, simplecalc_desktop_msg, NULL)) { printf("Error opening listening channel\n"); return 1; }#endif /* LAUNCHER_SUPPORT */ init_font_table(NULL); i18n_init(); emtk_app_init(&argc, &argv); emtk_app_root(APP_X, APP_Y, APP_W, APP_H);#endif /* !defined(MERGE_EMTK_LAUNCHER) */ init(); #if !defined(MERGE_EMTK_LAUNCHER) emtk_app_run(); unload_font_table(); #ifdef LAUNCHER_SUPPORT desktop_channel_listen_disconnect(&channel);#endif /* LAUNCHER_SUPPORT */#endif /* !defined(MERGE_EMTK_LAUNCHER) */ return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -