/[rdesktop]/sourceforge.net/trunk/rdesktop/xwin.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/xwin.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 823 by stargo, Mon Feb 28 23:30:00 2005 UTC revision 976 by astrand, Thu Aug 4 13:39:57 2005 UTC
# Line 1  Line 1 
1  /* -*- c-basic-offset: 8 -*-  /* -*- c-basic-offset: 8 -*-
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     User interface services - X Window System     User interface services - X Window System
4     Copyright (C) Matthew Chapman 1999-2002     Copyright (C) Matthew Chapman 1999-2005
5    
6     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
# Line 32  extern int g_width; Line 32  extern int g_width;
32  extern int g_height;  extern int g_height;
33  extern int g_xpos;  extern int g_xpos;
34  extern int g_ypos;  extern int g_ypos;
35    extern int g_pos;
36  extern BOOL g_sendmotion;  extern BOOL g_sendmotion;
37  extern BOOL g_fullscreen;  extern BOOL g_fullscreen;
38  extern BOOL g_grab_keyboard;  extern BOOL g_grab_keyboard;
# Line 119  PixelColour; Line 120  PixelColour;
120          XFillRectangle(g_display, g_ownbackstore ? g_backstore : g_wnd, g_gc, x, y, cx, cy); \          XFillRectangle(g_display, g_ownbackstore ? g_backstore : g_wnd, g_gc, x, y, cx, cy); \
121  }  }
122    
123    #define FILL_POLYGON(p,np)\
124    { \
125            XFillPolygon(g_display, g_wnd, g_gc, p, np, Complex, CoordModePrevious); \
126            if (g_ownbackstore) \
127                    XFillPolygon(g_display, g_backstore, g_gc, p, np, Complex, CoordModePrevious); \
128    }
129    
130    #define DRAW_ELLIPSE(x,y,cx,cy,m)\
131    { \
132            switch (m) \
133            { \
134                    case 0: /* Outline */ \
135                            XDrawArc(g_display, g_wnd, g_gc, x, y, cx, cy, 0, 360*64); \
136                            if (g_ownbackstore) \
137                                    XDrawArc(g_display, g_backstore, g_gc, x, y, cx, cy, 0, 360*64); \
138                            break; \
139                    case 1: /* Filled */ \
140                            XFillArc(g_display, g_ownbackstore ? g_backstore : g_wnd, g_gc, x, y, \
141                                     cx, cy, 0, 360*64); \
142                            if (g_ownbackstore) \
143                                    XCopyArea(g_display, g_backstore, g_wnd, g_gc, x, y, cx, cy, x, y); \
144                            break; \
145            } \
146    }
147    
148  /* colour maps */  /* colour maps */
149  extern BOOL g_owncolmap;  extern BOOL g_owncolmap;
150  static Colormap g_xcolmap;  static Colormap g_xcolmap;
# Line 1138  ui_create_window(void) Line 1164  ui_create_window(void)
1164          wndwidth = g_fullscreen ? WidthOfScreen(g_screen) : g_width;          wndwidth = g_fullscreen ? WidthOfScreen(g_screen) : g_width;
1165          wndheight = g_fullscreen ? HeightOfScreen(g_screen) : g_height;          wndheight = g_fullscreen ? HeightOfScreen(g_screen) : g_height;
1166    
1167            /* Handle -x-y portion of geometry string */
1168            if (g_xpos < 0 || (g_xpos == 0 && (g_pos & 2)))
1169                    g_xpos = WidthOfScreen(g_screen) + g_xpos - g_width;
1170            if (g_ypos < 0 || (g_ypos == 0 && (g_pos & 4)))
1171                    g_ypos = HeightOfScreen(g_screen) + g_ypos - g_height;
1172    
1173          attribs.background_pixel = BlackPixelOfScreen(g_screen);          attribs.background_pixel = BlackPixelOfScreen(g_screen);
1174          attribs.border_pixel = WhitePixelOfScreen(g_screen);          attribs.border_pixel = WhitePixelOfScreen(g_screen);
1175          attribs.backing_store = g_ownbackstore ? NotUseful : Always;          attribs.backing_store = g_ownbackstore ? NotUseful : Always;
# Line 1181  ui_create_window(void) Line 1213  ui_create_window(void)
1213          if (sizehints)          if (sizehints)
1214          {          {
1215                  sizehints->flags = PMinSize | PMaxSize;                  sizehints->flags = PMinSize | PMaxSize;
1216                    if (g_pos)
1217                            sizehints->flags |= PPosition;
1218                  sizehints->min_width = sizehints->max_width = g_width;                  sizehints->min_width = sizehints->max_width = g_width;
1219                  sizehints->min_height = sizehints->max_height = g_height;                  sizehints->min_height = sizehints->max_height = g_height;
1220                  XSetWMNormalHints(g_display, g_wnd, sizehints);                  XSetWMNormalHints(g_display, g_wnd, sizehints);
# Line 1193  ui_create_window(void) Line 1227  ui_create_window(void)
1227          }          }
1228    
1229          input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |          input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
1230                  VisibilityChangeMask | FocusChangeMask;                  VisibilityChangeMask | FocusChangeMask | StructureNotifyMask;
1231    
1232          if (g_sendmotion)          if (g_sendmotion)
1233                  input_mask |= PointerMotionMask;                  input_mask |= PointerMotionMask;
# Line 1307  xwin_toggle_fullscreen(void) Line 1341  xwin_toggle_fullscreen(void)
1341          }          }
1342  }  }
1343    
1344  /* Process all events in Xlib queue  /* Process events in Xlib queue
1345     Returns 0 after user quit, 1 otherwise */     Returns 0 after user quit, 1 otherwise */
1346  static int  static int
1347  xwin_process_events(void)  xwin_process_events(void)
# Line 1316  xwin_process_events(void) Line 1350  xwin_process_events(void)
1350          KeySym keysym;          KeySym keysym;
1351          uint16 button, flags;          uint16 button, flags;
1352          uint32 ev_time;          uint32 ev_time;
         key_translation tr;  
