diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index 00bf375..5debebd 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1515,7 +1515,7 @@ BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top, INT width, INT h
 {
     BOOL result;
 
-    X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
+    X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, TRUE );
     result = BITBLT_InternalStretchBlt( physDev, left, top, width, height, NULL, 0, 0, 0, 0, rop );
     X11DRV_UnlockDIBSection( physDev, TRUE );
     return result;
@@ -1643,7 +1643,7 @@ BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                     INT xSrc, INT ySrc, DWORD rop )
 {
     BOOL result = FALSE;
-    INT sSrc, sDst;
+    INT sSrc = DIB_Status_None, sDst = DIB_Status_None;
     RECT visRectDst, visRectSrc;
 
     if (((rop >> 16) & 0x55) == ((rop >> 17) & 0x55)) {
@@ -1653,11 +1653,12 @@ BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
        * which may avoid a copy in some situations */
     }
 
-    sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None, FALSE );
-    if (physDevDst != physDevSrc)
-        sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None, FALSE );
+    if (physDevDst && physDevDst->bitmap)
+      sDst = X11DRV_DIB_Lock( physDevDst->bitmap, DIB_Status_None, FALSE );
+    if (physDevSrc && physDevSrc->bitmap && physDevDst != physDevSrc)
+      sSrc = X11DRV_DIB_Lock( physDevSrc->bitmap, DIB_Status_None, FALSE );
     else
-        sSrc = sDst;
+      sSrc = sDst;
 
     if ((sSrc == DIB_Status_AppMod) && (rop == SRCCOPY) &&
         (physDevSrc->depth == physDevDst->depth))
@@ -1723,9 +1724,10 @@ BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                                         physDevSrc, xSrc, ySrc, width, height, rop );
 
 END:
-    if (physDevDst != physDevSrc)
-      X11DRV_UnlockDIBSection( physDevSrc, FALSE );
-    X11DRV_UnlockDIBSection( physDevDst, TRUE );
+    if (physDevSrc && physDevSrc->bitmap && physDevDst != physDevSrc)
+      X11DRV_DIB_Unlock( physDevSrc->bitmap, FALSE );
+    if (physDevDst && physDevDst->bitmap)
+      X11DRV_DIB_Unlock( physDevDst->bitmap, TRUE );
 
     return result;
 }
@@ -1741,9 +1743,9 @@ BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
 {
     BOOL result;
 
-    X11DRV_LockDIBSection( physDevDst, DIB_Status_GdiMod, FALSE );
+    X11DRV_LockDIBSection( physDevDst, DIB_Status_GdiMod, TRUE );
     if (physDevDst != physDevSrc)
-      X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE );
+      X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod, TRUE );
 
     result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, widthDst, heightDst,
                                         physDevSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index c921034..bd923c2 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -98,8 +98,6 @@ enum Rle_EscapeCodes
 
 
 static INT X11DRV_DIB_Coerce(X_PHYSBITMAP *,INT,BOOL);
-static INT X11DRV_DIB_Lock(X_PHYSBITMAP *,INT,BOOL);
-static void X11DRV_DIB_Unlock(X_PHYSBITMAP *,BOOL);
 
 /* 
   Some of the following helper functions are duplicated in
@@ -3787,7 +3785,7 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO
     if (!cx || !cy) return lines;
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     X11DRV_SetupGCForText( physDev );  /* To have the correct colors */
     wine_tsx11_lock();
@@ -4413,7 +4411,7 @@ static INT X11DRV_DIB_Coerce(X_PHYSBITMAP *physBitmap, INT req, BOOL lossy)
 /***********************************************************************
  *           X11DRV_DIB_Lock
  */
