static void SelectPath(AG_Event *event) { char path[AG_PATHNAME_MAX]; AG_Window *win; AG_DirDlg *dd; char *key = AG_STRING(1); AG_Textbox *tbox = AG_PTR(2); win = AG_WindowNew(0); dd = AG_DirDlgNew(win, AG_DIRDLG_EXPAND|AG_DIRDLG_CLOSEWIN); AG_GetString(agConfig, key, path, sizeof(path)); if (AG_DirDlgSetDirectoryS(dd, path) == -1) { AG_MkPath(path); (void)AG_DirDlgSetDirectoryS(dd, path); } AG_WindowSetGeometryAlignedPct(win, AG_WINDOW_MC, 30, 30); AG_WindowSetCaption(win, _("Select %s directory"), key); AG_DirDlgOkAction(dd, SelectPathOK, "%s,%p,%p", key, tbox, win); AG_WindowShow(win); }
static void CreateWindow(void) { AG_Window *win; AG_Label *lbl; AG_Console *cons; win = AG_WindowNew(0); AG_WindowSetCaption(win, "Agar keyboard events demo"); lbl = AG_LabelNew(win, AG_LABEL_HFILL, "Agar keyboard events demo"); AG_LabelJustify(lbl, AG_TEXT_CENTER); AG_SeparatorNewHoriz(win); cons = AG_ConsoleNew(win, AG_CONSOLE_EXPAND); AG_ConsoleMsg(cons, "Press any key..."); /* * Attach our event handler function to both keydown and keyup * events of the Window object. Note that we could have used * any other object derived from the Widget class. */ AG_SetEvent(win, "key-down", MyKeyboardHandler, "%p", cons); AG_SetEvent(win, "key-up", MyKeyboardHandler, "%p", cons); /* * Enable reception of keydown/keyup events by the window, regardless * of whether it is currently focused or not. */ AGWIDGET(win)->flags |= AG_WIDGET_UNFOCUSED_KEYUP; AGWIDGET(win)->flags |= AG_WIDGET_UNFOCUSED_KEYDOWN; AG_ButtonNewFn(win, AG_BUTTON_HFILL, "Quit", Quit, NULL); AG_WindowShow(win); AG_WindowSetGeometryAlignedPct(win, AG_WINDOW_MC, 30, 30); }
static int TestGUI(void *obj, AG_Window *win) { M_Plotter *plt; AG_Pane *pane; AG_Numerical *num; AG_Box *box; int i; pane = AG_PaneNew(win, AG_PANE_HORIZ, AG_PANE_EXPAND); { /* Create our plotter widget */ plt = M_PlotterNew(pane->div[1], M_PLOTTER_EXPAND); /* * Create the velocity plot item. This is what our algorithm * computes. */ plVel = M_PlotNew(plt, M_PLOT_LINEAR); M_PlotSetLabel(plVel, "m/s"); M_PlotSetYoffs(plVel, -45); M_PlotSetScale(plVel, 0.0, 50.0); /* Create a label we will use to show the "case". */ plblCase = M_PlotLabelNew(plVel, M_LABEL_OVERLAY, 0, 16, "-"); /* Plot the derivative of the velocity (the acceleration). */ plAcc = M_PlotFromDerivative(plt, M_PLOT_LINEAR, plVel); M_PlotSetLabel(plAcc, "m/s^2"); M_PlotSetScale(plAcc, 0.0, 3000.0); /* Plot the derivative of the acceleration (the jerk). */ plJerk = M_PlotFromDerivative(plt, M_PLOT_LINEAR, plAcc); M_PlotSetLabel(plJerk, "m/s^3"); M_PlotSetScale(plJerk, 0.0, 100.0); M_PlotSetScale(plJerk, 0.0, 150000.0); M_PlotSetYoffs(plJerk, 70); } /* Allow the user to play with the parameters. */ box = AG_BoxNew(pane->div[0], AG_BOX_VERT, AG_BOX_EXPAND); { struct { const char *name; M_Real *f; double incr; } param[7] = { { "Jmax: ", &Jmax, 0.00001 }, { "Amax: ", &Amax, 0.0005 }, { "F: ", &F, 0.01 }, { "L: ", &L, 10.0 }, { "Ts tweak: ", &uTs, 1.0 }, { "Ta tweak: ", &uTa, 1.0 }, { "To tweak: ", &uTo, 1.0 }, }; for (i = 0; i < 7; i++) { num = AG_NumericalNewS(box, AG_NUMERICAL_HFILL, NULL, param[i].name); AG_BindDouble(num, "value", param[i].f); AG_SetDouble(num, "inc", param[i].incr); AG_SetEvent(num, "numerical-changed", GeneratePlot, "%p", plt); } AG_SeparatorNewHoriz(box); AG_LabelNewPolled(box, AG_LABEL_HFILL, "Aref: %lf", &Aref); AG_LabelNewPolled(box, AG_LABEL_HFILL, "v1: %lf", &v1); AG_LabelNewPolled(box, AG_LABEL_HFILL, "v2: %lf", &v2); AG_LabelNewPolled(box, AG_LABEL_HFILL, "v3: %lf", &v3); AG_LabelNewPolled(box, AG_LABEL_HFILL, "Ts: %lf", &Ts); AG_LabelNewPolled(box, AG_LABEL_HFILL, "Ta: %lf", &Ta); AG_LabelNewPolled(box, AG_LABEL_HFILL, "To: %lf", &To); AG_ButtonNewFn(box, AG_BUTTON_HFILL, "Generate", GeneratePlot, "%p", plt); } AG_SetEvent(win, "window-shown", GeneratePlot, "%p", plt); AG_WindowSetGeometryAlignedPct(win, AG_WINDOW_MC, 50, 30); return (0); }