1353          char str[256];          char str[256];
1354          Status status;          Status status;
1355            int events = 0;
1356    
1357          while (XPending(g_display) > 0)          while ((XPending(g_display) > 0) && events++ < 20)
1358          {          {
1359                  XNextEvent(g_display, &xevent);                  XNextEvent(g_display, &xevent);
1360    
# Line 1368  xwin_process_events(void) Line 1402  xwin_process_events(void)
1402                                                        str, sizeof(str), &keysym, NULL);                                                        str, sizeof(str), &keysym, NULL);
1403                                  }                                  }
1404    
1405                                  DEBUG_KBD(("KeyPress for (keysym 0x%lx, %s)\n", keysym,                                  DEBUG_KBD(("KeyPress for keysym (0x%lx, %s)\n", keysym,
1406                                             get_ksname(keysym)));                                             get_ksname(keysym)));
1407    
1408                                  ev_time = time(NULL);                                  ev_time = time(NULL);
1409                                  if (handle_special_keys(keysym, xevent.xkey.state, ev_time, True))                                  if (handle_special_keys(keysym, xevent.xkey.state, ev_time, True))
1410                                          break;                                          break;
1411    
1412                                  tr = xkeymap_translate_key(keysym,                                  xkeymap_send_keys(keysym, xevent.xkey.keycode, xevent.xkey.state,
1413                                                             xevent.xkey.keycode, xevent.xkey.state);                                                    ev_time, True, 0);
   
                                 if (tr.scancode == 0)  
                                         break;  
   
                                 save_remote_modifiers(tr.scancode);  
                                 ensure_remote_modifiers(ev_time, tr);  
                                 rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode);  
                                 restore_remote_modifiers(ev_time, tr.scancode);  
   
