author Jonathan Watt <jwatt@jwatt.org>
Tue, 19 Apr 2016 21:51:25 +0100
changeset 332041 31b3a03707447d000981a6c1aa2dc81697458fc8
parent 322298 f37626eba5c683d42aaa510b55ad7e24f490063d
child 345097 803d0028289a74df1be4220a61dd88802a3563a9
permissions -rw-r--r--
Bug 1265953, part 2 - Convert much of the rest of the widget code from nsAutoPtr to UniquePtr. r=mstange

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef __mozilla_widget_nsShmImage_h__
#define __mozilla_widget_nsShmImage_h__

#if defined(MOZ_X11)


#include "mozilla/gfx/2D.h"
#include "nsIWidget.h"
#include "Units.h"

#include <X11/Xlib.h>
#include <X11/extensions/XShm.h>

class nsShmImage {
  // bug 1168843, compositor thread may create shared memory instances that are destroyed by main thread on shutdown, so this must use thread-safe RC to avoid hitting assertion

  static bool UseShm();

    CreateDrawTarget(const mozilla::LayoutDeviceIntRegion& aRegion);

  void Put(const mozilla::LayoutDeviceIntRegion& aRegion);

  nsShmImage(Display* aDisplay,
             Drawable aWindow,
             Visual* aVisual,
             unsigned int aDepth);


  bool InitExtension();

  bool CreateShmSegment();
  void DestroyShmSegment();

  bool CreateImage(const mozilla::gfx::IntSize& aSize);
  void DestroyImage();

  static Bool FindEvent(Display* aDisplay, XEvent* aEvent, XPointer aArg);
  bool RequestWasProcessed();
  void WaitForRequest();
  void SendEvent();

  XImage*                      mImage;
  Display*                     mDisplay;
  Window                       mWindow;
  Visual*                      mVisual;
  unsigned int                 mDepth;
  XShmSegmentInfo              mInfo;
  mozilla::gfx::SurfaceFormat  mFormat;
  Pixmap                       mPixmap;
  GC                           mGC;
  unsigned long                mRequest;
  unsigned long                mPreviousRequestProcessed;