| /* PR opt/6516 */ |
| /* On x86, something about the structure of this function prevented |
| cross-jumping from combining the three arms of the switch statement |
| until the last moment. After which we did not delete dead code, |
| which left a reference to the deleted ADDR_VEC. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-options "-O2 -frename-registers -fpic" } */ |
| |
| typedef unsigned long XID; |
| typedef XID Window; |
| typedef void Display; |
| typedef unsigned long Time; |
| |
| typedef struct { |
| int type; |
| unsigned long serial; |
| int send_event; |
| Display *display; |
| Window window; |
| Window root; |
| Window subwindow; |
| Time time; |
| int x, y; |
| int x_root, y_root; |
| unsigned int state; |
| unsigned int button; |
| int same_screen; |
| } XButtonEvent; |
| typedef struct { |
| int type; |
| unsigned long serial; |
| int send_event; |
| Display *display; |
| Window window; |
| Window root; |
| Window subwindow; |
| Time time; |
| int x, y; |
| int x_root, y_root; |
| unsigned int state; |
| char is_hint; |
| int same_screen; |
| } XMotionEvent; |
| typedef struct { |
| int type; |
| unsigned long serial; |
| int send_event; |
| Display *display; |
| Window window; |
| Window root; |
| Window subwindow; |
| Time time; |
| int x, y; |
| int x_root, y_root; |
| int mode; |
| int detail; |
| int same_screen; |
| int focus; |
| unsigned int state; |
| } XCrossingEvent; |
| typedef union _XEvent { |
| int type; |
| XButtonEvent xbutton; |
| XMotionEvent xmotion; |
| XCrossingEvent xcrossing; |
| } XEvent; |
| |
| typedef struct { |
| int width, height; |
| Display *display; |
| } Screen; |
| typedef struct _CorePart { |
| Screen *screen; |
| } CorePart; |
| typedef struct _WidgetRec { |
| CorePart core; |
| } WidgetRec; |
| typedef struct _WidgetRec *Widget; |
| |
| typedef struct _SmeRec *SmeObject; |
| typedef struct _SimpleMenuPart { |
| SmeObject entry_set; |
| } SimpleMenuPart; |
| typedef struct _SimpleMenuRec { |
| SimpleMenuPart simple_menu; |
| } SimpleMenuRec; |
| typedef struct _SimpleMenuRec* SimpleMenuWidget; |
| |
| typedef short Position; |
| typedef unsigned short Dimension; |
| typedef char Boolean; |
| |
| typedef struct _RectObjPart { |
| Position x, y; |
| Dimension width, height; |
| Dimension border_width; |
| Boolean managed; |
| Boolean sensitive; |
| Boolean ancestor_sensitive; |
| }RectObjPart; |
| typedef struct _RectObjRec { |
| RectObjPart rectangle; |
| } RectObjRec; |
| typedef struct _RectObjRec *RectObj; |
| |
| SmeObject DoGetEventEntry(); |
| |
| SmeObject |
| GetEventEntry(Widget w, XEvent *event) |
| { |
| int x_loc, y_loc, x_root; |
| SimpleMenuWidget smw = (SimpleMenuWidget)w; |
| SmeObject entry; |
| int warp, move; |
| switch (event->type) { |
| case 6: |
| x_loc = event->xmotion.x; |
| y_loc = event->xmotion.y; |
| x_root = event->xmotion.x_root; |
| break; |
| case 7: |
| case 8: |
| x_loc = event->xcrossing.x; |
| y_loc = event->xcrossing.y; |
| x_root = event->xcrossing.x_root; |
| break; |
| case 4: |
| case 5: |
| x_loc = event->xbutton.x; |
| y_loc = event->xbutton.y; |
| x_root = event->xbutton.x_root; |
| break; |
| default: |
| XtAppError(XtWidgetToApplicationContext(w), |
| "Unknown event type in GetEventEntry()."); |
| return (((void *)0)); |
| } |
| if (x_loc < 0 || x_loc >= (((RectObj)smw)->rectangle.width) || |
| y_loc < 0 || y_loc >= (((RectObj)smw)->rectangle.height)) |
| return (((void *)0)); |
| if (x_root == ((((w)->core.screen))->width) - 1 && |
| (((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width)) > x_root) { |
| warp = -8; |
| if (smw->simple_menu.entry_set) { |
| entry = DoGetEventEntry(w, |
| (((RectObj)smw->simple_menu.entry_set)->rectangle.x) |
| + (((RectObj)smw->simple_menu.entry_set)->rectangle.width) + 1, |
| y_loc); |
| Unhighlight(w, event, ((void *)0), ((void *)0)); |
| if (entry) { |
| warp = -(int)(((RectObj)entry)->rectangle.width) >> 1; |
| move = x_loc - (((RectObj)entry)->rectangle.width) - (((RectObj)entry)->rectangle.x) + (((RectObj)w)->rectangle.border_width); |
| } |
| else { |
| warp = 0; |
| move = ((((w)->core.screen))->width) - |
| ((((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width) << 1)); |
| } |
| } |
| else { |
| warp = 0; |
| move = ((((w)->core.screen))->width) - |
| ((((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width) << 1)); |
| } |
| } |
| else if (x_root == 0 && (((RectObj)w)->rectangle.x) < 0) { |
| warp = 8; |
| if (smw->simple_menu.entry_set) { |
| entry = DoGetEventEntry(w, (((RectObj)smw->simple_menu.entry_set)->rectangle.x) - 1, |
| y_loc); |
| Unhighlight(w, event, ((void *)0), ((void *)0)); |
| if (entry) { |
| warp = (((RectObj)entry)->rectangle.width) >> 1; |
| move = x_loc - (((RectObj)entry)->rectangle.x); |
| } |
| else |
| move = x_loc + (((RectObj)w)->rectangle.border_width); |
| } |
| else |
| move = x_loc + (((RectObj)w)->rectangle.border_width); |
| } |
| else |
| move = warp = 0; |
| if (move) |
| XtMoveWidget(w, (((RectObj)w)->rectangle.x) + move, (((RectObj)w)->rectangle.y)); |
| if (warp) |
| XWarpPointer((((w)->core.screen)->display), 0L, 0L, 0, 0, 0, 0, warp, 0); |
| return (DoGetEventEntry(w, x_loc, y_loc)); |
| } |