1414                                  break;                                  break;
1415    
1416                          case KeyRelease:                          case KeyRelease:
# Line 1393  xwin_process_events(void) Line 1418  xwin_process_events(void)
1418                                  XLookupString((XKeyEvent *) & xevent, str,                                  XLookupString((XKeyEvent *) & xevent, str,
1419                                                sizeof(str), &keysym, NULL);                                                sizeof(str), &keysym, NULL);
1420    
1421                                  DEBUG_KBD(("\nKeyRelease for (keysym 0x%lx, %s)\n", keysym,                                  DEBUG_KBD(("\nKeyRelease for keysym (0x%lx, %s)\n", keysym,
1422                                             get_ksname(keysym)));                                             get_ksname(keysym)));
1423    
1424                                  ev_time = time(NULL);                                  ev_time = time(NULL);
1425                                  if (handle_special_keys(keysym, xevent.xkey.state, ev_time, False))                                  if (handle_special_keys(keysym, xevent.xkey.state, ev_time, False))
1426                                          break;                                          break;
1427    
1428                                  tr = xkeymap_translate_key(keysym,                                  xkeymap_send_keys(keysym, xevent.xkey.keycode, xevent.xkey.state,
1429                                                             xevent.xkey.keycode, xevent.xkey.state);                                                    ev_time, False, 0);
   
                                 if (tr.scancode == 0)  
                                         break;  
   
                                 rdp_send_scancode(ev_time, RDP_KEYRELEASE, tr.scancode);  
