diff options
Diffstat (limited to 'Build/source/texk/xdvik/gui/xicon.c')
-rw-r--r-- | Build/source/texk/xdvik/gui/xicon.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/Build/source/texk/xdvik/gui/xicon.c b/Build/source/texk/xdvik/gui/xicon.c new file mode 100644 index 00000000000..15faa32442a --- /dev/null +++ b/Build/source/texk/xdvik/gui/xicon.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2001 Marcin Dalecki + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/* + * Implement a nice and well behaved application icon. + */ + +#include "xdvi-config.h" +#include "xdvi.h" +#include "xicon.h" +#include "util.h" +#include "xdvi-debug.h" + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xos.h> +#include <X11/Xfuncs.h> +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> +#include <X11/Shell.h> + +#ifdef MOTIF +# include <Xm/XmStrDefs.h> +#endif + +#if defined(HAVE_X11_XPM_H) +# include <X11/xpm.h> +#elif defined(HAVE_XPM_H) +# include <xpm.h> +#elif defined(HAVE_XM_XPMP_H) +# include <Xm/XpmP.h> +#endif + +#include "xdvi.icon" +#include "pixmaps/xdvi32x32.xpm" +#include "pixmaps/xdvi16x16.xpm" +#include "pixmaps/xdvi48x48.xpm" +void +add_icon(Widget top_level, + String title_name, + String icon_name) +{ +#if !HAVE_XPM + + static Arg args[] = { + {XtNiconX, (XtArgVal) 0}, + {XtNiconY, (XtArgVal) 0}, + }; + static Pixmap icon_pm; + static Arg temp_args4 = { XtNiconPixmap, (XtArgVal) &icon_pm }; + + UNUSED(xdvi16x16_xpm); + UNUSED(xdvi32x32_xpm); + UNUSED(xdvi48x48_xpm); + + if (resource.icon_geometry != NULL) { + int junk; + + (void)XGeometry(DISP, XScreenNumberOfScreen(SCRN), + resource.icon_geometry, "", + 0, 0, 0, 0, 0, + (int *)&args[0].value, + (int *)&args[1].value, + &junk, + &junk); + XtSetValues(top_level, args, XtNumber(args)); + } + /* Set icon pixmap */ + XtGetValues(top_level, &temp_args4, 1); + if (icon_pm == (Pixmap) 0) { + temp_args4.value = + (XtArgVal)XCreateBitmapFromData(DISP, + RootWindowOfScreen(SCRN), + (const char *)xdvi_bits, + xdvi_width, + xdvi_height); + XtSetValues(top_level, &temp_args4, 1); + } +#else /* HAVE_XPM */ + + /* Use Pixmaps, looking much nicer. */ + + static Pixmap icon = 0; + static Pixmap icon_mask = 0; + static const char **pixmap_data = xdvi32x32_xpm; + XIconSize *size; + int number_sizes; + Display *dsp; + Screen *scr; + XpmAttributes attr; + + UNUSED(xdvi_bits); + /* + * get the icon size preferred by the window manager + */ + if (XGetIconSizes(XtDisplay(top_level), RootWindowOfScreen(SCRN), + &size, &number_sizes) != 0) { + if (number_sizes > 0) { + if (size->max_height >= 48 && size->max_height >= 48) + pixmap_data = xdvi48x48_xpm; + else if (size->max_height >= 32 && size->max_height >= 32) + pixmap_data = xdvi32x32_xpm; + else if (size->max_height >= 16 && size->max_height >= 16) + pixmap_data = xdvi16x16_xpm; + } + } + + dsp = XtDisplay(top_level); + scr = XtScreen(top_level); + + attr.valuemask = 0L; + attr.valuemask = XpmCloseness | XpmReturnPixels | XpmColormap | XpmDepth | XpmVisual; + attr.closeness = 65535; /* accuracy isn't crucial */ + /* use the same visual/colormap/depth as main window, else BadMatch ... */ + attr.visual = G_visual; + attr.colormap = G_colormap; + attr.depth = G_depth; + + if (!icon) { + Window rootWindow = XtWindow(globals.widgets.top_level); + ASSERT(rootWindow != 0, ""); + XpmCreatePixmapFromData(dsp, rootWindow, (char **)pixmap_data, + &icon, &icon_mask, &attr); + } + +# ifdef MOTIF + XtVaSetValues(top_level, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL); +# else + XtVaSetValues(top_level, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL); +# endif + + XpmFreeAttributes(&attr); +#endif + + { + /* code locality ... */ + static Arg args[] = { + { XtNtitle, (XtArgVal) 0 }, + { XtNiconName, (XtArgVal) 0 }, + { XtNinput, (XtArgVal) True }, + }; + + args[0].value = (XtArgVal)title_name; + args[1].value = (XtArgVal)icon_name; + XtSetValues(top_level, args, XtNumber(args)); + } +} |