mc/xv/xvaction.c

115 lines
2.9 KiB
C

/* XView Action Icons (for Drag and Drop).
Copyright (C) 1995 Jakub Jelinek.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <config.h>
#include <stdlib.h>
#include "setup.h"
#include "profile.h"
#include "xvmain.h"
#include "ext.h"
#include "mad.h"
#ifdef HAVE_XPM_SHAPE
#include "xvicon.h"
extern char *regex_command_title;
extern Display *dpy;
void add_action_icon (char *filename, char *geometry)
{
char *iconname, *title, *p, *base = x_basename (filename);
int x, y, z;
XpmIcon *icon;
iconname = regex_command (base, "Icon", NULL, NULL);
if (iconname == NULL)
iconname = strdup ("file.xpm");
if (*iconname != '/') {
p = copy_strings (ICONDIR, iconname, NULL);
free (iconname);
iconname = p;
}
title = regex_command_title;
if (title == NULL)
title = strdup (base);
else {
char *q, *r;
y = strlen (filename);
z = strlen (base);
for (q = title, x = 1; *q; q++, x++)
if (*q == '%') {
if (q [1] == 'p')
x += z - 2;
else if (q [1] == 'd')
x += y - 2;
}
r = xmalloc (x, "Icon Title");
for (q = title, p = r; *q; q++, p++)
if (*q == '%') {
if (q [1] == 'p') {
strcpy (p, base);
p += z - 1;
q++;
} else if (q [1] == 'd') {
strcpy (p, filename);
p += y - 1;
q++;
} else
*p = *q;
} else
*p = *q;
*p = 0;
free (title);
title = r;
}
x = atoi (geometry);
for (p = geometry; *p && (*p < '0' || *p > '9'); p++);
for (; *p >= '0' && *p <= '9'; p++);
y = atoi (p);
icon = CreateXpmIcon (iconname, x, y, title);
if (icon != NULL) {
icon->filename = strdup (filename);
}
free (iconname);
free (title);
XFlush (dpy);
xv_dispatch_a_bit ();
}
#endif
void xv_action_icons (void)
{
#ifdef HAVE_XPM_SHAPE
char *key, *value;
void *keys = profile_init_iterator ("Action Icons", profile_name);
xv_dispatch_a_bit ();
if (keys == NULL) {
add_action_icon ("/bin/rm", "+45+100");
add_action_icon ("/usr/bin/lpr", "+45+160");
}
while (keys != NULL) {
keys = profile_iterator_next (keys, &key, &value);
add_action_icon (key, value);
}
#endif
}