diff options
Diffstat (limited to 'xorg/X11R7.6/rdp/rdpup.c')
-rw-r--r-- | xorg/X11R7.6/rdp/rdpup.c | 174 |
1 files changed, 169 insertions, 5 deletions
diff --git a/xorg/X11R7.6/rdp/rdpup.c b/xorg/X11R7.6/rdp/rdpup.c index 81165a3a..b9b5b92f 100644 --- a/xorg/X11R7.6/rdp/rdpup.c +++ b/xorg/X11R7.6/rdp/rdpup.c @@ -50,6 +50,7 @@ static int g_scheduled = 0; static int g_count = 0; static int g_rdpindex = -1; +extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */ extern ScreenPtr g_pScreen; /* from rdpmain.c */ extern int g_Bpp; /* from rdpmain.c */ extern int g_Bpp_mask; /* from rdpmain.c */ @@ -59,6 +60,8 @@ extern int g_use_rail; /* from rdpmain.c */ /* true is to use unix domain socket */ extern int g_use_uds; /* in rdpmain.c */ extern char g_uds_data[]; /* in rdpmain.c */ +extern int g_do_dirty_ons; /* in rdpmain.c */ +extern rdpPixmapRec g_screenPriv; /* in rdpmain.c */ struct rdpup_os_bitmap { @@ -75,6 +78,12 @@ static int g_os_bitmap_stamp = 0; static int g_pixmap_byte_total = 0; static int g_pixmap_num_used = 0; +struct rdpup_top_window +{ + WindowPtr wnd; + struct rdpup_top_window* next; +}; + /* 0 GXclear, 0 1 GXnor, DPon @@ -327,13 +336,21 @@ rdpup_send_pending(void) static CARD32 rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg) { - rdpup_send_pending(); + LLOGLN(10, ("rdpDeferredUpdateCallback")); + if (g_do_dirty_ons) + { + rdpup_check_dirty_screen(&g_screenPriv); + } + else + { + rdpup_send_pending(); + } g_scheduled = 0; return 0; } /******************************************************************************/ -static void +void rdpScheduleDeferredUpdate(void) { if (!g_scheduled) @@ -540,6 +557,31 @@ process_version_msg(int param1, int param2, int param3, int param4) /******************************************************************************/ static int +rdpup_send_rail(void) +{ + WindowPtr wnd; + rdpWindowRec* priv; + + wnd = g_pScreen->root; + if (wnd != 0) + { + wnd = wnd->lastChild; + while (wnd != 0) + { + if (wnd->realized) + { + priv = GETWINPRIV(wnd); + priv->status = 1; + rdpup_create_window(wnd, priv); + } + wnd = wnd->prevSib; + } + } + return 0; +} + +/******************************************************************************/ +static int rdpup_process_msg(struct stream* s) { int msg_type; @@ -661,6 +703,7 @@ rdpup_process_msg(struct stream* s) if (g_rdpScreen.client_info.rail_support_level > 0) { g_use_rail = 1; + rdpup_send_rail(); } } else @@ -829,6 +872,7 @@ rdpup_check(void) int rdpup_begin_update(void) { + LLOGLN(10, ("rdpup_begin_update")); if (g_connected) { if (g_begin) @@ -850,9 +894,17 @@ rdpup_begin_update(void) int rdpup_end_update(void) { + LLOGLN(10, ("rdpup_end_update")); if (g_connected && g_begin) { - rdpScheduleDeferredUpdate(); + if (g_do_dirty_ons) + { + rdpup_send_pending(); + } + else + { + rdpScheduleDeferredUpdate(); + } } return 0; } @@ -1560,8 +1612,8 @@ rdpup_create_window(WindowPtr pWindow, rdpWindowRec* priv) out_uint16_le(g_out_s, pWindow->drawable.height); /* bottom */ } flags |= WINDOW_ORDER_FIELD_WND_RECTS; - out_uint32_le(g_out_s, 0); /* visible_offset_x */ - out_uint32_le(g_out_s, 0); /* visible_offset_y */ + out_uint32_le(g_out_s, pWindow->drawable.x); /* visible_offset_x */ + out_uint32_le(g_out_s, pWindow->drawable.y); /* visible_offset_y */ flags |= WINDOW_ORDER_FIELD_VIS_OFFSET; out_uint16_le(g_out_s, num_visibility_rects); /* num_visibility_rects */ for (index = 0; index < num_visibility_rects; index++) @@ -1694,6 +1746,9 @@ rdpup_check_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv) rdpup_reset_clip(); rdpup_set_opcode(GXcopy); break; + case RDI_SCRBLT: + LLOGLN(10, (" RDI_SCRBLT")); + break; } di = di->next; } @@ -1703,3 +1758,112 @@ rdpup_check_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv) rdpup_switch_os_surface(-1); return 0; } + +/******************************************************************************/ +int +rdpup_check_dirty_screen(rdpPixmapRec* pDirtyPriv) +{ + int index; + int clip_index; + int count; + int num_clips; + BoxRec box; + xSegment* seg; + struct image_data id; + struct rdp_draw_item* di; + + if (pDirtyPriv == 0) + { + return 0; + } + if (pDirtyPriv->is_dirty == 0) + { + return 0; + } + + LLOGLN(10, ("-----------------got dirty")); + rdpup_get_screen_image_rect(&id); + rdpup_begin_update(); + draw_item_pack(pDirtyPriv); + di = pDirtyPriv->draw_item_head; + while (di != 0) + { + LLOGLN(10, ("rdpup_check_dirty_screen: type %d", di->type)); + switch (di->type) + { + case RDI_FILL: + rdpup_set_fgcolor(di->u.fill.fg_color); + rdpup_set_opcode(di->u.fill.opcode); + count = REGION_NUM_RECTS(di->reg); + for (index = 0; index < count; index++) + { + box = REGION_RECTS(di->reg)[index]; + LLOGLN(10, (" RDI_FILL %d %d %d %d", box.x1, box.y1, + box.x2, box.y2)); + rdpup_fill_rect(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1); + } + rdpup_set_opcode(GXcopy); + break; + case RDI_IMGLL: + rdpup_set_hints(1, 1); + rdpup_set_opcode(di->u.img.opcode); + count = REGION_NUM_RECTS(di->reg); + for (index = 0; index < count; index++) + { + box = REGION_RECTS(di->reg)[index]; + LLOGLN(10, (" RDI_IMGLL %d %d %d %d", box.x1, box.y1, + box.x2, box.y2)); + rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, + box.y2 - box.y1); + } + rdpup_set_opcode(GXcopy); + rdpup_set_hints(0, 1); + break; + case RDI_IMGLY: + rdpup_set_opcode(di->u.img.opcode); + count = REGION_NUM_RECTS(di->reg); + for (index = 0; index < count; index++) + { + box = REGION_RECTS(di->reg)[index]; + LLOGLN(10, (" RDI_IMGLY %d %d %d %d", box.x1, box.y1, + box.x2, box.y2)); + rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, + box.y2 - box.y1); + } + rdpup_set_opcode(GXcopy); + break; + case RDI_LINE: + LLOGLN(10, (" RDI_LINE")); + num_clips = REGION_NUM_RECTS(di->reg); + if (num_clips > 0) + { + rdpup_set_fgcolor(di->u.line.fg_color); + rdpup_set_opcode(di->u.line.opcode); + rdpup_set_pen(0, di->u.line.width); + for (clip_index = num_clips - 1; clip_index >= 0; clip_index--) + { + box = REGION_RECTS(di->reg)[clip_index]; + rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1); + for (index = 0; index < di->u.line.nseg; index++) + { + seg = di->u.line.segs + index; + LLOGLN(10, (" RDI_LINE %d %d %d %d", seg->x1, seg->y1, + seg->x2, seg->y2)); + rdpup_draw_line(seg->x1, seg->y1, seg->x2, seg->y2); + } + } + } + rdpup_reset_clip(); + rdpup_set_opcode(GXcopy); + break; + case RDI_SCRBLT: + LLOGLN(10, (" RDI_SCRBLT")); + break; + } + di = di->next; + } + draw_item_remove_all(pDirtyPriv); + rdpup_end_update(); + pDirtyPriv->is_dirty = 0; + return 0; +} |