tkMacOSXXStubs.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:27k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tkMacOSXXStubs.c --
  3.  *
  4.  * This file contains most of the X calls called by Tk. Many of
  5.  * these calls are just stubs and either don't make sense on the
  6.  * Macintosh or thier implamentation just doesn't do anything. Other
  7.  * calls will eventually be moved into other files.
  8.  *
  9.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  10.  * Copyright 2001, Apple Computer, Inc.
  11.  * Copyright (c) 2005-2007 Daniel A. Steffen <das@users.sourceforge.net>
  12.  *
  13.  * See the file "license.terms" for information on usage and redistribution
  14.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15.  *
  16.  * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.2.2.20 2007/11/09 06:26:57 das Exp $
  17.  */
  18. #include "tkMacOSXPrivate.h"
  19. #include "tkMacOSXEvent.h"
  20. #if 0
  21. #include <IOKit/IOKitLib.h>
  22. #endif
  23. /*
  24.  * Because this file is still under major development Debugger statements are
  25.  * used through out this file. The define TCL_DEBUG will decide whether
  26.  * the debugger statements actually call the debugger or not.
  27.  */
  28. #ifndef TCL_DEBUG
  29. #   define Debugger()
  30. #endif
  31. #define ROOT_ID 10
  32. /*
  33.  * Declarations of static variables used in this file.
  34.  */
  35. static TkDisplay *gMacDisplay = NULL; /* Macintosh display. */
  36. static const char *macScreenName = ":0"; /* Default name of macintosh display. */
  37. /*
  38.  * Forward declarations of procedures used in this file.
  39.  */
  40. static XID MacXIdAlloc(Display *display);
  41. static int DefaultErrorHandler(Display* display, XErrorEvent* err_evt);
  42. /*
  43.  * Other declarations
  44.  */
  45. static int DestroyImage(XImage *image);
  46. static unsigned long ImageGetPixel(XImage *image, int x, int y);
  47. static int PutPixel(XImage *image, int x, int y, unsigned long pixel);
  48. #if 0
  49. static XImage *SubImage(XImage *image, int x, int y,
  50. unsigned int width, unsigned int height);
  51. static int AddPixel(XImage *image, long value);
  52. #endif
  53. /*
  54.  *----------------------------------------------------------------------
  55.  *
  56.  * TkMacOSXDisplayChanged --
  57.  *
  58.  * Called to set up initial screen info or when an event indicated
  59.  * display (screen) change.
  60.  *
  61.  * Results:
  62.  * None.
  63.  *
  64.  * Side effects:
  65.  * May change info regarding the screen.
  66.  *
  67.  *----------------------------------------------------------------------
  68.  */
  69. void
  70. TkMacOSXDisplayChanged(Display *display)
  71. {
  72.     GDHandle graphicsDevice;
  73.     Screen *screen;
  74.     Rect bounds = {0, 0, 0, 0}, *maxBounds;
  75.     if (display == NULL || display->screens == NULL) {
  76. return;
  77.     }
  78.     screen = display->screens;
  79.     graphicsDevice = GetMainDevice();
  80.     screen->root_depth = (*(*graphicsDevice)->gdPMap)->cmpSize *
  81.        (*(*graphicsDevice)->gdPMap)->cmpCount;
  82.     screen->height = (*graphicsDevice)->gdRect.bottom -
  83. (*graphicsDevice)->gdRect.top;
  84.     screen->width = (*graphicsDevice)->gdRect.right -
  85. (*graphicsDevice)->gdRect.left;
  86.     screen->mwidth = (screen->width * 254 + 360) / 720;
  87.     screen->mheight = (screen->height * 254 + 360) / 720;
  88.     maxBounds = (Rect*) screen->ext_data;
  89.     *maxBounds = bounds;
  90.     graphicsDevice = GetDeviceList();
  91.     while (graphicsDevice) {
  92. OSStatus err;
  93. err = ChkErr(GetAvailableWindowPositioningBounds, graphicsDevice,
  94. &bounds);
  95. if (err == noErr) {
  96.     UnionRect(&bounds, maxBounds, maxBounds);
  97. }
  98. graphicsDevice = GetNextDevice(graphicsDevice);
  99.     }
  100. }
  101. /*
  102.  *----------------------------------------------------------------------
  103.  *
  104.  * TkpOpenDisplay --
  105.  *
  106.  * Create the Display structure and fill it with device
  107.  * specific information.
  108.  *
  109.  * Results:
  110.  * Returns a Display structure on success or NULL on failure.
  111.  *
  112.  * Side effects:
  113.  * Allocates a new Display structure.
  114.  *
  115.  *----------------------------------------------------------------------
  116.  */
  117. TkDisplay *
  118. TkpOpenDisplay(
  119.     CONST char *display_name)
  120. {
  121.     Display *display;
  122.     Screen *screen;
  123.     int fd = 0;
  124.     static Rect maxBounds = {0, 0, 0, 0};
  125.     if (gMacDisplay != NULL) {
  126. if (strcmp(gMacDisplay->display->display_name, display_name) == 0) {
  127.     return gMacDisplay;
  128. } else {
  129.     return NULL;
  130. }
  131.     }
  132.     display = (Display *) ckalloc(sizeof(Display));
  133.     screen  = (Screen *) ckalloc(sizeof(Screen));
  134.     bzero(display, sizeof(Display));
  135.     bzero(screen, sizeof(Screen));
  136.     display->resource_alloc = MacXIdAlloc;
  137.     display->request     = 0;
  138.     display->qlen     = 0;
  139.     display->fd     = fd;
  140.     display->screens     = screen;
  141.     display->nscreens     = 1;
  142.     display->default_screen = 0;
  143.     display->display_name   = (char*)macScreenName;
  144.     Gestalt(gestaltQuickdrawVersion, (long*)&display->proto_minor_version);
  145.     display->proto_major_version = 10;
  146.     display->proto_minor_version -= gestaltMacOSXQD;
  147.     display->vendor = "Apple";
  148.     Gestalt(gestaltSystemVersion, (long*)&display->release);
  149.     /*
  150.      * These screen bits never change
  151.      */
  152.     screen->root = ROOT_ID;
  153.     screen->display = display;
  154.     screen->black_pixel = 0x00000000 | PIXEL_MAGIC << 24;
  155.     screen->white_pixel = 0x00FFFFFF | PIXEL_MAGIC << 24;
  156.     screen->ext_data = (XExtData*) &maxBounds;
  157.     screen->root_visual = (Visual *) ckalloc(sizeof(Visual));
  158.     screen->root_visual->visualid     = 0;
  159.     screen->root_visual->class       = TrueColor;
  160.     screen->root_visual->red_mask     = 0x00FF0000;
  161.     screen->root_visual->green_mask   = 0x0000FF00;
  162.     screen->root_visual->blue_mask    = 0x000000FF;
  163.     screen->root_visual->bits_per_rgb = 24;
  164.     screen->root_visual->map_entries  = 256;
  165.     /*
  166.      * Initialize screen bits that may change
  167.      */
  168.     TkMacOSXDisplayChanged(display);
  169.     gMacDisplay = (TkDisplay *) ckalloc(sizeof(TkDisplay));
  170.     /*
  171.      * This is the quickest way to make sure that all the *Init
  172.      * flags get properly initialized
  173.      */
  174.     bzero(gMacDisplay, sizeof(TkDisplay));
  175.     gMacDisplay->display = display;
  176.     return gMacDisplay;
  177. }
  178. /*
  179.  *----------------------------------------------------------------------
  180.  *
  181.  * TkpCloseDisplay --
  182.  *
  183.  * Deallocates a display structure created by TkpOpenDisplay.
  184.  *
  185.  * Results:
  186.  * None.
  187.  *
  188.  * Side effects:
  189.  * Frees memory.
  190.  *
  191.  *----------------------------------------------------------------------
  192.  */
  193. void
  194. TkpCloseDisplay(
  195.     TkDisplay *displayPtr)
  196. {
  197.     Display *display = displayPtr->display;
  198.     if (gMacDisplay != displayPtr) {
  199. Tcl_Panic("TkpCloseDisplay: tried to call TkpCloseDisplay on bad display");
  200.     }
  201.     gMacDisplay = NULL;
  202.     if (display->screens != (Screen *) NULL) {
  203. if (display->screens->root_visual != (Visual *) NULL) {
  204.     ckfree((char *) display->screens->root_visual);
  205. }
  206. ckfree((char *) display->screens);
  207.     }
  208.     ckfree((char *) display);
  209. }
  210. /*
  211.  *----------------------------------------------------------------------
  212.  *
  213.  * TkClipCleanup --
  214.  *
  215.  * This procedure is called to cleanup resources associated with
  216.  * claiming clipboard ownership and for receiving selection get
  217.  * results. This function is called in tkWindow.c. This has to be
  218.  * called by the display cleanup function because we still need the
  219.  * access display elements.
  220.  *
  221.  * Results:
  222.  * None.
  223.  *
  224.  * Side effects:
  225.  * Resources are freed - the clipboard may no longer be used.
  226.  *
  227.  *----------------------------------------------------------------------
  228.  */
  229. void
  230. TkClipCleanup(dispPtr)
  231.     TkDisplay *dispPtr; /* display associated with clipboard */
  232. {
  233.     /*
  234.      * Make sure that the local scrap is transfered to the global
  235.      * scrap if needed.
  236.      */
  237.     TkSuspendClipboard();
  238.     if (dispPtr->clipWindow != NULL) {
  239. Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom,
  240. dispPtr->applicationAtom);
  241. Tk_DeleteSelHandler(dispPtr->clipWindow, dispPtr->clipboardAtom,
  242. dispPtr->windowAtom);
  243. Tk_DestroyWindow(dispPtr->clipWindow);
  244. Tcl_Release((ClientData) dispPtr->clipWindow);
  245. dispPtr->clipWindow = NULL;
  246.     }
  247. }
  248. /*
  249.  *----------------------------------------------------------------------
  250.  *
  251.  * MacXIdAlloc --
  252.  *
  253.  * This procedure is invoked by Xlib as the resource allocator
  254.  * for a display.
  255.  *
  256.  * Results:
  257.  * The return value is an X resource identifier that isn't currently
  258.  * in use.
  259.  *
  260.  * Side effects:
  261.  * The identifier is removed from the stack of free identifiers,
  262.  * if it was previously on the stack.
  263.  *
  264.  *----------------------------------------------------------------------
  265.  */
  266. static XID
  267. MacXIdAlloc(
  268.     Display *display) /* Display for which to allocate. */
  269. {
  270. static long int cur_id = 100;
  271. /*
  272.  * Some special XIds are reserved
  273.  *   - this is why we start at 100
  274.  */
  275. return ++cur_id;
  276. }
  277. /*
  278.  *----------------------------------------------------------------------
  279.  *
  280.  * TkpWindowWasRecentlyDeleted --
  281.  *
  282.  * Tries to determine whether the given window was recently deleted.
  283.  * Called from the generic code error handler to attempt to deal with
  284.  * async BadWindow errors under some circumstances.
  285.  *
  286.  * Results:
  287.  * Always 0, we do not keep this information on the Mac, so we do not
  288.  * know whether the window was destroyed.
  289.  *
  290.  * Side effects:
  291.  * None.
  292.  *
  293.  *----------------------------------------------------------------------
  294.  */
  295. int
  296. TkpWindowWasRecentlyDeleted(
  297.     Window win,
  298.     TkDisplay *dispPtr)
  299. {
  300.     return 0;
  301. }
  302. /*
  303.  *----------------------------------------------------------------------
  304.  *
  305.  * DefaultErrorHandler --
  306.  *
  307.  * This procedure is the default X error handler. Tk uses it's
  308.  * own error handler so this call should never be called.
  309.  *
  310.  * Results:
  311.  * None.
  312.  *
  313.  * Side effects:
  314.  * This function will call panic and exit.
  315.  *
  316.  *----------------------------------------------------------------------
  317.  */
  318. static int
  319. DefaultErrorHandler(
  320.     Display* display,
  321.     XErrorEvent* err_evt)
  322. {
  323.     /*
  324.      * This call should never be called. Tk replaces
  325.      * it with its own error handler.
  326.      */
  327.     Tcl_Panic("Warning hit bogus error handler!");
  328.     return 0;
  329. }
  330. char *
  331. XGetAtomName(
  332.     Display * display,
  333.     Atom atom)
  334. {
  335.     display->request++;
  336.     return NULL;
  337. }
  338. int
  339. _XInitImageFuncPtrs(XImage *image)
  340. {
  341.     return 0;
  342. }
  343. XErrorHandler
  344. XSetErrorHandler(
  345.     XErrorHandler handler)
  346. {
  347.     return DefaultErrorHandler;
  348. }
  349. Window
  350. XRootWindow(Display *display, int screen_number)
  351. {
  352.     display->request++;
  353.     return ROOT_ID;
  354. }
  355. int
  356. XGetGeometry(display, d, root_return, x_return, y_return, width_return,
  357. height_return, border_width_return, depth_return)
  358.     Display* display;
  359.     Drawable d;
  360.     Window* root_return;
  361.     int* x_return;
  362.     int* y_return;
  363.     unsigned int* width_return;
  364.     unsigned int* height_return;
  365.     unsigned int* border_width_return;
  366.     unsigned int* depth_return;
  367. {
  368.     TkWindow *winPtr = ((MacDrawable *) d)->winPtr;
  369.     display->request++;
  370.     *root_return = ROOT_ID;
  371.     if (winPtr) {
  372. *x_return = Tk_X(winPtr);
  373. *y_return = Tk_Y(winPtr);
  374. *width_return = Tk_Width(winPtr);
  375. *height_return = Tk_Height(winPtr);
  376. *border_width_return = winPtr->changes.border_width;
  377. *depth_return = Tk_Depth(winPtr);
  378.     } else {
  379. Rect boundsRect;
  380. CGrafPtr destPort = TkMacOSXGetDrawablePort(d);
  381. GetPortBounds(destPort, &boundsRect);
  382. *x_return = boundsRect.left;
  383. *y_return =  boundsRect.top;
  384. *width_return = boundsRect.right - boundsRect.left;
  385. *height_return = boundsRect.bottom - boundsRect.top;
  386. *border_width_return = 0;
  387. *depth_return = 32;
  388.     }
  389.     return 1;
  390. }
  391. void
  392. XChangeProperty(
  393.     Display* display,
  394.     Window w,
  395.     Atom property,
  396.     Atom type,
  397.     int format,
  398.     int mode,
  399.     _Xconst unsigned char* data,
  400.     int nelements)
  401. {
  402.     Debugger();
  403. }
  404. void
  405. XSelectInput(
  406.     Display* display,
  407.     Window w,
  408.     long event_mask)
  409. {
  410.     Debugger();
  411. }
  412. void
  413. XBell(
  414.     Display* display,
  415.     int percent)
  416. {
  417.     SysBeep(percent);
  418. }
  419. #if 0
  420. void
  421. XSetWMNormalHints(
  422.     Display* display,
  423.     Window w,
  424.     XSizeHints* hints)
  425. {
  426.     /*
  427.      * Do nothing. Shouldn't even be called.
  428.      */
  429. }
  430. XSizeHints *
  431. XAllocSizeHints(void)
  432. {
  433.     /*
  434.      * Always return NULL. Tk code checks to see if NULL
  435.      * is returned & does nothing if it is.
  436.      */
  437.     return NULL;
  438. }
  439. #endif
  440. GContext
  441. XGContextFromGC(
  442.     GC gc)
  443. {
  444.     /*
  445.      * TODO: currently a no-op
  446.      */
  447.     return 0;
  448. }
  449. Status
  450. XSendEvent(
  451.     Display* display,
  452.     Window w,
  453.     Bool propagate,
  454.     long event_mask,
  455.     XEvent* event_send)
  456. {
  457.     Debugger();
  458.     return 0;
  459. }
  460. void
  461. XClearWindow(
  462.     Display* display,
  463.     Window w)
  464. {
  465. }
  466. /*
  467. void
  468. XDrawPoint(
  469.     Display* display,
  470.     Drawable d,
  471.     GC gc,
  472.     int x,
  473.     int y)
  474. {
  475. }
  476. void
  477. XDrawPoints(
  478.     Display* display,
  479.     Drawable d,
  480.     GC gc,
  481.     XPoint* points,
  482.     int npoints,
  483.     int mode)
  484. {
  485. }
  486. */
  487. void
  488. XWarpPointer(
  489.     Display* display,
  490.     Window src_w,
  491.     Window dest_w,
  492.     int src_x,
  493.     int src_y,
  494.     unsigned int src_width,
  495.     unsigned int src_height,
  496.     int dest_x,
  497.     int dest_y)
  498. {
  499. }
  500. void
  501. XQueryColor(
  502.     Display* display,
  503.     Colormap colormap,
  504.     XColor* def_in_out)
  505. {
  506.     unsigned long p;
  507.     unsigned char r, g, b;
  508.     XColor *d = def_in_out;
  509.     p = d->pixel;
  510.     r = (p & 0x00FF0000) >> 16;
  511.     g = (p & 0x0000FF00) >> 8;
  512.     b = (p & 0x000000FF);
  513.     d->red = (r << 8) | r;
  514.     d->green = (g << 8) | g;
  515.     d->blue = (b << 8) | b;
  516.     d->flags = DoRed|DoGreen|DoBlue;
  517.     d->pad = 0;
  518. }
  519. void
  520. XQueryColors(
  521.     Display* display,
  522.     Colormap colormap,
  523.     XColor* defs_in_out,
  524.     int ncolors)
  525. {
  526.     int i;
  527.     unsigned long p;
  528.     unsigned char r, g, b;
  529.     XColor *d = defs_in_out;
  530.     for (i = 0; i < ncolors; i++, d++) {
  531. p = d->pixel;
  532. r = (p & 0x00FF0000) >> 16;
  533. g = (p & 0x0000FF00) >> 8;
  534. b = (p & 0x000000FF);
  535. d->red = (r << 8) | r;
  536. d->green = (g << 8) | g;
  537. d->blue = (b << 8) | b;
  538. d->flags = DoRed|DoGreen|DoBlue;
  539. d->pad = 0;
  540.     }
  541. }
  542. int
  543. XQueryTree(display, w, root_return, parent_return, children_return,
  544. nchildren_return)
  545.     Display* display;
  546.     Window w;
  547.     Window* root_return;
  548.     Window* parent_return;
  549.     Window** children_return;
  550.     unsigned int* nchildren_return;
  551. {
  552.     return 0;
  553. }
  554. int
  555. XGetWindowProperty(
  556.     Display *display,
  557.     Window w,
  558.     Atom property,
  559.     long long_offset,
  560.     long long_length,
  561.     Bool delete,
  562.     Atom req_type,
  563.     Atom *actual_type_return,
  564.     int *actual_format_return,
  565.     unsigned long *nitems_return,
  566.     unsigned long *bytes_after_return,
  567.     unsigned char ** prop_return)
  568. {
  569.     display->request++;
  570.     *actual_type_return = None;
  571.     *actual_format_return = *bytes_after_return = 0;
  572.     *nitems_return = 0;
  573.     return 0;
  574. }
  575. void
  576. XRefreshKeyboardMapping( XMappingEvent* x)
  577. {
  578.     /* used by tkXEvent.c */
  579.     Debugger();
  580. }
  581. void
  582. XSetIconName(
  583.     Display* display,
  584.     Window w,
  585.     const char *icon_name)
  586. {
  587.     /*
  588.      * This is a no-op, no icon name for Macs.
  589.      */
  590.     display->request++;
  591. }
  592. void
  593. XForceScreenSaver(
  594.     Display* display,
  595.     int mode)
  596. {
  597.     /*
  598.      * This function is just a no-op. It is defined to
  599.      * reset the screen saver. However, there is no real
  600.      * way to do this on a Mac. Let me know if there is!
  601.      */
  602.     display->request++;
  603. }
  604. void
  605. Tk_FreeXId(
  606.     Display *display,
  607.     XID xid)
  608. {
  609.     /* no-op function needed for stubs implementation. */
  610. }
  611. int
  612. XSync(
  613.     Display *display,
  614.     Bool flag)
  615. {
  616.     TkMacOSXFlushWindows();
  617.     display->request++;
  618.     return 0;
  619. }
  620. #if 0
  621. int
  622. XSetClipRectangles(
  623.     Display *d,
  624.     GC gc,
  625.     int clip_x_origin,
  626.     int clip_y_origin,
  627.     XRectangle* rectangles,
  628.     int n,
  629.     int ordering)
  630. {
  631.     TkRegion clipRgn = TkCreateRegion();
  632.     while (n--) {
  633. XRectangle rect = *rectangles;
  634. rect.x += clip_x_origin;
  635. rect.y += clip_y_origin;
  636. TkUnionRectWithRegion(&rect, clipRgn, clipRgn);
  637. rectangles++;
  638.     }
  639.     TkSetRegion(d, gc, clipRgn);
  640.     TkDestroyRegion(clipRgn);
  641.     return 1;
  642. }
  643. #endif
  644. /*
  645.  *----------------------------------------------------------------------
  646.  *
  647.  * TkGetServerInfo --
  648.  *
  649.  * Given a window, this procedure returns information about
  650.  * the window server for that window. This procedure provides
  651.  * the guts of the "winfo server" command.
  652.  *
  653.  * Results:
  654.  * None.
  655.  *
  656.  * Side effects:
  657.  * None.
  658.  *
  659.  *----------------------------------------------------------------------
  660.  */
  661. void
  662. TkGetServerInfo(
  663.     Tcl_Interp *interp, /* The server information is returned in
  664.  * this interpreter's result. */
  665.     Tk_Window tkwin) /* Token for window; this selects a
  666.  * particular display and server. */
  667. {
  668.     char buffer[8 + TCL_INTEGER_SPACE * 2];
  669.     char buffer2[TCL_INTEGER_SPACE];
  670.     sprintf(buffer, "QD%dR%x ", ProtocolVersion(Tk_Display(tkwin)),
  671.     ProtocolRevision(Tk_Display(tkwin)));
  672.     sprintf(buffer2, " %x", VendorRelease(Tk_Display(tkwin)));
  673.     Tcl_AppendResult(interp, buffer, ServerVendor(Tk_Display(tkwin)),
  674.     buffer2, NULL);
  675. }
  676. #pragma mark XImage handling
  677. /*
  678.  *----------------------------------------------------------------------
  679.  *
  680.  * XCreateImage --
  681.  *
  682.  * Allocates storage for a new XImage.
  683.  *
  684.  * Results:
  685.  * Returns a newly allocated XImage.
  686.  *
  687.  * Side effects:
  688.  * None.
  689.  *
  690.  *----------------------------------------------------------------------
  691.  */
  692. XImage *
  693. XCreateImage(
  694.     Display* display,
  695.     Visual* visual,
  696.     unsigned int depth,
  697.     int format,
  698.     int offset,
  699.     char* data,
  700.     unsigned int width,
  701.     unsigned int height,
  702.     int bitmap_pad,
  703.     int bytes_per_line)
  704. {
  705.     XImage *ximage;
  706.     display->request++;
  707.     ximage = (XImage *) ckalloc(sizeof(XImage));
  708.     ximage->height = height;
  709.     ximage->width = width;
  710.     ximage->depth = depth;
  711.     ximage->xoffset = offset;
  712.     ximage->format = format;
  713.     ximage->data = data;
  714.     if (format == ZPixmap) {
  715. ximage->bits_per_pixel = 32;
  716. ximage->bitmap_unit = 32;
  717.     } else {
  718. ximage->bits_per_pixel = 1;
  719. ximage->bitmap_unit = 8;
  720.     }
  721.     if (bitmap_pad) {
  722. ximage->bitmap_pad = bitmap_pad;
  723.     } else {
  724. /* Use 16 byte alignment for best Quartz perfomance */
  725. ximage->bitmap_pad = 128;
  726.     }
  727.     if (bytes_per_line) {
  728. ximage->bytes_per_line = bytes_per_line;
  729.     } else {
  730. ximage->bytes_per_line = ((width * ximage->bits_per_pixel +
  731. (ximage->bitmap_pad - 1)) >> 3) &
  732. ~((ximage->bitmap_pad >> 3) - 1);
  733.     }
  734. #ifdef WORDS_BIGENDIAN
  735.     ximage->byte_order = MSBFirst;
  736.     ximage->bitmap_bit_order = MSBFirst;
  737. #else
  738.     ximage->byte_order = LSBFirst;
  739.     ximage->bitmap_bit_order = LSBFirst;
  740. #endif
  741.     ximage->red_mask = 0x00FF0000;
  742.     ximage->green_mask = 0x0000FF00;
  743.     ximage->blue_mask = 0x000000FF;
  744.     ximage->obdata = NULL;
  745.     ximage->f.create_image = NULL;
  746.     ximage->f.destroy_image = DestroyImage;
  747.     ximage->f.get_pixel = ImageGetPixel;
  748.     ximage->f.put_pixel = PutPixel;
  749.     ximage->f.sub_image = NULL;
  750.     ximage->f.add_pixel = NULL;
  751.     return ximage;
  752. }
  753. /*
  754.  *----------------------------------------------------------------------
  755.  *
  756.  * XGetImage --
  757.  *
  758.  * This function copies data from a pixmap or window into an XImage.
  759.  *
  760.  * Results:
  761.  * Returns a newly allocated image containing the data from the given
  762.  * rectangle of the given drawable.
  763.  *
  764.  * Side effects:
  765.  * None.
  766.  *
  767.  *----------------------------------------------------------------------
  768.  */
  769. XImage *
  770. XGetImage(
  771.     Display *display,
  772.     Drawable d,
  773.     int x,
  774.     int y,
  775.     unsigned int width,
  776.     unsigned int height,
  777.     unsigned long plane_mask,
  778.     int format)
  779. {
  780.     XImage *   imagePtr = NULL;
  781.     Pixmap     pixmap = (Pixmap) NULL;
  782.     Tk_Window  win = (Tk_Window) ((MacDrawable *) d)->winPtr;
  783.     GC        gc;
  784.     int        depth = 32;
  785.     int        offset = 0;
  786.     int        bitmap_pad = 32;
  787.     int        bytes_per_line = 0;
  788.     if (TkMacOSXGetDrawablePort(d)) {
  789. if (format == ZPixmap) {
  790.     if (width > 0 && height > 0) {
  791. /* Tk_GetPixmap fails for zero width or height */
  792. pixmap = Tk_GetPixmap(display, d, width, height, depth);
  793.     }
  794.     if (win) {
  795. XGCValues values;
  796. gc = Tk_GetGC(win, 0, &values);
  797.     } else {
  798. gc = XCreateGC(display, pixmap, 0, NULL);
  799.     }
  800.     if (pixmap) {
  801. XCopyArea(display, d, pixmap, gc, x, y, width, height, 0, 0);
  802.     }
  803.     imagePtr = XCreateImage(display, NULL, depth, format, offset,
  804. (char*)TkMacOSXGetDrawablePort(pixmap),
  805. width, height, bitmap_pad, bytes_per_line);
  806.     /* Track Pixmap underlying the XImage in the unused obdata field *
  807.      * so that we can treat XImages coming from XGetImage specially. */
  808.     imagePtr->obdata = (XPointer) pixmap;
  809.     if (!win) {
  810. XFreeGC(display, gc);
  811.     }
  812. } else {
  813.     TkpDisplayWarning(
  814. "XGetImage: only ZPixmap types are implemented",
  815. "XGetImage Failure");
  816. }
  817.     }
  818.     return imagePtr;
  819. }
  820. /*
  821.  *----------------------------------------------------------------------
  822.  *
  823.  * DestroyImage --
  824.  *
  825.  * Destroys storage associated with an image.
  826.  *
  827.  * Results:
  828.  * None.
  829.  *
  830.  * Side effects:
  831.  * Deallocates the image.
  832.  *
  833.  *----------------------------------------------------------------------
  834.  */
  835. static int
  836. DestroyImage(
  837.     XImage *image)
  838. {
  839.     if (image) {
  840. if (image->obdata) {
  841.     Tk_FreePixmap((Display*) gMacDisplay, (Pixmap) image->obdata);
  842. } else if (image->data) {
  843.     ckfree(image->data);
  844. }
  845. ckfree((char*) image);
  846.     }
  847.     return 0;
  848. }
  849. /*
  850.  *----------------------------------------------------------------------
  851.  *
  852.  * ImageGetPixel --
  853.  *
  854.  * Get a single pixel from an image.
  855.  *
  856.  * Results:
  857.  * Returns the 32 bit pixel value.
  858.  *
  859.  * Side effects:
  860.  * None.
  861.  *
  862.  *----------------------------------------------------------------------
  863.  */
  864. static unsigned long
  865. ImageGetPixel(
  866.     XImage *image,
  867.     int x,
  868.     int y)
  869. {
  870.     CGrafPtr destPort, savePort;
  871.     Boolean portChanged;
  872.     RGBColor cPix;
  873.     unsigned long r, g, b, c;
  874.     destPort = (CGrafPtr)image->data;
  875.     portChanged = QDSwapPort(destPort, &savePort);
  876.     GetCPixel(x, y, &cPix);
  877.     if (image->obdata) {
  878. /* Image from XGetImage, 16 bit color values */
  879. r = (cPix . red) >> 8;
  880. g = (cPix . green) >> 8;
  881. b = (cPix . blue) >> 8;
  882.     } else {
  883. r = cPix . red;
  884. g = cPix . green;
  885. b = cPix . blue;
  886.     }
  887.     c = (r<<16)|(g<<8)|(b);
  888.     if (portChanged) {
  889. QDSwapPort(savePort, NULL);
  890.     }
  891.     return c;
  892. }
  893. /*
  894.  *----------------------------------------------------------------------
  895.  *
  896.  * PutPixel --
  897.  *
  898.  * Set a single pixel in an image.
  899.  *
  900.  * Results:
  901.  * None.
  902.  *
  903.  * Side effects:
  904.  * None.
  905.  *
  906.  *----------------------------------------------------------------------
  907.  */
  908. static int
  909. PutPixel(
  910.     XImage *image,
  911.     int x,
  912.     int y,
  913.     unsigned long pixel)
  914. {
  915.     CGrafPtr destPort, savePort;
  916.     Boolean portChanged;
  917.     RGBColor cPix;
  918.     unsigned long r, g, b;
  919.     destPort = (CGrafPtr)image->data;
  920.     portChanged = QDSwapPort(destPort, &savePort);
  921.     r  = (pixel & image->red_mask)>>16;
  922.     g  = (pixel & image->green_mask)>>8;
  923.     b  = (pixel & image->blue_mask);
  924.     if (image->obdata) {
  925. /* Image from XGetImage, 16 bit color values */
  926. cPix . red = r << 8;
  927. cPix . green = g << 8;
  928. cPix . blue = b << 8;
  929.     } else {
  930. cPix . red = r;
  931. cPix . green = g;
  932. cPix . blue = b;
  933.     }
  934.     SetCPixel(x, y, &cPix);
  935.     if (portChanged) {
  936. QDSwapPort(savePort, NULL);
  937.     }
  938.     return 0;
  939. }
  940. #if 0
  941. static XImage *
  942. SubImage(
  943.     XImage *image,
  944.     int x,
  945.     int y,
  946.     unsigned int width,
  947.     unsigned int height)
  948. {
  949.     Debugger();
  950.     return NULL;
  951. }
  952. static int
  953. AddPixel(
  954.     XImage *image,
  955.     long value)
  956. {
  957.     Debugger();
  958.     return 0;
  959. }
  960. #endif
  961. /*
  962.  *----------------------------------------------------------------------
  963.  *
  964.  * XChangeWindowAttributes, XSetWindowBackground,
  965.  * XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap,
  966.  * XSetWindowBorderWidth, XSetWindowColormap
  967.  *
  968.  * These functions are all no-ops. They all have equivilent
  969.  * Tk calls that should always be used instead.
  970.  *
  971.  * Results:
  972.  * None.
  973.  *
  974.  * Side effects:
  975.  * None.
  976.  *
  977.  *----------------------------------------------------------------------
  978.  */
  979. void
  980. XChangeWindowAttributes(
  981.     Display* display,
  982.     Window w,
  983.     unsigned long value_mask,
  984.     XSetWindowAttributes* attributes)
  985. {
  986. }
  987. void
  988. XSetWindowBackground(
  989. Display *display,
  990. Window window,
  991. unsigned long value)
  992. {
  993. }
  994. void
  995. XSetWindowBackgroundPixmap(
  996.     Display* display,
  997.     Window w,
  998.     Pixmap background_pixmap)
  999. {
  1000. }
  1001. void
  1002. XSetWindowBorder(
  1003.     Display* display,
  1004.     Window w,
  1005.     unsigned long border_pixel)
  1006. {
  1007. }
  1008. void
  1009. XSetWindowBorderPixmap(
  1010.     Display* display,
  1011.     Window w,
  1012.     Pixmap border_pixmap)
  1013. {
  1014. }
  1015. void
  1016. XSetWindowBorderWidth(
  1017.     Display* display,
  1018.     Window w,
  1019.     unsigned int width)
  1020. {
  1021. }
  1022. void
  1023. XSetWindowColormap(
  1024.     Display* display,
  1025.     Window w,
  1026.     Colormap colormap)
  1027. {
  1028.     Debugger();
  1029. }
  1030. Status
  1031. XStringListToTextProperty(
  1032.     char** list,
  1033.     int count,
  1034.     XTextProperty* text_prop_return)
  1035. {
  1036.     Debugger();
  1037.     return (Status) 0;
  1038. }
  1039. void
  1040. XSetWMClientMachine(
  1041.     Display* display,
  1042.     Window w,
  1043.     XTextProperty* text_prop)
  1044. {
  1045.     Debugger();
  1046. }
  1047. XIC
  1048. XCreateIC(
  1049.     void)
  1050. {
  1051.     Debugger();
  1052.     return (XIC) 0;
  1053. }
  1054. /*
  1055.  *----------------------------------------------------------------------
  1056.  *
  1057.  * TkGetDefaultScreenName --
  1058.  *
  1059.  * Returns the name of the screen that Tk should use during
  1060.  * initialization.
  1061.  *
  1062.  * Results:
  1063.  * Returns a statically allocated string.
  1064.  *
  1065.  * Side effects:
  1066.  * None.
  1067.  *
  1068.  *----------------------------------------------------------------------
  1069.  */
  1070. CONST char *
  1071. TkGetDefaultScreenName(
  1072.     Tcl_Interp *interp, /* Not used. */
  1073.     CONST char *screenName) /* If NULL, use default string. */
  1074. {
  1075. #if 0
  1076.     if ((screenName == NULL) || (screenName[0] == '')) {
  1077. screenName = macScreenName;
  1078.     }
  1079.     return screenName;
  1080. #endif
  1081.     return macScreenName;
  1082. }
  1083. #if 0
  1084. /*
  1085.  *----------------------------------------------------------------------
  1086.  *
  1087.  * Tk_GetUserInactiveTime --
  1088.  *
  1089.  * Return the number of milliseconds the user was inactive.
  1090.  *
  1091.  * Results:
  1092.  * The number of milliseconds the user has been inactive,
  1093.  * or -1 if querying the inactive time is not supported.
  1094.  *
  1095.  * Side effects:
  1096.  * None.
  1097.  *----------------------------------------------------------------------
  1098.  */
  1099. long
  1100. Tk_GetUserInactiveTime(Display *dpy)
  1101. {
  1102.     io_registry_entry_t regEntry;
  1103.     CFMutableDictionaryRef props = NULL;
  1104.     CFTypeRef timeObj;
  1105.     long ret = -1l;
  1106.     uint64_t time;
  1107.     regEntry = IOServiceGetMatchingService(kIOMasterPortDefault,
  1108.     IOServiceMatching("IOHIDSystem"));
  1109.     if (regEntry == 0) {
  1110. return -1l;
  1111.     }
  1112.     IOReturn result = IORegistryEntryCreateCFProperties(regEntry, &props,
  1113.     kCFAllocatorDefault, 0);
  1114.     IOObjectRelease(regEntry);
  1115.     if (result != KERN_SUCCESS || props == NULL) {
  1116. return -1l;
  1117.     }
  1118.     timeObj = CFDictionaryGetValue(props, CFSTR("HIDIdleTime"));
  1119.     if (timeObj) {
  1120. CFTypeID type = CFGetTypeID(timeObj);
  1121. if (type == CFDataGetTypeID()) { /* Jaguar */
  1122.     CFDataGetBytes((CFDataRef) timeObj,
  1123.     CFRangeMake(0, sizeof(time)), (UInt8 *) &time);
  1124.     /* Convert nanoseconds to milliseconds. */
  1125.     /* ret /= kMillisecondScale; */
  1126.     ret = (long)(time/kMillisecondScale);
  1127. } else if (type == CFNumberGetTypeID()) { /* Panther+ */
  1128.     CFNumberGetValue((CFNumberRef)timeObj,
  1129.     kCFNumberSInt64Type, &time);
  1130.     /* Convert nanoseconds to milliseconds. */
  1131.     /* ret /= kMillisecondScale; */
  1132.     ret = (long)(time/kMillisecondScale);
  1133. } else {
  1134.     ret = -1l;
  1135. }
  1136.     }
  1137.     /* Cleanup */
  1138.     CFRelease(props);
  1139.     return ret;
  1140. }
  1141. /*
  1142.  *----------------------------------------------------------------------
  1143.  *
  1144.  * Tk_ResetUserInactiveTime --
  1145.  *
  1146.  * Reset the user inactivity timer
  1147.  *
  1148.  * Results:
  1149.  * none
  1150.  *
  1151.  * Side effects:
  1152.  * The user inactivity timer of the underlaying windowing system
  1153.  * is reset to zero.
  1154.  *
  1155.  *----------------------------------------------------------------------
  1156.  */
  1157. void
  1158. Tk_ResetUserInactiveTime(Display *dpy)
  1159. {
  1160.     UpdateSystemActivity(OverallAct);
  1161. }
  1162. #endif