visual.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /* Copyright 2001-2003 by Norbert Freudemann, David Frese */
  2. #include "xlib.h"
  3. s48_ref_t scx_visual_class_binding = NULL;
  4. #define scx_extract_visual_class(c, x) \
  5. S48_EXTRACT_ENUM(c, x, scx_visual_class_binding)
  6. s48_ref_t scx_visual_classes_binding = NULL;
  7. #define scx_enter_visual_class(c, x) \
  8. S48_ENTER_ENUM(c, x, scx_visual_classes_binding)
  9. s48_ref_t scx_enter_visual(s48_call_t call, Visual* vis) {
  10. s48_ref_t v = s48_make_record_2(call, scx_visual);
  11. s48_record_set_2(call, v, 0, s48_enter_pointer_2(call, vis));
  12. return v;
  13. }
  14. s48_ref_t scx_visual_info_binding = NULL;
  15. s48_ref_t scx_enter_visual_info(s48_call_t call, XVisualInfo* vi) {
  16. s48_ref_t v = s48_make_record_2(call, scx_visual_info_binding);
  17. s48_record_set_2(call, v, 0, scx_enter_visual(call, vi->visual));
  18. s48_record_set_2(call, v, 1, scx_enter_visualid(call, vi->visualid));
  19. s48_record_set_2(call, v, 2, s48_enter_long_2(call, vi->screen));
  20. s48_record_set_2(call, v, 3, s48_enter_long_2(call, vi->depth));
  21. s48_record_set_2(call, v, 4, scx_enter_visual_class(call, vi->class));
  22. s48_record_set_2(call, v, 5, s48_enter_long_2(call, vi->red_mask));
  23. s48_record_set_2(call, v, 6, s48_enter_long_2(call, vi->green_mask));
  24. s48_record_set_2(call, v, 7, s48_enter_long_2(call, vi->blue_mask));
  25. s48_record_set_2(call, v, 8, s48_enter_long_2(call, vi->bits_per_rgb));
  26. s48_record_set_2(call, v, 9, s48_enter_long_2(call, vi->colormap_size));
  27. return v;
  28. }
  29. unsigned int scx_extract_visual_info(s48_call_t call, s48_ref_t v,
  30. XVisualInfo* vi) {
  31. unsigned long mask = 0;
  32. s48_check_record_type_2(call, v, scx_visual_info_binding);
  33. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 0)))
  34. vi->visual = scx_extract_visual(call, s48_record_ref_2(call, v, 0));
  35. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 1))) {
  36. vi->visualid = scx_extract_visualid(call, s48_record_ref_2(call, v, 1));
  37. mask |= VisualIDMask;
  38. }
  39. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 2))) {
  40. vi->screen = s48_extract_long_2(call, s48_record_ref_2(call, v, 2));
  41. mask |= VisualScreenMask;
  42. }
  43. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 3))) {
  44. vi->depth = s48_extract_long_2(call, s48_record_ref_2(call, v, 4));
  45. mask |= VisualDepthMask;
  46. }
  47. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 4))) {
  48. vi->class = scx_extract_visual_class(call, s48_record_ref_2(call, v, 5));
  49. mask |= VisualClassMask;
  50. }
  51. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 5))) {
  52. vi->red_mask = s48_extract_long_2(call, s48_record_ref_2(call, v, 6));
  53. mask |= VisualRedMaskMask;
  54. }
  55. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 6))) {
  56. vi->green_mask = s48_extract_long_2(call, s48_record_ref_2(call, v, 7));
  57. mask |= VisualGreenMaskMask;
  58. }
  59. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 7))) {
  60. vi->blue_mask = s48_extract_long_2(call, s48_record_ref_2(call, v, 8));
  61. mask |= VisualBlueMaskMask;
  62. }
  63. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 8))) {
  64. vi->bits_per_rgb = s48_extract_long_2(call, s48_record_ref_2(call, v, 9));
  65. mask |= VisualBitsPerRGBMask;
  66. }
  67. if (!s48_false_p_2(call, s48_record_ref_2(call, v, 9))) {
  68. vi->colormap_size = s48_extract_long_2(call, s48_record_ref_2(call, v, 10));
  69. mask |= VisualColormapSizeMask;
  70. }
  71. return mask;
  72. }
  73. s48_ref_t scx_Get_Visual_Info(s48_call_t call, s48_ref_t display,
  74. s48_ref_t template) {
  75. XVisualInfo templ;
  76. unsigned long mask = scx_extract_visual_info(call, template, &templ);
  77. XVisualInfo* vis;
  78. int n, i;
  79. s48_ref_t l = s48_null_2(call);
  80. vis = XGetVisualInfo(scx_extract_display(call, display),
  81. mask, &templ, &n);
  82. for (i = n-1; i >= 0; i--)
  83. l = s48_cons_2(call, scx_enter_visual_info(call, &vis[i]), l);
  84. return l;
  85. }
  86. s48_ref_t scx_Match_Visual_Info(s48_call_t call, s48_ref_t display,
  87. s48_ref_t scrnum, s48_ref_t depth, s48_ref_t class) {
  88. XVisualInfo vi;
  89. if (! XMatchVisualInfo(scx_extract_display(call, display),
  90. s48_extract_long_2(call, scrnum),
  91. s48_extract_long_2(call, depth),
  92. scx_extract_visual_class(call, class),
  93. &vi) )
  94. return s48_false_2(call);
  95. else
  96. return scx_enter_visual_info(call, &vi);
  97. }
  98. s48_ref_t scx_VisualIDFromVisual(s48_call_t call, s48_ref_t visual) {
  99. return s48_enter_long_2(call,
  100. XVisualIDFromVisual(scx_extract_visual(call, visual)));
  101. }
  102. void scx_init_visual(void) {
  103. scx_visual_class_binding = s48_get_imported_binding_2("scx-visual-class");
  104. scx_visual_classes_binding = s48_get_imported_binding_2("scx-visual-classes");
  105. scx_visual_info_binding = s48_get_imported_binding_2("scx-visual-info");
  106. S48_EXPORT_FUNCTION(scx_Get_Visual_Info);
  107. S48_EXPORT_FUNCTION(scx_Match_Visual_Info);
  108. S48_EXPORT_FUNCTION(scx_VisualIDFromVisual);
  109. }