-static INT X11DRV_DIB_Lock(X_PHYSBITMAP *physBitmap, INT req, BOOL lossy)
+INT X11DRV_DIB_Lock(X_PHYSBITMAP *physBitmap, INT req, BOOL lossy)
 {
     INT ret = DIB_Status_None;
 
@@ -4429,7 +4427,7 @@ static INT X11DRV_DIB_Lock(X_PHYSBITMAP *physBitmap, INT req, BOOL lossy)
 /***********************************************************************
  *           X11DRV_DIB_Unlock
  */
-static void X11DRV_DIB_Unlock(X_PHYSBITMAP *physBitmap, BOOL commit)
+void X11DRV_DIB_Unlock(X_PHYSBITMAP *physBitmap, BOOL commit)
 {
     if (!physBitmap->image) return;  /* not a DIB section */
     switch (physBitmap->status)
@@ -4496,10 +4494,17 @@ INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
 /***********************************************************************
  *           X11DRV_LockDIBSection
  */
-INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL lossy)
+HBITMAP X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev, INT req, BOOL force)
 {
-    if (!physDev || !physDev->bitmap) return DIB_Status_None;
-    return X11DRV_DIB_Lock(physDev->bitmap, req, lossy);
+    if (!physDev || !physDev->bitmap) return NULL;
+
+    if (force)
+        X11DRV_DIB_Lock(physDev->bitmap, req, FALSE);
+    else
+        if (X11DRV_DIB_Lock(physDev->bitmap, DIB_Status_None, FALSE) != req)
+            return NULL;
+
+    return physDev->bitmap->hbitmap;
 }
 
 /***********************************************************************
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index 638356b..fcbda87 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -333,7 +333,7 @@ X11DRV_LineTo( X11DRV_PDEVICE *physDev, INT x, INT y )
 
     if (X11DRV_SetupGCForPen( physDev )) {
 	/* Update the pixmap from the DIB section */
-	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
         GetCurrentPositionEx( physDev->hdc, &pt[0] );
         pt[1].x = x;
