MC Return
2015-Apr-13 17:10 UTC
[compiz] Accessibility: mouse guides for Compiz, and forthcoming contributions
Hey Luca, I forgot one important thing in my review: When you manipulate global OpenGL states you need to set them back to what they were before after painting - in the ruler-drawing-case you change the glBlendFunc, but also glLineWidth without restoring them - drawGuides () could look something like this (with added only on output with pointer option): void ShowmouseScreen::drawGuides (const GLMatrix &transform) { unsigned short *color = optionGetGuideColor (); const int x = mMousePos.x (); const int y = mMousePos.y (); const float xf = (float)x; const float yf = (float)y; const int thickness = optionGetGuideThickness (); const float r = (float)optionGetGuideEmptyRadius (); CompRect workArea; const bool restrictGuidesToOutputWithPointer = optionGetRestrictGuidesToOutputWithPointer (); if (restrictGuidesToOutputWithPointer) workArea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (x, y)); else workArea = CompRect (0, 0, screen->width (), screen->height ()); const int workAreaX = workArea.x (); const int workAreaY = workArea.y (); const int workAreaWidth = workArea.width (); const int workAreaHeight = workArea.height (); const int workAreaXPlusWidth = workAreaX + workAreaWidth; const int workAreaYPlusHeight = workAreaY + workAreaHeight; /* If the thickness is zero we don't have to draw, but we should * still mark the region where the guides should be as damaged -- * this is useful when thickness has just been changed. */ if (thickness > 0) { glLineWidth ((GLfloat)thickness); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* we push in any case as we are going to change the blend function */ #ifndef USE_GLES glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LINE_BIT); #endif if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (restrictGuidesToOutputWithPointer) { if (yf - r >= (GLfloat)workAreaY) drawLine (transform, xf, (GLfloat)workAreaY, xf, yf - r, color); if (yf + r <= (GLfloat)workAreaYPlusHeight) drawLine (transform, xf, yf + r, xf, (GLfloat)workAreaYPlusHeight, color); if (xf - r >= (GLfloat)workAreaX) drawLine (transform, (GLfloat)workAreaX, yf, xf - r, yf, color); if (xf + r <= (GLfloat)workAreaXPlusWidth) drawLine (transform, xf + r, yf, (GLfloat)workAreaXPlusWidth, yf, color); } else { drawLine (transform, xf, (GLfloat)workAreaY, xf, yf - r, color); drawLine (transform, xf, yf + r, xf, (GLfloat)workAreaYPlusHeight, color); drawLine (transform, (GLfloat)workAreaX, yf, xf - r, yf, color); drawLine (transform, xf + r, yf, (GLfloat)workAreaXPlusWidth, yf, color); } /* we changed the blend function in any way here */ #ifndef USE_GLES glPopAttrib (); // restore line width and glBlendFunc/GL_BLEND #else if (!glBlendEnabled) glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glLineWidth (1.0f); #endif } cScreen->damageRegion (CompRegion (workAreaX, y - thickness / 2 - 1, workAreaXPlusWidth, thickness + 1)); cScreen->damageRegion (CompRegion (x - thickness / 2 - 1, workAreaY, thickness + 1, workAreaYPlusHeight)); } Maybe this saves you some work. Greetinx, MC Return -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.freedesktop.org/archives/compiz/attachments/20150413/5c78c2e1/attachment.html>