next up previous contents index
Next: Utility Classes and Functions Up: Resource file .graperc Previous: Utility Functions on class

Code Example : Resource Device Implementation in the Postscript Driver

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");
}
The class Manager uses sub groups for the hotkeys:
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");
  [...]
}



SFB 256 Universität Bonn and IAM Universität Freiburg

Copyright © by the Sonderforschungsbereich 256 at the Institut für Angewandte Mathematik, Universität Bonn.