1430                                  break;                                  break;
1431    
1432                          case ButtonPress:                          case ButtonPress:
# Line 1564  xwin_process_events(void) Line 1584  xwin_process_events(void)
1584                          case PropertyNotify:                          case PropertyNotify:
1585                                  xclip_handle_PropertyNotify(&xevent.xproperty);                                  xclip_handle_PropertyNotify(&xevent.xproperty);
1586                                  break;                                  break;
1587                            case MapNotify:
1588                                    rdp_send_client_window_status(1);
1589                                    break;
1590                            case UnmapNotify:
1591                                    rdp_send_client_window_status(0);
1592                                    break;
1593                  }                  }
1594          }          }
1595          /* Keep going */          /* Keep going */
# Line 2166  ui_rect( Line 2192  ui_rect(
2192          FILL_RECTANGLE(x, y, cx, cy);          FILL_RECTANGLE(x, y, cx, cy);
2193  }  }
2194    
2195    void
2196    ui_polygon(uint8 opcode,
2197               /* mode */ uint8 fillmode,
2198               /* dest */ POINT * point, int npoints,
2199               /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
2200    {
2201            uint8 style, i, ipattern[8];
2202            Pixmap fill;
2203    
2204            SET_FUNCTION(opcode);
2205    
2206            switch (fillmode)
2207            {
2208                    case ALTERNATE:
2209                            XSetFillRule(g_display, g_gc, EvenOddRule);
2210                            break;
2211                    case WINDING:
2212                            XSetFillRule(g_display, g_gc, WindingRule);
2213                            break;
2214                    default:
2215                            unimpl("fill mode %d\n", fillmode);
2216            }
2217    
2218            if (brush)
2219                    style = brush->style;
2220            else
2221                    style = 0;
2222    
2223            switch (style)
2224            {
2225                    case 0: /* Solid */
2226                            SET_FOREGROUND(fgcolour);
2227                            FILL_POLYGON((XPoint *) point, npoints);
2228                            break;
2229    
2230                    case 2: /* Hatch */
2231                            fill = (Pixmap) ui_create_glyph(8, 8,
2232                                                            hatch_patterns + brush->pattern[0] * 8);
2233                            SET_FOREGROUND(fgcolour);
2234                            SET_BACKGROUND(bgcolour);
2235                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2236                            XSetStipple(g_display, g_gc, fill);
2237                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2238                            FILL_POLYGON((XPoint *) point, npoints);
2239                            XSetFillStyle(g_display, g_gc, FillSolid);
2240                            XSetTSOrigin(g_display, g_gc, 0, 0);
2241                            ui_destroy_glyph((HGLYPH) fill);
2242                            break;
2243    
2244                    case 3: /* Pattern */
2245                            for (i = 0; i != 8; i++)
2246                                    ipattern[7 - i] = brush->pattern[i];
2247                            fill = (Pixmap) ui_create_glyph(8, 8, ipattern);
2248                            SET_FOREGROUND(bgcolour);
2249                            SET_BACKGROUND(fgcolour);
2250                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2251                            XSetStipple(g_display, g_gc, fill);
2252                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2253                            FILL_POLYGON((XPoint *) point, npoints);
2254                            XSetFillStyle(g_display, g_gc, FillSolid);
2255                            XSetTSOrigin(g_display, g_gc, 0, 0);
2256                            ui_destroy_glyph((HGLYPH) fill);
2257                            break;
2258    
2259                    default:
2260                            unimpl("brush %d\n", brush->style);
2261            }
2262    
2263            RESET_FUNCTION(opcode);
2264    }
2265    
2266    void
2267    ui_polyline(uint8 opcode,
2268                /* dest */ POINT * points, int npoints,
2269                /* pen */ PEN * pen)
2270    {
2271            /* TODO: set join style */
2272            SET_FUNCTION(opcode);
2273            SET_FOREGROUND(pen->colour);
2274            XDrawLines(g_display, g_wnd, g_gc, (XPoint *) points, npoints, CoordModePrevious);
2275            if (g_ownbackstore)
2276                    XDrawLines(g_display, g_backstore, g_gc, (XPoint *) points, npoints,
2277                               CoordModePrevious);
2278            RESET_FUNCTION(opcode);
2279    }
2280    
2281    void
2282    ui_ellipse(uint8 opcode,
2283               /* mode */ uint8 fillmode,
2284               /* dest */ int x, int y, int cx, int cy,
2285               /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
2286    {
2287            uint8 style, i, ipattern[8];
2288            Pixmap fill;
2289    
2290            SET_FUNCTION(opcode);
2291    
2292            if (brush)
2293                    style = brush->style;
2294            else
2295                    style = 0;
2296    
2297            switch (style)
2298            {
2299                    case 0: /* Solid */
2300                            SET_FOREGROUND(fgcolour);
2301                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2302                            break;
2303    
2304                    case 2: /* Hatch */
2305                            fill = (Pixmap) ui_create_glyph(8, 8,
2306                                                            hatch_patterns + brush->pattern[0] * 8);
2307                            SET_FOREGROUND(fgcolour);
2308                            SET_BACKGROUND(bgcolour);
2309                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2310                            XSetStipple(g_display, g_gc, fill);
2311                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2312                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2313                            XSetFillStyle(g_display, g_gc, FillSolid);
2314                            XSetTSOrigin(g_display, g_gc, 0, 0);
2315                            ui_destroy_glyph((HGLYPH) fill);
2316                            break;
2317    
2318                    case 3: /* Pattern */
2319                            for (i = 0; i != 8; i++)
2320                                    ipattern[7 - i] = brush->pattern[i];
2321                            fill = (Pixmap) ui_create_glyph(8, 8, ipattern);
2322                            SET_FOREGROUND(bgcolour);
2323                            SET_BACKGROUND(fgcolour);
2324                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2325                            XSetStipple(g_display, g_gc, fill);
2326                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2327                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2328                            XSetFillStyle(g_display, g_gc, FillSolid);
2329                            XSetTSOrigin(g_display, g_gc, 0, 0);
2330                            ui_destroy_glyph((HGLYPH) fill);
2331                            break;
2332    
2333                    default:
2334                            unimpl("brush %d\n", brush->style);
2335            }
2336    
2337            RESET_FUNCTION(opcode);
2338    }
2339    
2340  /* warning, this function only draws on wnd or backstore, not both */  /* warning, this function only draws on wnd or backstore, not both */
2341  void  void
2342  ui_draw_glyph(int mixmode,  ui_draw_glyph(int mixmode,
# Line 2221  ui_draw_glyph(int mixmode, Line 2392  ui_draw_glyph(int mixmode,
2392  }  }
2393    
2394  void  void
2395  ui_draw_text(uint8 font, uint8 flags, int mixmode, int x, int y,  ui_draw_text(uint8 font, uint8 flags, uint8 opcode, int mixmode, int x, int y,
2396               int clipx, int clipy, int clipcx, int clipcy,               int clipx, int clipy, int clipcx, int clipcy,
2397               int boxx, int boxy, int boxcx, int boxcy, int bgcolour,               int boxx, int boxy, int boxcx, int boxcy, BRUSH * brush,
2398               int fgcolour, uint8 * text, uint8 length)               int bgcolour, int fgcolour, uint8 * text, uint8 length)
2399  {  {
2400            /* TODO: use brush appropriately */
2401    
2402          FONTGLYPH *glyph;          FONTGLYPH *glyph;
2403          int i, j, xyoffset, x1, y1;          int i, j, xyoffset, x1, y1;
2404          DATABLOB *entry;          DATABLOB *entry;

Legend:
Removed from v.823  
changed lines
  Added in v.976

  ViewVC Help
Powered by ViewVC 1.1.26