The class Manager uses sub groups for the hotkeys:GRAPHICPS *graphicps_resource (G_RESOURCE_DESCR *descr, G_LIST *rclist) { GRAPHICPS *self; G_INFO_PS *info; int error = FALSE, used = FALSE, pass = FALSE; self = (GRAPHICPS *) START_METHOD (G_INSTANCE); ASSURE (self, "", END_METHOD (NULL)); info = (G_INFO_PS *)self->info; /* special command: help prints all possible values */ if (!strcmp (descr->ident, "help")) { used = TRUE; pass = TRUE; printf ("Help for section \"/GraphicPs\":\n" "The simple values are:\n"); g_resourcelist_print (rclist); printf ("Additionally available:\n" "\trgb_to_gray of type VEC3 value %f %f %f\n" "\tfilename of type string value %s\n" "\thelp\n", info->rgb_to_gray_scale[0], info->rgb_to_gray_scale[1], info->rgb_to_gray_scale[2], info->file_name); } /* first try to resolve simple single values */ if (!error && !used) used = g_resourcelist_find (rclist, descr, &error); /* none of them: hand-code the rest */ if (!error && !used) switch (descr->type) { case dfGroup: /* no groups defined for now in GraphicPs */ break; case dfDouble: if (!strcmp (descr->ident, "rgb_to_gray")) { static int rgb_to_gray_next = 0; /* vector handling not very good for now, wait for further revisions * of rcdev; don't use vectors before that */ if (rgb_to_gray_next == descr->index) { info->rgb_to_gray_scale[descr->index] = *(double *)descr->value; rgb_to_gray_next = (descr->index + 1) % 3; used = TRUE; } else { error = TRUE; fprintf (stderr, "rgb_to_gray: index error\n"); } } break; case dfString: if (!strcmp (descr->ident, "filename")) if (!descr->index && strlen (descr->value) < (size_t) MAX_STRLEN) { GRAPE (self, "set-filename")(descr->value); used = TRUE; } else error = TRUE; break; default: break; } if ((pass || (!error && !used)) && GRAPE (self, "find-method")("^resource")) GRAPE (self, "^resource")(descr, NULL); if (error || !used) { g_resourcedev_not_found ((INSTANCE *)self, descr); END_METHOD (NULL); } END_METHOD (self); } G_LIST *graphicps_get_rclist (void) { GRAPHICPS *self; G_LIST *rclist = NULL; G_INFO_PS *info; self = (GRAPHICPS *) START_METHOD (G_INSTANCE); ASSURE (self, "", END_METHOD (NULL)); if (GRAPE (self, "find-method")("^get-rclist")) rclist = (G_LIST *)GRAPE (self, "^get-rclist")(); /* list must be created now because the variable addresses are not known at * compile/load time. */ info = (G_INFO_PS *)self->info; rclist = g_rclist_add (rclist, "use_colors", &info->use_colors, dfInt); g_rclist_add (rclist, "patch_bounds", &info->use_patch_bounds, dfInt); g_rclist_add (rclist, "optimal_rotate", &info->optimal_rotate, dfInt); g_rclist_add (rclist, "optimal_stretch", &info->optimal_stretch, dfInt); g_rclist_add (rclist, "linewidth", &info->linewidth, dfDouble); [...] END_METHOD (rclist); } static void read_graperc (GRAPHICPS *self) { g_resourcedev_parse ((INSTANCE *)self, "/GraphicPs"); }
static int hotkey_has_key = FALSE; MANAGER *manager_resource_hotkey (G_RESOURCE_DESCR *descr, G_LIST *rclist) { MANAGER *self; int error = FALSE, used = FALSE; self = (MANAGER *) START_METHOD (G_INSTANCE); ASSURE (self, "", END_METHOD (NULL)); /* special command: help prints all possible values */ if (!strcmp (descr->ident, "help")) { used = TRUE; printf ("Help for section \"/Manager/hotkey\":\n" "\tpossible tags:\n" "\tkey string\n" "\titem string\n" "\tsend string\n" "\tclick string\n"); [...] printf ("\thelp\n"); } /* none of them: hand-code the rest */ if (!error && !used) switch (descr->type) { case dfInt: [...] break; case dfString: if (!strcmp (descr->ident, "key")) { GRAPE (self, "add-hotkey")(descr->value); used = TRUE; hotkey_has_key = TRUE; } else if (hotkey_has_key) { if (!strcmp (descr->ident, "send")) { GRAPE (self, "add-hot-action")(hatSendMethod, descr->value, 0, 1); used = TRUE; } else if (!strcmp (descr->ident, "click")) { GRAPE (self, "add-hot-action")(hatMouseClick, descr->value, 3, 1); used = TRUE; } [...] break; default: break; } if (error || !used) { g_resourcedev_not_found ((INSTANCE *)self, descr); END_METHOD (NULL); } END_METHOD (self); } MANAGER *manager_resource (G_RESOURCE_DESCR *descr, G_LIST *rclist) { MANAGER *self; int error = FALSE, used = FALSE, pass = FALSE; self = (MANAGER *) START_METHOD (G_INSTANCE); ASSURE (self, "", END_METHOD (NULL)); /* special command: help prints all possible values */ if (!strcmp (descr->ident, "help")) { used = TRUE; pass = TRUE; printf ("Help for section \"/Manager\":\n" "The simple values are:\n"); g_resourcelist_print (rclist); printf ("Additionally available:\n" "\thotkey of type Group\n" "\thelp\n"); } /* first try to resolve simple single values */ if (!error && !used) used = g_resourcelist_find (rclist, descr, &error); /* none of them: hand-code the rest */ if (!error && !used) switch (descr->type) { case dfGroup: if (!strcmp (descr->ident, "hotkey")) { RESOURCEDEV *rcdev; rcdev = (RESOURCEDEV *) GRAPE (ResourceDev, "get-stddev")(); hotkey_has_key = FALSE; GRAPE (rcdev, "parse")("=", self, "resource-hotkey", NULL); used = TRUE; } break; default: break; } if ((pass || (!error && !used)) && GRAPE (self, "find-method")("^resource")) GRAPE (self, "^resource")(descr, NULL); if (error || !used) { g_resourcedev_not_found ((INSTANCE *)self, descr); END_METHOD (NULL); } END_METHOD (self); } G_LIST *manager_get_rclist (void) { MANAGER *self; G_LIST *rclist = NULL; self = (MANAGER *) START_METHOD (G_INSTANCE); ASSURE (self, "", END_METHOD (NULL)); if (GRAPE (self, "find-method")("^get-rclist")) rclist = (G_LIST *)GRAPE (self, "^get-rclist")(); rclist = g_rclist_add (rclist, "ask_on_exit", &self->ask_on_exit, dfInt); END_METHOD (rclist); } [...] { [...] g_resourcedev_parse ((INSTANCE *)mgr, "/Manager"); [...] }
Copyright © by the Sonderforschungsbereich 256 at the Institut für Angewandte Mathematik, Universität Bonn.