1999-11-27 09:58:33 -08:00
|
|
|
#ifndef __LCLINT__
|
1999-11-12 11:54:11 -08:00
|
|
|
#include "config.h"
|
1999-11-27 09:58:33 -08:00
|
|
|
#endif
|
1999-10-13 08:14:42 -07:00
|
|
|
#include "epplet.h"
|
|
|
|
#include <errno.h>
|
|
|
|
#include <sys/utsname.h>
|
1999-10-13 10:34:12 -07:00
|
|
|
#include <signal.h>
|
1999-10-13 10:41:41 -07:00
|
|
|
#include <sys/wait.h>
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static Display *disp = NULL;
|
|
|
|
static Window win = 0;
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
static Window real_win = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
static ImlibData *id = NULL;
|
|
|
|
static Display *dd = NULL;
|
|
|
|
static Window comms_win = 0;
|
|
|
|
static Window my_win = 0;
|
|
|
|
static Window root = 0;
|
|
|
|
static ETimer *q_first = NULL;
|
|
|
|
static XContext xid_context = 0;
|
|
|
|
static int win_w = 0;
|
|
|
|
static int win_h = 0;
|
|
|
|
static Pixmap bg_pmap = 0;
|
|
|
|
static Pixmap bg_mask = 0;
|
|
|
|
static Pixmap bg_bg = 0;
|
|
|
|
static char win_vert = 0;
|
|
|
|
|
|
|
|
static char *conf_dir = NULL;
|
|
|
|
static char *epplet_name = NULL;
|
|
|
|
static char *epplet_cfg_file = NULL;
|
|
|
|
static int epplet_instance = 0;
|
|
|
|
|
|
|
|
static int gad_num = 0;
|
|
|
|
static Epplet_gadget *gads = NULL;
|
1999-11-29 10:00:00 -08:00
|
|
|
static Epplet_gadget last_gadget = NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
|
|
|
static void *expose_data = NULL;
|
|
|
|
static void *moveresize_data = NULL;
|
|
|
|
static void *buttonpress_data = NULL;
|
|
|
|
static void *buttonrelease_data = NULL;
|
|
|
|
static void *mousemotion_data = NULL;
|
|
|
|
static void *keypress_data = NULL;
|
|
|
|
static void *keyrelease_data = NULL;
|
|
|
|
static void *enter_data = NULL;
|
|
|
|
static void *leave_data = NULL;
|
|
|
|
static void *focusin_data = NULL;
|
|
|
|
static void *focusout_data = NULL;
|
|
|
|
static void *event_data = NULL;
|
|
|
|
static void *comms_data = NULL;
|
|
|
|
static void *child_data = NULL;
|
|
|
|
|
|
|
|
static void (*expose_func) (void *data, Window win, int x, int y, int w,
|
1999-11-29 10:00:00 -08:00
|
|
|
int h) = NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*moveresize_func) (void *data, Window win, int x, int y,
|
1999-11-29 10:00:00 -08:00
|
|
|
int w, int h) = NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*buttonpress_func) (void *data, Window win, int x, int y,
|
1999-11-29 10:00:00 -08:00
|
|
|
int b) = NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*buttonrelease_func) (void *data, Window win, int x, int y,
|
1999-11-29 10:00:00 -08:00
|
|
|
int b) = NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*mousemotion_func) (void *data, Window win, int x, int y) =
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*keypress_func) (void *data, Window win, char *key) = NULL;
|
|
|
|
static void (*keyrelease_func) (void *data, Window win, char *key) =
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
NULL;
|
1999-11-16 13:02:11 -08:00
|
|
|
static void (*enter_func) (void *data, Window win) = NULL;
|
|
|
|
static void (*leave_func) (void *data, Window win) = NULL;
|
|
|
|
static void (*focusin_func) (void *data, Window win) = NULL;
|
|
|
|
static void (*focusout_func) (void *data, Window win) = NULL;
|
|
|
|
static void (*event_func) (void *data, XEvent * ev) = NULL;
|
|
|
|
static void (*comms_func) (void *data, char *s) = NULL;
|
|
|
|
static void (*child_func) (void *data, int pid, int exit_code) = NULL;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
#define MWM_HINTS_DECORATIONS (1L << 1)
|
|
|
|
typedef struct _mwmhints
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
unsigned long functions;
|
|
|
|
unsigned long decorations;
|
|
|
|
long inputMode;
|
|
|
|
unsigned long status;
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
MWMHints;
|
|
|
|
struct _etimer
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
char *name;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
double in;
|
|
|
|
char just_added;
|
|
|
|
ETimer *next;
|
|
|
|
};
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
#define ESYNC ECommsSend("nop");free(ECommsWaitForMessage());
|
|
|
|
|
1999-10-18 08:50:58 -07:00
|
|
|
/* The structures for the config file management ... */
|
1999-10-22 09:43:22 -07:00
|
|
|
typedef struct _configdict
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
ConfigItem *entries;
|
|
|
|
int num_entries;
|
|
|
|
}
|
1999-10-22 09:43:22 -07:00
|
|
|
ConfigDict;
|
1999-10-18 08:50:58 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static ConfigDict *config_dict = NULL;
|
|
|
|
|
|
|
|
static void CommsFindCommsWindow(void);
|
|
|
|
static void ECommsSetup(Display * d);
|
|
|
|
static void CommsHandleDestroy(Window win);
|
|
|
|
static int CommsHandlePropertyNotify(XEvent * ev);
|
|
|
|
static void CommsFindCommsWindow(void);
|
|
|
|
static void ECommsSend(char *s);
|
|
|
|
static char *ECommsGet(XEvent * ev);
|
|
|
|
static char *ECommsWaitForMessage(void);
|
|
|
|
static void Epplet_handle_timer(void);
|
|
|
|
static ETimer *Epplet_get_first(void);
|
|
|
|
static void Epplet_handle_event(XEvent * ev);
|
|
|
|
static void ECommsSend(char *s);
|
|
|
|
static Bool ev_check(Display * d, XEvent * ev, XPointer p);
|
|
|
|
static char *win_name = NULL;
|
|
|
|
static char *win_version = NULL;
|
|
|
|
static char *win_info = NULL;
|
|
|
|
|
|
|
|
static void Epplet_redraw(void);
|
|
|
|
static void Epplet_event(Epplet_gadget gadget, XEvent * ev);
|
|
|
|
static void Epplet_add_gad(Epplet_gadget gadget);
|
|
|
|
static void Epplet_del_gad(Epplet_gadget gadget);
|
|
|
|
static void Epplet_draw_button(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_textbox(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_togglebutton(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_drawingarea(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_hslider(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_vslider(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_hbar(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_vbar(Epplet_gadget eg);
|
|
|
|
static void Epplet_draw_image(Epplet_gadget eg, char un_only);
|
|
|
|
static void Epplet_draw_label(Epplet_gadget eg, char un_only);
|
|
|
|
static void Epplet_draw_popup(Epplet_gadget gadget);
|
|
|
|
static void Epplet_draw_popupbutton(Epplet_gadget eg);
|
|
|
|
static void Epplet_popup_arrange_contents(Epplet_gadget gadget);
|
|
|
|
static void Epplet_prune_events(XEvent * ev, int num);
|
|
|
|
static void Epplet_handle_child(int num);
|
|
|
|
static void Epplet_textbox_handle_keyevent(XEvent * ev,
|
|
|
|
|
|
|
|
Epplet_gadget g);
|
1999-11-27 08:17:16 -08:00
|
|
|
static void Epplet_textbox_textsize(Epplet_gadget gadget, int *w,
|
|
|
|
int *h, char *s);
|
1999-11-16 13:02:11 -08:00
|
|
|
static void Epplet_find_instance(char *name);
|
|
|
|
|
|
|
|
ImlibData *
|
1999-11-09 10:51:02 -08:00
|
|
|
Epplet_get_imlib_data(void)
|
|
|
|
{
|
1999-11-09 11:02:15 -08:00
|
|
|
return (id);
|
1999-11-09 10:51:02 -08:00
|
|
|
}
|
|
|
|
|
1999-11-28 14:08:49 -08:00
|
|
|
typedef enum gad_type
|
|
|
|
{
|
|
|
|
E_BUTTON,
|
|
|
|
E_DRAWINGAREA,
|
|
|
|
E_TEXTBOX,
|
|
|
|
E_HSLIDER,
|
|
|
|
E_VSLIDER,
|
|
|
|
E_TOGGLEBUTTON,
|
|
|
|
E_POPUPBUTTON,
|
|
|
|
E_POPUP,
|
|
|
|
E_IMAGE,
|
|
|
|
E_LABEL,
|
|
|
|
E_HBAR,
|
|
|
|
E_VBAR
|
|
|
|
}
|
|
|
|
GadType;
|
|
|
|
|
|
|
|
typedef struct gad_general
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
GadType type;
|
|
|
|
char visible;
|
|
|
|
}
|
1999-11-28 14:08:49 -08:00
|
|
|
GadGeneral;
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_send_ipc(char *s)
|
|
|
|
{
|
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
char *
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_wait_for_ipc(void)
|
|
|
|
{
|
|
|
|
return ECommsWaitForMessage();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_Init(char *name,
|
1999-11-16 13:02:11 -08:00
|
|
|
char *version,
|
|
|
|
char *info, int w, int h, int argc, char **argv, char vertical)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
struct sigaction sa;
|
|
|
|
char s[1024];
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
Atom a;
|
|
|
|
XTextProperty xtp;
|
|
|
|
XClassHint *xch;
|
|
|
|
XSizeHints sh;
|
|
|
|
struct utsname ubuf;
|
|
|
|
MWMHints mwm;
|
|
|
|
unsigned long val;
|
1999-11-24 09:16:39 -08:00
|
|
|
char *msg;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
w *= 16;
|
|
|
|
h *= 16;
|
|
|
|
disp = XOpenDisplay(NULL);
|
|
|
|
id = Imlib_init(disp);
|
|
|
|
if (!disp)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Epplet Error: Cannot open display\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
ECommsSetup(disp);
|
|
|
|
XSelectInput(disp, DefaultRootWindow(disp), PropertyChangeMask);
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
/* Find the instance number for this instance and compose the name from it */
|
1999-10-22 15:09:18 -07:00
|
|
|
Epplet_find_instance(name);
|
1999-10-22 09:43:22 -07:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
/* create a window with everythign set */
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = StructureNotifyMask | ButtonPressMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
ButtonReleaseMask | PointerMotionMask | EnterWindowMask |
|
|
|
|
LeaveWindowMask | KeyPressMask | KeyReleaseMask | ButtonMotionMask |
|
|
|
|
ExposureMask | FocusChangeMask | PropertyChangeMask |
|
|
|
|
VisibilityChangeMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, w, h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
|
|
|
|
/* set hints to be borderless */
|
|
|
|
mwm.flags = MWM_HINTS_DECORATIONS;
|
|
|
|
mwm.functions = 0;
|
|
|
|
mwm.decorations = 0;
|
|
|
|
mwm.inputMode = 0;
|
|
|
|
mwm.status = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
a = XInternAtom(disp, "_MOTIF_WM_HINTS", False);
|
1999-10-13 08:14:42 -07:00
|
|
|
XChangeProperty(disp, win, a, a, 32, PropModeReplace,
|
|
|
|
(unsigned char *)&mwm, sizeof(MWMHints) / 4);
|
|
|
|
|
|
|
|
/* set the window title , name , class */
|
1999-10-22 09:43:22 -07:00
|
|
|
XStoreName(disp, win, epplet_name);
|
1999-10-13 08:14:42 -07:00
|
|
|
xch = XAllocClassHint();
|
1999-10-22 09:43:22 -07:00
|
|
|
xch->res_name = epplet_name;
|
1999-10-13 08:14:42 -07:00
|
|
|
xch->res_class = "Epplet";
|
|
|
|
XSetClassHint(disp, win, xch);
|
|
|
|
XFree(xch);
|
|
|
|
/* set the size hints */
|
|
|
|
sh.flags = PSize | PMinSize | PMaxSize;
|
|
|
|
sh.width = w;
|
|
|
|
sh.height = h;
|
|
|
|
sh.min_width = w;
|
|
|
|
sh.min_height = h;
|
|
|
|
sh.max_width = w;
|
|
|
|
sh.max_height = h;
|
|
|
|
XSetWMNormalHints(disp, win, &sh);
|
|
|
|
/* set the command hint */
|
|
|
|
XSetCommand(disp, win, argv, argc);
|
|
|
|
/* set the client machine name */
|
|
|
|
if (!uname(&ubuf))
|
|
|
|
{
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "%s", ubuf.nodename);
|
1999-10-13 08:14:42 -07:00
|
|
|
xtp.encoding = XA_STRING;
|
|
|
|
xtp.format = 8;
|
|
|
|
xtp.value = (unsigned char *)s;
|
|
|
|
xtp.nitems = strlen((char *)(xtp.value));
|
|
|
|
XSetWMClientMachine(disp, win, &xtp);
|
|
|
|
}
|
|
|
|
/* set the icons name property */
|
1999-10-22 09:43:22 -07:00
|
|
|
XSetIconName(disp, win, epplet_name);
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
/* set sticky & arrange ignore */
|
1999-11-16 13:02:11 -08:00
|
|
|
val = (1 << 0) /* | (1 << 9) */ ;
|
1999-10-13 08:14:42 -07:00
|
|
|
a = XInternAtom(disp, "_WIN_STATE", False);
|
|
|
|
XChangeProperty(disp, win, a, XA_CARDINAL, 32, PropModeReplace,
|
|
|
|
(unsigned char *)&val, 1);
|
|
|
|
/* set the default layer to below */
|
|
|
|
val = 2;
|
|
|
|
a = XInternAtom(disp, "_WIN_LAYER", False);
|
|
|
|
XChangeProperty(disp, win, a, XA_CARDINAL, 32, PropModeReplace,
|
|
|
|
(unsigned char *)&val, 1);
|
|
|
|
/* set skip focus, skip winlist dont cover skip taskbar flags */
|
|
|
|
val = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 5);
|
|
|
|
a = XInternAtom(disp, "_WIN_HINTS", False);
|
1999-11-16 13:02:11 -08:00
|
|
|
XChangeProperty(disp, win, a, XA_CARDINAL, 32, PropModeReplace,
|
1999-10-13 08:14:42 -07:00
|
|
|
(unsigned char *)&val, 1);
|
|
|
|
win_vert = vertical;
|
|
|
|
win_w = w;
|
|
|
|
win_h = h;
|
1999-10-22 09:43:22 -07:00
|
|
|
win_name = epplet_name;
|
1999-10-13 08:14:42 -07:00
|
|
|
win_version = version;
|
|
|
|
win_info = info;
|
1999-11-16 13:02:11 -08:00
|
|
|
xid_context = XUniqueContext();
|
1999-10-13 08:14:42 -07:00
|
|
|
while (!comms_win)
|
|
|
|
{
|
|
|
|
ECommsSetup(disp);
|
|
|
|
sleep(1);
|
|
|
|
}
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "set clientname %s", win_name);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "set version %s", win_version);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "set info %s", win_info);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
ESYNC;
|
1999-11-24 09:16:39 -08:00
|
|
|
|
|
|
|
/* Check if the epplet imageclasses are there. */
|
|
|
|
ECommsSend("imageclass EPPLET_BUTTON query");
|
|
|
|
msg = ECommsWaitForMessage();
|
|
|
|
if (!msg || strstr(msg, "not"))
|
|
|
|
{
|
1999-11-27 08:17:16 -08:00
|
|
|
Epplet_dialog_ok
|
|
|
|
("Epplet Error: Your theme does not contain the imageclasses needed to run epplets.");
|
|
|
|
ESYNC;
|
|
|
|
exit(1);
|
1999-11-24 09:16:39 -08:00
|
|
|
}
|
|
|
|
free(msg);
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_background_properties(win_vert);
|
1999-10-13 10:34:12 -07:00
|
|
|
sa.sa_handler = Epplet_handle_child;
|
|
|
|
sa.sa_flags = SA_RESTART;
|
|
|
|
sigemptyset(&sa.sa_mask);
|
1999-11-16 13:02:11 -08:00
|
|
|
sigaction(SIGCHLD, &sa, (struct sigaction *)0);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Window
|
|
|
|
Epplet_create_window(int w, int h, int x, int y, char *title)
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
{
|
|
|
|
char s[1024];
|
|
|
|
XSetWindowAttributes attr;
|
|
|
|
Atom a;
|
|
|
|
XTextProperty xtp;
|
|
|
|
XClassHint *xch;
|
|
|
|
XSizeHints sh;
|
|
|
|
struct utsname ubuf;
|
|
|
|
MWMHints mwm;
|
|
|
|
char *msg;
|
|
|
|
Window ret;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
static Pixmap wbg_pmap = 0;
|
|
|
|
static Pixmap wbg_mask = 0;
|
|
|
|
static Pixmap wbg_bg = 0;
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
attr.backing_store = NotUseful;
|
|
|
|
attr.override_redirect = False;
|
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = StructureNotifyMask | ButtonPressMask |
|
|
|
|
ButtonReleaseMask | PointerMotionMask | EnterWindowMask |
|
|
|
|
LeaveWindowMask | KeyPressMask | KeyReleaseMask | ButtonMotionMask |
|
|
|
|
ExposureMask | FocusChangeMask | PropertyChangeMask |
|
|
|
|
VisibilityChangeMask;
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
ret = XCreateWindow(disp, DefaultRootWindow(disp), x, y, w, h, 0,
|
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
XSetTransientForHint(disp, ret, win);
|
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
/* set hints to be borderless */
|
|
|
|
mwm.flags = MWM_HINTS_DECORATIONS;
|
|
|
|
mwm.functions = 0;
|
|
|
|
mwm.decorations = 1;
|
|
|
|
mwm.inputMode = 0;
|
|
|
|
mwm.status = 0;
|
|
|
|
a = XInternAtom(disp, "_MOTIF_WM_HINTS", False);
|
|
|
|
XChangeProperty(disp, ret, a, a, 32, PropModeReplace,
|
|
|
|
(unsigned char *)&mwm, sizeof(MWMHints) / 4);
|
|
|
|
|
|
|
|
/* set the window title , name , class */
|
|
|
|
XStoreName(disp, ret, title);
|
|
|
|
xch = XAllocClassHint();
|
|
|
|
xch->res_name = epplet_name;
|
|
|
|
xch->res_class = "Epplet_config";
|
|
|
|
XSetClassHint(disp, ret, xch);
|
|
|
|
XFree(xch);
|
|
|
|
/* set the size hints */
|
|
|
|
sh.flags = PSize | PMinSize | PMaxSize;
|
|
|
|
sh.width = w;
|
|
|
|
sh.height = h;
|
|
|
|
sh.min_width = w;
|
|
|
|
sh.min_height = h;
|
|
|
|
sh.max_width = w;
|
|
|
|
sh.max_height = h;
|
|
|
|
XSetWMNormalHints(disp, ret, &sh);
|
|
|
|
|
|
|
|
/* set the client machine name */
|
|
|
|
if (!uname(&ubuf))
|
|
|
|
{
|
|
|
|
Esnprintf(s, sizeof(s), "%s", ubuf.nodename);
|
|
|
|
xtp.encoding = XA_STRING;
|
|
|
|
xtp.format = 8;
|
|
|
|
xtp.value = (unsigned char *)s;
|
|
|
|
xtp.nitems = strlen((char *)(xtp.value));
|
|
|
|
XSetWMClientMachine(disp, ret, &xtp);
|
|
|
|
}
|
|
|
|
/* set the icons name property */
|
|
|
|
XSetIconName(disp, ret, epplet_name);
|
|
|
|
|
|
|
|
ESYNC;
|
|
|
|
|
|
|
|
/* Check if the epplet imageclasses are there. */
|
|
|
|
ECommsSend("imageclass EPPLET_BUTTON query");
|
|
|
|
msg = ECommsWaitForMessage();
|
|
|
|
if (!msg || strstr(msg, "not"))
|
|
|
|
{
|
|
|
|
Epplet_dialog_ok
|
|
|
|
("Epplet Error: Your theme does not contain the imageclasses needed to run epplets.");
|
|
|
|
ESYNC;
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
free(msg);
|
|
|
|
|
|
|
|
/* Set bg pixmap */
|
|
|
|
if (wbg_pmap)
|
|
|
|
XFreePixmap(disp, bg_pmap);
|
|
|
|
if (wbg_bg)
|
|
|
|
XFreePixmap(disp, bg_bg);
|
|
|
|
if (wbg_mask)
|
|
|
|
XFreePixmap(disp, bg_mask);
|
|
|
|
wbg_pmap = 0;
|
|
|
|
wbg_mask = 0;
|
|
|
|
wbg_bg = 0;
|
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BACKGROUND_HORIZONTAL", "normal",
|
1999-12-01 11:30:19 -08:00
|
|
|
&wbg_bg, &wbg_mask, w, h);
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
wbg_pmap = XCreatePixmap(disp, ret, w, h, id->x.depth);
|
|
|
|
if (!gc)
|
|
|
|
gc = XCreateGC(disp, wbg_pmap, 0, &gcv);
|
|
|
|
XCopyArea(disp, wbg_bg, wbg_pmap, gc, 0, 0, w, h, 0, 0);
|
|
|
|
XSetWindowBackgroundPixmap(disp, ret, wbg_pmap);
|
|
|
|
XShapeCombineMask(disp, ret, ShapeBounding, 0, 0, wbg_mask, ShapeSet);
|
|
|
|
XClearWindow(disp, ret);
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
Epplet_window_switch_context(ret);
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
void
|
|
|
|
Epplet_window_show(Window win)
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
{
|
|
|
|
XEvent ev;
|
|
|
|
|
|
|
|
XMapWindow(disp, win);
|
|
|
|
/* wait for the window to map */
|
|
|
|
XMaskEvent(disp, StructureNotifyMask, &ev);
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
void
|
|
|
|
Epplet_window_hide(Window win)
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
{
|
|
|
|
XEvent ev;
|
|
|
|
|
|
|
|
XUnmapWindow(disp, win);
|
|
|
|
/* wait for the window to unmap */
|
|
|
|
XMaskEvent(disp, StructureNotifyMask, &ev);
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
void
|
|
|
|
Epplet_window_destroy(Window win)
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
{
|
|
|
|
XEvent ev;
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
XDestroyWindow(disp, win);
|
|
|
|
/* wait for the window to be destroyed */
|
|
|
|
XMaskEvent(disp, StructureNotifyMask, &ev);
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
void
|
|
|
|
Epplet_window_switch_context(Window newwin)
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
{
|
1999-12-01 11:30:19 -08:00
|
|
|
if (real_win != newwin)
|
|
|
|
{
|
|
|
|
real_win = win;
|
|
|
|
win = newwin;
|
|
|
|
}
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
void
|
|
|
|
Epplet_window_reset_context(void)
|
|
|
|
{
|
|
|
|
win = real_win;
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
}
|
|
|
|
|
1999-10-18 08:50:58 -07:00
|
|
|
void
|
|
|
|
Epplet_cleanup(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
1999-10-18 08:50:58 -07:00
|
|
|
|
1999-10-22 09:43:22 -07:00
|
|
|
/* remove lock file */
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "%s/.lock_%i", conf_dir, epplet_instance);
|
1999-10-22 09:43:22 -07:00
|
|
|
if (unlink(s) < 0)
|
1999-10-18 08:50:58 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char err[255];
|
|
|
|
|
|
|
|
Esnprintf(err, sizeof(err), "Unable to remove lock file %s -- %s.\n",
|
|
|
|
s, strerror(errno));
|
|
|
|
Epplet_dialog_ok(err);
|
1999-10-22 09:43:22 -07:00
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-22 09:43:22 -07:00
|
|
|
/* save config settings */
|
1999-10-22 15:09:18 -07:00
|
|
|
Epplet_save_config();
|
1999-10-22 09:43:22 -07:00
|
|
|
|
1999-10-22 15:09:18 -07:00
|
|
|
/* Freeing all this memory right before you exit is pretty pointless.... -- mej */
|
|
|
|
#if 0
|
1999-10-22 09:43:22 -07:00
|
|
|
/* free config stuff */
|
|
|
|
if (config_dict)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < config_dict->num_entries; i++)
|
|
|
|
{
|
|
|
|
if (config_dict->entries[i].key)
|
|
|
|
free(config_dict->entries[i].key);
|
|
|
|
if (config_dict->entries[i].value)
|
|
|
|
free(config_dict->entries[i].value);
|
|
|
|
}
|
|
|
|
free(config_dict->entries);
|
|
|
|
free(config_dict);
|
|
|
|
config_dict = NULL;
|
1999-10-18 08:50:58 -07:00
|
|
|
}
|
1999-10-22 09:43:22 -07:00
|
|
|
|
|
|
|
if (conf_dir)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
free(conf_dir);
|
|
|
|
conf_dir = NULL;
|
|
|
|
}
|
1999-10-22 09:43:22 -07:00
|
|
|
if (epplet_name)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
free(epplet_name);
|
|
|
|
epplet_name = NULL;
|
1999-10-22 09:43:22 -07:00
|
|
|
}
|
|
|
|
if (epplet_cfg_file)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
free(epplet_cfg_file);
|
|
|
|
epplet_cfg_file = NULL;
|
1999-10-22 09:43:22 -07:00
|
|
|
}
|
1999-10-22 15:09:18 -07:00
|
|
|
#endif
|
1999-10-22 09:43:22 -07:00
|
|
|
|
1999-10-18 08:50:58 -07:00
|
|
|
}
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
void
|
|
|
|
Epplet_show(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
XEvent ev;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
XMapWindow(disp, win);
|
|
|
|
/* wait for the window to map */
|
|
|
|
XMaskEvent(disp, StructureNotifyMask, &ev);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_remember(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x none", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x layer", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x border", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x location", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x sticky", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x shade", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x group", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x command", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_unremember(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "remember %x none", (unsigned int)win);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
1999-10-25 16:54:10 -07:00
|
|
|
ESYNC;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Window Epplet_get_main_window(void)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
return win;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_imageclass_apply(char *iclass, char *state, Window ww)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
|
|
|
|
|
|
|
Esnprintf(s, sizeof(s), "imageclass %s apply 0x%x %s", iclass,
|
|
|
|
(unsigned int)ww, state);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_paste(char *iclass, char *state, Window ww, int x, int y,
|
1999-10-13 08:14:42 -07:00
|
|
|
int w, int h)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Pixmap p, m;
|
|
|
|
char s[1024], *msg;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
|
|
|
|
Esnprintf(s, sizeof(s), "imageclass %s apply_copy 0x%x %s %i %i", iclass,
|
|
|
|
(unsigned int)ww, state, w, h);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
msg = ECommsWaitForMessage();
|
|
|
|
if (msg)
|
|
|
|
{
|
|
|
|
sscanf(msg, "%x %x", (unsigned int *)&p, (unsigned int *)&m);
|
|
|
|
free(msg);
|
|
|
|
if (!gc)
|
|
|
|
gc = XCreateGC(disp, win, 0, &gcv);
|
|
|
|
XSetClipMask(disp, gc, m);
|
|
|
|
XSetClipOrigin(disp, gc, x, y);
|
1999-11-16 13:02:11 -08:00
|
|
|
XCopyArea(disp, p, win, gc, 0, 0, w, h, x, y);
|
|
|
|
Esnprintf(s, sizeof(s), "imageclass %s free_pixmap 0x%x", iclass,
|
|
|
|
(unsigned int)p);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps(char *iclass, char *state, Pixmap * p, Pixmap * m,
|
1999-10-13 08:14:42 -07:00
|
|
|
int w, int h)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Pixmap pp, mm;
|
|
|
|
char s[1024], *msg;
|
|
|
|
static GC gc = 0, mgc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
|
|
|
|
Esnprintf(s, sizeof(s), "imageclass %s apply_copy 0x%x %s %i %i", iclass,
|
|
|
|
(unsigned int)win, state, w, h);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
msg = ECommsWaitForMessage();
|
|
|
|
if (msg)
|
|
|
|
{
|
|
|
|
sscanf(msg, "%x %x", (unsigned int *)&pp, (unsigned int *)&mm);
|
|
|
|
free(msg);
|
|
|
|
if (pp)
|
|
|
|
*p = XCreatePixmap(disp, win, w, h, id->x.depth);
|
|
|
|
else
|
|
|
|
*p = 0;
|
|
|
|
if (mm)
|
|
|
|
*m = XCreatePixmap(disp, win, w, h, 1);
|
|
|
|
else
|
|
|
|
*m = 0;
|
|
|
|
if ((*p) && (!gc))
|
|
|
|
gc = XCreateGC(disp, *p, 0, &gcv);
|
|
|
|
if ((*m) && (!mgc))
|
|
|
|
mgc = XCreateGC(disp, *m, 0, &gcv);
|
|
|
|
if (*p)
|
1999-11-16 13:02:11 -08:00
|
|
|
XCopyArea(disp, pp, *p, gc, 0, 0, w, h, 0, 0);
|
1999-10-13 08:14:42 -07:00
|
|
|
if (*m)
|
|
|
|
XCopyArea(disp, mm, *m, mgc, 0, 0, w, h, 0, 0);
|
1999-11-16 13:02:11 -08:00
|
|
|
Esnprintf(s, sizeof(s), "imageclass %s free_pixmap 0x%x", iclass,
|
|
|
|
(unsigned int)pp);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw(char *iclass, char *state, Window ww, int x, int y,
|
|
|
|
char *txt)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
|
|
|
|
|
|
|
Esnprintf(s, sizeof(s), "textclass %s apply 0x%x %i %i %s %s", iclass,
|
|
|
|
(unsigned int)ww, x, y, state, txt);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_textclass_get_size(char *iclass, int *w, int *h, char *txt)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024], *msg = NULL;
|
|
|
|
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "textclass %s query_size %s", iclass, txt);
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
msg = ECommsWaitForMessage();
|
|
|
|
if (msg)
|
|
|
|
{
|
|
|
|
sscanf(msg, "%i %i", w, h);
|
|
|
|
free(msg);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*w = 0;
|
|
|
|
*h = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_expose_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, int x, int y, int w,
|
|
|
|
int h), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
expose_data = data;
|
|
|
|
expose_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_move_resize_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, int x, int y,
|
|
|
|
int w, int h), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
moveresize_data = data;
|
|
|
|
moveresize_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_button_press_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, int x, int y,
|
|
|
|
int b), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
buttonpress_data = data;
|
|
|
|
buttonpress_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_button_release_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, int x, int y,
|
|
|
|
int b), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
buttonrelease_data = data;
|
|
|
|
buttonrelease_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_key_press_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, char *key),
|
1999-10-13 08:14:42 -07:00
|
|
|
void *data)
|
|
|
|
{
|
|
|
|
keypress_data = data;
|
|
|
|
keypress_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_key_release_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, char *key),
|
1999-10-13 08:14:42 -07:00
|
|
|
void *data)
|
|
|
|
{
|
|
|
|
keyrelease_data = data;
|
|
|
|
keyrelease_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_mouse_motion_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win, int x, int y),
|
1999-10-13 08:14:42 -07:00
|
|
|
void *data)
|
|
|
|
{
|
|
|
|
mousemotion_data = data;
|
|
|
|
mousemotion_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_mouse_enter_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
enter_data = data;
|
|
|
|
enter_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_mouse_leave_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
leave_data = data;
|
|
|
|
leave_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_focus_in_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
focusin_data = data;
|
|
|
|
focusin_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_focus_out_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, Window win), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
focusout_data = data;
|
|
|
|
focusout_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_event_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, XEvent * ev), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
event_data = data;
|
|
|
|
event_func = func;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_comms_handler(void (*func) (void *data, char *s), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
comms_data = data;
|
|
|
|
comms_func = func;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
Display *
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_get_display(void)
|
|
|
|
{
|
|
|
|
return disp;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_handle_event(XEvent * ev)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_gadget g = NULL;
|
1999-12-01 11:30:19 -08:00
|
|
|
|
Wed Dec 01 23:05:13 GMT 1999
(gilbertt)
api changes.
Ok. I have added some functions to the api, they are not yet perfect, but
they compile cleanly and don't create any problems. Don't use them yet
though, the api may change.
Window Epplet_create_window(int w,int h,int x,int y,char *title);
void Epplet_window_show(Window win);
void Epplet_window_hide(Window win);
void Epplet_window_destroy(Window win);
void Epplet_window_switch_context(Window newwin);
void Epplet_window_reset_context(void);
All of these functions are in place and work. I have yet to add code to
handle delete_events. At the moment, if you close the dialog window, the
epplet exits. This is clearly not intended ;) I'll fix it tomorrow, its late
here now.
You can even switch context and add widgets to your new window with no
problems ;)
Other things to fix tomorrow is the event handling stuff which assumes only
one window will be around...
I am currently using E-ScreenSave as my test epplet for this code, as I know
only about 2 people use it ;) Try it to see the code working.
SVN revision: 1472
1999-12-01 11:12:33 -08:00
|
|
|
#if 0
|
1999-12-01 11:30:19 -08:00
|
|
|
Atom wmDeleteWindow;
|
|
|
|
|
|
|
|
wmDeleteWindow = XInternAtom(disp, "WM_DELETE_WINDOW", False);
|
|
|
|
if (ev->xclient.format == 32
|
|
|
|
&& ev->xclient.data.l[0] == (signed) wmDeleteWindow)
|
|
|
|
printf("Got a delete event\n");
|
|
|
|
#endif
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (event_func)
|
|
|
|
(*event_func) (ev, event_data);
|
|
|
|
switch (ev->type)
|
|
|
|
{
|
|
|
|
case ClientMessage:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
char *msg;
|
|
|
|
|
|
|
|
msg = ECommsGet(ev);
|
|
|
|
if (msg)
|
|
|
|
{
|
|
|
|
if (comms_func)
|
|
|
|
(*comms_func) (comms_data, msg);
|
|
|
|
free(msg);
|
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case KeyPress:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
|
|
|
g = NULL;
|
|
|
|
|
|
|
|
if (g)
|
|
|
|
Epplet_event(g, ev);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char *key;
|
|
|
|
|
|
|
|
key =
|
|
|
|
XKeysymToString(XKeycodeToKeysym(disp,
|
|
|
|
(KeyCode) ev->xkey.keycode,
|
|
|
|
0));
|
|
|
|
if (keypress_func)
|
|
|
|
(*keypress_func) (keypress_data, ev->xkey.window, key);
|
1999-11-28 14:08:49 -08:00
|
|
|
else
|
1999-11-29 10:00:00 -08:00
|
|
|
{
|
|
|
|
if (last_gadget &&
|
|
|
|
((GadGeneral *) last_gadget)->type == E_TEXTBOX)
|
|
|
|
{
|
|
|
|
Epplet_textbox_handle_keyevent(ev, last_gadget);
|
|
|
|
Epplet_draw_textbox(last_gadget);
|
|
|
|
}
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case KeyRelease:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
char *key;
|
|
|
|
|
|
|
|
key =
|
|
|
|
XKeysymToString(XKeycodeToKeysym(disp,
|
|
|
|
(KeyCode) ev->xkey.keycode, 0));
|
|
|
|
if (keyrelease_func)
|
|
|
|
(*keyrelease_func) (keyrelease_data, ev->xkey.window, key);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case ButtonPress:
|
1999-11-16 13:02:11 -08:00
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
1999-10-13 08:14:42 -07:00
|
|
|
g = NULL;
|
|
|
|
if (g)
|
|
|
|
Epplet_event(g, ev);
|
1999-11-16 13:02:11 -08:00
|
|
|
else
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
if (buttonpress_func)
|
1999-11-16 13:02:11 -08:00
|
|
|
(*buttonpress_func) (buttonpress_data, ev->xbutton.window,
|
|
|
|
ev->xbutton.x, ev->xbutton.y,
|
|
|
|
ev->xbutton.button);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ButtonRelease:
|
1999-11-16 13:02:11 -08:00
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
1999-10-13 08:14:42 -07:00
|
|
|
g = NULL;
|
|
|
|
if (g)
|
1999-11-28 14:33:31 -08:00
|
|
|
{
|
|
|
|
last_gadget = g;
|
|
|
|
Epplet_event(g, ev);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (buttonrelease_func)
|
1999-11-16 13:02:11 -08:00
|
|
|
(*buttonrelease_func) (buttonrelease_data, ev->xbutton.window,
|
|
|
|
ev->xbutton.x, ev->xbutton.y,
|
|
|
|
ev->xbutton.button);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MotionNotify:
|
1999-11-16 13:02:11 -08:00
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
1999-10-13 08:14:42 -07:00
|
|
|
g = NULL;
|
|
|
|
if (g)
|
|
|
|
Epplet_event(g, ev);
|
1999-11-16 13:02:11 -08:00
|
|
|
else
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
if (mousemotion_func)
|
1999-11-16 13:02:11 -08:00
|
|
|
(*mousemotion_func) (mousemotion_data, ev->xmotion.window,
|
1999-10-13 08:14:42 -07:00
|
|
|
ev->xmotion.x, ev->xmotion.y);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EnterNotify:
|
1999-11-16 13:02:11 -08:00
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
1999-10-13 08:14:42 -07:00
|
|
|
g = NULL;
|
1999-11-28 14:08:49 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g)
|
|
|
|
Epplet_event(g, ev);
|
1999-11-16 13:02:11 -08:00
|
|
|
else
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
if (enter_func)
|
|
|
|
(*enter_func) (enter_data, ev->xcrossing.window);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LeaveNotify:
|
1999-11-16 13:02:11 -08:00
|
|
|
if (XFindContext(disp, ev->xkey.window, xid_context,
|
|
|
|
(XPointer *) & g) == XCNOENT)
|
1999-10-13 08:14:42 -07:00
|
|
|
g = NULL;
|
|
|
|
if (g)
|
|
|
|
Epplet_event(g, ev);
|
1999-11-16 13:02:11 -08:00
|
|
|
else
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
if (leave_func)
|
|
|
|
(*leave_func) (leave_data, ev->xcrossing.window);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case FocusIn:
|
|
|
|
if (focusin_func)
|
|
|
|
(*focusin_func) (focusin_data, ev->xfocus.window);
|
|
|
|
break;
|
|
|
|
case FocusOut:
|
1999-12-01 11:30:19 -08:00
|
|
|
last_gadget = NULL;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (focusout_func)
|
|
|
|
(*focusout_func) (focusout_data, ev->xfocus.window);
|
|
|
|
break;
|
|
|
|
case Expose:
|
|
|
|
if (expose_func)
|
|
|
|
(*expose_func) (expose_data, ev->xexpose.window,
|
1999-11-16 13:02:11 -08:00
|
|
|
ev->xexpose.x, ev->xexpose.y,
|
1999-10-13 08:14:42 -07:00
|
|
|
ev->xexpose.width, ev->xexpose.height);
|
|
|
|
break;
|
|
|
|
case ConfigureNotify:
|
|
|
|
if (moveresize_func)
|
|
|
|
(*moveresize_func) (moveresize_data, ev->xconfigure.window,
|
1999-11-16 13:02:11 -08:00
|
|
|
ev->xconfigure.x, ev->xconfigure.y,
|
1999-10-13 08:14:42 -07:00
|
|
|
ev->xconfigure.width, ev->xconfigure.height);
|
|
|
|
break;
|
|
|
|
case PropertyNotify:
|
|
|
|
if (CommsHandlePropertyNotify(ev))
|
|
|
|
Epplet_redraw();
|
|
|
|
break;
|
|
|
|
case DestroyNotify:
|
1999-12-01 11:30:19 -08:00
|
|
|
CommsHandleDestroy(ev->xdestroywindow.window);
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_timer(void (*func) (void *data), void *data, double in, char *name)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ETimer *et, *ptr, *pptr;
|
|
|
|
double tally;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
Epplet_remove_timer(name);
|
|
|
|
et = malloc(sizeof(ETimer));
|
|
|
|
et->next = NULL;
|
|
|
|
et->func = func;
|
|
|
|
et->data = data;
|
|
|
|
et->name = malloc(strlen(name) + 1);
|
|
|
|
et->just_added = 1;
|
|
|
|
et->in = in;
|
|
|
|
memcpy(et->name, name, strlen(name) + 1);
|
|
|
|
tally = 0.0;
|
|
|
|
if (!q_first)
|
|
|
|
q_first = et;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pptr = NULL;
|
|
|
|
ptr = q_first;
|
|
|
|
tally = 0.0;
|
|
|
|
while (ptr)
|
|
|
|
{
|
|
|
|
tally += ptr->in;
|
|
|
|
if (tally > in)
|
|
|
|
{
|
|
|
|
tally -= ptr->in;
|
|
|
|
et->next = ptr;
|
|
|
|
if (pptr)
|
|
|
|
pptr->next = et;
|
|
|
|
else
|
|
|
|
q_first = et;
|
|
|
|
et->in -= tally;
|
|
|
|
if (et->next)
|
|
|
|
et->next->in -= et->in;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pptr = ptr;
|
|
|
|
ptr = ptr->next;
|
|
|
|
}
|
|
|
|
if (pptr)
|
|
|
|
pptr->next = et;
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
q_first = et;
|
1999-10-13 08:14:42 -07:00
|
|
|
et->in -= tally;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_remove_timer(char *name)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ETimer *et, *ptr, *pptr;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
pptr = NULL;
|
|
|
|
ptr = q_first;
|
|
|
|
while (ptr)
|
|
|
|
{
|
|
|
|
et = ptr;
|
|
|
|
if (!strcmp(et->name, name))
|
|
|
|
{
|
|
|
|
if (pptr)
|
|
|
|
pptr->next = et->next;
|
|
|
|
else
|
|
|
|
q_first = et->next;
|
|
|
|
if (et->next)
|
|
|
|
et->next->in += et->in;
|
|
|
|
if (et->name)
|
|
|
|
free(et->name);
|
|
|
|
if (et)
|
|
|
|
free(et);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pptr = ptr;
|
|
|
|
ptr = ptr->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void *
|
1999-10-20 15:23:29 -07:00
|
|
|
Epplet_timer_get_data(char *name)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ETimer *et, *ptr;
|
1999-10-20 15:23:29 -07:00
|
|
|
|
|
|
|
ptr = q_first;
|
|
|
|
while (ptr)
|
|
|
|
{
|
|
|
|
et = ptr;
|
|
|
|
if (!strcmp(et->name, name))
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
return et->data;
|
1999-10-20 15:23:29 -07:00
|
|
|
}
|
|
|
|
ptr = ptr->next;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
static void
|
|
|
|
Epplet_handle_timer(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ETimer *et;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
if (!q_first)
|
|
|
|
return;
|
|
|
|
et = q_first;
|
|
|
|
q_first = q_first->next;
|
|
|
|
(*(et->func)) (et->data);
|
|
|
|
if (et->name)
|
|
|
|
free(et->name);
|
|
|
|
if (et)
|
|
|
|
free(et);
|
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
Epplet_get_time(void)
|
|
|
|
{
|
|
|
|
struct timeval timev;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
gettimeofday(&timev, NULL);
|
|
|
|
return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static ETimer *
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_get_first(void)
|
|
|
|
{
|
|
|
|
return q_first;
|
1999-11-16 13:02:11 -08:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
#ifndef MIN
|
|
|
|
#define MIN(a,b) ((a)<(b)?(a):(b))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_prune_events(XEvent * ev, int num)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i, j;
|
|
|
|
char found, remember;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
/* find only the last moption event */
|
|
|
|
found = 0;
|
|
|
|
for (i = num - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
if (ev[i].type == MotionNotify)
|
|
|
|
{
|
|
|
|
if (!found)
|
|
|
|
found = 1;
|
|
|
|
else
|
|
|
|
ev[i].type = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* find all expose events and then all following expose events for that */
|
|
|
|
/* window then do a bounding box grow of the original expose event */
|
|
|
|
for (i = num - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
if (ev[i].type == Expose)
|
|
|
|
{
|
|
|
|
for (j = i - 1; j >= 0; j--)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if ((ev[j].type == Expose) &&
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev[j].xexpose.window == ev[i].xexpose.window))
|
|
|
|
{
|
|
|
|
if (ev[j].xexpose.x < ev[i].xexpose.x)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ev[i].xexpose.width +=
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev[i].xexpose.x - ev[j].xexpose.x);
|
|
|
|
ev[i].xexpose.x = ev[j].xexpose.x;
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
if ((ev[j].xexpose.x + ev[j].xexpose.width) >
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev[i].xexpose.x + ev[i].xexpose.width))
|
1999-11-16 13:02:11 -08:00
|
|
|
ev[i].xexpose.width +=
|
|
|
|
(ev[j].xexpose.x + ev[j].xexpose.width) -
|
|
|
|
(ev[i].xexpose.x + ev[i].xexpose.width);
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
if (ev[j].xexpose.y < ev[i].xexpose.y)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ev[i].xexpose.height +=
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev[i].xexpose.y - ev[j].xexpose.y);
|
|
|
|
ev[i].xexpose.y = ev[j].xexpose.y;
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
if ((ev[j].xexpose.y + ev[j].xexpose.height) >
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev[i].xexpose.y + ev[i].xexpose.height))
|
1999-11-16 13:02:11 -08:00
|
|
|
ev[i].xexpose.height +=
|
|
|
|
(ev[j].xexpose.y + ev[j].xexpose.height) -
|
|
|
|
(ev[i].xexpose.y + ev[i].xexpose.height);
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
ev[j].type = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* any reason to remember the window properties? */
|
|
|
|
remember = 0;
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
if ((ev[i].type == ConfigureNotify) && (ev->xconfigure.window == win))
|
|
|
|
remember = 1;
|
|
|
|
if ((ev[i].type == PropertyNotify) && (ev->xproperty.window == win))
|
|
|
|
remember = 1;
|
|
|
|
}
|
|
|
|
if (remember)
|
|
|
|
Epplet_remember();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_Loop(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int xfd, fdsize, count;
|
|
|
|
double t1 = 0.0, t2 = 0.0, pt;
|
|
|
|
ETimer *et;
|
|
|
|
fd_set fdset;
|
|
|
|
struct timeval tval;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
xfd = ConnectionNumber(disp);
|
|
|
|
fdsize = xfd + 1;
|
|
|
|
pt = Epplet_get_time();
|
|
|
|
for (;;)
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
XEvent *evs = NULL;
|
|
|
|
int evs_num = 0, i;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
XFlush(disp);
|
|
|
|
t1 = Epplet_get_time();
|
|
|
|
t2 = t1 - pt;
|
|
|
|
pt = t1;
|
|
|
|
while (XPending(disp))
|
|
|
|
{
|
|
|
|
evs_num++;
|
|
|
|
if (evs)
|
|
|
|
evs = realloc(evs, sizeof(XEvent) * evs_num);
|
|
|
|
else
|
|
|
|
evs = malloc(sizeof(XEvent));
|
|
|
|
XNextEvent(disp, &(evs[evs_num - 1]));
|
|
|
|
}
|
|
|
|
if (evs)
|
|
|
|
{
|
|
|
|
Epplet_prune_events(evs, evs_num);
|
|
|
|
for (i = 0; i < evs_num; i++)
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
1999-10-13 08:14:42 -07:00
|
|
|
if (evs[i].type > 0)
|
|
|
|
Epplet_handle_event(&(evs[i]));
|
1999-12-01 11:30:19 -08:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
free(evs);
|
|
|
|
evs = NULL;
|
|
|
|
evs_num = 0;
|
|
|
|
}
|
|
|
|
XFlush(disp);
|
|
|
|
FD_ZERO(&fdset);
|
|
|
|
FD_SET(xfd, &fdset);
|
|
|
|
et = Epplet_get_first();
|
|
|
|
count = 0;
|
|
|
|
if (et)
|
|
|
|
{
|
|
|
|
if (et->just_added)
|
|
|
|
{
|
|
|
|
et->just_added = 0;
|
|
|
|
t1 = et->in;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
t1 = et->in - t2;
|
|
|
|
if (t1 < 0.0)
|
|
|
|
t1 = 0.0;
|
|
|
|
et->in = t1;
|
|
|
|
}
|
|
|
|
tval.tv_sec = (long)t1;
|
|
|
|
tval.tv_usec = (long)((t1 - ((double)tval.tv_sec)) * 1000000);
|
|
|
|
if (tval.tv_sec < 0)
|
|
|
|
tval.tv_sec = 0;
|
|
|
|
if (tval.tv_usec <= 1000)
|
|
|
|
tval.tv_usec = 1000;
|
|
|
|
count = select(fdsize, &fdset, NULL, NULL, &tval);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
count = select(fdsize, &fdset, NULL, NULL, NULL);
|
|
|
|
if (count < 0)
|
|
|
|
{
|
|
|
|
if ((errno == ENOMEM) || (errno == EINVAL) || (errno == EBADF))
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
if ((et) && (count == 0))
|
|
|
|
Epplet_handle_timer();
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-11-16 13:02:11 -08:00
|
|
|
ECommsSetup(Display * d)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
dd = d;
|
|
|
|
root = DefaultRootWindow(dd);
|
|
|
|
if (!my_win)
|
|
|
|
{
|
|
|
|
my_win = XCreateSimpleWindow(dd, root, -100, -100, 5, 5, 0, 0, 0);
|
|
|
|
XSelectInput(dd, my_win, StructureNotifyMask | SubstructureNotifyMask);
|
|
|
|
}
|
|
|
|
CommsFindCommsWindow();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
CommsHandleDestroy(Window win)
|
|
|
|
{
|
|
|
|
if (win == comms_win)
|
|
|
|
comms_win = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
1999-11-16 13:02:11 -08:00
|
|
|
CommsHandlePropertyNotify(XEvent * ev)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Atom a = 0;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (comms_win)
|
|
|
|
return 0;
|
|
|
|
if (!a)
|
|
|
|
a = XInternAtom(dd, "ENLIGHTENMENT_COMMS", True);
|
|
|
|
if (a == ev->xproperty.atom)
|
|
|
|
CommsFindCommsWindow();
|
|
|
|
if (comms_win)
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
CommsFindCommsWindow(void)
|
|
|
|
{
|
|
|
|
unsigned char *s;
|
|
|
|
Atom a, ar;
|
|
|
|
unsigned long num, after;
|
|
|
|
int format;
|
|
|
|
Window rt;
|
|
|
|
int dint;
|
|
|
|
unsigned int duint;
|
|
|
|
|
|
|
|
a = XInternAtom(dd, "ENLIGHTENMENT_COMMS", True);
|
|
|
|
if (a != None)
|
|
|
|
{
|
|
|
|
s = NULL;
|
|
|
|
XGetWindowProperty(dd, root, a, 0, 14, False, AnyPropertyType, &ar,
|
|
|
|
&format, &num, &after, &s);
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
sscanf((char *)s, "%*s %x", (unsigned int *)&comms_win);
|
|
|
|
XFree(s);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
(comms_win = 0);
|
|
|
|
if (comms_win)
|
|
|
|
{
|
|
|
|
if (!XGetGeometry(dd, comms_win, &rt, &dint, &dint,
|
|
|
|
&duint, &duint, &duint, &duint))
|
|
|
|
comms_win = 0;
|
|
|
|
s = NULL;
|
|
|
|
if (comms_win)
|
|
|
|
{
|
|
|
|
XGetWindowProperty(dd, comms_win, a, 0, 14, False,
|
1999-11-16 13:02:11 -08:00
|
|
|
AnyPropertyType, &ar, &format, &num,
|
1999-10-13 08:14:42 -07:00
|
|
|
&after, &s);
|
|
|
|
if (s)
|
|
|
|
XFree(s);
|
|
|
|
else
|
|
|
|
comms_win = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (comms_win)
|
1999-11-16 13:02:11 -08:00
|
|
|
XSelectInput(dd, comms_win, StructureNotifyMask | SubstructureNotifyMask);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
ECommsSend(char *s)
|
|
|
|
{
|
|
|
|
char ss[21];
|
|
|
|
int i, j, k, len;
|
|
|
|
XEvent ev;
|
|
|
|
Atom a = 0;
|
1999-10-26 08:48:35 -07:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!s)
|
|
|
|
return;
|
|
|
|
len = strlen(s);
|
|
|
|
if (!a)
|
|
|
|
a = XInternAtom(dd, "ENL_MSG", False);
|
|
|
|
ev.xclient.type = ClientMessage;
|
|
|
|
ev.xclient.serial = 0;
|
|
|
|
ev.xclient.send_event = True;
|
|
|
|
ev.xclient.window = comms_win;
|
|
|
|
ev.xclient.message_type = a;
|
|
|
|
ev.xclient.format = 8;
|
|
|
|
|
|
|
|
for (i = 0; i < len + 1; i += 12)
|
|
|
|
{
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(ss, sizeof(ss), "%8x", (int)my_win);
|
1999-10-13 08:14:42 -07:00
|
|
|
for (j = 0; j < 12; j++)
|
|
|
|
{
|
|
|
|
ss[8 + j] = s[i + j];
|
|
|
|
if (!s[i + j])
|
|
|
|
j = 12;
|
|
|
|
}
|
|
|
|
ss[20] = 0;
|
|
|
|
for (k = 0; k < 20; k++)
|
|
|
|
ev.xclient.data.b[k] = ss[k];
|
|
|
|
XSendEvent(dd, comms_win, False, 0, (XEvent *) & ev);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static Bool
|
|
|
|
ev_check(Display * d, XEvent * ev, XPointer p)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
if (((ev->type == ClientMessage) && (ev->xclient.window == my_win)) ||
|
1999-11-16 13:02:11 -08:00
|
|
|
((ev->type == DestroyNotify) &&
|
1999-10-13 08:14:42 -07:00
|
|
|
(ev->xdestroywindow.window == comms_win)))
|
|
|
|
return True;
|
|
|
|
return False;
|
|
|
|
d = NULL;
|
|
|
|
p = NULL;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static char *
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsWaitForMessage(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
XEvent ev;
|
|
|
|
char *msg = NULL;
|
1999-10-26 08:48:35 -07:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
while ((!msg) && (comms_win))
|
|
|
|
{
|
|
|
|
XIfEvent(dd, &ev, ev_check, NULL);
|
|
|
|
if (ev.type == DestroyNotify)
|
|
|
|
comms_win = 0;
|
|
|
|
else
|
|
|
|
msg = ECommsGet(&ev);
|
|
|
|
}
|
|
|
|
return msg;
|
1999-11-16 13:02:11 -08:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
static char *
|
1999-10-13 08:14:42 -07:00
|
|
|
ECommsGet(XEvent * ev)
|
|
|
|
{
|
|
|
|
char s[13], s2[9], *msg = NULL;
|
|
|
|
int i;
|
|
|
|
Window win;
|
|
|
|
static char *c_msg = NULL;
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (!ev)
|
1999-10-13 08:14:42 -07:00
|
|
|
return NULL;
|
|
|
|
if (ev->type != ClientMessage)
|
|
|
|
return NULL;
|
|
|
|
s[12] = 0;
|
|
|
|
s2[8] = 0;
|
|
|
|
msg = NULL;
|
|
|
|
for (i = 0; i < 8; i++)
|
|
|
|
s2[i] = ev->xclient.data.b[i];
|
|
|
|
for (i = 0; i < 12; i++)
|
|
|
|
s[i] = ev->xclient.data.b[i + 8];
|
|
|
|
sscanf(s2, "%x", (int *)&win);
|
|
|
|
if (win == comms_win)
|
|
|
|
{
|
|
|
|
if (c_msg)
|
|
|
|
{
|
|
|
|
c_msg = realloc(c_msg, strlen(c_msg) + strlen(s) + 1);
|
|
|
|
if (!c_msg)
|
|
|
|
return NULL;
|
|
|
|
strcat(c_msg, s);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
c_msg = malloc(strlen(s) + 1);
|
|
|
|
if (!c_msg)
|
|
|
|
return NULL;
|
|
|
|
strcpy(c_msg, s);
|
|
|
|
}
|
|
|
|
if (strlen(s) < 12)
|
|
|
|
{
|
|
|
|
msg = c_msg;
|
|
|
|
c_msg = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
int
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_get_color(int r, int g, int b)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int rr, gg, bb;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
rr = r;
|
|
|
|
gg = g;
|
1999-11-16 13:02:11 -08:00
|
|
|
bb = b;
|
1999-10-13 08:14:42 -07:00
|
|
|
return Imlib_best_color_match(id, &rr, &gg, &bb);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
char *label;
|
|
|
|
char *image;
|
|
|
|
char hilited;
|
|
|
|
char clicked;
|
|
|
|
char pop;
|
|
|
|
Epplet_gadget pop_parent;
|
|
|
|
char *std;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Window win;
|
|
|
|
Pixmap pmap, mask;
|
|
|
|
}
|
|
|
|
GadButton;
|
|
|
|
|
|
|
|
static char *
|
1999-10-13 08:14:42 -07:00
|
|
|
Estrdup(char *s)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char *ss;
|
|
|
|
int len;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!s)
|
|
|
|
return NULL;
|
|
|
|
len = strlen(s);
|
|
|
|
ss = malloc(len + 1);
|
|
|
|
memcpy(ss, s, len + 1);
|
|
|
|
return ss;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_paste_image(char *image, Window ww, int x, int y)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
im = Imlib_load_image(id, image);
|
|
|
|
if (im)
|
|
|
|
{
|
|
|
|
Imlib_paste_image(id, im, ww, x, y, im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_paste_image_size(char *image, Window ww, int x, int y, int w, int h)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
im = Imlib_load_image(id, image);
|
|
|
|
if (im)
|
|
|
|
{
|
|
|
|
Imlib_paste_image(id, im, ww, x, y, w, h);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_add_gad(Epplet_gadget gadget)
|
|
|
|
{
|
|
|
|
gad_num++;
|
|
|
|
if (gads)
|
|
|
|
gads = realloc(gads, gad_num * sizeof(Epplet_gadget));
|
|
|
|
else
|
|
|
|
gads = malloc(gad_num * sizeof(Epplet_gadget));
|
|
|
|
gads[gad_num - 1] = gadget;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_del_gad(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i, j;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
for (i = 0; i < gad_num; i++)
|
|
|
|
{
|
|
|
|
if (gads[i] == gadget)
|
|
|
|
{
|
|
|
|
for (j = i; j < gad_num - 1; j++)
|
|
|
|
gads[j] = gads[j + 1];
|
|
|
|
gad_num--;
|
|
|
|
if (gad_num > 0)
|
|
|
|
gads = realloc(gads, gad_num * sizeof(Epplet_gadget));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
free(gads);
|
|
|
|
gads = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-11-09 12:10:10 -08:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
1999-11-28 14:33:31 -08:00
|
|
|
unsigned int cursor_pos, text_offset;
|
1999-11-16 13:02:11 -08:00
|
|
|
char *image;
|
|
|
|
char *contents;
|
|
|
|
char hilited;
|
|
|
|
char size;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Window win;
|
|
|
|
Pixmap pmap, mask;
|
1999-11-09 12:10:10 -08:00
|
|
|
}
|
|
|
|
GadTextBox;
|
|
|
|
|
|
|
|
Epplet_gadget
|
|
|
|
Epplet_create_textbox(char *image, char *contents, int x, int y,
|
|
|
|
int w, int h, char size, void (*func) (void *data),
|
|
|
|
void *data)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadTextBox *g;
|
|
|
|
XSetWindowAttributes attr;
|
|
|
|
|
|
|
|
g = malloc(sizeof(GadTextBox));
|
|
|
|
g->general.type = E_TEXTBOX;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->contents = Estrdup(contents);
|
|
|
|
g->cursor_pos = contents != NULL ? strlen(contents) : 0;
|
|
|
|
g->text_offset = 0;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
g->size = size;
|
|
|
|
g->func = func;
|
|
|
|
g->data = data;
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
g->hilited = 0;
|
|
|
|
|
|
|
|
attr.backing_store = NotUseful;
|
|
|
|
attr.override_redirect = False;
|
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask =
|
1999-11-27 08:17:16 -08:00
|
|
|
EnterWindowMask | LeaveWindowMask | ButtonPressMask | ButtonReleaseMask |
|
|
|
|
KeyPressMask | KeyReleaseMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->general.visible = 0;
|
|
|
|
g->win = XCreateWindow(disp, win, x, y, g->w, g->h, 0,
|
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
|
|
|
|
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
|
|
|
|
|
|
|
return (Epplet_gadget) g;
|
1999-11-09 12:10:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
Epplet_textbox_contents(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadTextBox *g;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadTextBox *) eg;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
return g->contents;
|
1999-11-09 12:10:10 -08:00
|
|
|
}
|
|
|
|
|
1999-11-10 19:02:47 -08:00
|
|
|
void
|
|
|
|
Epplet_reset_textbox(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadTextBox *g;
|
1999-11-10 19:02:47 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadTextBox *) eg;
|
|
|
|
if (g->contents)
|
|
|
|
{
|
|
|
|
free(g->contents);
|
|
|
|
g->contents = NULL;
|
|
|
|
}
|
1999-11-27 09:58:33 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g->cursor_pos = g->text_offset = 0;
|
|
|
|
Epplet_draw_textbox(eg);
|
1999-11-10 19:02:47 -08:00
|
|
|
}
|
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
void
|
|
|
|
Epplet_textbox_insert(Epplet_gadget eg, char *new_contents)
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
int len, w, h;
|
|
|
|
char *s, *line_break;
|
|
|
|
|
|
|
|
if (!new_contents || ((len = strlen(new_contents)) == 0))
|
|
|
|
return;
|
|
|
|
|
|
|
|
g = (GadTextBox *) eg;
|
|
|
|
|
|
|
|
if (g->contents)
|
|
|
|
s = (char *)malloc(sizeof(char) * (len + strlen(g->contents) + 1));
|
|
|
|
|
|
|
|
else
|
|
|
|
s = (char *)malloc(sizeof(char) * (len + 1));
|
|
|
|
|
|
|
|
if ((line_break = strchr(new_contents, '\n')))
|
|
|
|
{
|
1999-11-29 10:00:00 -08:00
|
|
|
*line_break = '\0'; /* get rid of the new line */
|
1999-11-27 09:58:33 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
*s = '\0';
|
|
|
|
|
|
|
|
if (g->contents)
|
|
|
|
strcpy(s, g->contents);
|
|
|
|
|
|
|
|
strcat(s, new_contents);
|
|
|
|
|
|
|
|
if (g->contents)
|
|
|
|
free(g->contents);
|
|
|
|
|
|
|
|
g->contents = s;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("Couldn't alloc mem\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (line_break)
|
|
|
|
{
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
}
|
|
|
|
|
|
|
|
Epplet_textbox_textsize(g, &w, &h, g->contents);
|
|
|
|
|
|
|
|
g->text_offset = 0;
|
|
|
|
|
|
|
|
while (w > g->w)
|
|
|
|
{
|
|
|
|
Epplet_textbox_textsize(g, &w, &h, (g->contents + g->text_offset));
|
|
|
|
g->text_offset++;
|
|
|
|
if (g->text_offset >= strlen(g->contents))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
g->cursor_pos = g->contents ? strlen(g->contents) : 0;
|
|
|
|
|
|
|
|
Epplet_draw_textbox(eg);
|
|
|
|
}
|
|
|
|
|
1999-11-11 19:46:39 -08:00
|
|
|
void
|
|
|
|
Epplet_change_textbox(Epplet_gadget eg, char *new_contents)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadTextBox *g;
|
1999-11-27 08:17:16 -08:00
|
|
|
int len, w, h;
|
|
|
|
char *s;
|
1999-11-12 12:27:52 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (!new_contents || ((len = strlen(new_contents)) == 0))
|
|
|
|
{
|
|
|
|
Epplet_reset_textbox(eg);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
g = (GadTextBox *) eg;
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (g->contents == new_contents)
|
|
|
|
return;
|
|
|
|
else if (g->contents != NULL)
|
|
|
|
free(g->contents);
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
if ((s = strchr(new_contents, '\n')))
|
1999-11-27 08:17:16 -08:00
|
|
|
{
|
1999-11-29 10:00:00 -08:00
|
|
|
*s = '\0'; /* kill new line */
|
1999-11-27 08:17:16 -08:00
|
|
|
|
|
|
|
s = (char *)malloc(sizeof(char) * len + 1);
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
strcpy(s, new_contents);
|
|
|
|
g->contents = s;
|
|
|
|
Epplet_draw_textbox(eg);
|
1999-11-27 08:17:16 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
printf("Couldn't allocate memory.\n");
|
|
|
|
}
|
1999-11-27 08:17:16 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
Epplet_textbox_textsize(g, &w, &h, new_contents);
|
1999-11-27 08:17:16 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
g->text_offset = 0;
|
1999-11-27 08:17:16 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
while (w > g->w)
|
|
|
|
{
|
|
|
|
Epplet_textbox_textsize(g, &w, &h, (new_contents + g->text_offset));
|
|
|
|
g->text_offset++;
|
|
|
|
if (g->text_offset >= strlen(new_contents))
|
|
|
|
break;
|
1999-11-27 08:17:16 -08:00
|
|
|
}
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-27 09:58:33 -08:00
|
|
|
g->cursor_pos = strlen(new_contents);
|
|
|
|
g->contents = Estrdup(new_contents);
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_draw_textbox(eg);
|
1999-11-11 19:46:39 -08:00
|
|
|
}
|
|
|
|
|
1999-11-09 12:10:10 -08:00
|
|
|
void
|
|
|
|
Epplet_draw_textbox(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadTextBox *g;
|
|
|
|
char *state;
|
|
|
|
int to_cursor = 0;
|
|
|
|
unsigned long gc_valuemask = 0;
|
|
|
|
XGCValues gc_values;
|
|
|
|
GC gc;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-29 10:00:00 -08:00
|
|
|
if ((g = (GadTextBox *) eg) == NULL)
|
|
|
|
return;
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (g->hilited)
|
|
|
|
state = "hilited";
|
|
|
|
else
|
|
|
|
state = "normal";
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (g->pmap)
|
|
|
|
XFreePixmap(disp, g->pmap);
|
|
|
|
if (g->mask)
|
|
|
|
XFreePixmap(disp, g->mask);
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BUTTON", "clicked",
|
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
if (g->image)
|
|
|
|
{
|
|
|
|
ImlibImage *im;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
ESYNC;
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
|
|
|
int x, y;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
x = (g->w - im->rgb_width) / 2;
|
|
|
|
y = (g->h - im->rgb_height) / 2;
|
|
|
|
Imlib_paste_image(id, im, g->pmap, x, y,
|
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g->contents)
|
|
|
|
{
|
1999-11-27 08:17:16 -08:00
|
|
|
int x, y, h;
|
1999-11-16 13:02:11 -08:00
|
|
|
char *s, *s2, temp;
|
|
|
|
|
|
|
|
s = &g->contents[g->text_offset];
|
|
|
|
temp = g->contents[g->cursor_pos];
|
|
|
|
g->contents[g->cursor_pos] = '\0';
|
|
|
|
s2 = Estrdup(s);
|
|
|
|
g->contents[g->cursor_pos] = temp;
|
|
|
|
|
|
|
|
x = 2;
|
|
|
|
|
1999-11-27 08:17:16 -08:00
|
|
|
Epplet_textbox_textsize(eg, &to_cursor, &h, s2);
|
|
|
|
y = (g->h - h) / 2;
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (g->size)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
Epplet_textclass_draw("EPPLET_BUTTON", state, g->pmap, x, y, s);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_TINY", state, g->pmap, x, y, s);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_MEDIUM", state, g->pmap, x, y,
|
|
|
|
s);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_LARGE", state, g->pmap, x, y,
|
|
|
|
s);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
free(s2);
|
|
|
|
}
|
|
|
|
|
|
|
|
ESYNC;
|
|
|
|
XSetWindowBackgroundPixmap(disp, g->win, g->pmap);
|
|
|
|
XShapeCombineMask(disp, g->win, ShapeBounding, 0, 0, g->mask, ShapeSet);
|
|
|
|
XClearWindow(disp, g->win);
|
|
|
|
|
|
|
|
gc_valuemask = GCFunction;
|
|
|
|
gc_values.function = GXinvert;
|
|
|
|
gc = XCreateGC(disp, g->win, gc_valuemask, &gc_values);
|
|
|
|
XSetForeground(disp, gc, Epplet_get_color(0, 0, 0));
|
|
|
|
|
1999-11-27 08:17:16 -08:00
|
|
|
if (to_cursor >= g->w)
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
1999-11-28 14:59:25 -08:00
|
|
|
if ((last_gadget == g) || (g->hilited))
|
1999-11-16 13:02:11 -08:00
|
|
|
XFillRectangle(disp, g->win, gc, g->w - 5, 2, 5, g->h - 4);
|
|
|
|
else
|
|
|
|
XDrawRectangle(disp, g->win, gc, g->w - 5, 2, 5, g->h - 4);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-28 14:59:25 -08:00
|
|
|
if ((last_gadget == g) || (g->hilited))
|
1999-11-16 13:02:11 -08:00
|
|
|
XFillRectangle(disp, g->win, gc, to_cursor + 2, 2, 5, g->h - 4);
|
|
|
|
else
|
|
|
|
XDrawRectangle(disp, g->win, gc, to_cursor + 2, 2, 5, g->h - 4);
|
|
|
|
}
|
1999-11-11 19:46:39 -08:00
|
|
|
|
1999-11-09 12:10:10 -08:00
|
|
|
}
|
|
|
|
|
1999-11-27 08:17:16 -08:00
|
|
|
static void
|
|
|
|
Epplet_textbox_textsize(Epplet_gadget gadget, int *w, int *h, char *s)
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
|
|
|
|
switch (g->size)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
Epplet_textclass_get_size("EPPLET_BUTTON", w, h, s);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_TINY", w, h, s);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_MEDIUM", w, h, s);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_LARGE", w, h, s);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-10 14:46:14 -08:00
|
|
|
static void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textbox_handle_keyevent(XEvent * ev, Epplet_gadget gadget)
|
|
|
|
{
|
|
|
|
int len, char_width, text_width, h;
|
|
|
|
static char kbuf[20];
|
|
|
|
KeySym keysym;
|
|
|
|
XKeyEvent *kev;
|
|
|
|
GadTextBox *g;
|
|
|
|
|
|
|
|
kev = (XKeyEvent *) ev;
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
|
|
|
|
len = XLookupString(&ev->xkey, (char *)kbuf, sizeof(kbuf), &keysym, NULL);
|
|
|
|
/* Convert unmapped Latin2-4 keysyms into Latin1 characters */
|
|
|
|
if (!len && (keysym >= 0x0100) && (keysym < 0x0400))
|
|
|
|
{
|
|
|
|
len = 1;
|
|
|
|
kbuf[0] = (keysym & 0xff);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (len <= 0 || len > (int)sizeof(kbuf))
|
|
|
|
return;
|
|
|
|
kbuf[len] = 0;
|
|
|
|
|
|
|
|
if (*kbuf == '\r' || *kbuf == '\n')
|
|
|
|
{
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
}
|
|
|
|
else if (*kbuf == '\b')
|
|
|
|
{
|
|
|
|
if (g->contents && *(g->contents))
|
|
|
|
{
|
|
|
|
len = strlen(g->contents) - 1;
|
|
|
|
g->contents[len] = 0;
|
|
|
|
g->cursor_pos--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->contents != NULL)
|
|
|
|
{
|
|
|
|
g->contents =
|
|
|
|
(char *)realloc(g->contents, (strlen(g->contents) + len + 1));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g->contents = (char *)malloc(len + 1);
|
|
|
|
*(g->contents) = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
strcat(g->contents, kbuf);
|
|
|
|
g->cursor_pos++;
|
|
|
|
}
|
|
|
|
|
1999-11-27 08:17:16 -08:00
|
|
|
Epplet_textbox_textsize(g, &char_width, &h, kbuf);
|
|
|
|
Epplet_textbox_textsize(g, &text_width, &h, g->contents);
|
1999-11-16 13:02:11 -08:00
|
|
|
|
|
|
|
if ((text_width + char_width) > g->w + 1)
|
|
|
|
{
|
|
|
|
if ((*kbuf == '\b') && g->contents && *(g->contents))
|
|
|
|
{
|
|
|
|
if (g->text_offset > 0)
|
|
|
|
g->text_offset--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g->text_offset++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Epplet_gadget
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_create_button(char *label, char *image, int x, int y,
|
1999-11-16 13:02:11 -08:00
|
|
|
int w, int h, char *std, Window parent,
|
|
|
|
Epplet_gadget pop_parent,
|
1999-12-01 11:30:19 -08:00
|
|
|
void (*func) (void *data), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadButton *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadButton));
|
|
|
|
g->general.type = E_BUTTON;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->std = Estrdup(std);
|
|
|
|
if (g->std)
|
|
|
|
{
|
|
|
|
g->w = 12;
|
|
|
|
g->h = 12;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
}
|
|
|
|
g->func = func;
|
|
|
|
g->data = data;
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
g->label = Estrdup(label);
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
g->hilited = 0;
|
|
|
|
g->clicked = 0;
|
|
|
|
g->pop = 0;
|
|
|
|
g->pop_parent = pop_parent;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
EnterWindowMask | LeaveWindowMask;
|
|
|
|
g->general.visible = 0;
|
|
|
|
if (parent)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, parent, x, y, g->w, g->h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore
|
1999-11-16 13:02:11 -08:00
|
|
|
| CWColormap | CWBackPixel | CWBorderPixel |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWEventMask, &attr);
|
|
|
|
g->pop = 1;
|
|
|
|
}
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, g->w, g->h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_button(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadButton *g;
|
|
|
|
char *state;
|
|
|
|
|
|
|
|
g = (GadButton *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "hilited";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "normal";
|
|
|
|
}
|
|
|
|
if (g->pmap)
|
|
|
|
XFreePixmap(disp, g->pmap);
|
|
|
|
if (g->mask)
|
|
|
|
XFreePixmap(disp, g->mask);
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
if (g->std)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
|
|
|
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "EPPLET_%s", g->std);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps(s, state,
|
1999-10-13 08:14:42 -07:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
}
|
|
|
|
else if (g->pop)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_POPUP_ENTRY", state,
|
1999-10-13 08:14:42 -07:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
if (g->image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
ESYNC;
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
x = (g->w - im->rgb_width) / 2;
|
|
|
|
y = (g->h - im->rgb_height) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Imlib_paste_image(id, im, g->pmap, x, y,
|
1999-10-13 08:14:42 -07:00
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g->label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y, w, h;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_textclass_get_size("EPPLET_POPUP", &w, &h, g->label);
|
|
|
|
x = (g->w - w) / 2;
|
|
|
|
y = (g->h - h) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw("EPPLET_POPUP", state, g->pmap, x, y,
|
|
|
|
g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BUTTON", state,
|
1999-10-13 08:14:42 -07:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
if (g->image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
ESYNC;
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
x = (g->w - im->rgb_width) / 2;
|
|
|
|
y = (g->h - im->rgb_height) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Imlib_paste_image(id, im, g->pmap, x, y,
|
1999-10-13 08:14:42 -07:00
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g->label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y, w, h;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_textclass_get_size("EPPLET_BUTTON", &w, &h, g->label);
|
|
|
|
x = (g->w - w) / 2;
|
|
|
|
y = (g->h - h) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw("EPPLET_BUTTON", state, g->pmap, x, y,
|
|
|
|
g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
ESYNC;
|
|
|
|
XSetWindowBackgroundPixmap(disp, g->win, g->pmap);
|
1999-11-16 13:02:11 -08:00
|
|
|
XShapeCombineMask(disp, g->win, ShapeBounding, 0, 0, g->mask, ShapeSet);
|
1999-10-13 08:14:42 -07:00
|
|
|
XClearWindow(disp, g->win);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
char *label;
|
|
|
|
char *image;
|
|
|
|
char hilited;
|
|
|
|
char clicked;
|
|
|
|
int *val;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Window win;
|
|
|
|
Pixmap pmap, mask;
|
|
|
|
}
|
|
|
|
GadToggleButton;
|
|
|
|
|
|
|
|
Epplet_gadget
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_create_togglebutton(char *label, char *image, int x,
|
|
|
|
int y, int w, int h, int *val,
|
1999-12-01 11:30:19 -08:00
|
|
|
void (*func) (void *data), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadToggleButton *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadToggleButton));
|
|
|
|
g->general.type = E_TOGGLEBUTTON;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
g->func = func;
|
|
|
|
g->data = data;
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
g->val = val;
|
|
|
|
g->label = Estrdup(label);
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
g->hilited = 0;
|
|
|
|
g->clicked = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
EnterWindowMask | LeaveWindowMask;
|
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, w, h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_togglebutton(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadToggleButton *g;
|
|
|
|
char *state;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "hilited";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "normal";
|
|
|
|
}
|
|
|
|
if (g->pmap)
|
|
|
|
XFreePixmap(disp, g->pmap);
|
|
|
|
if (g->mask)
|
|
|
|
XFreePixmap(disp, g->mask);
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
if (*(g->val))
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_TOGGLEBUTTON_ON", state,
|
1999-10-13 08:14:42 -07:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_TOGGLEBUTTON_OFF", state,
|
1999-10-13 08:14:42 -07:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
|
|
|
if (g->image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
ESYNC;
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
x = (g->w - im->rgb_width) / 2;
|
|
|
|
y = (g->h - im->rgb_height) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Imlib_paste_image(id, im, g->pmap, x, y,
|
1999-10-13 08:14:42 -07:00
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g->label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y, w, h;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (*(g->val))
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_get_size("EPPLET_TOGGLEBUTTON_ON", &w, &h,
|
|
|
|
g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
x = (g->w - w) / 2;
|
|
|
|
y = (g->h - h) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw("EPPLET_TOGGLEBUTTON_ON", state, g->pmap, x,
|
|
|
|
y, g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_get_size("EPPLET_TOGGLEBUTTON_OFF", &w, &h,
|
|
|
|
g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
x = (g->w - w) / 2;
|
|
|
|
y = (g->h - h) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw("EPPLET_TOGGLEBUTTON_OFF", state, g->pmap, x,
|
|
|
|
y, g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
ESYNC;
|
|
|
|
XSetWindowBackgroundPixmap(disp, g->win, g->pmap);
|
1999-11-16 13:02:11 -08:00
|
|
|
XShapeCombineMask(disp, g->win, ShapeBounding, 0, 0, g->mask, ShapeSet);
|
1999-10-13 08:14:42 -07:00
|
|
|
XClearWindow(disp, g->win);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
Window win;
|
|
|
|
Window win_in;
|
|
|
|
}
|
|
|
|
GadDrawingArea;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_drawingarea(int x, int y, int w, int h)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadDrawingArea *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadDrawingArea));
|
|
|
|
g->general.type = E_DRAWINGAREA;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = 0;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, w, h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.event_mask = ButtonPressMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
ButtonReleaseMask | PointerMotionMask | EnterWindowMask |
|
|
|
|
LeaveWindowMask | KeyPressMask | KeyReleaseMask | ButtonMotionMask |
|
|
|
|
ExposureMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win_in = XCreateWindow(disp, g->win, 2, 2, w - 4, h - 4, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XSetWindowBackgroundPixmap(disp, g->win_in, ParentRelative);
|
|
|
|
XMapWindow(disp, g->win_in);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_drawingarea(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadDrawingArea *g;
|
|
|
|
|
|
|
|
g = (GadDrawingArea *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_imageclass_apply("EPPLET_DRAWINGAREA", "normal", g->win);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
int min, max;
|
|
|
|
int step, jump;
|
|
|
|
char hilited;
|
|
|
|
char clicked;
|
|
|
|
int *val;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Window win;
|
|
|
|
Window win_knob;
|
|
|
|
}
|
|
|
|
GadHSlider;
|
|
|
|
|
|
|
|
Epplet_gadget
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_create_hslider(int x, int y, int len, int min, int max,
|
|
|
|
int step, int jump, int *val,
|
1999-12-01 11:30:19 -08:00
|
|
|
void (*func) (void *data), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHSlider *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
|
|
|
|
|
|
|
if (len < 9)
|
|
|
|
len = 9;
|
|
|
|
g = malloc(sizeof(GadHSlider));
|
|
|
|
g->general.type = E_HSLIDER;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = len;
|
|
|
|
g->h = 8;
|
|
|
|
g->max = max;
|
|
|
|
g->min = min;
|
|
|
|
g->step = step;
|
|
|
|
g->jump = jump;
|
|
|
|
g->val = val;
|
|
|
|
g->func = func;
|
|
|
|
g->data = data;
|
1999-10-18 08:04:54 -07:00
|
|
|
g->hilited = 0;
|
|
|
|
g->clicked = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, len, 8, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
PointerMotionMask | EnterWindowMask | LeaveWindowMask | ButtonMotionMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win_knob = XCreateWindow(disp, win, x, y, 8, 8, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore
|
1999-11-16 13:02:11 -08:00
|
|
|
| CWColormap | CWBackPixel | CWBorderPixel |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
|
|
|
XSaveContext(disp, g->win_knob, xid_context, (XPointer) g);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_hslider(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHSlider *g;
|
|
|
|
char *state;
|
|
|
|
|
|
|
|
g = (GadHSlider *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "hilited";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "normal";
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_apply("EPPLET_HSLIDER_BASE", "normal", g->win);
|
|
|
|
XMoveWindow(disp, g->win_knob,
|
1999-12-01 11:30:19 -08:00
|
|
|
g->x + ((g->w - 8) * (*(g->val))) / (g->max - g->min + 1), g->y);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_apply("EPPLET_HSLIDER_KNOB", state, g->win_knob);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
int min, max;
|
|
|
|
int step, jump;
|
|
|
|
char hilited;
|
|
|
|
char clicked;
|
|
|
|
int *val;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Window win;
|
|
|
|
Window win_knob;
|
|
|
|
}
|
|
|
|
GadVSlider;
|
|
|
|
|
|
|
|
Epplet_gadget
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_create_vslider(int x, int y, int len, int min, int max,
|
|
|
|
int step, int jump, int *val,
|
1999-12-01 11:30:19 -08:00
|
|
|
void (*func) (void *data), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadVSlider *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
|
|
|
|
|
|
|
if (len < 9)
|
|
|
|
len = 9;
|
|
|
|
g = malloc(sizeof(GadVSlider));
|
|
|
|
g->general.type = E_VSLIDER;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = 8;
|
|
|
|
g->h = len;
|
|
|
|
g->max = max;
|
|
|
|
g->min = min;
|
|
|
|
g->step = step;
|
|
|
|
g->jump = jump;
|
|
|
|
g->val = val;
|
|
|
|
g->func = func;
|
|
|
|
g->data = data;
|
1999-10-18 08:04:54 -07:00
|
|
|
g->hilited = 0;
|
|
|
|
g->clicked = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, 8, len, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
PointerMotionMask | EnterWindowMask | LeaveWindowMask | ButtonMotionMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win_knob = XCreateWindow(disp, win, x, y, 8, 8, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore
|
1999-11-16 13:02:11 -08:00
|
|
|
| CWColormap | CWBackPixel | CWBorderPixel |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
|
|
|
XSaveContext(disp, g->win_knob, xid_context, (XPointer) g);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_vslider(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadVSlider *g;
|
|
|
|
char *state;
|
|
|
|
|
|
|
|
g = (GadVSlider *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "hilited";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "normal";
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_apply("EPPLET_VSLIDER_BASE", "normal", g->win);
|
|
|
|
XMoveWindow(disp, g->win_knob,
|
1999-12-01 11:30:19 -08:00
|
|
|
g->x, g->y + ((g->h - 8) * (*(g->val))) / (g->max - g->min + 1));
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_apply("EPPLET_VSLIDER_KNOB", state, g->win_knob);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
int *val;
|
|
|
|
char dir;
|
|
|
|
Window win;
|
|
|
|
Window win_in;
|
|
|
|
}
|
|
|
|
GadHBar;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_hbar(int x, int y, int w, int h, char dir, int *val)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHBar *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadHBar));
|
|
|
|
g->general.type = E_HBAR;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
g->dir = dir;
|
|
|
|
g->val = val;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = 0;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, w, h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win_in = XCreateWindow(disp, g->win, 2, 2, w - 4, h - 4, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XMapWindow(disp, g->win_in);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_hbar(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHBar *g;
|
|
|
|
int l;
|
|
|
|
|
|
|
|
g = (GadHBar *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
l = (((g->w - 4) * (*(g->val))) / 100);
|
|
|
|
if (l < 1)
|
|
|
|
l = 1;
|
|
|
|
if (l > (g->w - 4))
|
|
|
|
l = g->w - 4;
|
|
|
|
if (g->dir)
|
|
|
|
XMoveResizeWindow(disp, g->win_in, g->w - 2 - l, 2, l, g->h - 4);
|
|
|
|
else
|
|
|
|
XMoveResizeWindow(disp, g->win_in, 2, 2, l, g->h - 4);
|
|
|
|
XSync(disp, False);
|
|
|
|
Epplet_imageclass_apply("EPPLET_HBAR_BASE", "normal", g->win);
|
|
|
|
Epplet_imageclass_apply("EPPLET_HBAR_BAR", "normal", g->win_in);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
int *val;
|
|
|
|
char dir;
|
|
|
|
Window win;
|
|
|
|
Window win_in;
|
|
|
|
}
|
|
|
|
GadVBar;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_vbar(int x, int y, int w, int h, char dir, int *val)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHBar *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadVBar));
|
|
|
|
g->general.type = E_VBAR;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
g->dir = dir;
|
|
|
|
g->val = val;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = 0;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, w, h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win_in = XCreateWindow(disp, g->win, 2, 2, w - 4, h - 4, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
1999-12-01 11:30:19 -08:00
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
1999-10-13 08:14:42 -07:00
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XMapWindow(disp, g->win_in);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_vbar(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadVBar *g;
|
|
|
|
int l;
|
|
|
|
|
|
|
|
g = (GadVBar *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
l = (((g->h - 4) * (*(g->val))) / 100);
|
|
|
|
if (l < 1)
|
|
|
|
l = 1;
|
|
|
|
if (l > (g->h - 4))
|
|
|
|
l = g->h - 4;
|
|
|
|
if (g->dir)
|
|
|
|
XMoveResizeWindow(disp, g->win_in, 2, g->h - 2 - l, g->w - 4, l);
|
|
|
|
else
|
|
|
|
XMoveResizeWindow(disp, g->win_in, 2, 2, g->w - 4, l);
|
|
|
|
XSync(disp, False);
|
|
|
|
Epplet_imageclass_apply("EPPLET_VBAR_BASE", "normal", g->win);
|
|
|
|
Epplet_imageclass_apply("EPPLET_VBAR_BAR", "normal", g->win_in);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h, pw, ph;
|
|
|
|
char *image;
|
|
|
|
}
|
|
|
|
GadImage;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_image(int x, int y, int w, int h, char *image)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadImage *g;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadImage));
|
|
|
|
g->general.type = E_IMAGE;
|
|
|
|
g->general.visible = 0;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
g->pw = 0;
|
|
|
|
g->ph = 0;
|
|
|
|
g->image = Estrdup(image);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_image(Epplet_gadget eg, char un_only)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadImage *g;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
ImlibImage *im;
|
|
|
|
|
|
|
|
g = (GadImage *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!gc)
|
|
|
|
gc = XCreateGC(disp, bg_pmap, 0, &gcv);
|
|
|
|
if ((g->pw > 0) && (g->ph > 0))
|
1999-11-16 13:02:11 -08:00
|
|
|
XCopyArea(disp, bg_bg, bg_pmap, gc, g->x, g->y, g->pw, g->ph, g->x, g->y);
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!un_only)
|
|
|
|
{
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
|
|
|
if ((g->w > 0) && (g->h > 0))
|
|
|
|
{
|
|
|
|
Imlib_paste_image(id, im, bg_pmap, g->x, g->y, g->w, g->h);
|
|
|
|
g->pw = g->w;
|
|
|
|
g->ph = g->h;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Imlib_paste_image(id, im, bg_pmap, g->x, g->y,
|
1999-10-13 08:14:42 -07:00
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
g->pw = im->rgb_width;
|
|
|
|
g->ph = im->rgb_height;
|
|
|
|
}
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XSetWindowBackgroundPixmap(disp, win, bg_pmap);
|
|
|
|
XClearWindow(disp, win);
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
char size;
|
|
|
|
char *label;
|
|
|
|
}
|
|
|
|
GadLabel;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_label(int x, int y, char *label, char size)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadLabel *g;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadLabel));
|
|
|
|
g->general.type = E_LABEL;
|
|
|
|
g->general.visible = 0;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
|
|
|
g->size = size;
|
|
|
|
g->label = Estrdup(label);
|
|
|
|
if (g->size == 0)
|
|
|
|
Epplet_textclass_get_size("EPPLET_LABEL", &(g->w), &(g->h), g->label);
|
|
|
|
else if (g->size == 1)
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_TINY", &(g->w), &(g->h), g->label);
|
|
|
|
else if (g->size == 2)
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_MEDIUM", &(g->w), &(g->h),
|
|
|
|
g->label);
|
1999-10-13 08:14:42 -07:00
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_LARGE", &(g->w), &(g->h),
|
|
|
|
g->label);
|
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_label(Epplet_gadget eg, char un_only)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadLabel *g;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
int x;
|
1999-10-26 08:48:35 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadLabel *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!gc)
|
1999-11-16 13:02:11 -08:00
|
|
|
gc = XCreateGC(disp, bg_pmap, 0, &gcv);
|
1999-10-26 08:48:35 -07:00
|
|
|
if (g->x < 0)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
x = win_w + g->x - g->w;
|
|
|
|
if (x < 0)
|
|
|
|
x = 0;
|
1999-10-26 08:48:35 -07:00
|
|
|
}
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
x = g->x;
|
|
|
|
XCopyArea(disp, bg_bg, bg_pmap, gc,
|
|
|
|
x - 1, g->y - 1, g->w + 2, g->h + 2, x - 1, g->y - 1);
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!un_only)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
XSync(disp, False);
|
|
|
|
if (g->size == 0)
|
|
|
|
{
|
|
|
|
Epplet_textclass_get_size("EPPLET_LABEL", &(g->w), &(g->h),
|
|
|
|
g->label);
|
|
|
|
if (g->x < 0)
|
|
|
|
{
|
|
|
|
x = win_w + g->x - g->w;
|
|
|
|
if (x < 0)
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
x = g->x;
|
|
|
|
Epplet_textclass_draw("EPPLET_LABEL", "normal", bg_pmap, x, g->y,
|
|
|
|
g->label);
|
|
|
|
}
|
|
|
|
else if (g->size == 1)
|
|
|
|
{
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_TINY", &(g->w), &(g->h),
|
|
|
|
g->label);
|
|
|
|
if (g->x < 0)
|
|
|
|
{
|
|
|
|
x = win_w + g->x - g->w;
|
|
|
|
if (x < 0)
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
x = g->x;
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_TINY", "normal", bg_pmap, x,
|
|
|
|
g->y, g->label);
|
|
|
|
}
|
|
|
|
else if (g->size == 2)
|
|
|
|
{
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_MEDIUM", &(g->w), &(g->h),
|
|
|
|
g->label);
|
|
|
|
if (g->x < 0)
|
|
|
|
{
|
|
|
|
x = win_w + g->x - g->w;
|
|
|
|
if (x < 0)
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
x = g->x;
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_MEDIUM", "normal", bg_pmap, x,
|
|
|
|
g->y, g->label);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Epplet_textclass_get_size("EPPLET_TEXT_LARGE", &(g->w), &(g->h),
|
|
|
|
g->label);
|
|
|
|
if (g->x < 0)
|
|
|
|
{
|
|
|
|
x = win_w + g->x - g->w;
|
|
|
|
if (x < 0)
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
x = g->x;
|
|
|
|
Epplet_textclass_draw("EPPLET_TEXT_LARGE", "normal", bg_pmap, x,
|
|
|
|
g->y, g->label);
|
|
|
|
}
|
|
|
|
ESYNC;
|
1999-11-09 10:24:35 -08:00
|
|
|
}
|
|
|
|
XSetWindowBackgroundPixmap(disp, win, bg_pmap);
|
|
|
|
XClearWindow(disp, win);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char *label;
|
|
|
|
char *image;
|
|
|
|
int w, h;
|
|
|
|
void (*func) (void *data);
|
|
|
|
void *data;
|
|
|
|
Epplet_gadget gadget;
|
|
|
|
}
|
|
|
|
GadPopEntry;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
typedef struct _gadpopupbutton GadPopupButton;
|
|
|
|
typedef struct
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
Epplet_gadget popbutton;
|
|
|
|
int entry_num;
|
|
|
|
GadPopEntry *entry;
|
|
|
|
Window win;
|
|
|
|
char changed;
|
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
struct _gadpopupbutton
|
1999-12-01 11:30:19 -08:00
|
|
|
{
|
|
|
|
GadGeneral general;
|
|
|
|
int x, y, w, h;
|
|
|
|
char *label;
|
|
|
|
char *image;
|
|
|
|
char hilited;
|
|
|
|
char clicked;
|
|
|
|
Epplet_gadget popup;
|
|
|
|
char popped;
|
|
|
|
char *std;
|
|
|
|
Window win;
|
|
|
|
Pixmap pmap, mask;
|
|
|
|
};
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Epplet_gadget Epplet_create_popup(void)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadPopup));
|
|
|
|
g->general.type = E_POPUP;
|
|
|
|
g->general.visible = 0;
|
|
|
|
g->x = 0;
|
|
|
|
g->y = 0;
|
|
|
|
g->w = 5;
|
|
|
|
g->h = 5;
|
|
|
|
g->popbutton = NULL;
|
|
|
|
g->entry_num = 0;
|
|
|
|
g->entry = NULL;
|
1999-10-13 11:14:19 -07:00
|
|
|
g->changed = 1;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = True;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
PointerMotionMask | EnterWindowMask | LeaveWindowMask | ButtonMotionMask;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, root, 0, 0, 5, 5, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
|
|
|
return (Epplet_gadget) g;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_add_popup_entry(Epplet_gadget gadget, char *label, char *pixmap,
|
1999-12-01 11:30:19 -08:00
|
|
|
void (*func) (void *data), void *data)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
g->entry_num++;
|
|
|
|
if (g->entry)
|
|
|
|
g->entry = realloc(g->entry, sizeof(GadPopup) * g->entry_num);
|
|
|
|
else
|
|
|
|
g->entry = malloc(sizeof(GadPopup));
|
|
|
|
g->entry[g->entry_num - 1].label = Estrdup(label);
|
|
|
|
g->entry[g->entry_num - 1].image = Estrdup(pixmap);
|
|
|
|
g->entry[g->entry_num - 1].w = 0;
|
|
|
|
g->entry[g->entry_num - 1].h = 0;
|
|
|
|
g->entry[g->entry_num - 1].func = func;
|
|
|
|
g->entry[g->entry_num - 1].data = data;
|
|
|
|
g->entry[g->entry_num - 1].gadget = NULL;
|
|
|
|
if (g->entry[g->entry_num - 1].image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
im = Imlib_load_image(id, g->entry[g->entry_num - 1].image);
|
|
|
|
g->w = im->rgb_width;
|
|
|
|
g->h = im->rgb_height;
|
|
|
|
Imlib_destroy_image(id, im);
|
|
|
|
}
|
|
|
|
else if (g->entry[g->entry_num - 1].label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int w, h;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_textclass_get_size("EPPLET_POPUP",
|
1999-11-16 13:02:11 -08:00
|
|
|
&w, &h, g->entry[g->entry_num - 1].label);
|
1999-10-13 08:14:42 -07:00
|
|
|
g->entry[g->entry_num - 1].w = w;
|
|
|
|
g->entry[g->entry_num - 1].h = h;
|
|
|
|
}
|
1999-10-13 11:14:19 -07:00
|
|
|
g->changed = 1;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-10-23 03:15:45 -07:00
|
|
|
void
|
|
|
|
Epplet_remove_popup_entry(Epplet_gadget gadget, int entry_num)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-10-28 16:30:09 -07:00
|
|
|
if (!g->entry)
|
1999-11-16 13:02:11 -08:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (entry_num < 0)
|
|
|
|
entry_num = g->entry_num + entry_num;
|
|
|
|
if (g->entry_num < entry_num)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (g->entry[entry_num].label)
|
|
|
|
{
|
|
|
|
free(g->entry[entry_num].label);
|
|
|
|
g->entry[entry_num].label = NULL;
|
|
|
|
}
|
|
|
|
if (g->entry[entry_num].image)
|
|
|
|
{
|
|
|
|
free(g->entry[entry_num].image);
|
|
|
|
g->entry[entry_num].image = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
g->entry_num--;
|
|
|
|
for (i = entry_num; i < g->entry_num; i++)
|
|
|
|
{
|
|
|
|
*((g->entry) + i) = *((g->entry) + i + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g->entry_num)
|
|
|
|
g->entry = realloc(g->entry, sizeof(GadPopup) * g->entry_num);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
free(g->entry);
|
|
|
|
g->entry = NULL;
|
|
|
|
}
|
|
|
|
g->changed = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *
|
1999-11-09 11:02:15 -08:00
|
|
|
Epplet_popup_entry_get_data(Epplet_gadget gadget, int entry_num)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
/* int i; */
|
1999-11-16 13:02:11 -08:00
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-11-09 11:02:15 -08:00
|
|
|
if (!g->entry)
|
1999-11-16 13:02:11 -08:00
|
|
|
return NULL;
|
1999-10-28 16:30:09 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
if (entry_num < 0)
|
|
|
|
entry_num = g->entry_num + entry_num;
|
|
|
|
if (g->entry_num < entry_num)
|
|
|
|
return NULL;
|
1999-10-28 16:30:09 -07:00
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
return ((g->entry)[entry_num]).data;
|
|
|
|
}
|
1999-11-09 10:24:35 -08:00
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
int
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_popup_entry_num(Epplet_gadget gadget)
|
1999-11-09 11:02:15 -08:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if (((GadGeneral *) gadget)->type == E_POPUP)
|
|
|
|
return ((GadPopup *) gadget)->entry_num;
|
1999-10-28 16:30:09 -07:00
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
return 0;
|
1999-10-28 16:30:09 -07:00
|
|
|
}
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
void
|
|
|
|
Epplet_popup_arrange_contents(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
int i, mw, mh, x, y;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
mw = 0;
|
|
|
|
mh = 0;
|
|
|
|
for (i = 0; i < g->entry_num; i++)
|
|
|
|
{
|
|
|
|
if (g->entry[i].w > mw)
|
|
|
|
mw = g->entry[i].w;
|
|
|
|
if (g->entry[i].h > mh)
|
|
|
|
mh = g->entry[i].h;
|
|
|
|
}
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
XResizeWindow(disp, g->win, mw + 8, ((mh + 4) * g->entry_num) + 4);
|
|
|
|
for (i = 0; i < g->entry_num; i++)
|
|
|
|
{
|
|
|
|
g->entry[i].gadget = Epplet_create_button(g->entry[i].label,
|
|
|
|
g->entry[i].image,
|
1999-11-16 13:02:11 -08:00
|
|
|
x + 2, y + 2,
|
1999-10-13 08:14:42 -07:00
|
|
|
mw + 4, mh + 4, NULL,
|
|
|
|
g->win, gadget,
|
|
|
|
g->entry[i].func,
|
|
|
|
g->entry[i].data);
|
|
|
|
Epplet_gadget_show(g->entry[i].gadget);
|
|
|
|
y += mh + 4;
|
|
|
|
}
|
|
|
|
g->x = 0;
|
|
|
|
g->y = 0;
|
|
|
|
g->w = mw + 8;
|
|
|
|
g->h = ((mh + 4) * g->entry_num) + 4;
|
|
|
|
XSync(disp, False);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_popup(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-10-13 11:14:19 -07:00
|
|
|
if (g->changed)
|
|
|
|
{
|
|
|
|
g->changed = 0;
|
|
|
|
Epplet_imageclass_apply("EPPLET_POPUP_BASE", "normal", g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_pop_popup(Epplet_gadget gadget, Window ww)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopup *g;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
1999-10-13 11:14:19 -07:00
|
|
|
if (g->changed)
|
|
|
|
Epplet_popup_arrange_contents(gadget);
|
1999-10-13 08:14:42 -07:00
|
|
|
if (ww)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int px, py, rw, rh, x, y;
|
|
|
|
Window dw;
|
|
|
|
unsigned int w, h, b, d;
|
|
|
|
|
|
|
|
XGetGeometry(disp, root, &dw, &x, &y,
|
|
|
|
(unsigned int *)&rw, (unsigned int *)&rh, &b, &d);
|
1999-10-13 08:14:42 -07:00
|
|
|
XGetGeometry(disp, ww, &dw, &x, &y, &w, &h, &b, &d);
|
|
|
|
XTranslateCoordinates(disp, ww, root, 0, 0, &px, &py, &dw);
|
|
|
|
if ((py + ((int)h / 2)) > (rh / 2))
|
|
|
|
{
|
|
|
|
g->x = px + ((w - g->w) / 2);
|
|
|
|
g->y = py - g->h;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g->x = px + ((w - g->w) / 2);
|
|
|
|
g->y = py + h;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int rw, rh, dd, x, y;
|
|
|
|
Window dw;
|
|
|
|
unsigned int b, d;
|
|
|
|
|
|
|
|
XGetGeometry(disp, root, &dw, &x, &y,
|
|
|
|
(unsigned int *)&rw, (unsigned int *)&rh, &b, &d);
|
|
|
|
XQueryPointer(disp, root, &dw, &dw, &dd, &dd, &x, &y, &b);
|
1999-10-13 08:14:42 -07:00
|
|
|
g->x = x - (g->w / 2);
|
|
|
|
g->y = y - 8;
|
|
|
|
if (g->x < 0)
|
|
|
|
g->x = 0;
|
|
|
|
if (g->y < 0)
|
|
|
|
g->y = 0;
|
|
|
|
if ((g->x + g->w) > rw)
|
|
|
|
g->x = rw - g->w;
|
|
|
|
if ((g->y + g->h) > rh)
|
|
|
|
g->y = rh - g->h;
|
|
|
|
}
|
|
|
|
XMoveWindow(disp, g->win, g->x, g->y);
|
|
|
|
Epplet_gadget_show(gadget);
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_gadget
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_create_popupbutton(char *label, char *image, int x,
|
1999-11-16 13:02:11 -08:00
|
|
|
int y, int w, int h, char *std, Epplet_gadget popup)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopupButton *g;
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowAttributes attr;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
g = malloc(sizeof(GadPopupButton));
|
|
|
|
g->general.type = E_POPUPBUTTON;
|
|
|
|
g->x = x;
|
|
|
|
g->y = y;
|
1999-11-09 11:02:15 -08:00
|
|
|
g->std = Estrdup(std);
|
|
|
|
if (g->std)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
g->w = 12;
|
|
|
|
g->h = 12;
|
1999-11-09 11:02:15 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
1999-11-09 11:02:15 -08:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
|
|
|
g->label = Estrdup(label);
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
g->hilited = 0;
|
|
|
|
g->clicked = 0;
|
|
|
|
g->popped = 0;
|
|
|
|
g->popup = popup;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.backing_store = NotUseful;
|
1999-10-13 08:14:42 -07:00
|
|
|
attr.override_redirect = False;
|
1999-11-16 13:02:11 -08:00
|
|
|
attr.colormap = Imlib_get_colormap(id);
|
|
|
|
attr.border_pixel = 0;
|
|
|
|
attr.background_pixel = 0;
|
|
|
|
attr.save_under = False;
|
|
|
|
attr.event_mask = ButtonPressMask | ButtonReleaseMask |
|
1999-10-13 08:14:42 -07:00
|
|
|
EnterWindowMask | LeaveWindowMask;
|
|
|
|
g->general.visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
g->win = XCreateWindow(disp, win, x, y, g->w, g->h, 0,
|
1999-10-13 08:14:42 -07:00
|
|
|
id->x.depth, InputOutput, Imlib_get_visual(id),
|
|
|
|
CWOverrideRedirect | CWSaveUnder | CWBackingStore |
|
|
|
|
CWColormap | CWBackPixel | CWBorderPixel |
|
|
|
|
CWEventMask, &attr);
|
|
|
|
XSaveContext(disp, g->win, xid_context, (XPointer) g);
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_add_gad((Epplet_gadget) g);
|
1999-10-13 08:14:42 -07:00
|
|
|
return (Epplet_gadget) g;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_draw_popupbutton(Epplet_gadget eg)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopupButton *g;
|
|
|
|
char *state;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) eg;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "hilited";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->clicked)
|
|
|
|
state = "clicked";
|
|
|
|
else
|
|
|
|
state = "normal";
|
|
|
|
}
|
|
|
|
if (g->popped)
|
|
|
|
state = "clicked";
|
|
|
|
if (g->pmap)
|
|
|
|
XFreePixmap(disp, g->pmap);
|
|
|
|
if (g->mask)
|
|
|
|
XFreePixmap(disp, g->mask);
|
|
|
|
g->pmap = 0;
|
|
|
|
g->mask = 0;
|
1999-11-09 11:02:15 -08:00
|
|
|
if (g->std)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
1999-10-28 16:30:09 -07:00
|
|
|
|
1999-11-10 15:37:53 -08:00
|
|
|
Esnprintf(s, sizeof(s), "EPPLET_%s", g->std);
|
1999-11-09 11:02:15 -08:00
|
|
|
Epplet_imageclass_get_pixmaps(s, state,
|
1999-11-16 13:02:11 -08:00
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
1999-11-09 11:02:15 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BUTTON", state,
|
|
|
|
&(g->pmap), &(g->mask), g->w, g->h);
|
1999-11-09 11:02:15 -08:00
|
|
|
if (g->image)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
ImlibImage *im;
|
1999-10-28 16:30:09 -07:00
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
ESYNC;
|
|
|
|
im = Imlib_load_image(id, g->image);
|
|
|
|
if (im)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int x, y;
|
|
|
|
|
|
|
|
x = (g->w - im->rgb_width) / 2;
|
|
|
|
y = (g->h - im->rgb_height) / 2;
|
|
|
|
Imlib_paste_image(id, im, g->pmap, x, y,
|
|
|
|
im->rgb_width, im->rgb_height);
|
|
|
|
Imlib_destroy_image(id, im);
|
1999-11-09 11:02:15 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g->label)
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
int x, y, w, h;
|
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
Epplet_textclass_get_size("EPPLET_BUTTON", &w, &h, g->label);
|
|
|
|
x = (g->w - w) / 2;
|
|
|
|
y = (g->h - h) / 2;
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textclass_draw("EPPLET_BUTTON", state, g->pmap, x, y,
|
|
|
|
g->label);
|
1999-10-28 16:30:09 -07:00
|
|
|
}
|
1999-11-09 10:24:35 -08:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
ESYNC;
|
|
|
|
XSetWindowBackgroundPixmap(disp, g->win, g->pmap);
|
1999-11-16 13:02:11 -08:00
|
|
|
XShapeCombineMask(disp, g->win, ShapeBounding, 0, 0, g->mask, ShapeSet);
|
1999-10-13 08:14:42 -07:00
|
|
|
XClearWindow(disp, g->win);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_change_popbutton_popup(Epplet_gadget gadget, Epplet_gadget popup)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
Epplet_gadget_destroy(g->popup);
|
1999-10-13 08:14:42 -07:00
|
|
|
g->popped = 0;
|
|
|
|
g->popup = popup;
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_change_image(Epplet_gadget gadget, int w, int h, char *image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadImage *g;
|
|
|
|
|
|
|
|
g = (GadImage *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
g->w = w;
|
|
|
|
g->h = h;
|
|
|
|
Epplet_draw_image(gadget, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_change_label(Epplet_gadget gadget, char *label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadLabel *g;
|
|
|
|
|
|
|
|
g = (GadLabel *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (g->label)
|
1999-10-26 06:26:21 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if (label && !strcmp(g->label, label))
|
|
|
|
return; /* The labels are identical, so no sense in redrawing */
|
|
|
|
else
|
|
|
|
free(g->label); /* The labels are different. Proceed. */
|
1999-10-26 06:26:21 -07:00
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
g->label = Estrdup(label);
|
|
|
|
Epplet_draw_label(gadget, 0);
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
Window Epplet_get_drawingarea_window(Epplet_gadget gadget)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadDrawingArea *g;
|
|
|
|
|
|
|
|
g = (GadDrawingArea *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
return g->win_in;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_event(Epplet_gadget gadget, XEvent * ev)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
static int rx = 0, ry = 0, dx, dy;
|
|
|
|
GadGeneral *gg;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
switch (ev->type)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
case KeyPress:
|
|
|
|
rx = ev->xbutton.x_root;
|
|
|
|
ry = ev->xbutton.y_root;
|
|
|
|
switch (gg->type)
|
1999-11-09 12:10:10 -08:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
case E_BUTTON:
|
|
|
|
break;
|
|
|
|
case E_TEXTBOX:
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadTextBox *) gadget;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_textbox_handle_keyevent(ev, gadget);
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_draw_textbox(g);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
|
|
|
break;
|
|
|
|
case E_DRAWINGAREA:
|
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
|
|
|
break;
|
|
|
|
case E_LABEL:
|
|
|
|
break;
|
|
|
|
case E_VBAR:
|
|
|
|
break;
|
|
|
|
case E_HBAR:
|
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
break;
|
1999-11-09 12:10:10 -08:00
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
case ButtonPress:
|
|
|
|
rx = ev->xbutton.x_root;
|
|
|
|
ry = ev->xbutton.y_root;
|
|
|
|
switch (gg->type)
|
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
g->clicked = 1;
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
g->clicked = 1;
|
|
|
|
if (ev->xbutton.window == g->win)
|
|
|
|
{
|
|
|
|
if (ev->xbutton.x > (((*(g->val)) * g->w) /
|
|
|
|
(g->max - g->min + 1)))
|
|
|
|
(*(g->val)) += g->jump;
|
|
|
|
else
|
|
|
|
(*(g->val)) -= g->jump;
|
|
|
|
if ((*(g->val)) < g->min)
|
|
|
|
(*(g->val)) = g->min;
|
|
|
|
if ((*(g->val)) > g->max)
|
|
|
|
(*(g->val)) = g->max;
|
|
|
|
}
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
g->clicked = 1;
|
|
|
|
if (ev->xbutton.window == g->win)
|
|
|
|
{
|
|
|
|
if (ev->xbutton.y > (((*(g->val)) * g->h) /
|
|
|
|
(g->max - g->min + 1)))
|
|
|
|
(*(g->val)) += g->jump;
|
|
|
|
else
|
|
|
|
(*(g->val)) -= g->jump;
|
|
|
|
if ((*(g->val)) < g->min)
|
|
|
|
(*(g->val)) = g->min;
|
|
|
|
if ((*(g->val)) > g->max)
|
|
|
|
(*(g->val)) = g->max;
|
|
|
|
}
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
g->clicked = 1;
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
g->clicked = 1;
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ButtonRelease:
|
|
|
|
rx = ev->xbutton.x_root;
|
|
|
|
ry = ev->xbutton.y_root;
|
|
|
|
switch (gg->type)
|
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
g->clicked = 0;
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
if (g->pop_parent)
|
|
|
|
Epplet_gadget_hide(g->pop_parent);
|
|
|
|
if ((g->hilited) && (g->func))
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
1999-11-27 08:17:16 -08:00
|
|
|
case E_TEXTBOX:
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
char *s;
|
|
|
|
int nbytes_return;
|
|
|
|
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
|
|
|
|
if (ev->xbutton.button == 2)
|
|
|
|
{
|
1999-11-27 09:58:33 -08:00
|
|
|
s = XFetchBuffer(disp, &nbytes_return, 0);
|
|
|
|
if (nbytes_return)
|
|
|
|
Epplet_textbox_insert(g, s);
|
1999-11-27 08:17:16 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
g->clicked = 0;
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
g->clicked = 0;
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
g->clicked = 0;
|
|
|
|
if (g->hilited)
|
|
|
|
{
|
|
|
|
if (*(g->val))
|
|
|
|
*(g->val) = 0;
|
|
|
|
else
|
|
|
|
*(g->val) = 1;
|
|
|
|
}
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
if ((g->hilited) && (g->func))
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
g->clicked = 0;
|
|
|
|
if (g->popped)
|
|
|
|
{
|
|
|
|
if (g->popup)
|
|
|
|
Epplet_gadget_hide(g->popup);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g->popup)
|
|
|
|
{
|
|
|
|
Epplet_pop_popup(g->popup, g->win);
|
|
|
|
((GadPopup *) g->popup)->popbutton = gadget;
|
|
|
|
g->popped = 1;
|
|
|
|
}
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MotionNotify:
|
|
|
|
dx = ev->xbutton.x_root - rx;
|
|
|
|
dy = ev->xbutton.y_root - ry;
|
|
|
|
rx = ev->xbutton.x_root;
|
|
|
|
ry = ev->xbutton.y_root;
|
|
|
|
switch (gg->type)
|
|
|
|
{
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
int v, x, xx;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
if (g->clicked)
|
|
|
|
{
|
|
|
|
x = ((g->w - 8) * (*(g->val))) / (g->max - g->min + 1);
|
|
|
|
xx = x + dx;
|
|
|
|
(*(g->val)) = g->min + ((xx * (g->max - g->min)) / (g->w - 8));
|
|
|
|
v = (*(g->val)) / g->step;
|
|
|
|
if ((*(g->val)) - (v * g->step) >= (g->step / 2))
|
|
|
|
v++;
|
|
|
|
(*(g->val)) = v * g->step;
|
|
|
|
if ((*(g->val)) < g->min)
|
|
|
|
(*(g->val)) = g->min;
|
|
|
|
if ((*(g->val)) > g->max)
|
|
|
|
(*(g->val)) = g->max;
|
|
|
|
xx = ((g->w - 8) * (*(g->val))) / (g->max - g->min + 1);
|
|
|
|
rx = rx - dx + (xx - x);
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
int v, y, yy;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
if (g->clicked)
|
|
|
|
{
|
|
|
|
y = ((g->h - 8) * (*(g->val))) / (g->max - g->min + 1);
|
|
|
|
yy = y + dy;
|
|
|
|
(*(g->val)) = g->min + ((yy * (g->max - g->min)) / (g->h - 8));
|
|
|
|
v = (*(g->val)) / g->step;
|
|
|
|
if ((*(g->val)) - (v * g->step) >= (g->step / 2))
|
|
|
|
v++;
|
|
|
|
(*(g->val)) = v * g->step;
|
|
|
|
if ((*(g->val)) < g->min)
|
|
|
|
(*(g->val)) = g->min;
|
|
|
|
if ((*(g->val)) > g->max)
|
|
|
|
(*(g->val)) = g->max;
|
|
|
|
yy = ((g->h - 8) * (*(g->val))) / (g->max - g->min + 1);
|
|
|
|
ry = ry - dy + (yy - y);
|
|
|
|
if (g->func)
|
|
|
|
(*(g->func)) (g->data);
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EnterNotify:
|
|
|
|
switch (gg->type)
|
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadButton *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case E_TEXTBOX:
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_textbox(gadget);
|
|
|
|
}
|
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
g->hilited = 1;
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LeaveNotify:
|
|
|
|
switch (gg->type)
|
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
1999-11-09 12:10:10 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadButton *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case E_TEXTBOX:
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_textbox(gadget);
|
|
|
|
}
|
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
g->hilited = 0;
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_background_properties(char vertical)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (bg_pmap)
|
|
|
|
XFreePixmap(disp, bg_pmap);
|
|
|
|
if (bg_bg)
|
|
|
|
XFreePixmap(disp, bg_bg);
|
|
|
|
if (bg_mask)
|
|
|
|
XFreePixmap(disp, bg_mask);
|
|
|
|
bg_pmap = 0;
|
|
|
|
bg_mask = 0;
|
|
|
|
bg_bg = 0;
|
|
|
|
if (vertical)
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BACKGROUND_VERTICAL", "normal",
|
1999-10-13 08:14:42 -07:00
|
|
|
&bg_bg, &bg_mask, win_w, win_h);
|
|
|
|
else
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_imageclass_get_pixmaps("EPPLET_BACKGROUND_HORIZONTAL", "normal",
|
1999-10-13 08:14:42 -07:00
|
|
|
&bg_bg, &bg_mask, win_w, win_h);
|
|
|
|
bg_pmap = XCreatePixmap(disp, win, win_w, win_h, id->x.depth);
|
|
|
|
if (!gc)
|
|
|
|
gc = XCreateGC(disp, bg_pmap, 0, &gcv);
|
1999-11-16 13:02:11 -08:00
|
|
|
XCopyArea(disp, bg_bg, bg_pmap, gc, 0, 0, win_w, win_h, 0, 0);
|
1999-10-13 08:14:42 -07:00
|
|
|
XSetWindowBackgroundPixmap(disp, win, bg_pmap);
|
1999-11-16 13:02:11 -08:00
|
|
|
XShapeCombineMask(disp, win, ShapeBounding, 0, 0, bg_mask, ShapeSet);
|
1999-10-13 08:14:42 -07:00
|
|
|
XClearWindow(disp, win);
|
|
|
|
win_vert = vertical;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_gadget_destroy(Epplet_gadget gadget)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral *gg;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_gadget_hide(gadget);
|
1999-11-16 13:02:11 -08:00
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_del_gad(gadget);
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (gg->type)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
if (g->label)
|
|
|
|
free(g->label);
|
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
if (g->std)
|
|
|
|
free(g->std);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_DRAWINGAREA:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadDrawingArea *g;
|
|
|
|
|
|
|
|
g = (GadDrawingArea *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDestroyWindow(disp, g->win_knob);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
XDeleteContext(disp, g->win_knob, xid_context);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDestroyWindow(disp, g->win_knob);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
XDeleteContext(disp, g->win_knob, xid_context);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
if (g->label)
|
|
|
|
free(g->label);
|
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
if (g->label)
|
|
|
|
free(g->label);
|
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopup *g;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
|
|
|
for (i = 0; i < g->entry_num; i++)
|
|
|
|
{
|
|
|
|
if (g->entry[i].label)
|
|
|
|
free(g->entry[i].label);
|
|
|
|
if (g->entry[i].image)
|
|
|
|
free(g->entry[i].image);
|
1999-11-28 08:31:23 -08:00
|
|
|
if (g->entry[i].gadget)
|
|
|
|
Epplet_gadget_destroy(g->entry[i].gadget);
|
1999-11-16 13:02:11 -08:00
|
|
|
}
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
XDeleteContext(disp, g->win, xid_context);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadImage *g;
|
|
|
|
|
|
|
|
g = (GadImage *) gadget;
|
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_LABEL:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadLabel *g;
|
|
|
|
|
|
|
|
g = (GadLabel *) gadget;
|
|
|
|
if (g->label)
|
|
|
|
free(g->label);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-11-09 10:24:35 -08:00
|
|
|
break;
|
|
|
|
case E_HBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHBar *g;
|
|
|
|
|
|
|
|
g = (GadHBar *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVBar *g;
|
|
|
|
|
|
|
|
g = (GadVBar *) gadget;
|
|
|
|
XDestroyWindow(disp, g->win);
|
|
|
|
free(g);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_gadget_hide(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral *gg;
|
|
|
|
|
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!(gg->visible))
|
|
|
|
return;
|
|
|
|
gg->visible = 0;
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (gg->type)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_DRAWINGAREA:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadDrawingArea *g;
|
|
|
|
|
|
|
|
g = (GadDrawingArea *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
XUnmapWindow(disp, g->win_knob);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
XUnmapWindow(disp, g->win_knob);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopup *g;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
if (g->popbutton)
|
|
|
|
{
|
|
|
|
((GadPopupButton *) g->popbutton)->popped = 0;
|
|
|
|
Epplet_draw_popupbutton(g->popbutton);
|
|
|
|
g->popbutton = NULL;
|
|
|
|
}
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadImage *g;
|
|
|
|
|
|
|
|
g = (GadImage *) gadget;
|
|
|
|
Epplet_draw_image(gadget, 1);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_LABEL:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadLabel *g;
|
|
|
|
|
|
|
|
g = (GadLabel *) gadget;
|
|
|
|
Epplet_draw_label(gadget, 1);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHBar *g;
|
|
|
|
|
|
|
|
g = (GadHBar *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVBar *g;
|
|
|
|
|
|
|
|
g = (GadVBar *) gadget;
|
|
|
|
XUnmapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_gadget_show(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral *gg;
|
|
|
|
|
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (gg->visible)
|
|
|
|
return;
|
|
|
|
gg->visible = 1;
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (gg->type)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadButton *g;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case E_TEXTBOX:
|
|
|
|
{
|
|
|
|
GadTextBox *g;
|
|
|
|
|
|
|
|
g = (GadTextBox *) gadget;
|
|
|
|
Epplet_draw_textbox(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_DRAWINGAREA:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadDrawingArea *g;
|
|
|
|
|
|
|
|
g = (GadDrawingArea *) gadget;
|
|
|
|
Epplet_draw_drawingarea(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
XMapRaised(disp, g->win_knob);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
XMapRaised(disp, g->win_knob);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopupButton *g;
|
|
|
|
|
|
|
|
g = (GadPopupButton *) gadget;
|
|
|
|
Epplet_draw_popupbutton(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_POPUP:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadPopup *g;
|
|
|
|
|
|
|
|
g = (GadPopup *) gadget;
|
|
|
|
Epplet_popup_arrange_contents(gadget);
|
|
|
|
Epplet_draw_popup(gadget);
|
|
|
|
XMapRaised(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadImage *g;
|
|
|
|
|
|
|
|
g = (GadImage *) gadget;
|
|
|
|
Epplet_draw_image(gadget, 0);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_LABEL:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadLabel *g;
|
|
|
|
|
|
|
|
g = (GadLabel *) gadget;
|
|
|
|
Epplet_draw_label(gadget, 0);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHBar *g;
|
|
|
|
|
|
|
|
g = (GadHBar *) gadget;
|
|
|
|
Epplet_draw_hbar(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVBar *g;
|
|
|
|
|
|
|
|
g = (GadVBar *) gadget;
|
|
|
|
Epplet_draw_vbar(gadget);
|
|
|
|
XMapWindow(disp, g->win);
|
|
|
|
}
|
1999-11-09 10:24:35 -08:00
|
|
|
break;
|
1999-10-28 16:30:09 -07:00
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
1999-10-28 16:30:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void *
|
|
|
|
Epplet_gadget_get_data(Epplet_gadget gadget)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if (!gadget)
|
|
|
|
return NULL;
|
1999-11-09 10:24:35 -08:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (((GadGeneral *) gadget)->type)
|
1999-11-09 11:02:15 -08:00
|
|
|
{
|
|
|
|
case E_BUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
return ((GadButton *) gadget)->data;
|
1999-11-09 11:02:15 -08:00
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
return ((GadToggleButton *) gadget)->data;
|
1999-11-09 11:02:15 -08:00
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
return ((GadHSlider *) gadget)->data;
|
1999-11-09 11:02:15 -08:00
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
return ((GadVSlider *) gadget)->data;
|
1999-11-09 11:02:15 -08:00
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
return NULL;
|
1999-11-09 11:02:15 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-11-09 11:02:15 -08:00
|
|
|
Epplet_gadget_data_changed(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadGeneral *gg;
|
|
|
|
|
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!gg->visible)
|
|
|
|
return;
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (gg->type)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
case E_HSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
|
|
|
Epplet_draw_hslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
|
|
|
Epplet_draw_vslider(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadToggleButton *g;
|
|
|
|
|
|
|
|
g = (GadToggleButton *) gadget;
|
|
|
|
Epplet_draw_togglebutton(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadImage *g;
|
|
|
|
|
|
|
|
g = (GadImage *) gadget;
|
|
|
|
Epplet_draw_image(gadget, 0);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_LABEL:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadLabel *g;
|
|
|
|
|
|
|
|
g = (GadLabel *) gadget;
|
|
|
|
Epplet_draw_label(gadget, 0);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_HBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadHBar *g;
|
|
|
|
|
|
|
|
g = (GadHBar *) gadget;
|
|
|
|
Epplet_draw_hbar(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
case E_VBAR:
|
1999-11-16 13:02:11 -08:00
|
|
|
{
|
|
|
|
GadVBar *g;
|
|
|
|
|
|
|
|
g = (GadVBar *) gadget;
|
|
|
|
Epplet_draw_vbar(gadget);
|
|
|
|
}
|
1999-10-13 08:14:42 -07:00
|
|
|
break;
|
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_redraw(void)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i;
|
|
|
|
GadGeneral *gg;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
Epplet_background_properties(win_vert);
|
|
|
|
for (i = 0; i < gad_num; i++)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
gg = (GadGeneral *) gads[i];
|
1999-10-13 08:14:42 -07:00
|
|
|
if (gg->visible)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
switch (gg->type)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
case E_BUTTON:
|
|
|
|
Epplet_draw_button(gads[i]);
|
|
|
|
break;
|
1999-11-16 13:02:11 -08:00
|
|
|
case E_TEXTBOX:
|
|
|
|
Epplet_draw_textbox(gads[i]);
|
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
case E_DRAWINGAREA:
|
|
|
|
Epplet_draw_drawingarea(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_HSLIDER:
|
|
|
|
Epplet_draw_hslider(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_VSLIDER:
|
|
|
|
Epplet_draw_vslider(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_TOGGLEBUTTON:
|
|
|
|
Epplet_draw_togglebutton(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_POPUPBUTTON:
|
|
|
|
Epplet_draw_popupbutton(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_POPUP:
|
|
|
|
Epplet_draw_popup(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_IMAGE:
|
|
|
|
Epplet_draw_image(gads[i], 0);
|
|
|
|
break;
|
|
|
|
case E_LABEL:
|
|
|
|
Epplet_draw_label(gads[i], 0);
|
|
|
|
break;
|
|
|
|
case E_HBAR:
|
|
|
|
Epplet_draw_hbar(gads[i]);
|
|
|
|
break;
|
|
|
|
case E_VBAR:
|
|
|
|
Epplet_draw_vbar(gads[i]);
|
|
|
|
break;
|
|
|
|
default:
|
1999-11-16 13:02:11 -08:00
|
|
|
break;
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Esync(void)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
|
|
|
XSync(disp, False);
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_draw_line(Window win, int x1, int y1, int x2, int y2,
|
|
|
|
int r, int g, int b)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
static int cr = -1, cg = -1, cb = -1;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
if (!gc)
|
1999-11-16 13:02:11 -08:00
|
|
|
gc = XCreateGC(disp, win, 0, &gcv);
|
1999-10-13 08:14:42 -07:00
|
|
|
if ((cr != r) || (cg != g) || (cb != b))
|
1999-11-16 13:02:11 -08:00
|
|
|
XSetForeground(disp, gc, Epplet_get_color(r, g, b));
|
|
|
|
XDrawLine(disp, win, gc, x1, y1, x2, y2);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_draw_box(Window win, int x, int y, int w, int h, int r, int g, int b)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
static int cr = -1, cg = -1, cb = -1;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
if ((w <= 0) || (h <= 0))
|
|
|
|
return;
|
|
|
|
if (!gc)
|
1999-11-16 13:02:11 -08:00
|
|
|
gc = XCreateGC(disp, win, 0, &gcv);
|
1999-10-13 08:14:42 -07:00
|
|
|
if ((cr != r) || (cg != g) || (cb != b))
|
1999-11-16 13:02:11 -08:00
|
|
|
XSetForeground(disp, gc, Epplet_get_color(r, g, b));
|
1999-10-13 08:14:42 -07:00
|
|
|
XFillRectangle(disp, win, gc, x, y, (unsigned int)w, (unsigned int)h);
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
|
|
|
Epplet_draw_outline(Window win, int x, int y, int w, int h, int r, int g, int b)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
static int cr = -1, cg = -1, cb = -1;
|
|
|
|
static GC gc = 0;
|
|
|
|
XGCValues gcv;
|
1999-10-13 08:14:42 -07:00
|
|
|
|
|
|
|
if ((w <= 0) || (h <= 0))
|
|
|
|
return;
|
|
|
|
if (!gc)
|
1999-11-16 13:02:11 -08:00
|
|
|
gc = XCreateGC(disp, win, 0, &gcv);
|
1999-10-13 08:14:42 -07:00
|
|
|
if ((cr != r) || (cg != g) || (cb != b))
|
1999-11-16 13:02:11 -08:00
|
|
|
XSetForeground(disp, gc, Epplet_get_color(r, g, b));
|
|
|
|
XDrawRectangle(disp, win, gc, x, y, (unsigned int)(w - 1),
|
1999-10-13 08:14:42 -07:00
|
|
|
(unsigned int)(h - 1));
|
|
|
|
}
|
|
|
|
|
1999-12-01 11:30:19 -08:00
|
|
|
RGB_buf Epplet_make_rgb_buf(int w, int h)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
RGB_buf buf;
|
|
|
|
unsigned char *data;
|
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
buf = malloc(sizeof(RGB_buf));
|
|
|
|
data = malloc(w * h * 3 * sizeof(unsigned char));
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 08:14:42 -07:00
|
|
|
buf->im = Imlib_create_image_from_data(id, data, NULL, w, h);
|
|
|
|
free(data);
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
unsigned char *
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_get_rgb_pointer(RGB_buf buf)
|
|
|
|
{
|
|
|
|
return buf->im->rgb_data;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_paste_buf(RGB_buf buf, Window win, int x, int y)
|
|
|
|
{
|
|
|
|
Imlib_changed_image(id, buf->im);
|
1999-11-16 13:02:11 -08:00
|
|
|
Imlib_paste_image(id, buf->im, win, x, y,
|
1999-10-13 08:14:42 -07:00
|
|
|
buf->im->rgb_width, buf->im->rgb_height);
|
|
|
|
}
|
|
|
|
|
1999-10-13 10:34:12 -07:00
|
|
|
static void
|
|
|
|
Epplet_handle_child(int num)
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
pid_t pid;
|
1999-11-16 13:02:11 -08:00
|
|
|
|
1999-10-13 10:34:12 -07:00
|
|
|
while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
|
|
|
|
{
|
|
|
|
if (WIFEXITED(status))
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int code;
|
|
|
|
|
1999-10-13 10:34:12 -07:00
|
|
|
code = WEXITSTATUS(status);
|
|
|
|
if (child_func)
|
|
|
|
(*child_func) (child_data, pid, code);
|
|
|
|
}
|
|
|
|
}
|
1999-10-22 16:45:57 -07:00
|
|
|
return;
|
|
|
|
num = 0;
|
1999-10-13 10:34:12 -07:00
|
|
|
}
|
|
|
|
|
1999-11-09 11:02:15 -08:00
|
|
|
int
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_run_command(char *cmd)
|
|
|
|
{
|
1999-11-09 11:02:15 -08:00
|
|
|
return system(cmd);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
char *
|
1999-10-13 08:14:42 -07:00
|
|
|
Epplet_read_run_command(char *cmd)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
return (cmd);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
1999-10-13 10:34:12 -07:00
|
|
|
Epplet_spawn_command(char *cmd)
|
1999-10-13 08:14:42 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
pid_t pid;
|
|
|
|
|
1999-10-13 10:34:12 -07:00
|
|
|
pid = fork();
|
|
|
|
if (pid)
|
|
|
|
return (int)pid;
|
|
|
|
execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
|
|
|
|
exit(0);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_pause_spawned_command(int pid)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
kill((pid_t) pid, SIGSTOP);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_unpause_spawned_command(int pid)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
kill((pid_t) pid, SIGCONT);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_kill_spawned_command(int pid)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
kill((pid_t) pid, SIGINT);
|
1999-10-13 10:34:12 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_destroy_spawned_command(int pid)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
kill((pid_t) pid, SIGKILL);
|
1999-10-13 08:14:42 -07:00
|
|
|
}
|
|
|
|
|
1999-10-13 10:34:12 -07:00
|
|
|
void
|
1999-11-16 13:02:11 -08:00
|
|
|
Epplet_register_child_handler(void (*func)
|
1999-12-01 11:30:19 -08:00
|
|
|
(void *data, int pid, int exit_code), void *data)
|
1999-10-13 10:34:12 -07:00
|
|
|
{
|
|
|
|
child_data = data;
|
|
|
|
child_func = func;
|
|
|
|
}
|
1999-10-13 11:14:19 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_change_button_label(Epplet_gadget gadget, char *label)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadButton *g;
|
|
|
|
GadGeneral *gg;
|
|
|
|
|
|
|
|
g = (GadButton *) gadget;
|
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 11:14:19 -07:00
|
|
|
if (g->label)
|
|
|
|
free(g->label);
|
|
|
|
g->label = Estrdup(label);
|
|
|
|
if (gg->visible)
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_change_button_image(Epplet_gadget gadget, char *image)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadButton *g;
|
|
|
|
GadGeneral *gg;
|
1999-10-13 11:14:19 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
g = (GadButton *) gadget;
|
|
|
|
gg = (GadGeneral *) gadget;
|
1999-10-13 11:14:19 -07:00
|
|
|
if (g->image)
|
|
|
|
free(g->image);
|
|
|
|
g->image = Estrdup(image);
|
|
|
|
if (gg->visible)
|
|
|
|
Epplet_draw_button(gadget);
|
|
|
|
}
|
1999-10-13 12:04:05 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
void
|
1999-10-13 12:04:05 -07:00
|
|
|
Epplet_clear_window(Window ww)
|
|
|
|
{
|
|
|
|
XClearWindow(disp, ww);
|
|
|
|
}
|
1999-10-13 14:13:40 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_show_about(char *name)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024];
|
|
|
|
|
1999-11-27 08:17:16 -08:00
|
|
|
Esnprintf(s, sizeof(s), EBIN "/dox " EROOT "/epplet_data/%s/%s.ABOUT", name,
|
|
|
|
name);
|
1999-10-13 14:13:40 -07:00
|
|
|
Epplet_spawn_command(s);
|
|
|
|
}
|
1999-10-13 15:31:43 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
Epplet_dialog_ok(char *text)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char *s;
|
|
|
|
|
1999-10-13 15:31:43 -07:00
|
|
|
s = malloc(strlen(text) + 32);
|
1999-11-10 15:58:34 -08:00
|
|
|
sprintf(s, "dialog_ok %s", text);
|
1999-10-13 15:31:43 -07:00
|
|
|
ECommsSend(s);
|
|
|
|
free(s);
|
|
|
|
}
|
1999-10-18 08:04:54 -07:00
|
|
|
|
1999-10-22 15:09:18 -07:00
|
|
|
static void
|
|
|
|
Epplet_find_instance(char *name)
|
1999-10-22 09:43:22 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
struct stat st;
|
|
|
|
char s[1024];
|
|
|
|
int i = 0, fd;
|
|
|
|
pid_t pid;
|
1999-10-22 09:43:22 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
/* make sure basic dir exists */
|
|
|
|
Esnprintf(s, sizeof(s), "%s/.enlightenment/epplet_config", getenv("HOME"));
|
|
|
|
if (stat(s, &st) < 0)
|
|
|
|
{
|
|
|
|
if (mkdir(s, S_IRWXU) < 0)
|
|
|
|
{
|
|
|
|
char err[255];
|
|
|
|
|
|
|
|
Esnprintf(err, sizeof(err),
|
|
|
|
"Unable to create epplet config directory %s -- %s.\n",
|
|
|
|
s, strerror(errno));
|
|
|
|
Epplet_dialog_ok(err);
|
|
|
|
epplet_instance = 1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* make sure this epplets config dir exists */
|
|
|
|
Esnprintf(s, sizeof(s), "%s/.enlightenment/epplet_config/%s", getenv("HOME"),
|
|
|
|
name);
|
|
|
|
conf_dir = strdup(s);
|
|
|
|
if (stat(s, &st) < 0)
|
|
|
|
{
|
|
|
|
if (mkdir(s, S_IRWXU) < 0)
|
|
|
|
{
|
|
|
|
char err[255];
|
|
|
|
|
|
|
|
Esnprintf(err, sizeof(err),
|
|
|
|
"Unable to create epplet config directory %s -- %s.\n",
|
|
|
|
s, strerror(errno));
|
|
|
|
Epplet_dialog_ok(err);
|
|
|
|
epplet_instance = 1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Pick our instance number. 255 is the max to avoid infinite loops, which could be caused by
|
|
|
|
* lack of insert permissions in the config directory. */
|
|
|
|
for (i = 1; i < 256; i++)
|
|
|
|
{
|
|
|
|
Esnprintf(s, sizeof(s), "%s/.lock_%i", conf_dir, i);
|
|
|
|
if (stat(s, &st) >= 0)
|
|
|
|
{
|
|
|
|
/* Lock file exists. Read from it. */
|
|
|
|
if ((fd = open(s, O_RDONLY)) < 0)
|
|
|
|
{
|
|
|
|
/* Either it's there and we can't read it, or it's gone now. Next! */
|
|
|
|
fprintf(stderr, "Unable to read lock file %s -- %s\n", s,
|
|
|
|
strerror(errno));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ((read(fd, &pid, sizeof(pid_t))) < ((int)sizeof(pid_t)))
|
|
|
|
{
|
|
|
|
/* We didn't get enough bytes. Next! */
|
|
|
|
fprintf(stderr,
|
|
|
|
"Read attempt for lock file %s failed -- %s\n", s,
|
|
|
|
strerror(errno));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
if (pid <= 0)
|
|
|
|
{
|
|
|
|
/* We got a bogus process ID. Next! */
|
|
|
|
fprintf(stderr,
|
|
|
|
"Lock file %s contained a bogus process ID (%lu)\n",
|
|
|
|
s, (unsigned long)pid);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ((kill(pid, 0) == 0) || (errno != ESRCH))
|
|
|
|
{
|
|
|
|
/* The process exists. Next! */
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
/* Okay, looks like a stale lockfile at this point. Remove it. */
|
|
|
|
if ((unlink(s)) != 0)
|
|
|
|
{
|
|
|
|
/* Removal failed. Next! */
|
|
|
|
fprintf(stderr,
|
|
|
|
"Unable to remove stale lock file %s -- %s. Please remove it manually.\n",
|
|
|
|
s, strerror(errno));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((fd = open(s, (O_WRONLY | O_EXCL | O_CREAT), 0600)) < 0)
|
|
|
|
{
|
|
|
|
/* Apparently another process just came in under us and created it. Next! */
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
pid = getpid();
|
1999-12-01 11:30:19 -08:00
|
|
|
write(fd, &pid, sizeof(pid_t)); /* Not sure how best to deal with write errors here */
|
1999-11-16 13:02:11 -08:00
|
|
|
close(fd);
|
|
|
|
/* If we made it here, we've just written the lock file and saved it. We have our instance
|
|
|
|
* number, so exit the loop. */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Anything this high is probably an error. */
|
|
|
|
if (i >= 255)
|
|
|
|
{
|
|
|
|
i = 1;
|
|
|
|
}
|
|
|
|
epplet_instance = i;
|
|
|
|
|
|
|
|
/* find out epplet's name */
|
|
|
|
if (epplet_instance > 1)
|
|
|
|
{
|
|
|
|
Esnprintf(s, sizeof(s), "%s-%i", name, epplet_instance);
|
|
|
|
epplet_name = strdup(s);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
epplet_name = strdup(name);
|
1999-10-22 15:09:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
Epplet_get_instance(void)
|
|
|
|
{
|
|
|
|
return epplet_instance;
|
|
|
|
}
|
|
|
|
|
1999-10-22 16:12:12 -07:00
|
|
|
void
|
1999-10-26 08:48:35 -07:00
|
|
|
Epplet_add_config(char *key, char *value)
|
1999-10-22 15:09:18 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if (!config_dict)
|
|
|
|
{
|
|
|
|
config_dict = (ConfigDict *) malloc(sizeof(ConfigDict));
|
|
|
|
memset(config_dict, 0, sizeof(ConfigDict));
|
|
|
|
}
|
|
|
|
if (config_dict && key)
|
|
|
|
{
|
|
|
|
config_dict->entries =
|
|
|
|
realloc(config_dict->entries,
|
|
|
|
sizeof(ConfigItem) * (config_dict->num_entries + 1));
|
|
|
|
config_dict->entries[config_dict->num_entries].key = strdup(key);
|
|
|
|
config_dict->entries[config_dict->num_entries].value =
|
|
|
|
(value ? strdup(value) : strdup(""));
|
|
|
|
config_dict->num_entries++;
|
|
|
|
}
|
1999-10-22 15:09:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-10-26 08:48:35 -07:00
|
|
|
Epplet_load_config(void)
|
1999-10-22 15:09:18 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char s[1024], s2[1024], s3[1024];
|
|
|
|
FILE *f = NULL;
|
|
|
|
|
|
|
|
/* If they haven't initialized, abort */
|
|
|
|
if (epplet_instance == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* create config file name */
|
|
|
|
Esnprintf(s, sizeof(s), "%s/%s.cfg", conf_dir, epplet_name);
|
|
|
|
epplet_cfg_file = strdup(s);
|
|
|
|
|
|
|
|
config_dict = (ConfigDict *) malloc(sizeof(ConfigDict));
|
|
|
|
memset(config_dict, 0, sizeof(ConfigDict));
|
|
|
|
|
|
|
|
if ((f = fopen(epplet_cfg_file, "r")) == NULL)
|
|
|
|
return;
|
|
|
|
*s2 = 0;
|
|
|
|
for (; fgets(s, sizeof(s), f);)
|
|
|
|
{
|
|
|
|
sscanf(s, "%s %[^\n]\n", (char *)&s2, (char *)&s3);
|
|
|
|
if (!(*s2) || (!*s3) || (*s2 == '\n') || (*s2 == '#'))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
Epplet_add_config(s2, s3);
|
|
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
return;
|
1999-10-22 09:43:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-10-22 15:09:18 -07:00
|
|
|
Epplet_save_config(void)
|
1999-10-18 08:50:58 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
FILE *f;
|
|
|
|
int i;
|
1999-10-22 09:43:22 -07:00
|
|
|
|
1999-10-26 08:48:35 -07:00
|
|
|
if (!(config_dict) || (config_dict->num_entries <= 0))
|
1999-11-16 13:02:11 -08:00
|
|
|
return;
|
1999-10-26 08:48:35 -07:00
|
|
|
|
|
|
|
if (!(f = fopen(epplet_cfg_file, "w")))
|
1999-10-22 15:09:18 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
char err[255];
|
|
|
|
|
|
|
|
Esnprintf(err, sizeof(err),
|
1999-12-01 11:30:19 -08:00
|
|
|
"Unable to write to config file %s -- %s.\n", epplet_cfg_file,
|
1999-11-16 13:02:11 -08:00
|
|
|
strerror(errno));
|
|
|
|
Epplet_dialog_ok(err);
|
|
|
|
return;
|
1999-10-26 08:48:35 -07:00
|
|
|
}
|
1999-11-16 13:02:11 -08:00
|
|
|
fprintf(f, "### Automatically generated Epplet config file for %s.\n\n",
|
|
|
|
epplet_name);
|
1999-10-26 08:48:35 -07:00
|
|
|
for (i = 0; i < config_dict->num_entries; i++)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
if (config_dict->entries[i].key)
|
|
|
|
{
|
|
|
|
fprintf(f, "%s %s\n", config_dict->entries[i].key,
|
|
|
|
config_dict->entries[i].value);
|
|
|
|
}
|
1999-10-18 08:50:58 -07:00
|
|
|
}
|
1999-10-26 08:48:35 -07:00
|
|
|
fclose(f);
|
1999-10-18 08:50:58 -07:00
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
char *
|
1999-10-26 08:48:35 -07:00
|
|
|
Epplet_query_config(char *key)
|
1999-10-18 08:50:58 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i;
|
|
|
|
ConfigItem *ci;
|
1999-10-18 08:50:58 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
for (i = 0; i < config_dict->num_entries; i++)
|
|
|
|
{
|
|
|
|
ci = &(config_dict->entries[i]);
|
|
|
|
if ((ci->key) && !strcmp(key, ci->key))
|
|
|
|
/* we've found the key */
|
|
|
|
return (ci->value);
|
|
|
|
}
|
|
|
|
return ((char *)NULL);
|
1999-10-18 08:50:58 -07:00
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
char *
|
1999-10-26 08:48:35 -07:00
|
|
|
Epplet_query_config_def(char *key, char *def)
|
1999-10-24 06:10:22 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i;
|
|
|
|
ConfigItem *ci;
|
1999-10-24 06:10:22 -07:00
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
for (i = 0; i < config_dict->num_entries; i++)
|
|
|
|
{
|
|
|
|
ci = &(config_dict->entries[i]);
|
|
|
|
if ((ci->key) && !strcmp(key, ci->key))
|
|
|
|
/* we've found the key */
|
|
|
|
return (ci->value);
|
|
|
|
}
|
|
|
|
Epplet_add_config(key, def); /* Not found. Add the default. */
|
|
|
|
return (def);
|
1999-10-24 06:10:22 -07:00
|
|
|
}
|
|
|
|
|
1999-10-22 09:43:22 -07:00
|
|
|
void
|
1999-10-26 08:48:35 -07:00
|
|
|
Epplet_modify_config(char *key, char *value)
|
1999-10-22 09:43:22 -07:00
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
int i;
|
|
|
|
ConfigItem *ci;
|
|
|
|
|
|
|
|
for (i = 0; i < config_dict->num_entries; i++)
|
|
|
|
{
|
|
|
|
ci = &(config_dict->entries[i]);
|
|
|
|
if ((ci->key) && !strcmp(key, ci->key))
|
|
|
|
/* we've found the key */
|
|
|
|
{
|
|
|
|
if (ci->value != value)
|
|
|
|
{
|
|
|
|
free(ci->value);
|
|
|
|
if (value)
|
|
|
|
{
|
|
|
|
ci->value = strdup(value);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ci->value = strdup("");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* so we couldn't find the key, thus add it ... */
|
|
|
|
Epplet_add_config(key, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
1999-10-18 08:04:54 -07:00
|
|
|
Epplet_get_hslider_clicked(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadHSlider *g;
|
|
|
|
|
|
|
|
g = (GadHSlider *) gadget;
|
1999-10-18 08:04:54 -07:00
|
|
|
return (int)g->clicked;
|
|
|
|
}
|
|
|
|
|
1999-11-16 13:02:11 -08:00
|
|
|
int
|
1999-10-18 08:04:54 -07:00
|
|
|
Epplet_get_vslider_clicked(Epplet_gadget gadget)
|
|
|
|
{
|
1999-11-16 13:02:11 -08:00
|
|
|
GadVSlider *g;
|
|
|
|
|
|
|
|
g = (GadVSlider *) gadget;
|
1999-10-18 08:04:54 -07:00
|
|
|
return (int)g->clicked;
|
|
|
|
}
|