/[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 821 by jdmeijer, Mon Feb 28 01:15:45 2005 UTC revision 867 by stargo, Wed Mar 23 12:25:54 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 662  translate16to32(const uint16 * data, uin Line 688  translate16to32(const uint16 * data, uin
688                  }                  }
689                  else                  else
690                  {                  {
691                            while (out < end)
692                          {                          {
693                                  pixel = *(data++);                                  pixel = *(data++);
694                                  SPLITCOLOUR16(pixel, pc);                                  SPLITCOLOUR16(pixel, pc);
# Line 764  translate24to32(const uint8 * data, uint Line 791  translate24to32(const uint8 * data, uint
791          if (g_arch_match)          if (g_arch_match)
792          {          {
793                  /* *INDENT-OFF* */                  /* *INDENT-OFF* */
794    #ifdef NEED_ALIGN
795                  REPEAT4                  REPEAT4
796                  (                  (
 #ifdef NEED_ALIGN  
797                          *(out++) = *(data++);                          *(out++) = *(data++);
798                          *(out++) = *(data++);                          *(out++) = *(data++);
799                          *(out++) = *(data++);                          *(out++) = *(data++);
800                          *(out++) = 0;                          *(out++) = 0;
801                    )
802  #else  #else
803                    REPEAT4
804                    (
805                          *((uint32 *) out) = *((uint32 *) data);                          *((uint32 *) out) = *((uint32 *) data);
806                          out += 4;                          out += 4;
807                          data += 3;                          data += 3;
 #endif  
808                  )                  )
809    #endif
810                  /* *INDENT-ON* */                  /* *INDENT-ON* */
811          }          }
812          else if (g_xserver_be)          else if (g_xserver_be)
# Line 1134  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 1177  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 2162  ui_rect( Line 2200  ui_rect(
2200          FILL_RECTANGLE(x, y, cx, cy);          FILL_RECTANGLE(x, y, cx, cy);
2201  }  }
2202    
2203    void
2204    ui_polygon(uint8 opcode,
2205               /* mode */ uint8 fillmode,
2206               /* dest */ POINT * point, int npoints,
2207               /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
2208    {
2209            uint8 style, i, ipattern[8];
2210            Pixmap fill;
2211    
2212            SET_FUNCTION(opcode);
2213    
2214            switch (fillmode)
2215            {
2216                    case ALTERNATE:
2217                            XSetFillRule(g_display, g_gc, EvenOddRule);
2218                            break;
2219                    case WINDING:
2220                            XSetFillRule(g_display, g_gc, WindingRule);
2221                            break;
2222                    default:
2223                            unimpl("fill mode %d\n", fillmode);
2224            }
2225    
2226            if (brush)
2227                    style = brush->style;
2228            else
2229                    style = 0;
2230    
2231            switch (style)
2232            {
2233                    case 0: /* Solid */
2234                            SET_FOREGROUND(fgcolour);
2235                            FILL_POLYGON((XPoint *) point, npoints);
2236                            break;
2237    
2238                    case 2: /* Hatch */
2239                            fill = (Pixmap) ui_create_glyph(8, 8,
2240                                                            hatch_patterns + brush->pattern[0] * 8);
2241                            SET_FOREGROUND(fgcolour);
2242                            SET_BACKGROUND(bgcolour);
2243                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2244                            XSetStipple(g_display, g_gc, fill);
2245                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2246                            FILL_POLYGON((XPoint *) point, npoints);
2247                            XSetFillStyle(g_display, g_gc, FillSolid);
2248                            XSetTSOrigin(g_display, g_gc, 0, 0);
2249                            ui_destroy_glyph((HGLYPH) fill);
2250                            break;
2251    
2252                    case 3: /* Pattern */
2253                            for (i = 0; i != 8; i++)
2254                                    ipattern[7 - i] = brush->pattern[i];
2255                            fill = (Pixmap) ui_create_glyph(8, 8, ipattern);
2256                            SET_FOREGROUND(bgcolour);
2257                            SET_BACKGROUND(fgcolour);
2258                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2259                            XSetStipple(g_display, g_gc, fill);
2260                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2261                            FILL_POLYGON((XPoint *) point, npoints);
2262                            XSetFillStyle(g_display, g_gc, FillSolid);
2263                            XSetTSOrigin(g_display, g_gc, 0, 0);
2264                            ui_destroy_glyph((HGLYPH) fill);
2265                            break;
2266    
2267                    default:
2268                            unimpl("brush %d\n", brush->style);
2269            }
2270    
2271            RESET_FUNCTION(opcode);
2272    }
2273    
2274    void
2275    ui_polyline(uint8 opcode,
2276                /* dest */ POINT * points, int npoints,
2277                /* pen */ PEN * pen)
2278    {
2279            /* TODO: set join style */
2280            SET_FUNCTION(opcode);
2281            SET_FOREGROUND(pen->colour);
2282            XDrawLines(g_display, g_wnd, g_gc, (XPoint *) points, npoints, CoordModePrevious);
2283            if (g_ownbackstore)
2284                    XDrawLines(g_display, g_backstore, g_gc, (XPoint *) points, npoints,
2285                               CoordModePrevious);
2286            RESET_FUNCTION(opcode);
2287    }
2288    
2289    void
2290    ui_ellipse(uint8 opcode,
2291               /* mode */ uint8 fillmode,
2292               /* dest */ int x, int y, int cx, int cy,
2293               /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
2294    {
2295            uint8 style, i, ipattern[8];
2296            Pixmap fill;
2297    
2298            SET_FUNCTION(opcode);
2299    
2300            if (brush)
2301                    style = brush->style;
2302            else
2303                    style = 0;
2304    
2305            switch (style)
2306            {
2307                    case 0: /* Solid */
2308                            SET_FOREGROUND(fgcolour);
2309                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2310                            break;
2311    
2312                    case 2: /* Hatch */
2313                            fill = (Pixmap) ui_create_glyph(8, 8,
2314                                                            hatch_patterns + brush->pattern[0] * 8);
2315                            SET_FOREGROUND(fgcolour);
2316                            SET_BACKGROUND(bgcolour);
2317                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2318                            XSetStipple(g_display, g_gc, fill);
2319                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2320                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2321                            XSetFillStyle(g_display, g_gc, FillSolid);
2322                            XSetTSOrigin(g_display, g_gc, 0, 0);
2323                            ui_destroy_glyph((HGLYPH) fill);
2324                            break;
2325    
2326                    case 3: /* Pattern */
2327                            for (i = 0; i != 8; i++)
2328                                    ipattern[7 - i] = brush->pattern[i];
2329                            fill = (Pixmap) ui_create_glyph(8, 8, ipattern);
2330                            SET_FOREGROUND(bgcolour);
2331                            SET_BACKGROUND(fgcolour);
2332                            XSetFillStyle(g_display, g_gc, FillOpaqueStippled);
2333                            XSetStipple(g_display, g_gc, fill);
2334                            XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);
2335                            DRAW_ELLIPSE(x, y, cx, cy, fillmode);
2336                            XSetFillStyle(g_display, g_gc, FillSolid);
2337                            XSetTSOrigin(g_display, g_gc, 0, 0);
2338                            ui_destroy_glyph((HGLYPH) fill);
2339                            break;
2340    
2341                    default:
2342                            unimpl("brush %d\n", brush->style);
2343            }
2344    
2345            RESET_FUNCTION(opcode);
2346    }
2347    
2348  /* warning, this function only draws on wnd or backstore, not both */  /* warning, this function only draws on wnd or backstore, not both */
2349  void  void
2350  ui_draw_glyph(int mixmode,  ui_draw_glyph(int mixmode,
# Line 2217  ui_draw_glyph(int mixmode, Line 2400  ui_draw_glyph(int mixmode,
2400  }  }
2401    
2402  void  void
2403  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,
2404               int clipx, int clipy, int clipcx, int clipcy,               int clipx, int clipy, int clipcx, int clipcy,
2405               int boxx, int boxy, int boxcx, int boxcy, int bgcolour,               int boxx, int boxy, int boxcx, int boxcy, BRUSH * brush,
2406               int fgcolour, uint8 * text, uint8 length)               int bgcolour, int fgcolour, uint8 * text, uint8 length)
2407  {  {
2408            /* TODO: use brush appropriately */
2409    
2410          FONTGLYPH *glyph;          FONTGLYPH *glyph;
2411          int i, j, xyoffset, x1, y1;          int i, j, xyoffset, x1, y1;
2412          DATABLOB *entry;          DATABLOB *entry;

Legend:
Removed from v.821  
changed lines
  Added in v.867

  ViewVC Help
Powered by ViewVC 1.1.26