Fix action processing at end of window move.

Don't send events to non-existing buttonproxy window.


SVN revision: 8387
This commit is contained in:
Kim Woelders 2004-01-13 20:01:44 +00:00
parent d0dee83646
commit 8c61ba10de
5 changed files with 75 additions and 54 deletions

View File

@ -1318,6 +1318,7 @@ typedef struct
char nogroup;
char keybinds_changed;
char firsttime;
Window button_proxy_win;
}
EMode;
@ -1904,6 +1905,7 @@ void RemoveActionClass(ActionClass * ActionToRemove);
void AddToAction(Action * act, int id, void *params);
void AddAction(ActionClass * a, Action * act);
int EventAclass(XEvent * ev, ActionClass * a);
void doActionEnd(void);
int spawnMenu(void *params);
int hideMenu(void *params);
int doNothing(void *params);
@ -2833,7 +2835,6 @@ extern Desktops desks;
extern Window init_win1;
extern Window init_win2;
extern Window init_win_ext;
extern Window bpress_win;
extern int deskorder[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
#define FILEPATH_LEN_MAX 4096

View File

@ -1239,6 +1239,55 @@ doMoveEnd(void *params)
EDBUG_RETURN(0);
}
void
doActionEnd(void)
{
EWin *ewin;
int i, num;
EWin **gwins;
switch (mode.mode)
{
case MODE_RESIZE:
case MODE_RESIZE_H:
case MODE_RESIZE_V:
doResizeEnd(NULL);
mode.action_inhibit = 1;
break;
case MODE_MOVE:
ewin = mode.ewin;
if (ewin)
{
gwins =
ListWinGroupMembersForEwin(ewin, ACTION_MOVE, mode.nogroup,
&num);
if ((conf.movemode == 0) && (mode.mode == MODE_MOVE))
for (i = 0; i < num; i++)
DetermineEwinFloat(gwins[i], 0, 0);
Efree(gwins);
}
doMoveEnd(NULL);
if (mode.have_place_grab)
{
mode.have_place_grab = 0;
XUngrabPointer(disp, CurrentTime);
}
mode.ewin = NULL;
mode.action_inhibit = 1;
break;
case MODE_DESKDRAG:
mode.mode = MODE_NONE;
break;
case MODE_BUTTONDRAG:
if (!mode.button_move_pending)
mode.action_inhibit = 1;
doDragButtonEnd(NULL);
break;
default:
break;
}
}
int
doRaise(void *params)
{

View File

@ -95,6 +95,14 @@ TooltipsHandleEvent(void)
DoIn("TOOLTIP_TIMEOUT", conf.tooltips.tiptime, ToolTipTimeout, 0, NULL);
}
static void
ButtonProxySendEvent(XEvent * ev)
{
if (mode.button_proxy_win)
XSendEvent(disp, mode.button_proxy_win, False, SubstructureNotifyMask,
ev);
}
void
HandleClientMessage(XEvent * ev)
{
@ -1343,7 +1351,7 @@ HandleMouseDown(XEvent * ev)
if (ac)
{
if (!EventAclass(ev, ac))
XSendEvent(disp, bpress_win, False, SubstructureNotifyMask, ev);
ButtonProxySendEvent(ev);
}
EDBUG_RETURN_;
}
@ -1415,9 +1423,7 @@ HandleMouseUp(XEvent * ev)
{
Window win = ev->xbutton.window;
EWin *ewin;
int i, num;
Slideout *pslideout;
EWin **gwins;
EDBUG(5, "HandleMouseUp");
@ -1461,57 +1467,20 @@ HandleMouseUp(XEvent * ev)
}
#endif
switch (mode.mode)
doActionEnd();
if (mode.place)
{
case MODE_RESIZE:
case MODE_RESIZE_H:
case MODE_RESIZE_V:
doResizeEnd(NULL);
mode.action_inhibit = 1;
break;
case MODE_MOVE:
ewin = mode.ewin;
if (ewin)
{
gwins =
ListWinGroupMembersForEwin(ewin, ACTION_MOVE, mode.nogroup,
&num);
if ((conf.movemode == 0) && (mode.mode == MODE_MOVE))
for (i = 0; i < num; i++)
DetermineEwinFloat(gwins[i], 0, 0);
Efree(gwins);
}
doMoveEnd(NULL);
if (mode.have_place_grab)
{
mode.have_place_grab = 0;
XUngrabPointer(disp, CurrentTime);
}
mode.ewin = NULL;
mode.action_inhibit = 1;
if (mode.place)
{
mode.place = 0;
goto exit;
}
break;
case MODE_DESKDRAG:
mode.mode = MODE_NONE;
break;
case MODE_BUTTONDRAG:
if (!mode.button_move_pending)
mode.action_inhibit = 1;
doDragButtonEnd(NULL);
break;
default:
break;
mode.place = 0;
goto exit;
}
if (sentpress)
{
/* We never get here? */
sentpress = 0;
XSendEvent(disp, bpress_win, False, SubstructureNotifyMask, ev);
ButtonProxySendEvent(ev);
}
mode.context_win = last_bpress;
ewin = SlideoutsGetContextEwin();
@ -1525,10 +1494,13 @@ HandleMouseUp(XEvent * ev)
mode.justclicked = 1;
}
if (MenusEventMouseUp(ev))
if (!clickmenu && BordersEventMouseUp(ev))
goto exit;
if (!clickmenu && BordersEventMouseUp(ev))
if (mode.action_inhibit)
goto exit;
if (MenusEventMouseUp(ev))
goto exit;
if (ButtonsEventMouseUp(ev))

View File

@ -55,7 +55,6 @@ Desktops desks;
Window init_win1 = 0;
Window init_win2 = 0;
Window init_win_ext = 0;
Window bpress_win = 0;
int deskorder[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
char themepath[FILEPATH_LEN_MAX];
char themename[FILEPATH_LEN_MAX];

View File

@ -770,11 +770,11 @@ GNOME_SetHints(Window win_wm_check)
CARD32 val;
atom_set = XInternAtom(disp, "_WIN_DESKTOP_BUTTON_PROXY", False);
bpress_win = ECreateWindow(root.win, -80, -80, 24, 24, 0);
val = bpress_win;
mode.button_proxy_win = ECreateWindow(root.win, -80, -80, 24, 24, 0);
val = mode.button_proxy_win;
XChangeProperty(disp, root.win, atom_set, XA_CARDINAL, 32,
PropModeReplace, (unsigned char *)&val, 1);
XChangeProperty(disp, bpress_win, atom_set, XA_CARDINAL, 32,
XChangeProperty(disp, mode.button_proxy_win, atom_set, XA_CARDINAL, 32,
PropModeReplace, (unsigned char *)&val, 1);
}