File: action.c

package info (click to toggle)
elk 3.0-6
  • links: PTS
  • area: main
  • in suites: potato, slink
  • size: 4,068 kB
  • ctags: 3,123
  • sloc: ansic: 20,686; lisp: 5,232; makefile: 419; awk: 91; sh: 21
file content (80 lines) | stat: -rw-r--r-- 1,945 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "xt.h"

typedef struct action {
    char *name;
    int num;
    XtAppContext con;
    struct action *next;
} ACTION;

ACTION *actions;

/*ARGSUSED*/
static void Dummy_Action (w, ep, argv, argc) Widget w; XEvent *ep;
	String *argv; int *argc; {
}

void Action_Hook (w, client_data, name, ep, argv, argc)
	Widget w; XtPointer client_data; char *name; XEvent *ep;
	char **argv; int *argc; {
    ACTION *ap;
    Object args, params, tail;
    register i;
    GC_Node3;

    for (ap = actions; ap; ap = ap->next) {
	if (strcmp (ap->name, name))
	    continue;
	args = params = tail = Null;
	GC_Link3 (args, params, tail);
	params = P_Make_List (Make_Integer (*argc), Null);
	for (i = 0, tail = params; i < *argc; tail = Cdr (tail), i++) {
	    Object tmp;
	    
	    tmp = Make_String (argv[i], strlen (argv[i]));
	    Car (tail) = tmp;
	}
	args = Cons (params, Null);
	params = Get_Event_Args (ep);
	args = Cons (Copy_List (params), args);
	Destroy_Event_Args (params);
	args = Cons (Make_Widget_Foreign (w), args);
	(void)Funcall (Get_Function (ap->num), args, 0);
	GC_Unlink;
    }
}

static Object P_Context_Add_Action (c, s, p) Object c, s, p; {
    ACTION *ap;
    XtActionsRec a;

    Check_Context (c);
    Check_Procedure (p);
    ap = (ACTION *)XtMalloc (sizeof (ACTION));
    ap->num = Register_Function (p);
    ap->name = XtNewString (Get_Strsym (s));
    ap->con = CONTEXT(c)->context;
    ap->next = actions;
    actions = ap;
    a.string = ap->name;
    a.proc = (XtActionProc)Dummy_Action;
    XtAppAddActions (ap->con, &a, 1);
    return Void;
}

void Free_Actions (con) XtAppContext con; {
    register ACTION *p, **pp;

    for (pp = &actions; p = *pp; ) {
	if (p->con == con) {
	    Deregister_Function (p->num);
	    XtFree (p->name);
	    *pp = p->next;
	    XtFree ((char *)p);
	} else pp = &p->next;
    }
}

elk_init_xt_action () {
    Define_Primitive (P_Context_Add_Action, "context-add-action", 3, 3, EVAL);
}