about summary refs log tree commit diff
path: root/xwin.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2017-07-04 14:01:44 +0200
committerLeah Neukirchen <leah@vuxu.org>2017-07-04 14:01:44 +0200
commit42b6dbbbde03ac9134658fc531a1294a96f1d33d (patch)
tree680286c2b2fe4511059791f27103f1237a5de35b /xwin.c
downloadxdu-42b6dbbbde03ac9134658fc531a1294a96f1d33d.tar.gz
xdu-42b6dbbbde03ac9134658fc531a1294a96f1d33d.tar.xz
xdu-42b6dbbbde03ac9134658fc531a1294a96f1d33d.zip
Initial import of xdu-3.0.orig
Diffstat (limited to 'xwin.c')
-rw-r--r--xwin.c496
1 files changed, 496 insertions, 0 deletions
diff --git a/xwin.c b/xwin.c
new file mode 100644
index 0000000..dbecb5d
--- /dev/null
+++ b/xwin.c
@@ -0,0 +1,496 @@
+/*
+ * XDU - X Window System Interface.
+ *
+ * We hide all of the X hieroglyphics inside of this module.
+ *
+ * Phillip C. Dykstra
+ * <phil@arl.mil>
+ * 4 Sep 1991.
+ * 
+ * Copyright (c)	Phillip C. Dykstra	1991, 1993, 1994
+ * The X Consortium, and any party obtaining a copy of these files from
+ * the X Consortium, directly or indirectly, is granted, free of charge, a
+ * full and unrestricted irrevocable, world-wide, paid up, royalty-free,
+ * nonexclusive right and license to deal in this software and
+ * documentation files (the "Software"), including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons who receive
+ * copies from any such party to do so.  This license includes without
+ * limitation a license to do the foregoing actions under any patents of
+ * the party supplying this software to the X Consortium.
+ */
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/AsciiSrc.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Label.h>
+
+#include <stdio.h>
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>	/* for exit() */
+#endif
+
+/* IMPORTS: routines that this module vectors out to */
+extern int press();
+extern int reset();
+extern int repaint();
+extern int reorder();
+extern int setorder();
+extern int nodeinfo();
+extern int helpinfo();
+extern int ncols;
+
+/* EXPORTS: routines that this module exports outside */
+extern int xsetup();
+extern int xmainloop();
+extern int xclear();
+extern int xrepaint();
+extern int xrepaint_noclear();
+extern int xdrawrect();
+
+/* internal routines */
+static void help_popup();
+static void help_popdown();
+
+static String fallback_resources[] = {
+"*window.width:		600",
+"*window.height:	480",
+"*help.width:		500",
+"*help.height:		330",
+"*order:		first",
+NULL
+};
+
+/* Application Resources */
+typedef struct {
+	Pixel	foreground;
+	Pixel	background;
+	XFontStruct *font;
+	int	ncol;
+	Boolean	showsize;
+	char	*order;
+} res_data, *res_data_ptr;
+static res_data res;
+
+static XtResource application_resources[] = {
+	{ XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+		XtOffset(res_data_ptr,foreground), XtRString, XtDefaultForeground},
+	{ XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel),
+		XtOffset(res_data_ptr,background), XtRString, XtDefaultBackground},
+	{ XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
+		XtOffset(res_data_ptr,font), XtRString, XtDefaultFont },
+	{ "ncol", "Ncol", XtRInt, sizeof(int),
+		XtOffset(res_data_ptr,ncol), XtRString, "5"},
+	{ "showsize", "ShowSize", XtRBoolean, sizeof(Boolean),
+		XtOffset(res_data_ptr,showsize), XtRString, "True"},
+	{ "order", "Order", XtRString, sizeof(String),
+		XtOffset(res_data_ptr,order), XtRString, "first"}
+};
+
+/* Command Line Options */
+static XrmOptionDescRec options[] = {
+	{"-c",		"*ncol",	XrmoptionSepArg,	NULL},
+	{"+s",		"*showsize",	XrmoptionNoArg,		"True"},
+	{"-s",		"*showsize",	XrmoptionNoArg,		"False"},
+	{"-n",		"*order",	XrmoptionNoArg,		"size"},
+	{"-rn",		"*order",	XrmoptionNoArg,		"rsize"},
+	{"-a",		"*order",	XrmoptionNoArg,		"alpha"},
+	{"-ra",		"*order",	XrmoptionNoArg,		"ralpha"}
+};
+
+/* action routines */
+static void a_goto();
+static void a_reset();
+static void a_quit();
+static void a_reorder();
+static void a_size();
+static void a_ncol();
+static void a_info();
+static void a_help();
+static void a_removehelp();
+
+static XtActionsRec actionsTable[] = {
+	{ "reset",	a_reset },
+	{ "goto",	a_goto },
+	{ "quit",	a_quit },
+	{ "reorder",	a_reorder },
+	{ "size",	a_size },
+	{ "ncol",	a_ncol },
+	{ "info",	a_info },
+	{ "help",	a_help },
+	{ "RemoveHelp",	a_removehelp }
+};
+
+static char defaultTranslations[] = "\
+<Key>Q:	quit()\n\
+<Key>Escape: quit()\n\
+:<Key>/: reset()\n\
+<Key>S:	size()\n\
+<Key>I:	info()\n\
+<Key>H: help()\n\
+<Key>Help: help()\n\
+:<Key>?: help()\n\
+<Key>A:	reorder(alpha)\n\
+<Key>N:	reorder(size)\n\
+<Key>F:	reorder(first)\n\
+<Key>L:	reorder(last)\n\
+<Key>R:	reorder(reverse)\n\
+<Key>1:	ncol(1)\n\
+<Key>2:	ncol(2)\n\
+<Key>3:	ncol(3)\n\
+<Key>4:	ncol(4)\n\
+<Key>5:	ncol(5)\n\
+<Key>6:	ncol(6)\n\
+<Key>7:	ncol(7)\n\
+<Key>8:	ncol(8)\n\
+<Key>9:	ncol(9)\n\
+<Key>0:	ncol(10)\n\
+<Btn1Down>: goto()\n\
+<Btn2Down>: reset()\n\
+<Btn3Down>: quit()\n\
+";
+
+/*  action routines  */
+
+static void a_quit(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
+	exit(0);
+}
+
+static void a_goto(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	press(event->xbutton.x, event->xbutton.y);
+}
+
+static void a_reset(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	reset();
+}
+
+static void a_reorder(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	if (*num_params != 1) {
+		fprintf(stderr, "xdu: bad number of params to reorder action\n");
+	} else {
+		reorder(*params);
+	}
+}
+
+static void a_size(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	if (res.showsize)
+		res.showsize = 0;
+	else
+		res.showsize = 1;
+	xrepaint();
+}
+
+static void a_ncol(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	int	n;
+
+	if (*num_params != 1) {
+		fprintf(stderr, "xdu: bad number of params to ncol action\n");
+		return;
+	}
+	n = atoi(*params);
+	if (n < 1 || n > 1000) {
+		fprintf(stderr, "xdu: bad value to ncol action\n");
+		return;
+	}
+	ncols = res.ncol = n;
+	xrepaint();
+}
+
+static void a_info(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	nodeinfo();
+}
+
+static void a_help(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	/*helpinfo();*/
+	help_popup();
+}
+
+static void a_removehelp(w, event, params, num_params)
+Widget w;
+XEvent *event;
+String *params;
+Cardinal *num_params;
+{
+	help_popdown();
+}
+
+/* callback routines */
+
+static void c_resize(w, data, event, continue_to_dispatch)
+Widget w;
+XtPointer data;
+XEvent *event;
+Boolean *continue_to_dispatch;
+{
+	/*printf("Resize\n");*/
+	xrepaint();
+}
+
+static void c_repaint(w, data, event, continue_to_dispatch)
+Widget w;
+XtPointer data;
+XEvent *event;
+Boolean *continue_to_dispatch;
+{
+	/*printf("Expose\n");*/
+	xrepaint_noclear();
+}
+
+/* X Window related variables */
+static Cursor WorkingCursor;
+static Display *dpy;
+static int screen;
+static Visual *vis;
+static Window win;
+static GC gc;
+static GC cleargc;
+static XtAppContext app_con;
+
+Widget toplevel;
+
+/*  External Functions  */
+
+int
+xsetup(argcp, argv)
+int *argcp;
+char **argv;
+{
+	XtTranslations trans_table;
+	Widget w;
+	XGCValues gcv;
+	int n;
+	Arg args[5];
+
+	/* Create the top level Widget */
+	n = 0;
+	XtSetArg(args[n], XtNtitle, "XDU Disk Usage Display ('h' for help)\n"); n++;
+	toplevel = XtAppInitialize(&app_con, "XDu",
+			options, XtNumber(options),
+			argcp, argv,
+			fallback_resources, args, n);
+
+	XtGetApplicationResources(toplevel, (XtPointer)&res,
+		application_resources, XtNumber(application_resources),
+		NULL, 0 );
+
+	XtAppAddActions(app_con, actionsTable, XtNumber(actionsTable));
+	trans_table = XtParseTranslationTable(defaultTranslations);
+
+	/* Create a simple Label class widget to draw in */
+	n = 0;
+	XtSetArg(args[n], XtNlabel, ""); n++;
+	w = XtCreateManagedWidget("window", labelWidgetClass, toplevel,
+		args, n);
+
+	/* events */
+	XtAddEventHandler(w, ExposureMask, False, c_repaint, NULL);
+	XtAddEventHandler(w, StructureNotifyMask, False, c_resize, NULL);
+	XtAugmentTranslations(w, trans_table);
+
+	XtRealizeWidget(toplevel);
+
+	/* We need these for the raw Xlib calls */
+	win = XtWindow(w);
+	dpy = XtDisplay(w);
+	screen = DefaultScreen(dpy);
+	vis = DefaultVisual(dpy,screen);
+
+	gcv.foreground = res.foreground;
+	gcv.background = res.background;
+	gcv.font = res.font->fid;
+	gc = XCreateGC(dpy, win, (GCFont|GCForeground|GCBackground), &gcv);
+
+	setorder(res.order);
+	ncols = res.ncol;
+}
+
+xmainloop()
+{
+	XtAppMainLoop(app_con);
+	return(0);
+}
+
+xclear()
+{
+	XClearWindow(dpy, win);
+}
+
+xrepaint()
+{
+	XWindowAttributes xwa;
+
+	XClearWindow(dpy, win);
+	XGetWindowAttributes(dpy, win, &xwa);
+	repaint(xwa.width, xwa.height);
+}
+
+xrepaint_noclear()
+{
+	XWindowAttributes xwa;
+
+	XGetWindowAttributes(dpy, win, &xwa);
+	repaint(xwa.width, xwa.height);
+}
+
+xdrawrect(name, size, x, y, width, height)
+char *name;
+int size;
+int x, y, width, height;
+{
+	int	textx, texty;
+	char	label[1024];
+	XCharStruct overall;
+	int	ascent, descent, direction;
+	int	cheight;
+
+	/*printf("draw(%d,%d,%d,%d)\n", x, y, width, height );*/
+	XDrawRectangle(dpy, win, gc, x, y, width, height);
+
+	if (res.showsize) {
+		sprintf(label,"%s (%d)", name, size);
+		name = label;
+	}
+
+	XTextExtents(res.font, name, strlen(name), &direction,
+		&ascent, &descent, &overall);
+	cheight = overall.ascent + overall.descent;
+	if (height < (cheight + 2))
+		return;
+
+	/* print label */
+	textx = x + 4;
+	texty = y + height/2.0 + (overall.ascent - overall.descent)/2.0 + 1.5;
+	XDrawString(dpy, win, gc, textx, texty, name, strlen(name));
+}
+
+static Widget popup;
+
+static void
+help_popup()
+{
+	Widget form, text, src;
+	Arg args[15];
+	int n;
+	Atom wm_delete_window;
+	XtTranslations trans_table;
+
+	if (popup != NULL) {
+		XtPopup(popup, XtGrabNone);
+		return;
+	}
+
+	/* popup shell */
+	n = 0;
+	XtSetArg(args[n], XtNtitle, "XDU Help"); n++;
+	popup = XtCreatePopupShell("helpPopup", transientShellWidgetClass,
+		toplevel, args, n);
+
+	/* form container */
+	n = 0;
+	XtSetArg(args[n], XtNborderWidth, 0); n++;
+	XtSetArg(args[n], XtNdefaultDistance, 0); n++;
+	form = XtCreateManagedWidget("form", formWidgetClass,
+		popup, args, n);
+
+	/* text widget in form */
+	n = 0;
+	XtSetArg(args[n], XtNborderWidth, 0); n++;
+	XtSetArg(args[n], XtNresize, XawtextResizeBoth); n++;
+	/* fallback resources weren't working here on the Sun */
+	XtSetArg(args[n], XtNwidth, 500); n++;
+	XtSetArg(args[n], XtNheight, 330); n++;
+	text = XtCreateManagedWidget("help", asciiTextWidgetClass,
+		form, args, n);
+
+	/* create text source */
+	n = 0;
+	XtSetArg(args[n], XtNtype, XawAsciiString); n++;
+	XtSetArg(args[n], XtNeditType, XawtextRead); n++;
+	XtSetArg(args[n], XtNstring, "\
+XDU Version 3.0 - Phil Dykstra <phil@arl.mil>\n\
+\n\
+Keyboard Commands\n\
+  a  sort alphabetically\n\
+  n  sort numerically (largest first)\n\
+  f  sort first-in-first-out\n\
+  l  sort last-in-first-out\n\
+  r  reverse sort\n\
+  s  toggle size display\n\
+  /  goto the root\n\
+  i  node info to standard out\n\
+  h  this help message\n\
+  q  quit (also Escape)\n\
+0-9  set number of columns (0=10)\n\
+\n\
+Mouse Commands\n\
+  Left   Goto node (goto parent if leftmost box)\n\
+  Middle Back to root\n\
+  Right  Quit\n\
+"); n++;
+	src = XtCreateWidget("textSource", asciiSrcObjectClass,
+		text, args, n);
+	/* set text source */
+	XawTextSetSource(text, src, 0);
+
+	XtRealizeWidget(popup);
+	XtPopup(popup, XtGrabNone);
+
+	trans_table = XtParseTranslationTable("<Key>Q: RemoveHelp()");
+	XtAugmentTranslations(form, trans_table);
+
+	/* Set up ICCCM delete window */
+	wm_delete_window = XInternAtom(XtDisplay(popup), "WM_DELETE_WINDOW", False);
+	XtOverrideTranslations(popup, XtParseTranslationTable("<Message>WM_PROTOCOLS: RemoveHelp()"));
+	XSetWMProtocols(XtDisplay(popup), XtWindow(popup), &wm_delete_window, 1);
+}
+
+static void
+help_popdown()
+{
+	XtPopdown(popup);
+}