From f62f0eab65a18e050fb3f830a6bd7574ab1f2de6 Mon Sep 17 00:00:00 2001
From: Michele Baldessari <michele@acksyn.org>
Date: Sat, 23 Aug 2014 09:10:13 +0200
Subject: [PATCH] Extend X11 response parsing

Add support to parse screens, depths, visual-types and
pixel-formats in the X11 connection initial response.
---
 epan/dissectors/packet-x11.c        | 166 +++++++++++++++++++++++++++++++++++-
 epan/dissectors/x11-declarations.h  |  32 +++++++
 epan/dissectors/x11-fields          |  36 ++++++++
 epan/dissectors/x11-register-info.h |  32 +++++++
 4 files changed, 264 insertions(+), 2 deletions(-)

diff --git a/epan/dissectors/packet-x11.c b/epan/dissectors/packet-x11.c
index 6c160937b4b6..95752a0890a2 100644
--- a/epan/dissectors/packet-x11.c
+++ b/epan/dissectors/packet-x11.c
@@ -204,6 +204,14 @@ static gint ett_x11_configure_window_mask = -1; /* XXX - unused */
 static gint ett_x11_keyboard_value_mask = -1;   /* XXX - unused */
 static gint ett_x11_same_screen_focus = -1;
 static gint ett_x11_event = -1;
+static gint ett_x11_list_of_pixmap_format = -1;
+static gint ett_x11_pixmap_format = -1;
+static gint ett_x11_list_of_screen = -1;
+static gint ett_x11_screen = -1;
+static gint ett_x11_list_of_depth_detail = -1;
+static gint ett_x11_depth_detail = -1;
+static gint ett_x11_list_of_visualtype= -1;
+static gint ett_x11_visualtype= -1;
 
 static expert_field ei_x11_invalid_format = EI_INIT;
 static expert_field ei_x11_request_length = EI_INIT;
