32 |
extern BOOL hide_decorations; |
extern BOOL hide_decorations; |
33 |
extern char title[]; |
extern char title[]; |
34 |
extern int server_bpp; |
extern int server_bpp; |
35 |
|
extern int win_button_size; |
36 |
BOOL enable_compose = False; |
BOOL enable_compose = False; |
37 |
BOOL focused; |
BOOL focused; |
38 |
BOOL mouse_in_wnd; |
BOOL mouse_in_wnd; |
59 |
static BOOL ownbackstore; |
static BOOL ownbackstore; |
60 |
static Pixmap backstore; |
static Pixmap backstore; |
61 |
|
|
62 |
|
/* Moving in single app mode */ |
63 |
|
static BOOL moving_wnd; |
64 |
|
static int move_x_offset = 0; |
65 |
|
static int move_y_offset = 0; |
66 |
|
|
67 |
/* MWM decorations */ |
/* MWM decorations */ |
68 |
#define MWM_HINTS_DECORATIONS (1L << 1) |
#define MWM_HINTS_DECORATIONS (1L << 1) |
69 |
#define PROP_MOTIF_WM_HINTS_ELEMENTS 5 |
#define PROP_MOTIF_WM_HINTS_ELEMENTS 5 |
128 |
#define SET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, rop2_map[rop2]); } |
#define SET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, rop2_map[rop2]); } |
129 |
#define RESET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, GXcopy); } |
#define RESET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, GXcopy); } |
130 |
|
|
131 |
void |
static void |
132 |
mwm_hide_decorations(void) |
mwm_hide_decorations(void) |
133 |
{ |
{ |
134 |
PropMotifWmHints motif_hints; |
PropMotifWmHints motif_hints; |
150 |
(unsigned char *) &motif_hints, PROP_MOTIF_WM_HINTS_ELEMENTS); |
(unsigned char *) &motif_hints, PROP_MOTIF_WM_HINTS_ELEMENTS); |
151 |
} |
} |
152 |
|
|
153 |
PixelColour |
static PixelColour |
154 |
split_colour15(uint32 colour) |
split_colour15(uint32 colour) |
155 |
{ |
{ |
156 |
PixelColour rv; |
PixelColour rv; |
163 |
return rv; |
return rv; |
164 |
} |
} |
165 |
|
|
166 |
PixelColour |
static PixelColour |
167 |
split_colour16(uint32 colour) |
split_colour16(uint32 colour) |
168 |
{ |
{ |
169 |
PixelColour rv; |
PixelColour rv; |
176 |
return rv; |
return rv; |
177 |
} |
} |
178 |
|
|
179 |
PixelColour |
static PixelColour |
180 |
split_colour24(uint32 colour) |
split_colour24(uint32 colour) |
181 |
{ |
{ |
182 |
PixelColour rv; |
PixelColour rv; |
186 |
return rv; |
return rv; |
187 |
} |
} |
188 |
|
|
189 |
uint32 |
static uint32 |
190 |
make_colour16(PixelColour pc) |
make_colour16(PixelColour pc) |
191 |
{ |
{ |
192 |
pc.red = (pc.red * 0x1f) / 0xff; |
pc.red = (pc.red * 0x1f) / 0xff; |
195 |
return (pc.red << 11) | (pc.green << 5) | pc.blue; |
return (pc.red << 11) | (pc.green << 5) | pc.blue; |
196 |
} |
} |
197 |
|
|
198 |
uint32 |
static uint32 |
199 |
make_colour24(PixelColour pc) |
make_colour24(PixelColour pc) |
200 |
{ |
{ |
201 |
return (pc.red << 16) | (pc.green << 8) | pc.blue; |
return (pc.red << 16) | (pc.green << 8) | pc.blue; |
202 |
} |
} |
203 |
|
|
204 |
uint32 |
static uint32 |
205 |
make_colour32(PixelColour pc) |
make_colour32(PixelColour pc) |
206 |
{ |
{ |
207 |
return (pc.red << 16) | (pc.green << 8) | pc.blue; |
return (pc.red << 16) | (pc.green << 8) | pc.blue; |
402 |
uint32 pixel = 0; |
uint32 pixel = 0; |
403 |
while (out < end) |
while (out < end) |
404 |
{ |
{ |
405 |
memcpy(&pixel, data, 3); |
pixel = *(data++); |
406 |
data += 3; |
pixel |= *(data++) << 8; |
407 |
|
pixel |= *(data++) << 16; |
408 |
*(out++) = pixel; |
*(out++) = pixel; |
409 |
} |
} |
410 |
} |
} |
861 |
if (button == 0) |
if (button == 0) |
862 |
break; |
break; |
863 |
|
|
864 |
|
/* If win_button_size is nonzero, enable single app mode */ |
865 |
|
if (xevent.xbutton.y < win_button_size) |
866 |
|
{ |
867 |
|
/* Stop moving window when button is released, regardless of cursor position */ |
868 |
|
if (moving_wnd && (xevent.type == ButtonRelease)) |
869 |
|
moving_wnd = False; |
870 |
|
|
871 |
|
/* Check from right to left: */ |
872 |
|
|
873 |
|
if (xevent.xbutton.x >= width - win_button_size) |
874 |
|
{ |
875 |
|
/* The close button, continue */ |
876 |
|
; |
877 |
|
} |
878 |
|
else if (xevent.xbutton.x >= width - win_button_size * 2) |
879 |
|
{ |
880 |
|
/* The maximize/restore button. Do not send to |
881 |
|
server. It might be a good idea to change the |
882 |
|
cursor or give some other visible indication |
883 |
|
that rdesktop inhibited this click */ |
884 |
|
break; |
885 |
|
} |
886 |
|
else if (xevent.xbutton.x >= width - win_button_size * 3) |
887 |
|
{ |
888 |
|
/* The minimize button. Iconify window. */ |
889 |
|
XIconifyWindow(display, wnd, |
890 |
|
DefaultScreen(display)); |
891 |
|
break; |
892 |
|
} |
893 |
|
else if (xevent.xbutton.x <= win_button_size) |
894 |
|
{ |
895 |
|
/* The system menu. Ignore. */ |
896 |
|
break; |
897 |
|
} |
898 |
|
else |
899 |
|
{ |
900 |
|
/* The title bar. */ |
901 |
|
if ((xevent.type == ButtonPress) && !fullscreen |
902 |
|
&& hide_decorations) |
903 |
|
{ |
904 |
|
moving_wnd = True; |
905 |
|
move_x_offset = xevent.xbutton.x; |
906 |
|
move_y_offset = xevent.xbutton.y; |
907 |
|
} |
908 |
|
break; |
909 |
|
|
910 |
|
} |
911 |
|
} |
912 |
|
|
913 |
rdp_send_input(time(NULL), RDP_INPUT_MOUSE, |
rdp_send_input(time(NULL), RDP_INPUT_MOUSE, |
914 |
flags | button, xevent.xbutton.x, xevent.xbutton.y); |
flags | button, xevent.xbutton.x, xevent.xbutton.y); |
915 |
break; |
break; |
916 |
|
|
917 |
case MotionNotify: |
case MotionNotify: |
918 |
|
if (moving_wnd) |
919 |
|
{ |
920 |
|
XMoveWindow(display, wnd, |
921 |
|
xevent.xmotion.x_root - move_x_offset, |
922 |
|
xevent.xmotion.y_root - move_y_offset); |
923 |
|
break; |
924 |
|
} |
925 |
|
|
926 |
if (fullscreen && !focused) |
if (fullscreen && !focused) |
927 |
XSetInputFocus(display, wnd, RevertToPointerRoot, |
XSetInputFocus(display, wnd, RevertToPointerRoot, |
928 |
CurrentTime); |
CurrentTime); |