summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mousetrails.c201
-rw-r--r--mousetrails.xml.in19
2 files changed, 142 insertions, 78 deletions
diff --git a/mousetrails.c b/mousetrails.c
index 2907cff..15e3695 100644
--- a/mousetrails.c
+++ b/mousetrails.c
@@ -41,18 +41,18 @@
mousetrailsScreen *ss = GET_MOUSETRAILS_SCREEN (s, GET_MOUSETRAILS_DISPLAY (s->display))
// in theory the texture array size should be >= trail size
-#define TEXTURES_SIZE 64
+#define TEXTURES_SIZE 51
int mousetrailsCursorUpdate (CompScreen *s);
typedef struct _Particle
{
- float life; // particle life
+ //float life; // particle life
float fade; // fade speed
- float width; // particle width
- float height; // particle height
- float w_mod; // particle size modification during life
- float h_mod; // particle size modification during life
+ float width; // particle width
+ float height; // particle height
+ float w_mod; // particle size modification during life
+ float h_mod; // particle size modification during life
float r; // red value
float g; // green value
float b; // blue value
@@ -60,7 +60,9 @@ typedef struct _Particle
float x; // X position
float y; // Y position
float z; // Z position
- int cursorIndex; // array index of cursor serial number
+ float xd;
+ float yd;
+ int cursorIndex; // array index of cursor serial number
} Particle;
typedef struct _MouseCursor
@@ -89,6 +91,7 @@ typedef struct _ParticleSystem
int lastGen;
float initialAlpha;
int sizeFactor;
+ Bool useMousepoll;
// for random colors
int colorcounter;
@@ -101,6 +104,7 @@ typedef struct _ParticleSystem
int colorrate;
int skip;
int atSkip;
+ int speed;
// Cursor data
MouseCursor cursors[TEXTURES_SIZE]; // rolling array of cursors grabbed from x
@@ -126,7 +130,7 @@ typedef struct _mousetrailsDisplay
{
int screenPrivateIndex;
- //MousePollFunc *mpFunc;
+ MousePollFunc *mpFunc;
}
mousetrailsDisplay;
@@ -139,7 +143,7 @@ typedef struct _mousetrailsScreen
ParticleSystem *ps;
- //PositionPollingHandle pollHandle;
+ PositionPollingHandle pollHandle;
PreparePaintScreenProc preparePaintScreen;
DonePaintScreenProc donePaintScreen;
@@ -153,7 +157,8 @@ initParticles (int numParticles, ParticleSystem * ps)
if (ps->particles)
free(ps->particles);
- ps->particles = calloc(numParticles, sizeof(Particle));
+ //ps->particles = calloc(numParticles, sizeof(Particle));
+ ps->particles = calloc(TEXTURES_SIZE, sizeof(Particle));
ps->numParticles = numParticles;
ps->numDisplayedParticles = 0;
@@ -169,6 +174,8 @@ initParticles (int numParticles, ParticleSystem * ps)
ps->y = 0;
ps->skip = 1;
ps->atSkip = 0;
+ ps->speed = 1;
+ ps->useMousepoll = 1;
ps->lastTextureFilled = -1;
ps->lastCursorIndex = 0;
@@ -184,8 +191,13 @@ initParticles (int numParticles, ParticleSystem * ps)
Particle *part = ps->particles;
int i;
- for (i = 0; i < numParticles; i++, part++)
- part->life = 0.0f;
+ for (i = 0; i < TEXTURES_SIZE; i++, part++){
+ part->a = 0.0f;
+ part->r = 0.0f;
+ part->g = 0.0f;
+ part->b = 0.0f;
+ }
+
for (i = 0; i < TEXTURES_SIZE; i++){
ps->cursors[i].cursor_serial = 0;
@@ -199,10 +211,13 @@ initParticles (int numParticles, ParticleSystem * ps)
}
+
static void
drawParticles (CompScreen * s, ParticleSystem * ps)
{
+ if (ps->numDisplayedParticles == 0) return;
+
glEnable(GL_BLEND);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnableClientState(GL_COLOR_ARRAY);
@@ -255,15 +270,16 @@ drawParticles (CompScreen * s, ParticleSystem * ps)
int i;
for (i = 0; i < ps->numParticles; i++, part++)
{
- if (part->life > 0.0f)
+ //if (part->life > 0.0f)
+ if (part->fade > 0.001f)
{
numActive += 4;
float w = part->width / 2;
float h = part->height / 2;
- w += (w * part->w_mod) * (1- part->life);
- h += (h * part->h_mod) * (1- part->life);
+ w += (w * part->w_mod) * (1- part->a);
+ h += (h * part->h_mod) * (1- part->a);
vertices[0] = part->x - w;
vertices[1] = part->y - h;
@@ -290,7 +306,7 @@ drawParticles (CompScreen * s, ParticleSystem * ps)
colors[0] = part->r;
colors[1] = part->g;
colors[2] = part->b;
- colors[3] = part->life * part->a * ps->initialAlpha;
+ colors[3] = part->a;
memcpy (colors + 4, colors, colorSize);
memcpy (colors + 8, colors, colorSize);
memcpy (colors + 12, colors, colorSize);
@@ -332,21 +348,26 @@ updateParticles (ParticleSystem * ps, float time)
{
int i;
Particle *part;
- float speed = (time / 50.0);
+ float speed = (time / 5000.0);
ps->active = FALSE;
part = ps->particles;
+ int numDisplayedParticles = 0;
+
for (i = 0; i < ps->numParticles; i++, part++)
{
- if (part->life > 0.0f)
+ if (part->a > 0.001f)
{
- // modify life
- part->life -= part->fade * speed;
+ // modify opacity
+ part->a -= 50 * part->a * part->fade * speed;
ps->active = TRUE;
+
+ numDisplayedParticles++;
}
}
+ ps->numDisplayedParticles = numDisplayedParticles;
}
static void
@@ -366,13 +387,13 @@ finiParticles (ParticleSystem * ps)
}
-// only here for XQueryPointer - why reinitialize pointless variables every time?
+/*
Window root_return;
Window child_return;
int rootX, rootY;
int winX, winY;
unsigned int maskReturn;
-Bool status;
+Bool status;*/
static void
genNewParticles(CompScreen *s,
@@ -388,11 +409,11 @@ genNewParticles(CompScreen *s,
MOUSETRAILS_SCREEN(s);
Bool rColor = mousetrailsGetRandom (s);
- float life = mousetrailsGetLife (s);
+ //float life = mousetrailsGetLife (s);
int sizeFactor = ps->sizeFactor;
float threshold = ps->threshold;
- float lifeNeg = 1 - life;
- float fadeExtra = 0.15f * (1.01 - life);
+ //float lifeNeg = 1 - life;
+ //float fadeExtra = 0.05f * (1.01 - life);
int cursorIndex = 0;
unsigned short *c = mousetrailsGetColor (s);
@@ -400,7 +421,7 @@ genNewParticles(CompScreen *s,
float colr1 = (float)c[0] / 0xffff;
float colg1 = (float)c[1] / 0xffff;
float colb1 = (float)c[2] / 0xffff;
- float cola = (float)c[3] / 0xffff;
+ //float cola = (float)c[3] / 0xffff;
float partw = ps->cursors[ps->lastCursorIndex].width;
float parth = ps->cursors[ps->lastCursorIndex].height;
@@ -408,38 +429,58 @@ genNewParticles(CompScreen *s,
float partoffw = ps->cursors[ps->lastCursorIndex].xhot;
float partoffh = ps->cursors[ps->lastCursorIndex].yhot;
-
- /*
- XFixesCursorImage *ci = XFixesGetCursorImage(s->display->display);
- ss->ps->x = ci->x;
- ss->ps->y = ci->y;
- XFree (ci);*/
+ int livex;
+ int livey;
// get x cursor position (rootX and rootY)
- status = XQueryPointer (s->display->display, s->root,
+ /*if (!ss->ps->useMousepoll){
+ status = XQueryPointer (s->display->display, s->root,
&root_return, &child_return,
&rootX, &rootY, &winX, &winY, &maskReturn);
- int livex = rootX;
- int livey = rootY;
+ livex = rootX;
+ livey = rootY;
+ }
+ else
+ {*/
+ livex = ss->posX;
+ livey = ss->posY;
+ //}
+
int deltax = livex - ps->x;
int deltay = livey - ps->y;
int delta = deltax * deltax + deltay * deltay;
ss->ps->x = livex;
ss->ps->y = livey;
- if (delta < threshold * threshold) return;
+ //if (delta < threshold * threshold) return;
+ if (delta < 1 ) return;
int newx = (float)(ps->x + partw/2 - partoffw);
int newy = (float)(ps->y + parth/2 - partoffh);
- // possibly crashy
- /*if (mousetrailsGetNumParticles(s) != ps->numParticles){
- initParticles(mousetrailsGetNumParticles (s), ss->ps);
- }*/
Particle *part = ps->particles;
int i;
+ // possibly crashy
+ if (mousetrailsGetNumParticles(s) != ps->numParticles){
+ //initParticles(mousetrailsGetNumParticles (s), ss->ps);
+ ps->numParticles = mousetrailsGetNumParticles(s);
+ ps->lastGen = -1;
+ /*ps->slowdown = mousetrailsGetSlowdown (s);
+ ps->initialAlpha = mousetrailsGetAlpha (s) ;
+ ps->sizeFactor = mousetrailsGetSize (s) ;
+ ps->threshold = mousetrailsGetThreshold (s) ;
+ ps->colorrate = mousetrailsGetColorrate (s) ;*/
+ for (i = 0; i < ps->numParticles; i++, part++){
+ part->a = 0.0f;
+ part->r = 0.0f;
+ part->g = 0.0f;
+ part->b = 0.0f;
+ }
+ }
+
+
//if (delta > threshold * threshold) max_new = 1;
int nextGen = (ps->lastGen + 1) % ps->numParticles;
@@ -462,15 +503,17 @@ genNewParticles(CompScreen *s,
// set the cursor array index
part->cursorIndex = ps->lastCursorIndex = cursorIndex;
- // give gt new life
- part->life = 1.0f;
- part->fade = (sqrt(ps->slowdown-0.9)/50.0) * lifeNeg + fadeExtra;
+ part->fade = ps->slowdown / 10.0;
// set size
part->width = partw;
part->height = parth;
part->w_mod = part->h_mod = ((float)sizeFactor - 10.0) / 10.0;
+ // set direction
+ part->xd = newx - ps->lastx;
+ part->yd = newy - ps->lasty;
+
// set position
part->x = newx;
part->y = newy;
@@ -478,6 +521,7 @@ genNewParticles(CompScreen *s,
ps->lasty = newy;
part->z = 0.0;
+
if (rColor)
{
float value;
@@ -507,14 +551,17 @@ genNewParticles(CompScreen *s,
part->b = colb1;
}
// set transparancy
- part->a = cola;
+ //part->a = ps->initialAlpha;
+ float thresholdfactor = 1.0;
+ if (delta < ps->threshold) thresholdfactor = (float)delta / (float)ps->threshold;
+ part->a = ps->initialAlpha * thresholdfactor;
ps->active = TRUE;
- //max_new -= 1;
}
}
}
+// damageRegion() seems to cause blockiness or jitters on the background window when scrolling, like on a webpage
static void
damageRegion (CompScreen *s)
@@ -526,6 +573,8 @@ damageRegion (CompScreen *s)
MOUSETRAILS_SCREEN (s);
+ if (ss->ps->numDisplayedParticles == 0) return;
+
if (!ss->ps)
return;
@@ -538,16 +587,18 @@ damageRegion (CompScreen *s)
for (i = 0; i < ss->ps->numParticles; i++, p++)
{
- w = p->width / 2;
- h = p->height / 2;
+ if (p->a > 0.001f){
+ w = p->width / 2;
+ h = p->height / 2;
- w += (w * p->w_mod) * p->life;
- h += (h * p->h_mod) * p->life;
+ w += (w * p->w_mod) * p->a;
+ h += (h * p->h_mod) * p->a;
- x1 = MIN (x1, p->x - w);
- x2 = MAX (x2, p->x + w);
- y1 = MIN (y1, p->y - h);
- y2 = MAX (y2, p->y + h);
+ x1 = MIN (x1, p->x - w);
+ x2 = MAX (x2, p->x + w);
+ y1 = MIN (y1, p->y - h);
+ y2 = MAX (y2, p->y + h);
+ }
}
r.rects = &r.extents;
@@ -632,7 +683,7 @@ int mousetrailsCursorUpdate (CompScreen *s)
return fillTexture;
}
-/*
+
static void
positionUpdate (CompScreen *s,
int x,
@@ -643,7 +694,7 @@ positionUpdate (CompScreen *s,
ss->posX = x;
ss->posY = y;
}
-*/
+
static void
@@ -652,13 +703,15 @@ mousetrailsPreparePaintScreen (CompScreen *s,
{
MOUSETRAILS_SCREEN (s);
- //MOUSETRAILS_DISPLAY (s->display);
+ MOUSETRAILS_DISPLAY (s->display);
+
+ //Bool useMousepoll = mousetrailsGetMousepoll (s);
- /*if (ss->active && !ss->pollHandle)
+ if (ss->active && !ss->pollHandle/* && useMousepoll*/)
{
(*sd->mpFunc->getCurrentPosition) (s, &ss->posX, &ss->posY);
ss->pollHandle = (*sd->mpFunc->addPositionPolling) (s, positionUpdate);
- }*/
+ }
if (ss->active && !ss->ps)
{
@@ -679,6 +732,7 @@ mousetrailsPreparePaintScreen (CompScreen *s,
ss->ps->sizeFactor = mousetrailsGetSize (s) ;
ss->ps->skip = mousetrailsGetSkip (s) ;
ss->ps->blendMode = GL_ONE_MINUS_SRC_ALPHA;
+ //ss->ps->useMousepoll = mousetrailsGetMousepoll (s);
mousetrailsCursorUpdate(s);
@@ -705,16 +759,16 @@ static void
mousetrailsDonePaintScreen (CompScreen *s)
{
MOUSETRAILS_SCREEN (s);
- //MOUSETRAILS_DISPLAY (s->display);
+ MOUSETRAILS_DISPLAY (s->display);
if (ss->active || (ss->ps && ss->ps->active))
damageRegion (s);
- /*if (!ss->active && ss->pollHandle)
+ if (!ss->active && ss->pollHandle && ss->ps->useMousepoll)
{
(*sd->mpFunc->removePositionPolling) (s, ss->pollHandle);
ss->pollHandle = 0;
- }*/
+ }
if (!ss->active && ss->ps && !ss->ps->active)
{
@@ -745,9 +799,14 @@ mousetrailsPaintOutput (CompScreen *s,
status = (*s->paintOutput) (s, sa, transform, region, output, mask);
WRAP (ss, s, paintOutput, mousetrailsPaintOutput);
+
+
if (!ss->ps || !ss->ps->active)
return status;
+// this doesn't seem to work
+// if (mask & PAINT_SCREEN_TRANSFORMED_MASK) return FALSE;
+
matrixGetIdentity (&sTransform);
transformToScreenSpace (s, output, -DEFAULT_Z_CAMERA, &sTransform);
@@ -839,7 +898,7 @@ mousetrailsInitScreen (CompPlugin *p,
ss->active = TRUE;
- //ss->pollHandle = 0;
+ ss->pollHandle = 0;
ss->ps = NULL;
@@ -852,15 +911,15 @@ mousetrailsFiniScreen (CompPlugin *p,
CompScreen *s)
{
MOUSETRAILS_SCREEN (s);
- //MOUSETRAILS_DISPLAY (s->display);
+ MOUSETRAILS_DISPLAY (s->display);
//Restore the original function
UNWRAP (ss, s, paintOutput);
UNWRAP (ss, s, preparePaintScreen);
UNWRAP (ss, s, donePaintScreen);
- /*if (ss->pollHandle)
- (*sd->mpFunc->removePositionPolling) (s, ss->pollHandle);*/
+ if (ss->pollHandle && ss->ps->useMousepoll)
+ (*sd->mpFunc->removePositionPolling) (s, ss->pollHandle);
if (ss->ps && ss->ps->active)
damageScreen (s);
@@ -876,14 +935,14 @@ mousetrailsInitDisplay (CompPlugin *p,
//Generate a mousetrails display
mousetrailsDisplay *sd;
- //int index;
+ int index;
- if (!checkPluginABI ("core", CORE_ABIVERSION)/* ||
- !checkPluginABI ("mousepoll", MOUSEPOLL_ABIVERSION)*/)
+ if (!checkPluginABI ("core", CORE_ABIVERSION) ||
+ !checkPluginABI ("mousepoll", MOUSEPOLL_ABIVERSION))
return FALSE;
- /*if (!getPluginDisplayIndex (d, "mousepoll", &index))
- return FALSE;*/
+ if (!getPluginDisplayIndex (d, "mousepoll", &index))
+ return FALSE;
sd = (mousetrailsDisplay *) malloc (sizeof (mousetrailsDisplay));
@@ -901,7 +960,7 @@ mousetrailsInitDisplay (CompPlugin *p,
return FALSE;
}
- //sd->mpFunc = d->base.privates[index].ptr;
+ sd->mpFunc = d->base.privates[index].ptr;
mousetrailsSetInitiateInitiate (d, mousetrailsInitiate);
mousetrailsSetInitiateTerminate (d, mousetrailsTerminate);
diff --git a/mousetrails.xml.in b/mousetrails.xml.in
index ff17f9d..a1c62b8 100644
--- a/mousetrails.xml.in
+++ b/mousetrails.xml.in
@@ -8,9 +8,9 @@
<relation type="after">
<plugin>cube</plugin>
</relation>
- <!--<requirement>
+ <requirement>
<plugin>mousepoll</plugin>
- </requirement>-->
+ </requirement>
</deps>
<display>
<group>
@@ -49,10 +49,10 @@
</option>
<option name="threshold" type="int">
<_short>Threshold</_short>
- <_long>The minimum distance (in pixels) from the current mouse position the cursor must travel before creating a new trail element. This helps prevent precision operations like text selecting from being blurred over with trails.</_long>
- <default>1</default>
+ <_long>If the cursor has moved less than this distance (in pixels) from the last mouse position check, it's initial opacity will be lowered proportionally to the distance moved. This helps prevent precision operations like text selecting from being blurred over with trails.</_long>
+ <default>50</default>
<min>1</min>
- <max>10</max>
+ <max>200</max>
</option>
<option name="skip" type="int">
<_short>Distance</_short>
@@ -68,14 +68,14 @@
<min>1</min>
<max>10</max>
</option>
- <option name="life" type="float">
+ <!--<option name="life" type="float">
<_short>Trail Life</_short>
<_long>Trail life.</_long>
<default>0.4</default>
<min>0.1</min>
<max>1</max>
<precision>0.1</precision>
- </option>
+ </option>-->
<option name="color" type="color">
<_short>Trail Color</_short>
<_long>Trail color.</_long>
@@ -98,6 +98,11 @@
<min>2</min>
<max>100</max>
</option>
+ <!--<option name="mousepoll" type="bool">
+ <_short>Use Mousepoll Plugin</_short>
+ <_long>Use mousepoll plugin instead of XQueryPointer</_long>
+ <default>false</default>
+ </option>-->
</group>
</screen>
</plugin>