Martin Geisler wrote:

Carsten Haitzler (The Rasterman) <[EMAIL PROTECTED]> writes:

indeed - very useful :) patch added in to cvs :)

I've tried to track the function calls made by e_border_move() but I
haven't found anything that fiddles with the focused window.

possibly make separate function - something like `e_focus_update' ?
we may use it in any case, when focus may change by actions
(moving/closing windows, etc).

hm... on my system whole e17 is freezed. seems to bug in focus code.

and more: get patch, that modifies pointer wrapping (relativity saved)

--

Boldin Pavel aka davinchi. mail-to: ldavinchi /at\ inbox _dot_ ru
   ZU - Zagovor Unixoidov. SSAU 303.




--- /home/davinchi/downloaded/e17/apps/e/src/bin/e_actions.c	2005-07-08 00:25:59 +0500
+++ e_actions.c	2005-07-08 04:01:42 +0500
@@ -300,18 +300,32 @@ ACT_FN_GO(move_relative)
    if (params)
      {
        int dx, dy;
+       int rx, ry;
 
        if (sscanf(params, "%i %i", &dx, &dy) == 2) {
          E_Border *bd;
          
          bd = (E_Border *)obj;
 
-         e_border_move(bd, bd->x + dx, bd->y + dy);
          
          if (e_config->focus_policy != E_FOCUS_CLICK)
+	   {
+	      ecore_x_pointer_xy_get(bd->zone->container->win,
+		    &rx, &ry);
+
+	      rx -= bd->x;
+	      ry -= bd->y;
+
+	      if (rx < 0 || rx > bd->w || ry < 0 || ry > bd->h)
+		rx = ry = 0;
+	   }
+
+         e_border_move(bd, bd->x + dx, bd->y + dy);
+         
+         if (e_config->focus_policy != E_FOCUS_CLICK && (rx || ry))
            ecore_x_pointer_warp(bd->zone->container->win,
-                                bd->x + (bd->w / 2),
-                                bd->y + (bd->h / 2));
+                                bd->x + rx,
+                                bd->y + ry);
        }
      }
 }
@@ -330,6 +344,7 @@ ACT_FN_GO(move_absolute)
      {
        E_Border *bd;
        int x, y;
+       int rx, ry;
        char cx, cy;
          
        bd = (E_Border *)obj;
@@ -354,12 +369,26 @@ ACT_FN_GO(move_absolute)
 
        if (x != bd->x || y != bd->y)
          {
-           e_border_move(bd, x, y);
+
 
            if (e_config->focus_policy != E_FOCUS_CLICK)
+	     {
+		ecore_x_pointer_xy_get(bd->zone->container->win,
+		      &rx, &ry);
+
+		rx -= bd->x;
+		ry -= bd->y;
+
+		if (rx < 0 || rx > bd->w || ry < 0 || ry > bd->h)
+		     rx = ry = 0;
+	     }
+
+           e_border_move(bd, x, y);
+
+           if (e_config->focus_policy != E_FOCUS_CLICK && (rx || ry))
              ecore_x_pointer_warp(bd->zone->container->win,
-                                  bd->x + (bd->w / 2),
-                                  bd->y + (bd->h / 2));
+                                  bd->x + rx,
+                                  bd->y + ry);
          }
      }
 }
@@ -378,17 +407,38 @@ ACT_FN_GO(resize)
    if (params)
      {
        int dw, dh;
+       int rx, ry;
 
        if (sscanf(params, "%i %i", &dw, &dh) == 2) {
          E_Border *bd;
          bd = (E_Border *)obj;
 
+         if (e_config->focus_policy != E_FOCUS_CLICK)
+	   {
+	      ecore_x_pointer_xy_get(bd->zone->container->win,
+		    &rx, &ry);
+
+	      rx -= bd->x;
+	      ry -= bd->y;
+
+	      if (rx < 0 || rx > bd->w || ry < 0 || ry > bd->h)
+		{
+		   rx = 500;
+		   ry = 500;
+		}
+	      else
+		{
+		   rx = rx*1000/bd->w;
+		   ry = ry*1000/bd->h;
+		}
+	   }
+
          e_border_resize(bd, bd->w + dw, bd->h + dh);
          
          if (e_config->focus_policy != E_FOCUS_CLICK)
            ecore_x_pointer_warp(bd->zone->container->win,
-                                bd->x + (bd->w / 2),
-                                bd->y + (bd->h / 2));
+                                bd->x + rx*bd->w/1000,
+                                bd->y + ry*bd->h/1000 );
        }
      }
 }

Reply via email to