[prev in list] [next in list] [prev in thread] [next in thread]
List: rdesktop-devel
Subject: [rdesktop-devel] [ rdesktop-Bugs-1198931 ] Translucent cursors
From: "SourceForge.net" <noreply () sourceforge ! net>
Date: 2011-02-04 20:09:17
Message-ID: E1PlRy1-0006Ct-So () sfs-web-10 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Bugs item #1198931, was opened at 2005-05-10 06:43
Message generated for change (Comment added) made by warrenfalk
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=381347&aid=1198931&group_id=24366
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Jernej Simončič (jernejs)
Assigned to: Ilya Konstantinov (ikonst)
Summary: Translucent cursors don't show up locally
Initial Comment:
I'm occassionally connecting to a server that uses some cursors with
alpha transparency. On Windows these cursors are brought over and
used locally when using 256-color mode (so the mouse motion is
smoorh; in 15-bit and higher modes RDP on Windows behaves the
same as RDesktop). RDesktop never displays the cursors locally, but
always uses the image from server, making the mouse motion jerky.
----------------------------------------------------------------------
Comment By: Warren Falk (warrenfalk)
Date: 2011-02-04 15:09
Message:
Here's a patch to trunk to enable this with the Xcursor library. I was
going to add this as an attachment to the bug but see no way to do it
(using Chrome). Does that need special access, or is sourceforge broken?
Index: Makefile.in
===================================================================
--- Makefile.in (revision 1609)
+++ Makefile.in (working copy)
@@ -35,7 +35,7 @@
all: $(TARGETS)
rdesktop: $(X11OBJ) $(SOUNDOBJ) $(RDPOBJ) $(SCARDOBJ)
- $(CC) $(CFLAGS) -o rdesktop $(X11OBJ) $(SOUNDOBJ) $(RDPOBJ)
$(SCARDOBJ) $(LDFLAGS) -lX11
+ $(CC) $(CFLAGS) -o rdesktop $(X11OBJ) $(SOUNDOBJ) $(RDPOBJ)
$(SCARDOBJ) $(LDFLAGS) -lX11 -lXcolor
rdp2vnc: $(VNCOBJ) $(SOUNDOBJ) $(RDPOBJ) $(SCARDOBJ)
$(VNCLINK) $(CFLAGS) -o rdp2vnc $(VNCOBJ) $(SOUNDOBJ) $(RDPOBJ)
$(SCARDOBJ) $(LDFLAGS) $(LDVNC)
Index: xwin.c
===================================================================
--- xwin.c (revision 1609)
+++ xwin.c (working copy)
@@ -21,6 +21,7 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xproto.h>
+#include <X11/Xcursor/Xcursor.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
@@ -2853,7 +2854,7 @@
break;
case 32:
s8 = xormask + *k;
- rv = (s8[1] << 16) | (s8[2] << 8) | s8[3];
+ rv = (s8[0] << 24) | (s8[1] << 16) | (s8[2] << 8) | s8[3];
(*k) += 4;
break;
default:
@@ -2875,16 +2876,13 @@
uint8 nextbit;
int scanline, offset, delta;
int i, j, k;
+ int pixel;
+ XcursorImage* pxc;
k = 0;
scanline = (width + 7) / 8;
offset = scanline * height;
- cursor = (uint8 *) xmalloc(offset);
- memset(cursor, 0, offset);
-
- mask = (uint8 *) xmalloc(offset);
- memset(mask, 0, offset);
if (bpp == 1)
{
offset = 0;
@@ -2895,50 +2893,86 @@
offset = scanline * height - scanline;
delta = -scanline;
}
- /* approximate AND and XOR masks with a monochrome X pointer */
- for (i = 0; i < height; i++)
+ if (bpp == 32)
{
- pcursor = &cursor[offset];
- pmask = &mask[offset];
+ pxc = XcursorImageCreate(width, height);
+ pxc->xhot = x;
+ pxc->yhot = y;
+ for (i = 0; i < height; i++)
+ {
+ nextbit = 0x80;
+ for (j = 0; j < width; j++)
+ {
+ pixel = get_next_xor_pixel(xormask, bpp, &k);
+ pixel = ((pixel & 0xFF) << 24) | ((pixel & 0xFF00) << 8) | ((pixel &
0xFF0000) >> 8) | ((pixel & 0xFF000000) >> 24);
+ /* The following will use the bit mask (lower quality) instead of
alpha */
+ /*
+ maskpx = (*andmask & nextbit) ? 0x00000000 : 0xff000000;
+ nextbit >>= 1;
+ if (nextbit == 0) {
+ nextbit = 0x80;
+ andmask++;
+ }
+ pixel = pixel & 0xFFFFFF | maskpx;
+ */
+ pxc->pixels[(height - i - 1) * width + j] = pixel;
+ }
+ }
+ xcursor = XcursorImageLoadCursor (g_display, pxc);
+ }
+ else
+ {
+ cursor = (uint8 *) xmalloc(scanline * height);
+ memset(cursor, 0, scanline * height);
- for (j = 0; j < scanline; j++)
+ mask = (uint8 *) xmalloc(scanline * height);
+ memset(mask, 0, scanline * height);
+
+ /* approximate AND and XOR masks with a monochrome X pointer */
+ for (i = 0; i < height; i++)
{
- for (nextbit = 0x80; nextbit != 0; nextbit >>= 1)
+ pcursor = &cursor[offset];
+ pmask = &mask[offset];
+
+ for (j = 0; j < scanline; j++)
{
- if (get_next_xor_pixel(xormask, bpp, &k))
+ for (nextbit = 0x80; nextbit != 0; nextbit >>= 1)
{
- *pcursor |= (~(*andmask) & nextbit);
- *pmask |= nextbit;
+ if (get_next_xor_pixel(xormask, bpp, &k))
+ {
+ *pcursor |= (~(*andmask) & nextbit);
+ *pmask |= nextbit;
+ }
+ else
+ {
+ *pcursor |= ((*andmask) & nextbit);
+ *pmask |= (~(*andmask) & nextbit);
+ }
}
- else
- {
- *pcursor |= ((*andmask) & nextbit);
- *pmask |= (~(*andmask) & nextbit);
- }
+
+ andmask++;
+ pcursor++;
+ pmask++;
}
-
- andmask++;
- pcursor++;
- pmask++;
+ offset += delta;
}
- offset += delta;
- }
- fg.red = fg.blue = fg.green = 0xffff;
- bg.red = bg.blue = bg.green = 0x0000;
- fg.flags = bg.flags = DoRed | DoBlue | DoGreen;
+ fg.red = fg.blue = fg.green = 0xffff;
+ bg.red = bg.blue = bg.green = 0x0000;
+ fg.flags = bg.flags = DoRed | DoBlue | DoGreen;
- cursorglyph = ui_create_glyph(width, height, cursor);
- maskglyph = ui_create_glyph(width, height, mask);
+ cursorglyph = ui_create_glyph(width, height, cursor);
+ maskglyph = ui_create_glyph(width, height, mask);
- xcursor =
- XCreatePixmapCursor(g_display, (Pixmap) cursorglyph,
- (Pixmap) maskglyph, &fg, &bg, x, y);
+ xcursor =
+ XCreatePixmapCursor(g_display, (Pixmap) cursorglyph,
+ (Pixmap) maskglyph, &fg, &bg, x, y);
- ui_destroy_glyph(maskglyph);
- ui_destroy_glyph(cursorglyph);
- xfree(mask);
- xfree(cursor);
+ ui_destroy_glyph(maskglyph);
+ ui_destroy_glyph(cursorglyph);
+ xfree(mask);
+ xfree(cursor);
+ }
return (RD_HCURSOR) xcursor;
}
----------------------------------------------------------------------
Comment By: Jernej Simončič (jernejs)
Date: 2005-11-04 01:46
Message:
Logged In: YES
user_id=632674
Translucent cursors work on Windows MSTSC, but only in
256-color mode (in 15bit and higher modes they're rendered
on server and thus lagging). I attached a cursor that uses
translucency.
----------------------------------------------------------------------
Comment By: Jeroen Meijer (jdmeijer)
Date: 2005-11-03 16:07
Message:
Logged In: YES
user_id=850718
Here's a patch that handles colour cursors using XRender (if
available). I don't understand how to write a configure
check, which is why I haven't included this in CVS yet.
Maybe someone can help me writing a configure check for XRender?
However I don't think there's support for translucent
cursors in RDP5.
----------------------------------------------------------------------
Comment By: Ilya Konstantinov (ikonst)
Date: 2005-11-03 07:02
Message:
Logged In: YES
user_id=335423
Currently we use XCreatePixmapCursor which only accepts 1bpp
(black and white) pixmaps. I guess we'd have to use
XRenderCreateCursor when available... but do we even receive
the colorful cursor from RDP? process_colour_pointer_pdu
hints so, but we treat its 'data' chunk as a XOR mask of
some sort...
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=381347&aid=1198931&group_id=24366
------------------------------------------------------------------------------
The modern datacenter depends on network connectivity to access resources
and provide services. The best practices for maximizing a physical server's
connectivity to a physical network are well understood - see how these
rules translate into the virtual world?
http://p.sf.net/sfu/oracle-sfdevnlfb
_______________________________________________
rdesktop-devel mailing list
rdesktop-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdesktop-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic