aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/obm/ObmW/iconutil.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/x11iraf/obm/ObmW/iconutil.c
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'vendor/x11iraf/obm/ObmW/iconutil.c')
-rw-r--r--vendor/x11iraf/obm/ObmW/iconutil.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/vendor/x11iraf/obm/ObmW/iconutil.c b/vendor/x11iraf/obm/ObmW/iconutil.c
new file mode 100644
index 00000000..d1392966
--- /dev/null
+++ b/vendor/x11iraf/obm/ObmW/iconutil.c
@@ -0,0 +1,297 @@
+/*
+
+The converter from String to Icon knows about a few preloaded icons:
+FATAL, ERROR, WARNING, QUESTION, INFO, emptysquare, filledsquare,
+emptydiamond, filleddiamond and none. Other names are assumed to be
+names of files in XPM format.
+
+An Icon is a combination of a Pixmap and a mask. The mask is
+constructed from the pixels that are marked `none' (i.e.,
+`transparent') in the XPM data. The other pixels end up in the icon's
+pixmap. The actual colors depend on many factors, but the XPM format
+offers a way of defining `dynamic' colors, i.e., colors that are
+chosen at run time instead of by the icon's designer. The designer can
+assign symbolic names to colors, such as `foreground' or `shadow'. The
+application can then replace the symbolic names with actual colors
+when the icon is loaded.
+
+The type converter tries to automate this process. When an icon is
+loaded, the function looks for symbolic color names that match
+resources of the widget into which the icon isloaded. E.g., if the
+icon has a symbolic color `mainColor' and the widget has resource of
+the same name, the value of the resource will be used as the actual
+color for the icon.
+
+In this way, icons can be created that fit the widget, whatever the
+colors of that widget.
+
+Good symbolic names to use are `background' (defined in every widget),
+`foreground' (defined e.g., in |XfwfLabel|), `topShadowColor' and
+`bottomShadowColor' (defined in |XfwfFrame|).
+
+The implementation is as follows: the pixmap for the icon actually has
+to be created twice; once to get the list of symbolic colors and again
+with the replacement colors. When the XPM data is not preloaded, it is
+read from a file. The data is converted to an icon, converted back,
+and then again converted to an icon with new colors.
+
+The converter is passed one extra argument: the widget that the icon
+is loaded into. It must be in |args[0].addr|.
+
+The table of colors to override is set to a fixed size of 20. This
+should be enough for most applications: how many widgets have more
+than 20 color resources?
+
+*/
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "Converters.h"
+#include "done.h"
+#include "bitmaps/FATAL.pm"
+#include "bitmaps/ERROR.pm"
+#include "bitmaps/WARNING.pm"
+#include "bitmaps/QUESTION.pm"
+#include "bitmaps/INFO.pm"
+#include "bitmaps/square0.pm"
+#include "bitmaps/square1.pm"
+#include "bitmaps/diamond0.pm"
+#include "bitmaps/diamond1.pm"
+#include "bitmaps/square0s.pm"
+#include "bitmaps/square1s.pm"
+#include "bitmaps/diamond0s.pm"
+#include "bitmaps/diamond1s.pm"
+#include "bitmaps/square0m.pm"
+#include "bitmaps/square1m.pm"
+#include "bitmaps/diamond0m.pm"
+#include "bitmaps/diamond1m.pm"
+
+#define MAXCOLORSYM 20
+
+
+
+/* Here are the quarks for the built-in icons names. */
+
+static XrmQuark filleddiamondq, emptydiamondq, filledsquareq, emptysquareq,
+ QUESTIONq, FATALq, ERRORq, WARNINGq, INFOq, noneq;
+static XrmQuark diamond0sq, diamond1sq, square0sq, square1sq;
+static XrmQuark diamond0mq, diamond1mq, square0mq, square1mq;
+
+static Boolean initialized = False;
+
+
+
+/* This function initializes the quarks. */
+
+static void init_icon_quarks()
+{
+ filleddiamondq = XrmPermStringToQuark("filleddiamond");
+ emptydiamondq = XrmPermStringToQuark("emptydiamond");
+ filledsquareq = XrmPermStringToQuark("filledsquare");
+ emptysquareq = XrmPermStringToQuark("emptysquare");
+
+ diamond0sq = XrmPermStringToQuark("diamond0s");
+ diamond1sq = XrmPermStringToQuark("diamond1s");
+ square0sq = XrmPermStringToQuark("square0s");
+ square1sq = XrmPermStringToQuark("square1s");
+
+ diamond0mq = XrmPermStringToQuark("diamond0m");
+ diamond1mq = XrmPermStringToQuark("diamond1m");
+ square0mq = XrmPermStringToQuark("square0m");
+ square1mq = XrmPermStringToQuark("square1m");
+
+ QUESTIONq = XrmPermStringToQuark("QUESTION");
+ FATALq = XrmPermStringToQuark("FATAL");
+ ERRORq = XrmPermStringToQuark("ERROR");
+ WARNINGq = XrmPermStringToQuark("WARNING");
+ INFOq = XrmPermStringToQuark("INFO");
+ noneq = XrmPermStringToQuark("none");
+
+ initialized = True;
+}
+
+
+/* The function |file_to_xpmimage| is called by the type converter
+ * |cvtStringToIcon|. It reads a file in XPM format into an XPM image and
+ * prints error messages in case of failure.
+ */
+static void file_to_xpmimage (dpy, file, image)
+ Display *dpy;
+ String file;
+ XpmImage *image;
+{
+ Cardinal one = 1;
+ int status;
+
+ status = XpmReadFileToXpmImage (file, image, NULL, NULL);
+
+ switch (status) {
+ case XpmOpenFailed:
+ case XpmFileInvalid:
+ case XpmNoMemory:
+ XtAppWarningMsg
+ (XtDisplayToApplicationContext(dpy), "cvtStringToIcon",
+ "fileError", "XtToolkitError", "Failed to create icon \"%s\"",
+ (XtPointer) &file, &one);
+ break;
+ case XpmColorError:
+ case XpmColorFailed:
+ XtAppWarningMsg
+ (XtDisplayToApplicationContext(dpy), "cvtStringToIcon",
+ "allocColor", "XtToolkitError",
+ "Could not get (all) colors for image \"%s\"",
+ (XtPointer) &file, &one);
+ break;
+ case XpmSuccess:
+ ; /* skip */
+ }
+}
+
+
+/* The function |data_to_xpmimage| is also called by the type converter
+ * |cvtStringToIcon|. It converts data in XPM format into an XPM image and
+ * prints error messages in case of failure.
+ */
+static void data_to_xpmimage (dpy, data, image)
+ Display *dpy;
+ String *data;
+ XpmImage *image;
+{
+ int status;
+
+ status = XpmCreateXpmImageFromData (data, image, NULL);
+
+ switch (status) {
+ case XpmOpenFailed:
+ case XpmFileInvalid:
+ case XpmNoMemory:
+ XtAppWarningMsg
+ (XtDisplayToApplicationContext(dpy), "cvtStringToIcon",
+ "fileError", "XtToolkitError", "Failed to create an icon",
+ NULL, NULL);
+ break;
+ case XpmColorError:
+ case XpmColorFailed:
+ XtAppWarningMsg
+ (XtDisplayToApplicationContext(dpy), "cvtStringToIcon",
+ "allocColor", "XtToolkitError",
+ "Could not get (all) colors for some icon", NULL, NULL);
+ break;
+ case XpmSuccess:
+ ; /* skip */
+ }
+}
+
+
+/* The function |build_colortable| is also called from
+|cvtStringToIcon|. It looks through all the resources for resources that
+specify a color (|Pixel|). All such resources and their values are
+entered in the table.
+
+To get at the resource value, the |resource_offset| (an unsigned int)
+must be added to the base address of the widget. The widget pointer is
+first converted to an unsigned long, tehn the offset is added to it and
+the result is converted back to a pointer, in this case a pointer to a
+|Pixel|. */
+
+static void build_colortable(self, table, size, n)
+ Widget self;
+ XpmColorSymbol *table;
+ Cardinal size;
+ Cardinal *n;
+{
+ Cardinal nres, i;
+ XtResourceList res;
+
+ *n = 0;
+ XtGetResourceList(XtClass(self), &res, &nres);
+ for (i = 0; i < nres; i++)
+ if (strcmp(res[i].resource_type, XtRPixel) == 0 && *n < size) {
+ table[*n].name = res[i].resource_name;
+ table[*n].value = NULL;
+ table[*n].pixel =
+ * (Pixel*) ((unsigned long) self + res[i].resource_offset);
+ (*n)++;
+ }
+ if (res)
+ XtFree ((char *)res); /* MF037 */
+}
+
+
+
+Boolean cvtStringToIcon(dpy, args, num_args, from, to, converter_data)
+ Display *dpy;
+ XrmValue *args;
+ Cardinal *num_args;
+ XrmValue *from;
+ XrmValue *to;
+ XtPointer *converter_data;
+{
+ static XpmColorSymbol table[MAXCOLORSYM];
+ String *data = NULL, s = (String) from->addr;
+ Widget self = (Widget) args[0].addr;
+ XpmImage image;
+ Icon *view;
+ Cardinal n;
+ XrmQuark q;
+
+ if (! initialized) init_icon_quarks();
+
+ if (*num_args != 1)
+ XtAppErrorMsg
+ (XtDisplayToApplicationContext(dpy),
+ "cvtStringToIcon", "wrongParameters", "XtToolkitError",
+ "String to Icon conversion needs one argument: a widget",
+ (String*) NULL, (Cardinal*) NULL);
+
+ view = (Icon*) XtCalloc(1, sizeof(*view));
+ q = XrmStringToQuark(s);
+ /*
+ * Convert the input icon or XPM file into an XPM image.
+ */
+ if (q == filleddiamondq) data_to_xpmimage(dpy, diamond1, &image);
+ else if (q == emptydiamondq) data_to_xpmimage(dpy, diamond0, &image);
+ else if (q == filledsquareq) data_to_xpmimage(dpy, square1, &image);
+ else if (q == emptysquareq) data_to_xpmimage(dpy, square0, &image);
+ else if (q == diamond0sq) data_to_xpmimage(dpy, diamond0s, &image);
+ else if (q == diamond1sq) data_to_xpmimage(dpy, diamond1s, &image);
+ else if (q == square0sq) data_to_xpmimage(dpy, square0s, &image);
+ else if (q == square1sq) data_to_xpmimage(dpy, square1s, &image);
+ else if (q == diamond0mq) data_to_xpmimage(dpy, diamond0m, &image);
+ else if (q == diamond1mq) data_to_xpmimage(dpy, diamond1m, &image);
+ else if (q == square0mq) data_to_xpmimage(dpy, square0m, &image);
+ else if (q == square1mq) data_to_xpmimage(dpy, square1m, &image);
+ else if (q == QUESTIONq) data_to_xpmimage(dpy, QUESTION, &image);
+ else if (q == FATALq) data_to_xpmimage(dpy, FATAL, &image);
+ else if (q == ERRORq) data_to_xpmimage(dpy, ERROR, &image);
+ else if (q == WARNINGq) data_to_xpmimage(dpy, WARNING, &image);
+ else if (q == INFOq) data_to_xpmimage(dpy, INFO, &image);
+ else if (q == noneq) {XtFree((String)view); done(Icon*, NULL);}
+ else file_to_xpmimage(dpy, s, &image);
+
+ /*
+ * Convert back to String format
+ */
+ if (image.width > 0 && image.height > 0)
+ XpmCreateDataFromXpmImage(&data, &image, NULL);
+
+ /*
+ * Construct color replacement table and create icon.
+ */
+ if (data) {
+ build_colortable(self, table, XtNumber(table), &n);
+ view->attributes.colorsymbols = table;
+ view->attributes.numsymbols = n;
+ view->attributes.valuemask = XpmColorSymbols;
+ (void) XpmCreatePixmapFromData(dpy, DefaultRootWindow(dpy), data,
+ &view->pixmap, &view->mask,
+ &view->attributes);
+ XtFree((String) data);
+ XpmFreeXpmImage (&image);
+ done(Icon*, view);
+
+ } else {
+ XtFree ((String)view);
+ done(Icon*, NULL);
+ }
+}