@@ -429,7 +429,7 @@ X11DRV_DrawArc( X11DRV_PDEVICE *physDev, INT left, INT top, INT right,
     if (idiff_angle <= 0) idiff_angle += 360 * 64;
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
       /* Fill arc with brush if Chord() or Pie() */
 
@@ -589,7 +589,7 @@ X11DRV_Ellipse( X11DRV_PDEVICE *physDev, INT left, INT top, INT right, INT botto
     physDev->pen.width = width;
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     if (X11DRV_SetupGCForBrush( physDev ))
     {
@@ -658,7 +658,7 @@ X11DRV_Rectangle(X11DRV_PDEVICE *physDev, INT left, INT top, INT right, INT bott
         physDev->pen.linejoin = PS_JOIN_MITER;
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     if ((rc.right > rc.left + width) && (rc.bottom > rc.top + width))
     {
@@ -745,7 +745,7 @@ X11DRV_RoundRect( X11DRV_PDEVICE *physDev, INT left, INT top, INT right,
     physDev->pen.endcap = PS_ENDCAP_SQUARE;
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     wine_tsx11_lock();
     if (X11DRV_SetupGCForBrush( physDev ))
@@ -914,7 +914,7 @@ X11DRV_SetPixel( X11DRV_PDEVICE *physDev, INT x, INT y, COLORREF color )
     pixel = X11DRV_PALETTE_ToPhysical( physDev, color );
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     /* inefficient but simple... */
     wine_tsx11_lock();
@@ -948,7 +948,7 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y )
     LPtoDP( physDev->hdc, &pt, 1 );
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     wine_tsx11_lock();
     if (memdc)
@@ -998,7 +998,7 @@ X11DRV_PaintRgn( X11DRV_PDEVICE *physDev, HRGN hrgn )
             rect[i].y += physDev->dc_rect.top;
         }
 
-        X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+        X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
         wine_tsx11_lock();
         XFillRectangles( gdi_display, physDev->drawable, physDev->gc, rect, data->rdh.nCount );
         wine_tsx11_unlock();
@@ -1032,7 +1032,7 @@ X11DRV_Polyline( X11DRV_PDEVICE *physDev, const POINT* pt, INT count )
 
     if (X11DRV_SetupGCForPen ( physDev ))
     {
-        X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+        X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
         wine_tsx11_lock();
         XDrawLines( gdi_display, physDev->drawable, physDev->gc,
                     points, count, CoordModeOrigin );
@@ -1070,7 +1070,7 @@ X11DRV_Polygon( X11DRV_PDEVICE *physDev, const POINT* pt, INT count )
     points[count] = points[0];
 
     /* Update the pixmap from the DIB section */
-    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
     if (X11DRV_SetupGCForBrush( physDev ))
     {
@@ -1121,7 +1121,7 @@ X11DRV_PolyPolygon( X11DRV_PDEVICE *physDev, const POINT* pt, const INT* counts,
 	XPoint *points;
 
 	/* Update the pixmap from the DIB section */
-	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
 	for (i = 0; i < polygons; i++) if (counts[i] > max) max = counts[i];
         if (!(points = HeapAlloc( GetProcessHeap(), 0, sizeof(XPoint) * (max+1) )))
@@ -1167,7 +1167,7 @@ X11DRV_PolyPolyline( X11DRV_PDEVICE *physDev, const POINT* pt, const DWORD* coun
         XPoint *points;
 
 	/* Update the pixmap from the DIB section */
-    	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+    	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
         for (i = 0; i < polylines; i++) if (counts[i] > max) max = counts[i];
         if (!(points = HeapAlloc( GetProcessHeap(), 0, sizeof(XPoint) * max )))
@@ -1306,7 +1306,7 @@ X11DRV_ExtFloodFill( X11DRV_PDEVICE *physDev, INT x, INT y, COLORREF color,
     if (X11DRV_SetupGCForBrush( physDev ))
     {
 	/* Update the pixmap from the DIB section */
-	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, FALSE);
+	X11DRV_LockDIBSection(physDev, DIB_Status_GdiMod, TRUE);
 
           /* ROP mode is always GXcopy for flood-fill */
         wine_tsx11_lock();
diff --git a/dlls/winex11.drv/text.c b/dlls/winex11.drv/text.c
index 57e5cd8..c51aa25 100644
--- a/dlls/winex11.drv/text.c
+++ b/dlls/winex11.drv/text.c
@@ -76,7 +76,7 @@ X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
 
     if (flags & ETO_OPAQUE)
     {
-        X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
+        X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, TRUE );
         dibUpdateFlag = TRUE;
         wine_tsx11_lock();
         XSetForeground( gdi_display, physDev->gc, physDev->backgroundPixel );
@@ -106,7 +106,7 @@ X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
 
     if (!dibUpdateFlag)
     {
-        X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
+        X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, TRUE );
         dibUpdateFlag = TRUE;
     }
 
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 8de2e25..6ab20c4 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -418,8 +418,10 @@ extern const dib_conversions dib_normal, dib_src_byteswap, dib_dst_byteswap;
 
 extern INT X11DRV_DIB_MaskToShift(DWORD mask);
 extern INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
-extern INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
+extern HBITMAP X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev,BOOL,BOOL);
 extern void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev,BOOL);
+extern INT X11DRV_DIB_Lock(X_PHYSBITMAP *,INT,BOOL);
+extern void X11DRV_DIB_Unlock(X_PHYSBITMAP *,BOOL);
 
 extern void X11DRV_DIB_DeleteDIBSection(X_PHYSBITMAP *physBitmap, DIBSECTION *dib);
 extern void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index e03540e..3c0b5b7 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1100,7 +1100,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
     XChangeGC( gdi_display, physDev->gc, GCFunction | GCBackground | GCFillStyle, &xgcval );
     wine_tsx11_unlock();
 
-    X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
+    X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, TRUE );
 
     if(physDev->depth == 1) {
         if((physDev->textPixel & 0xffffff) == 0) {
