Import Tk 8.6.6 (as of svn r86089)
This commit is contained in:
265
unix/tkUnix.c
Normal file
265
unix/tkUnix.c
Normal file
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* tkUnix.c --
|
||||
*
|
||||
* This file contains procedures that are UNIX/X-specific, and will
|
||||
* probably have to be written differently for Windows or Macintosh
|
||||
* platforms.
|
||||
*
|
||||
* Copyright (c) 1995 Sun Microsystems, Inc.
|
||||
*
|
||||
* See the file "license.terms" for information on usage and redistribution of
|
||||
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
*/
|
||||
|
||||
#include "tkInt.h"
|
||||
#ifdef HAVE_XSS
|
||||
# include <X11/extensions/scrnsaver.h>
|
||||
# ifdef __APPLE__
|
||||
/* Support for weak-linked libXss. */
|
||||
# define HaveXSSLibrary() (XScreenSaverQueryInfo != NULL)
|
||||
# else
|
||||
/* Other platforms always link libXss. */
|
||||
# define HaveXSSLibrary() (1)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TkGetServerInfo --
|
||||
*
|
||||
* Given a window, this procedure returns information about the window
|
||||
* server for that window. This procedure provides the guts of the "winfo
|
||||
* server" command.
|
||||
*
|
||||
* Results:
|
||||
* Sets the interpreter result.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
TkGetServerInfo(
|
||||
Tcl_Interp *interp, /* The server information is returned in this
|
||||
* interpreter's result. */
|
||||
Tk_Window tkwin) /* Token for window; this selects a particular
|
||||
* display and server. */
|
||||
{
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf("X%dR%d %s %d",
|
||||
ProtocolVersion(Tk_Display(tkwin)),
|
||||
ProtocolRevision(Tk_Display(tkwin)),
|
||||
ServerVendor(Tk_Display(tkwin)),
|
||||
VendorRelease(Tk_Display(tkwin))));
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TkGetDefaultScreenName --
|
||||
*
|
||||
* Returns the name of the screen that Tk should use during
|
||||
* initialization.
|
||||
*
|
||||
* Results:
|
||||
* Returns the argument or a string that should not be freed by the
|
||||
* caller.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
const char *
|
||||
TkGetDefaultScreenName(
|
||||
Tcl_Interp *interp, /* Interp used to find environment
|
||||
* variables. */
|
||||
const char *screenName) /* Screen name from command line, or NULL. */
|
||||
{
|
||||
if ((screenName == NULL) || (screenName[0] == '\0')) {
|
||||
screenName = Tcl_GetVar2(interp, "env", "DISPLAY", TCL_GLOBAL_ONLY);
|
||||
}
|
||||
return screenName;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* Tk_UpdatePointer --
|
||||
*
|
||||
* Unused function in UNIX
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
Tk_UpdatePointer(
|
||||
Tk_Window tkwin, /* Window to which pointer event is reported.
|
||||
* May be NULL. */
|
||||
int x, int y, /* Pointer location in root coords. */
|
||||
int state) /* Modifier state mask. */
|
||||
{
|
||||
/*
|
||||
* This function intentionally left blank
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TkpBuildRegionFromAlphaData --
|
||||
*
|
||||
* Set up a rectangle of the given region based on the supplied alpha
|
||||
* data.
|
||||
*
|
||||
* Results:
|
||||
* None
|
||||
*
|
||||
* Side effects:
|
||||
* The region is updated, with extra pixels added to it.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
TkpBuildRegionFromAlphaData(
|
||||
TkRegion region, /* Region to be updated. */
|
||||
unsigned x, unsigned y, /* Where in region to update. */
|
||||
unsigned width, unsigned height,
|
||||
/* Size of rectangle to update. */
|
||||
unsigned char *dataPtr, /* Data to read from. */
|
||||
unsigned pixelStride, /* Num bytes from one piece of alpha data to
|
||||
* the next in the line. */
|
||||
unsigned lineStride) /* Num bytes from one line of alpha data to
|
||||
* the next line. */
|
||||
{
|
||||
unsigned char *lineDataPtr;
|
||||
unsigned int x1, y1, end;
|
||||
XRectangle rect;
|
||||
|
||||
for (y1 = 0; y1 < height; y1++) {
|
||||
lineDataPtr = dataPtr;
|
||||
for (x1 = 0; x1 < width; x1 = end) {
|
||||
/*
|
||||
* Search for first non-transparent pixel.
|
||||
*/
|
||||
|
||||
while ((x1 < width) && !*lineDataPtr) {
|
||||
x1++;
|
||||
lineDataPtr += pixelStride;
|
||||
}
|
||||
end = x1;
|
||||
|
||||
/*
|
||||
* Search for first transparent pixel.
|
||||
*/
|
||||
|
||||
while ((end < width) && *lineDataPtr) {
|
||||
end++;
|
||||
lineDataPtr += pixelStride;
|
||||
}
|
||||
if (end > x1) {
|
||||
rect.x = x + x1;
|
||||
rect.y = y + y1;
|
||||
rect.width = end - x1;
|
||||
rect.height = 1;
|
||||
TkUnionRectWithRegion(&rect, region, region);
|
||||
}
|
||||
}
|
||||
dataPtr += lineStride;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* Tk_GetUserInactiveTime --
|
||||
*
|
||||
* Return the number of milliseconds the user was inactive.
|
||||
*
|
||||
* Results:
|
||||
* The number of milliseconds since the user's latest interaction with
|
||||
* the system on the given display, or -1 if the XScreenSaver extension
|
||||
* is not supported by the client libraries or the X server
|
||||
* implementation.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
long
|
||||
Tk_GetUserInactiveTime(
|
||||
Display *dpy) /* The display for which to query the inactive
|
||||
* time. */
|
||||
{
|
||||
long inactiveTime = -1;
|
||||
#ifdef HAVE_XSS
|
||||
int eventBase, errorBase, major, minor;
|
||||
|
||||
/*
|
||||
* Calling XScreenSaverQueryVersion seems to be needed to prevent a crash
|
||||
* on some buggy versions of XFree86.
|
||||
*/
|
||||
|
||||
if (HaveXSSLibrary()
|
||||
&& XScreenSaverQueryExtension(dpy, &eventBase, &errorBase)
|
||||
&& XScreenSaverQueryVersion(dpy, &major, &minor)) {
|
||||
XScreenSaverInfo *info = XScreenSaverAllocInfo();
|
||||
|
||||
if (info == NULL) {
|
||||
/*
|
||||
* We are out of memory.
|
||||
*/
|
||||
|
||||
Tcl_Panic("Out of memory: XScreenSaverAllocInfo failed in Tk_GetUserInactiveTime");
|
||||
}
|
||||
if (XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info)) {
|
||||
inactiveTime = info->idle;
|
||||
}
|
||||
XFree(info);
|
||||
}
|
||||
#endif /* HAVE_XSS */
|
||||
return inactiveTime;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* Tk_ResetUserInactiveTime --
|
||||
*
|
||||
* Reset the user inactivity timer
|
||||
*
|
||||
* Results:
|
||||
* none
|
||||
*
|
||||
* Side effects:
|
||||
* The user inactivity timer of the underlaying windowing system is reset
|
||||
* to zero.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
Tk_ResetUserInactiveTime(
|
||||
Display *dpy)
|
||||
{
|
||||
XResetScreenSaver(dpy);
|
||||
}
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: c
|
||||
* c-basic-offset: 4
|
||||
* fill-column: 78
|
||||
* End:
|
||||
*/
|
||||
Reference in New Issue
Block a user