home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gwm18a.zip / wl_client.c < prev    next >
C/C++ Source or Header  |  1995-07-03  |  9KB  |  329 lines

  1. /* Copyright 1989 GROUPE BULL -- See license conditions in file COPYRIGHT
  2.  * Copyright 1989 Massachusetts Institute of Technology
  3.  */
  4. /***********************\
  5. *                 *
  6. *  WOOL_OBJECT: Client  *
  7. *  BODY                *
  8. *                 *
  9. \***********************/
  10.  
  11. #include "EXTERN.h"
  12. #include <stdio.h>
  13. #include "wool.h"
  14. #include "wl_atom.h"
  15. #include "wl_number.h"
  16. #include "wl_string.h"
  17. #include "wl_list.h"
  18. #include "gwm.h"
  19. #include "wl_pixmap.h"
  20. #include "wl_event.h"
  21. #include "wl_fsm.h"
  22. #include "wl_plug.h"
  23. #include "wl_bar.h"
  24. #include "wl_cursor.h"
  25. #include "wl_menu.h"
  26. #include "INTERN.h"
  27. #include "wl_client.h"
  28. #include "EXTERN.h"
  29.  
  30. /*
  31.  *  wool_client_make:
  32.  * here we put all the hints got from window (properties) and wool profile
  33.  * into a WOOL_Client structure
  34.  * 
  35.  *         (window-make titlebar leftbar rightbar basebar plug)
  36.  */
  37.  
  38. WOOL_Client
  39. wool_client_make(argc, argv)
  40. int        argc;
  41. WOOL_OBJECT    argv[];
  42. {
  43.     WOOL_Client     wl_client;
  44.  
  45.     if (argc != 5)
  46.     wool_error(BAD_NUMBER_OF_ARGS, argc);
  47.     wl_client = (WOOL_Client) Malloc(sizeof(struct _WOOL_Client));
  48.     wl_client -> type = WLClient;
  49.     zrt_put(wl_client);
  50.  
  51.     increase_reference(wl_client -> titlebar = (WOOL_Bar) argv[0]);
  52.     increase_reference(wl_client -> leftbar = (WOOL_Bar) argv[1]);
  53.     increase_reference(wl_client -> rightbar = (WOOL_Bar) argv[2]);
  54.     increase_reference(wl_client -> basebar = (WOOL_Bar) argv[3]);
  55.     increase_reference(wl_client -> icon_plug = (WOOL_Plug) argv[4]);
  56.  
  57.     wl_client -> borderwidth = DefaultBorderWidth;
  58.     wl_client -> borderpixel = Context -> pixel.Border;
  59.     wl_client -> background = Context -> pixel.Back;
  60.     wl_client -> inner_borderwidth = DefaultInnerBorderwidth;
  61.     get_val_from_context(wl_client -> bordertile, WA_bordertile);
  62.     get_val_from_context(wl_client -> tile, WA_tile);
  63.     get_val_from_context(wl_client -> fsm, WA_fsm);
  64.     get_val_from_context(wl_client -> menu, WA_menu);
  65.     get_val_from_context(wl_client -> cursor, WA_cursor);
  66.     get_val_from_context(wl_client -> property, WA_property);
  67.     get_val_from_context(wl_client -> grabs, WA_grabs);
  68.     get_val_from_context(wl_client -> opening, WA_opening);
  69.     get_val_from_context(wl_client -> closing, WA_closing);
  70.  
  71.     get_bool_from_context(wl_client -> map_on_raise, WA_map_on_raise);
  72.     get_bool_from_context(wl_client -> ignore_take_focus,
  73.               WA_ignore_take_focus);
  74.  
  75.     fix_fsm(&(wl_client -> fsm));
  76.     return wl_client;
  77. }
  78.  
  79. /*
  80.  * WLClient_print:
  81.  * CLIENT(text)
  82.  */
  83.  
  84. WOOL_OBJECT
  85. WLClient_print(obj)
  86. WOOL_Client        obj;
  87. {
  88.     wool_printf("{CLIENT 0x%x: ", obj);
  89.     wool_print(obj -> titlebar);
  90.     wool_puts(" ");
  91.     wool_print(obj -> leftbar);
  92.     wool_puts(" ");
  93.     wool_print(obj -> rightbar);
  94.     wool_puts(" ");
  95.     wool_print(obj -> basebar);
  96.     wool_puts(" ");
  97.     wool_print(obj -> icon_plug);
  98.     wool_puts("}");
  99.     return (WOOL_OBJECT) obj;
  100. }
  101.  
  102. /*
  103.  * WLClient_free:
  104.  * recursivly free fsm
  105.  */
  106.  
  107. WOOL_OBJECT
  108. WLClient_free(obj)
  109. WOOL_Client        obj;
  110. {
  111.     decrease_reference(obj -> bordertile);
  112.     decrease_reference(obj -> tile);
  113.     decrease_reference(obj -> fsm);
  114.     decrease_reference(obj -> menu);
  115.     decrease_reference(obj -> cursor);
  116.     decrease_reference(obj -> opening);
  117.     decrease_reference(obj -> closing);
  118.     decrease_reference(obj -> property);
  119.     decrease_reference(obj -> grabs);
  120.     decrease_reference(obj -> titlebar);
  121.     decrease_reference(obj -> leftbar);
  122.     decrease_reference(obj -> rightbar);
  123.     decrease_reference(obj -> basebar);
  124.     decrease_reference(obj -> icon_plug);
  125.     Free(obj);
  126.     return NULL;
  127. }
  128.  
  129. /*
  130.  * MatchWoolDescription Executes the user-defined wool function
  131.  * "describe-window" which is supposed to return the wl_clients descriptors
  132.  * for the current-window & icon as a list of 2 wl_clients for window & icon,
  133.  * 
  134.  * If the returned value is not correct, it takes the value of
  135.  * window-description
  136.  */
  137.  
  138. MatchWoolDescription(cw, cw_desc_ptr)
  139. ClientWindow    cw;
  140. WOOL_OBJECT    *cw_desc_ptr; /* RETURN: WOOL_Clients */
  141. {
  142.     WOOL_List       desc =
  143.     (WOOL_List) wool_eval_and_catch_errors(WL_describe_window_call);
  144.  
  145.     if (!desc || (desc -> type != WLList) || (desc -> size != 2)) {
  146.     wool_puts("GWM: the return value of \"describe-window\": ");
  147.     if (desc)
  148.         wool_print(desc);
  149.     else
  150.         wool_puts("NULL");
  151.     wool_puts("\n    is not a pair of window descriptors,");
  152.     wool_puts("using \"window-description\"\n");
  153.     desc = (WOOL_List) wool_eval_and_catch_errors(WA_window_description);
  154.     if (!desc || (desc -> type != WLList) || (desc -> size != 2)) {
  155.         ShowUndecoratedWindow(cw);
  156.         wool_puts("\"window-description\": ");
  157.         if (desc)
  158.         wool_print(desc);
  159.         else
  160.         wool_puts("NULL");
  161.         wool_error("\n    is not pair of window descriptors%s", "");
  162.     }
  163.     }
  164.     if (desc -> list[0] -> type != WLClient) {
  165.     decrease_reference(desc -> list[0]);
  166.     increase_reference(desc -> list[0] = wool_eval(desc -> list[0]));
  167.     if (desc -> list[0] -> type != WLClient) {
  168.         ShowUndecoratedWindow(cw);
  169.         wool_print(desc -> list[0]);
  170.         wool_newline();
  171.         wool_error("bad %s description!", "window");
  172.     }
  173.     }
  174.     *cw_desc_ptr = desc -> list[0];
  175.     increase_reference(cw -> icon_description = desc -> list[1]);
  176. }
  177.  
  178. /* grabbing/ungrabbing buttons and keys (passive grabs) on the main window
  179.  * (C-callable funcs)
  180.  */
  181.  
  182. WLClient_set_grabs(list, window)
  183. WOOL_List    list;
  184. Window        window;
  185. {
  186.     int             i;
  187.     WOOL_Event      event;
  188.     KeyCode        keycode;
  189.  
  190.     if (list == (WOOL_List) NIL || !window)
  191.     return;
  192.     if (list -> type != WLList) {
  193.     wool_warning1("Grabs must be a list, not a %s",
  194.            ((char *) ((WOOL_Atom) list -> type[0]) -> p_name));
  195.     return;
  196.     }
  197.     for (i = 0; i < list -> size; i++) {
  198.     event = (WOOL_Event) list -> list[i];
  199.     if (event -> type != WLEvent)
  200.         goto not_event;
  201.     if (event -> match == WLEvent_buttonpress) {
  202.         XGrabButton(dpy,
  203.             (event -> detail == (unsigned int) ANY ?
  204.              AnyButton : event -> detail),
  205.             (event -> state == (unsigned int) ANY ?
  206.              AnyModifier : event -> state),
  207.             window, FALSE,
  208.             ButtonPressMask | ButtonReleaseMask,
  209.             ((event -> flags & FREEZE_ON_GRABS) ?
  210.              GrabModeSync : GrabModeAsync)
  211.             ,GrabModeAsync, None, None);
  212.     } else if (event -> match == WLEvent_keypress) {
  213.         /* A 0 keycode Means AnyKey ! */
  214.         if (event -> detail != (unsigned int) ANY) {
  215.         if (event -> detail != (unsigned int) UNDEFINED_KEYCODE)
  216.           if (keycode = XKeysymToKeycode(dpy, event -> detail))
  217.             XGrabKey(dpy, keycode,
  218.                  (event -> state == (unsigned int) ANY ?
  219.                   AnyModifier : event -> state),
  220.                  window, FALSE,
  221.             GrabModeAsync, ((event -> flags & FREEZE_ON_GRABS) ?
  222.                     GrabModeSync : GrabModeAsync));
  223.         } else {
  224.         XGrabKey(dpy, AnyKey,
  225.              (event -> state == (unsigned int) ANY ?
  226.               AnyModifier : event -> state),
  227.              window, FALSE,
  228.              GrabModeAsync, ((event -> flags & FREEZE_ON_GRABS) ?
  229.                      GrabModeSync : GrabModeAsync));
  230.         }
  231.     } else
  232.         goto not_event;
  233.     }
  234.     return;
  235. not_event:
  236.     wool_warning1("grabs only on %s", "buttons or keys presses");
  237. }
  238.  
  239. WLClient_unset_grabs(list, window)
  240. WOOL_List    list;
  241. Window        window;
  242. {
  243.     int             i;
  244.     WOOL_Event      event;
  245.     KeyCode        keycode;
  246.  
  247.     if (list == (WOOL_List) NIL || !window)
  248.     return;
  249.     if (list -> type != WLList) 
  250.     wool_error("Ungrabs must be a list, not a %s",
  251.                   ((char *) ((WOOL_Atom) list -> type[0])->p_name));
  252.     for (i = 0; i < list -> size; i++) {
  253.     event = (WOOL_Event) list -> list[i];
  254.     if (event -> type == WLEvent) {
  255.         if (event -> match == WLEvent_buttonpress) {
  256.         XUngrabButton(dpy,
  257.                 (event -> detail == (unsigned int) ANY ?
  258.                  AnyButton : event -> detail),
  259.                 (event -> state == (unsigned int) ANY ?
  260.                  AnyModifier : event -> state),
  261.                 window);
  262.         } else if (event -> match == WLEvent_keypress) {
  263.         if (event -> detail != (unsigned int) ANY) {
  264.             if (event -> detail != (unsigned int) UNDEFINED_KEYCODE)
  265.             if (keycode = XKeysymToKeycode(dpy, event -> detail))
  266.             XUngrabKey(dpy, keycode,
  267.                  (event -> state == (unsigned int) ANY ?
  268.                   AnyModifier : event -> state),
  269.                  window);
  270.         } else {
  271.             XUngrabKey(dpy, AnyKey,
  272.                  (event -> state == (unsigned int) ANY ?
  273.                   AnyModifier : event -> state),
  274.                  window);
  275.         }
  276.         } else
  277.         goto not_event;
  278.     } else
  279.         goto not_event;
  280.     }
  281.     return;
  282. not_event:
  283.     wool_error("ungrabs only on %s", "buttons or keys");
  284. }
  285.  
  286. /* grabbing/ungrabbing buttons and keys (passive grabs) on the main window
  287.  * (WOOL-callable funcs)
  288.  */
  289.  
  290. WOOL_OBJECT
  291. wool_set_grabs(argc, argv)
  292. int argc;
  293. WOOL_OBJECT    *argv;
  294. {
  295.     if (argc)
  296.     WLClient_set_grabs(wool_list_make_from_evaluated_array(argc, argv),
  297.                TargetWindow -> hook);
  298.     return NIL;
  299. }
  300.  
  301. WOOL_OBJECT
  302. wool_unset_grabs(argc, argv)
  303. int argc;
  304. WOOL_OBJECT    *argv;
  305. {
  306.     if (argc)
  307.     WLClient_unset_grabs(wool_list_make_from_evaluated_array(argc, argv),
  308.                TargetWindow -> hook);
  309.     return NIL;
  310. }
  311.  
  312. WOOL_OBJECT
  313. WLClient_get_property()
  314. {
  315.     return (TargetWindow -> property);
  316. }
  317.  
  318. WOOL_OBJECT
  319. WLClient_set_property(property)
  320. WOOL_OBJECT property;
  321. {
  322.     WOOL_OBJECT     object = TargetWindow -> property;
  323.  
  324.     must_be_or_nil(WLList, property, 0);
  325.     increase_reference(TargetWindow -> property = property);
  326.     decrease_reference(object);
  327.     return property;
  328. }
  329.