@@ -1186,6 +1194,8 @@ static const value_string zero_is_none_vals[] = {
       listOfKeysyms(tvb, pinfo, offsetp, t, hf_x11_##name, hf_x11_##name##_item, map, (keycode_first), (keycode_count), (keysyms_per_keycode), byte_order); }
 #define LISTofPOINT(name, length) { listOfPoint(tvb, offsetp, t, hf_x11_##name, (length) / 4, byte_order); }
 #define LISTofRECTANGLE(name) { listOfRectangle(tvb, offsetp, t, hf_x11_##name, (next_offset - *offsetp) / 8, byte_order); }
+#define LISTofPIXMAPFORMAT(name, length) { listOfPixmapFormat(tvb, offsetp, t, hf_x11_##name, (length), byte_order); }
+#define LISTofSCREEN(name, length) { listOfScreen(tvb, offsetp, t, hf_x11_##name, (length), byte_order); }
 #define LISTofSEGMENT(name) { listOfSegment(tvb, offsetp, t, hf_x11_##name, (next_offset - *offsetp) / 8, byte_order); }
 #define LISTofSTRING8(name, length) { listOfString8(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_string, (length), byte_order); }
 #define LISTofTEXTITEM8(name) { listOfTextItem(tvb, offsetp, t, hf_x11_##name, FALSE, next_offset, byte_order); }
@@ -2107,6 +2117,145 @@ static void listOfSegment(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
       }
 }
 
+static void listOfVisualTypes(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
+                              int length, guint byte_order)
+{
+      proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, length * 24, byte_order);
+      proto_tree *tt = proto_item_add_subtree(ti, ett_x11_list_of_visualtype);
+      while(length--) {
+            proto_item *tti;
+            proto_tree *ttt;
+
+            tti = proto_tree_add_none_format(tt, hf_x11_visualtype, tvb, *offsetp, 24,
+                                             "visualtype");
+            ttt = proto_item_add_subtree(tti, ett_x11_visualtype);
+            proto_tree_add_item(ttt, hf_x11_visualtype_visualid, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_visualtype_class, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_visualtype_bits_per_rgb_value, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_visualtype_colormap_entries, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_visualtype_red_mask, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_visualtype_green_mask, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_visualtype_blue_mask, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_unused, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+      }
+}
+static void listOfDepth(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
+                        int length, guint byte_order)
+{
+      guint8 number_of_visualtypes;
+      proto_item *ti;
+      proto_tree *tt;
+
+      ti = proto_tree_add_item(t, hf, tvb, *offsetp, -1, byte_order);
+      tt = proto_item_add_subtree(ti, ett_x11_list_of_depth_detail);
+      while(length--) {
+            proto_item *tti;
+            proto_tree *ttt;
+	    number_of_visualtypes = VALUE16(tvb, *offsetp + 2);
+
+            tti = proto_tree_add_none_format(tt, hf_x11_depth_detail, tvb, *offsetp, 8 + 24 * number_of_visualtypes,
+                                             "depth-detail");
+            ttt = proto_item_add_subtree(tti, ett_x11_screen);
+            proto_tree_add_item(ttt, hf_x11_depth_detail_depth, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_unused, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_depth_detail_visualtypes_numbers, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_unused, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+	    if (number_of_visualtypes > 0)
+                    listOfVisualTypes(tvb, offsetp, ttt, hf_x11_visualtype, number_of_visualtypes, byte_order);
+      }
+}
+
+static void listOfScreen(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
+                         int length, guint byte_order)
+{
+      proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, -1, byte_order);
+      proto_tree *tt = proto_item_add_subtree(ti, ett_x11_list_of_screen);
+      while(length--) {
+            guint8 number_of_depths, root_depth;
+	    guint16 width_in_pixels, height_in_pixels;
+	    guint32 screen_root;
+            proto_item *tti;
+            proto_tree *ttt;
+
+            screen_root = VALUE32(tvb, *offsetp);
+	    width_in_pixels = VALUE16(tvb, *offsetp + 20);
+	    height_in_pixels = VALUE16(tvb, *offsetp + 22);
+	    root_depth = VALUE8(tvb, *offsetp + 38);
+            tti = proto_tree_add_none_format(tt, hf_x11_screen, tvb, *offsetp, 0,
+                                                 "screen (%08x: %d x %d x %d)", screen_root,
+						 width_in_pixels, height_in_pixels, root_depth);
+            ttt = proto_item_add_subtree(tti, ett_x11_screen);
+            proto_tree_add_item(ttt, hf_x11_screen_root, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_default_colormap, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_white_pixel, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_black_pixel, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_current_input_masks, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_width_in_pixels, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_height_in_pixels, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_width_in_millimeters, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_height_in_millimeters, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_min_installed_maps, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_max_installed_maps, tvb, *offsetp, 2, byte_order);
+            *offsetp += 2;
+            proto_tree_add_item(ttt, hf_x11_screen_root_visual, tvb, *offsetp, 4, byte_order);
+            *offsetp += 4;
+            proto_tree_add_item(ttt, hf_x11_screen_backing_stores, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_screen_save_unders, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_screen_root_depth, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+	    number_of_depths = VALUE8(tvb, *offsetp);
+            proto_tree_add_item(ttt, hf_x11_screen_allowed_depths_len, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+	    listOfDepth(tvb, offsetp, ttt, hf_x11_depth_detail, number_of_depths, byte_order);
+      }
+}
+static void listOfPixmapFormat(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
+                               int length, guint byte_order)
+{
+      proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, length * 8, byte_order);
+      proto_tree *tt = proto_item_add_subtree(ti, ett_x11_list_of_pixmap_format);
+      while(length--) {
+            proto_item *tti;
+            proto_tree *ttt;
+
+            tti = proto_tree_add_none_format(tt, hf_x11_pixmap_format, tvb, *offsetp, 8,
+                                                 "pixmap-format");
+            ttt = proto_item_add_subtree(tti, ett_x11_pixmap_format);
+            proto_tree_add_item(ttt, hf_x11_pixmap_format_depth, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_pixmap_format_bits_per_pixel, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_pixmap_format_scanline_pad, tvb, *offsetp, 1, byte_order);
+            *offsetp += 1;
+            proto_tree_add_item(ttt, hf_x11_unused, tvb, *offsetp, 5, byte_order);
+            *offsetp += 5;
+      }
+}
+
 static void listOfString8(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf,
                           int hf_item, int length, guint byte_order)
 {
@@ -2976,6 +3125,8 @@ static void dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo,
       unsigned char success;
       int length_of_vendor;
       int length_of_reason;
+      int number_of_formats_in_pixmap_formats;
+      int number_of_screens_in_roots;
       proto_item *ti;
       proto_tree *t;
 
@@ -3003,8 +3154,8 @@ static void dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo,
             INT32(motion_buffer_size);
             length_of_vendor = INT16(length_of_vendor);
             INT16(maximum_request_length);
-            INT8(number_of_screens_in_roots);
-            INT8(number_of_formats_in_pixmap_formats);
+            number_of_screens_in_roots = INT8(number_of_screens_in_roots);
+            number_of_formats_in_pixmap_formats = INT8(number_of_formats_in_pixmap_formats);
             INT8(image_byte_order);
             INT8(bitmap_format_bit_order);
             INT8(bitmap_format_scanline_unit);
@@ -3013,6 +3164,9 @@ static void dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo,
             INT8(max_keycode);
             UNUSED(4);
             STRING8(vendor, length_of_vendor);
+	    UNUSED((4 - (length_of_vendor % 4)) % 4);
+	    LISTofPIXMAPFORMAT(pixmap_format, number_of_formats_in_pixmap_formats);
+	    LISTofSCREEN(screen, number_of_screens_in_roots);
       } else {
             STRING8(reason, length_of_reason);
       }
@@ -5676,6 +5830,14 @@ void proto_register_x11(void)
             &ett_x11_keyboard_value_mask,
             &ett_x11_same_screen_focus,
             &ett_x11_event,
+	    &ett_x11_list_of_pixmap_format,
+	    &ett_x11_pixmap_format,
+	    &ett_x11_list_of_screen,
+	    &ett_x11_screen,
+	    &ett_x11_list_of_depth_detail,
+	    &ett_x11_depth_detail,
+	    &ett_x11_list_of_visualtype,
+	    &ett_x11_visualtype,
       };
 
       static ei_register_info ei[] = {
diff --git a/epan/dissectors/x11-declarations.h b/epan/dissectors/x11-declarations.h
index 597ae33a1945..3f3e3bb630eb 100644
--- a/epan/dissectors/x11-declarations.h
+++ b/epan/dissectors/x11-declarations.h
@@ -178,6 +178,9 @@ static int hf_x11_data_length = -1;
 static int hf_x11_delete = -1;
 static int hf_x11_delta = -1;
 static int hf_x11_depth = -1;
+static int hf_x11_depth_detail = -1;
+static int hf_x11_depth_detail_depth = -1;
+static int hf_x11_depth_detail_visualtypes_numbers = -1;
 static int hf_x11_destination = -1;
 static int hf_x11_direction = -1;
 static int hf_x11_drawable = -1;
@@ -336,6 +339,10 @@ static int hf_x11_pixel = -1;
 static int hf_x11_pixels = -1;
 static int hf_x11_pixels_item = -1;
 static int hf_x11_pixmap = -1;
+static int hf_x11_pixmap_format = -1;
+static int hf_x11_pixmap_format_depth = -1;
+static int hf_x11_pixmap_format_bits_per_pixel = -1;
+static int hf_x11_pixmap_format_scanline_pad = -1;
 static int hf_x11_place = -1;
 static int hf_x11_plane_mask = -1;
 static int hf_x11_planes = -1;
@@ -400,6 +407,23 @@ static int hf_x11_same_screen_focus_mask_same_screen = -1;
 static int hf_x11_success = -1;
 static int hf_x11_save_set_mode = -1;
 static int hf_x11_save_under = -1;
+static int hf_x11_screen = -1;
+static int hf_x11_screen_root = -1;
+static int hf_x11_screen_default_colormap = -1;
+static int hf_x11_screen_white_pixel = -1;
+static int hf_x11_screen_black_pixel = -1;
+static int hf_x11_screen_current_input_masks = -1;
+static int hf_x11_screen_width_in_pixels = -1;
+static int hf_x11_screen_height_in_pixels = -1;
+static int hf_x11_screen_width_in_millimeters = -1;
+static int hf_x11_screen_height_in_millimeters = -1;
+static int hf_x11_screen_min_installed_maps = -1;
+static int hf_x11_screen_max_installed_maps = -1;
+static int hf_x11_screen_root_visual = -1;
+static int hf_x11_screen_backing_stores = -1;
+static int hf_x11_screen_save_unders = -1;
+static int hf_x11_screen_root_depth = -1;
+static int hf_x11_screen_allowed_depths_len = -1;
 static int hf_x11_screen_saver_mode = -1;
 static int hf_x11_segment = -1;
 static int hf_x11_segments = -1;
@@ -456,6 +480,14 @@ static int hf_x11_visual_blue = -1;
 static int hf_x11_visual_green = -1;
 static int hf_x11_visual_red = -1;
 static int hf_x11_visualid = -1;
+static int hf_x11_visualtype = -1;
+static int hf_x11_visualtype_visualid = -1;
+static int hf_x11_visualtype_class = -1;
+static int hf_x11_visualtype_bits_per_rgb_value = -1;
+static int hf_x11_visualtype_colormap_entries = -1;
+static int hf_x11_visualtype_red_mask = -1;
+static int hf_x11_visualtype_green_mask = -1;
+static int hf_x11_visualtype_blue_mask = -1;
 static int hf_x11_warp_pointer_dst_window = -1;
 static int hf_x11_warp_pointer_src_window = -1;
 static int hf_x11_wid = -1;
diff --git a/epan/dissectors/x11-fields b/epan/dissectors/x11-fields
index 7d0235353230..b6b2e64112a3 100644
--- a/epan/dissectors/x11-fields
+++ b/epan/dissectors/x11-fields
@@ -192,6 +192,10 @@ data-length	UINT32	DEC
 delete		BOOLEAN	NONE		Delete this property after reading
 delta		INT16	DEC
 depth		UINT8	DEC
+depth-detail    NONE    NONE
+	depth  			UINT8   DEC
+	visualtypes-numbers 	UINT16 	DEC
+
 destination	UINT8	DEC	VALS
 direction	UINT8	DEC	VALS
 drawable	UINT32	HEX
@@ -365,6 +369,11 @@ pixel		UINT32	HEX
 pixels		NONE	NONE
 pixels_item	UINT32	HEX
 pixmap		UINT32	HEX
+pixmap-format   NONE    NONE	Pixmap Formats
+	depth 		UINT8  DEC
+	bits-per-pixel  UINT8  DEC
+	scanline-pad    UINT8  DEC
+
 place		UINT8   DEC     VALS
 plane-mask	UINT32	HEX	VALS
 planes		UINT16	DEC
@@ -434,6 +443,24 @@ same-screen-focus-mask	UINT8	HEX
 success		UINT8	DEC
 save-set-mode	UINT8	DEC	VALS(insert_delete)
 save-under	BOOLEAN	NONE
+screen		NONE	NONE
+	root			UINT32  HEX
+	default_colormap 	UINT32 	HEX
+	white_pixel             UINT32 	HEX
+	black_pixel             UINT32  HEX
+	current_input_masks     UINT32  HEX
+	width_in_pixels         UINT16  DEC
+	height_in_pixels        UINT16  DEC
+	width_in_millimeters    UINT16  DEC
+	height_in_millimeters   UINT16  DEC
+	min_installed_maps      UINT16  DEC
+	max_installed_maps      UINT16  DEC
+	root_visual		UINT32  HEX
+	backing_stores          UINT8   HEX
+	save_unders             BOOLEAN NONE
+	root_depth              UINT8   DEC
+	allowed_depths_len      UINT8   DEC
+
 screen-saver-mode	UINT8	DEC	VALS
 segment		NONE	NONE
 segments	NONE	NONE
@@ -494,6 +521,15 @@ visual-blue	UINT16	DEC
 visual-green	UINT16	DEC
 visual-red	UINT16	DEC
 visualid	UINT32	HEX
+visualtype     NONE    NONE
+	visualid 		UINT32 	HEX
+	class                   UINT8   DEC
+	bits-per-rgb-value      UINT8   DEC
+	colormap-entries  	UINT16  DEC
+	red-mask 		UINT32  HEX
+	green-mask 		UINT32  HEX
+	blue-mask 		UINT32  HEX
+
 warp-pointer-dst-window	UINT32	HEX	VALS(zero_is_none)
 warp-pointer-src-window	UINT32	HEX	VALS(zero_is_none)
 wid		UINT32	HEX		Window id
diff --git a/epan/dissectors/x11-register-info.h b/epan/dissectors/x11-register-info.h
index 86a6786685d8..0c99d3411343 100644
--- a/epan/dissectors/x11-register-info.h
+++ b/epan/dissectors/x11-register-info.h
@@ -178,6 +178,9 @@
 { &hf_x11_delete, { "delete", "x11.delete", FT_BOOLEAN, BASE_NONE, NULL, 0, "Delete this property after reading", HFILL }},
 { &hf_x11_delta, { "delta", "x11.delta", FT_INT16, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_depth, { "depth", "x11.depth", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_depth_detail, { "depth-detail", "x11.depth-detail", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+{ &hf_x11_depth_detail_depth, { "depth", "x11.depth-detail.depth", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_depth_detail_visualtypes_numbers, { "visualtypes-numbers", "x11.depth-detail.visualtypes-numbers", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_destination, { "destination", "x11.destination", FT_UINT8, BASE_DEC, VALS(destination_vals), 0, NULL, HFILL }},
 { &hf_x11_direction, { "direction", "x11.direction", FT_UINT8, BASE_DEC, VALS(direction_vals), 0, NULL, HFILL }},
 { &hf_x11_drawable, { "drawable", "x11.drawable", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
@@ -336,6 +339,10 @@
 { &hf_x11_pixels, { "pixels", "x11.pixels", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
 { &hf_x11_pixels_item, { "pixels_item", "x11.pixels_item", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
 { &hf_x11_pixmap, { "pixmap", "x11.pixmap", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_pixmap_format, { "pixmap-format", "x11.pixmap-format", FT_NONE, BASE_NONE, NULL, 0, "Pixmap Formats", HFILL }},
+{ &hf_x11_pixmap_format_depth, { "depth", "x11.pixmap-format.depth", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_pixmap_format_bits_per_pixel, { "bits-per-pixel", "x11.pixmap-format.bits-per-pixel", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_pixmap_format_scanline_pad, { "scanline-pad", "x11.pixmap-format.scanline-pad", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_place, { "place", "x11.place", FT_UINT8, BASE_DEC, VALS(place_vals), 0, NULL, HFILL }},
 { &hf_x11_plane_mask, { "plane-mask", "x11.plane-mask", FT_UINT32, BASE_HEX, VALS(plane_mask_vals), 0, NULL, HFILL }},
 { &hf_x11_planes, { "planes", "x11.planes", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
@@ -400,6 +407,23 @@
 { &hf_x11_success, { "success", "x11.success", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_save_set_mode, { "save-set-mode", "x11.save-set-mode", FT_UINT8, BASE_DEC, VALS(insert_delete_vals), 0, NULL, HFILL }},
 { &hf_x11_save_under, { "save-under", "x11.save-under", FT_BOOLEAN, BASE_NONE, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen, { "screen", "x11.screen", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_root, { "root", "x11.screen.root", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_default_colormap, { "default_colormap", "x11.screen.default_colormap", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_white_pixel, { "white_pixel", "x11.screen.white_pixel", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_black_pixel, { "black_pixel", "x11.screen.black_pixel", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_current_input_masks, { "current_input_masks", "x11.screen.current_input_masks", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_width_in_pixels, { "width_in_pixels", "x11.screen.width_in_pixels", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_height_in_pixels, { "height_in_pixels", "x11.screen.height_in_pixels", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_width_in_millimeters, { "width_in_millimeters", "x11.screen.width_in_millimeters", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_height_in_millimeters, { "height_in_millimeters", "x11.screen.height_in_millimeters", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_min_installed_maps, { "min_installed_maps", "x11.screen.min_installed_maps", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_max_installed_maps, { "max_installed_maps", "x11.screen.max_installed_maps", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_root_visual, { "root_visual", "x11.screen.root_visual", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_backing_stores, { "backing_stores", "x11.screen.backing_stores", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_save_unders, { "save_unders", "x11.screen.save_unders", FT_BOOLEAN, BASE_NONE, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_root_depth, { "root_depth", "x11.screen.root_depth", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_screen_allowed_depths_len, { "allowed_depths_len", "x11.screen.allowed_depths_len", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_screen_saver_mode, { "screen-saver-mode", "x11.screen-saver-mode", FT_UINT8, BASE_DEC, VALS(screen_saver_mode_vals), 0, NULL, HFILL }},
 { &hf_x11_segment, { "segment", "x11.segment", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
 { &hf_x11_segments, { "segments", "x11.segments", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
@@ -456,6 +480,14 @@
 { &hf_x11_visual_green, { "visual-green", "x11.visual-green", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_visual_red, { "visual-red", "x11.visual-red", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
 { &hf_x11_visualid, { "visualid", "x11.visualid", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype, { "visualtype", "x11.visualtype", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_visualid, { "visualid", "x11.visualtype.visualid", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_class, { "class", "x11.visualtype.class", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_bits_per_rgb_value, { "bits-per-rgb-value", "x11.visualtype.bits-per-rgb-value", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_colormap_entries, { "colormap-entries", "x11.visualtype.colormap-entries", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_red_mask, { "red-mask", "x11.visualtype.red-mask", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_green_mask, { "green-mask", "x11.visualtype.green-mask", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+{ &hf_x11_visualtype_blue_mask, { "blue-mask", "x11.visualtype.blue-mask", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
 { &hf_x11_warp_pointer_dst_window, { "warp-pointer-dst-window", "x11.warp-pointer-dst-window", FT_UINT32, BASE_HEX, VALS(zero_is_none_vals), 0, NULL, HFILL }},
 { &hf_x11_warp_pointer_src_window, { "warp-pointer-src-window", "x11.warp-pointer-src-window", FT_UINT32, BASE_HEX, VALS(zero_is_none_vals), 0, NULL, HFILL }},
 { &hf_x11_wid, { "wid", "x11.wid", FT_UINT32, BASE_HEX, NULL, 0, "Window id", HFILL }},
-- 
2.1.0

