Back to index

lightning-sunbird  0.9+nobinonly
nsXUtils.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is mozilla.org code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #include "nsXUtils.h"
00039 
00040 #include <unistd.h>
00041 #include <string.h>
00042 
00043 #ifdef NEED_USLEEP_PROTOTYPE
00044 extern "C" int usleep(unsigned int);
00045 #endif
00046 #if defined(__QNX__)
00047 #define usleep(s)    sleep(s)
00048 #endif
00049 
00051 /* static */ void
00052 nsXUtils::XFlashWindow(Display *       aDisplay,
00053                        Window          aWindow,
00054                        unsigned int    aTimes,
00055                        unsigned long   aInterval,
00056                        XRectangle *    aArea)
00057 {
00058   Window       root_window = 0;
00059   Window       child_window = 0;
00060   GC           gc;
00061   int          x;
00062   int          y;
00063   unsigned int width;
00064   unsigned int height;
00065   unsigned int border_width;
00066   unsigned int depth;
00067   int          root_x;
00068   int          root_y;
00069   unsigned int i;
00070   XGCValues    gcv;
00071   
00072   XGetGeometry(aDisplay,
00073                aWindow,
00074                &root_window,
00075                &x,
00076                &y,
00077                &width,
00078                &height,
00079                &border_width,
00080                &depth);
00081   
00082   XTranslateCoordinates(aDisplay, 
00083                         aWindow,
00084                         root_window, 
00085                         0, 
00086                         0,
00087                         &root_x,
00088                         &root_y,
00089                         &child_window);
00090   
00091   memset(&gcv, 0, sizeof(XGCValues));
00092   
00093   gcv.function = GXxor;
00094   gcv.foreground = XWhitePixel(aDisplay, XDefaultScreen(aDisplay));
00095   gcv.subwindow_mode = IncludeInferiors;
00096   
00097   if (gcv.foreground == 0)
00098     gcv.foreground = 1;
00099   
00100   gc = XCreateGC(aDisplay,
00101                  root_window,
00102                  GCFunction | GCForeground | GCSubwindowMode, 
00103                  &gcv);
00104   
00105   XGrabServer(aDisplay);
00106 
00107   // If an area is given, use that.  Notice how out of whack coordinates
00108   // and dimentsions are not checked!!!
00109   if (aArea)
00110   {
00111        root_x += aArea->x;
00112        root_y += aArea->y;
00113 
00114        width = aArea->width;
00115        height = aArea->height;
00116   }
00117 
00118   // Need to do this twice so that the XOR effect can replace 
00119   // the original window contents.
00120   for (i = 0; i < aTimes * 2; i++)
00121   {
00122        XFillRectangle(aDisplay,
00123                                root_window,
00124                                gc,
00125                                root_x,
00126                                root_y,
00127                                width,
00128                                height);
00129        
00130        XSync(aDisplay, False);
00131        
00132        usleep(aInterval);
00133   }
00134   
00135   
00136   XFreeGC(aDisplay, gc);  
00137   
00138   XUngrabServer(aDisplay);
00139 }
00140 /*****************************************************************/