Added proper support for storing window parents in the server.
Added a few requests to query the window hierarchy.
diff --git a/server/trace.c b/server/trace.c
index 5dc05bc..93a4f36 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -119,6 +119,21 @@
return get_size(req);
}
+static size_t dump_varargs_user_handles( const void *req )
+{
+ const user_handle_t *data = get_data(req);
+ size_t len = get_size(req) / sizeof(*data);
+
+ fputc( '{', stderr );
+ while (len > 0)
+ {
+ fprintf( stderr, "%08x", *data++ );
+ if (--len) fputc( ',', stderr );
+ }
+ fputc( '}', stderr );
+ return get_size(req);
+}
+
static size_t dump_varargs_bytes( const void *req )
{
const unsigned char *data = get_data(req);
@@ -1652,17 +1667,10 @@
fprintf( stderr, " insize=%08x", req->insize );
}
-static void dump_create_desktop_window_request( const struct create_desktop_window_request *req )
-{
-}
-
-static void dump_create_desktop_window_reply( const struct create_desktop_window_request *req )
-{
- fprintf( stderr, " handle=%08x", req->handle );
-}
-
static void dump_create_window_request( const struct create_window_request *req )
{
+ fprintf( stderr, " parent=%08x,", req->parent );
+ fprintf( stderr, " owner=%08x", req->owner );
}
static void dump_create_window_reply( const struct create_window_request *req )
@@ -1694,6 +1702,47 @@
fprintf( stderr, " tid=%p", req->tid );
}
+static void dump_get_window_parents_request( const struct get_window_parents_request *req )
+{
+ fprintf( stderr, " handle=%08x", req->handle );
+}
+
+static void dump_get_window_parents_reply( const struct get_window_parents_request *req )
+{
+ fprintf( stderr, " count=%d,", req->count );
+ fprintf( stderr, " parents=" );
+ cur_pos += dump_varargs_user_handles( req );
+}
+
+static void dump_get_window_children_request( const struct get_window_children_request *req )
+{
+ fprintf( stderr, " parent=%08x", req->parent );
+}
+
+static void dump_get_window_children_reply( const struct get_window_children_request *req )
+{
+ fprintf( stderr, " count=%d,", req->count );
+ fprintf( stderr, " parents=" );
+ cur_pos += dump_varargs_user_handles( req );
+}
+
+static void dump_get_window_tree_request( const struct get_window_tree_request *req )
+{
+ fprintf( stderr, " handle=%08x", req->handle );
+}
+
+static void dump_get_window_tree_reply( const struct get_window_tree_request *req )
+{
+ fprintf( stderr, " parent=%08x,", req->parent );
+ fprintf( stderr, " owner=%08x,", req->owner );
+ fprintf( stderr, " next_sibling=%08x,", req->next_sibling );
+ fprintf( stderr, " prev_sibling=%08x,", req->prev_sibling );
+ fprintf( stderr, " first_sibling=%08x,", req->first_sibling );
+ fprintf( stderr, " last_sibling=%08x,", req->last_sibling );
+ fprintf( stderr, " first_child=%08x,", req->first_child );
+ fprintf( stderr, " last_child=%08x", req->last_child );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
@@ -1818,11 +1867,13 @@
(dump_func)dump_wait_named_pipe_request,
(dump_func)dump_disconnect_named_pipe_request,
(dump_func)dump_get_named_pipe_info_request,
- (dump_func)dump_create_desktop_window_request,
(dump_func)dump_create_window_request,
(dump_func)dump_link_window_request,
(dump_func)dump_destroy_window_request,
(dump_func)dump_get_window_info_request,
+ (dump_func)dump_get_window_parents_request,
+ (dump_func)dump_get_window_children_request,
+ (dump_func)dump_get_window_tree_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -1949,11 +2000,13 @@
(dump_func)0,
(dump_func)0,
(dump_func)dump_get_named_pipe_info_reply,
- (dump_func)dump_create_desktop_window_reply,
(dump_func)dump_create_window_reply,
(dump_func)0,
(dump_func)0,
(dump_func)dump_get_window_info_reply,
+ (dump_func)dump_get_window_parents_reply,
+ (dump_func)dump_get_window_children_reply,
+ (dump_func)dump_get_window_tree_reply,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -2080,11 +2133,13 @@
"wait_named_pipe",
"disconnect_named_pipe",
"get_named_pipe_info",
- "create_desktop_window",
"create_window",
"link_window",
"destroy_window",
"get_window_info",
+ "get_window_parents",
+ "get_window_children",
+ "get_window_tree",
};
/* ### make_requests end ### */