/********************************************************************** * If no application window was indicated on the command line, prompt * the user to select one *********************************************************************/ Window get_target_window () { XEvent eventp; int val = -10, trials; Window target = None; trials = 0; while ((trials < 100) && (val != GrabSuccess)) { val = XGrabPointer (dpy, Scr.Root, True, ButtonReleaseMask, GrabModeAsync, GrabModeAsync, Scr.Root, XCreateFontCursor (dpy, XC_crosshair), CurrentTime); if( val != GrabSuccess ) sleep_a_little (100); trials++; } if (val != GrabSuccess) { show_error( "Couldn't grab the cursor!\n", MyName); DeadPipe(0); } XMaskEvent (dpy, ButtonReleaseMask, &eventp); XUngrabPointer (dpy, CurrentTime); ASSync(0); target = eventp.xbutton.window; LOCAL_DEBUG_OUT( "window = %lX, root = %lX, subwindow = %lX", eventp.xbutton.window, eventp.xbutton.root, eventp.xbutton.subwindow ); if( eventp.xbutton.subwindow != None ) target = eventp.xbutton.subwindow; return target; }
/*************************************************************************** * * Waits for next X event, or for an auto-raise timeout. * ****************************************************************************/ int My_XNextEvent(Display *dpy, XEvent *event) { fd_set in_fdset; unsigned long header[3]; int body_length; int count,count2 = 0; static int miss_counter = 0; unsigned long *body; int total; char *cbody; if(XPending(dpy)) { XNextEvent(dpy,event); return 1; } FD_ZERO(&in_fdset); FD_SET(x_fd,&in_fdset); FD_SET(fd[1],&in_fdset); #ifdef __hpux select(fd_width,(int *)&in_fdset, 0, 0, NULL); #else select(fd_width,&in_fdset, 0, 0, NULL); #endif if(FD_ISSET(x_fd, &in_fdset)) { if(XPending(dpy)) { XNextEvent(dpy,event); miss_counter = 0; return 1; } else miss_counter++; if(miss_counter > 100) DeadPipe(0); } if(FD_ISSET(fd[1], &in_fdset)) { if(count = ReadFvwmPacket(fd[1],header,&body) > 0) { process_message(header[1],body); free(body); } } return 0; }
int get_window(void) { FvwmPacket* packet; struct ConfigWinPacket *cfgpacket; int last = 0; fd_set infds; FD_ZERO(&infds); FD_SET(fd[1], &infds); select(fd_width, SELECT_FD_SET_CAST &infds, 0, 0, NULL); if ( (packet = ReadFvwmPacket(fd[1])) == NULL ) DeadPipe(0); else { cfgpacket = (struct ConfigWinPacket*) packet->body; switch (packet->type) { case M_CONFIGURE_WINDOW: if (is_suitable_window(packet->body)) { window_item *wi = (window_item*)safemalloc(sizeof( window_item )); wi->frame = cfgpacket->frame; wi->th = cfgpacket->title_height; wi->bw = cfgpacket->border_width; wi->width = cfgpacket->frame_width; wi->height = cfgpacket->frame_height; if (!wins_tail) wins_tail = wi; insert_window_list(&wins, wi); ++wins_count; } last = 1; break; case M_END_WINDOWLIST: break; default: fprintf(console, "%s: internal inconsistency: unknown message 0x%08x\n", module->name, (int)packet->type); break; } } return last; }
void wait_configure(window_item *wi) { int found = 0; /** Uh, what's the point of the select() here?? **/ fd_set infds; FD_ZERO(&infds); FD_SET(fd[1], &infds); select(fd_width, SELECT_FD_SET_CAST &infds, 0, 0, NULL); while (!found) { FvwmPacket* packet = ReadFvwmPacket(fd[1]); if ( packet == NULL ) DeadPipe(0); if ( packet->type == M_CONFIGURE_WINDOW && (Window)(packet->body[1]) == wi->frame ) found = 1; } }
/*************************************************************************** * * Waits for next X event, or for an auto-raise timeout. * ****************************************************************************/ int My_XNextEvent(Display *dpy, XEvent *event) { fd_set in_fdset; static int miss_counter = 0; if(XPending(dpy)) { XNextEvent(dpy,event); return 1; } FD_ZERO(&in_fdset); FD_SET(x_fd,&in_fdset); FD_SET(fd[1],&in_fdset); if (fvwmSelect(fd_width, &in_fdset, 0, 0, NULL) > 0) { if(FD_ISSET(x_fd, &in_fdset)) { if(XPending(dpy)) { XNextEvent(dpy,event); miss_counter = 0; return 1; } miss_counter++; #ifdef WORRY_ABOUT_MISSED_XEVENTS if(miss_counter > 100) DeadPipe(0); #endif } if(FD_ISSET(fd[1], &in_fdset)) { FvwmPacket* packet = ReadFvwmPacket(fd[1]); if ( packet == NULL ) exit(0); process_message( packet ); } } return 0; }
/* read an X event */ void ReadXServer () { static XEvent event,evnt_sel; int i; char *octet; while (XEventsQueued(x11base->display, QueuedAfterReading)) { XNextEvent(x11base->display, &event); switch (event.type) { case Expose: if (event.xexpose.count==0) for (i=0;i<nbobj;i++) tabxobj[i]->DrawObj(tabxobj[i]); break; case KeyPress: /* Touche presse dans un objet */ if (event.xkey.subwindow!=0) { /* Envoi de l'evt à l'objet */ for (i=0;i<nbobj;i++) if (tabxobj[i]->win==event.xkey.subwindow) tabxobj[i]->EvtKey(tabxobj[i],&event.xkey); } break; case ButtonPress: /* Clique dans quel fenetre? */ if (event.xbutton.subwindow!=0) { i=0; while ((tabxobj[i]->win!=event.xbutton.subwindow)&&(i<nbobj-1)) i++; tabxobj[i]->EvtMouse(tabxobj[i],&event.xbutton); } break; case ButtonRelease: break; case EnterNotify: break; case LeaveNotify: break; case MotionNotify: break; case MappingNotify: XRefreshKeyboardMapping((XMappingEvent*)&event); break; case SelectionRequest: if (event.xselectionrequest.selection==XA_PRIMARY) { evnt_sel.type=SelectionNotify; evnt_sel.xselection.requestor=event.xselectionrequest.requestor; evnt_sel.xselection.selection=event.xselectionrequest.selection; evnt_sel.xselection.target=event.xselectionrequest.target; evnt_sel.xselection.time=event.xselectionrequest.time; evnt_sel.xselection.property=event.xselectionrequest.property; switch (event.xselectionrequest.target) { case XA_STRING: XChangeProperty(x11base->display,evnt_sel.xselection.requestor, evnt_sel.xselection.property, evnt_sel.xselection.target, 8,PropModeReplace,Scrapt,strlen(Scrapt)+1); break; default:evnt_sel.xselection.property=None; } XSendEvent(x11base->display,evnt_sel.xselection.requestor,False,0,&evnt_sel); } else SendMsgToScript(event); break; case SelectionClear: if (event.xselectionclear.selection==XA_PRIMARY) UnselectAllTextField(tabxobj); break; case ClientMessage: if ((event.xclient.format==32) && (event.xclient.data.l[0]==wm_del_win)) DeadPipe(1); break; case PropertyNotify: if (event.xproperty.atom==XA_CUT_BUFFER0) octet=XFetchBuffer(x11base->display,&i,0); else if (event.xproperty.atom==XA_CUT_BUFFER1) octet=XFetchBuffer(x11base->display,&i,1); else if (event.xproperty.atom==XA_CUT_BUFFER2) octet=XFetchBuffer(x11base->display,&i,2); else if (event.xproperty.atom==XA_CUT_BUFFER3) octet=XFetchBuffer(x11base->display,&i,3); else if (event.xproperty.atom==XA_CUT_BUFFER4) octet=XFetchBuffer(x11base->display,&i,4); else if (event.xproperty.atom==XA_CUT_BUFFER5) octet=XFetchBuffer(x11base->display,&i,5); else if (event.xproperty.atom==XA_CUT_BUFFER6) octet=XFetchBuffer(x11base->display,&i,6); else if (event.xproperty.atom==XA_CUT_BUFFER7) octet=XFetchBuffer(x11base->display,&i,7); else break; if (i>0) { Scrapt=(char*)realloc((void*)Scrapt,sizeof(char)*(i+1)); Scrapt=strcpy(Scrapt,octet); } break; } } }
void DispatchEvent (ASEvent * event) { ASVolume *event_volume = NULL; SHOW_EVENT_TRACE(event); if( (event->eclass & ASE_POINTER_EVENTS) != 0 ) { XKeyEvent *xk = &(event->x.xkey); int pointer_root_x = xk->x_root; int pointer_root_y = xk->y_root; event_volume = position2Volume (pointer_root_x,// - (int)AppState.mainCanvas->bw, pointer_root_y);// - (int)AppState.mainCanvas->bw); LOCAL_DEBUG_OUT ("event_volume = %p, name = \"%s\"", event_volume, event_volume ? event_volume->name : "(none)"); if(is_balloon_click( &(event->x) ) ) { withdraw_balloon(NULL); return; } if (event_volume) event->context = check_astbar_point( event_volume->contents, pointer_root_x, pointer_root_y ); } event->client = NULL ; switch (event->x.type) { case ConfigureNotify: { ASFlagType changes = handle_canvas_config (AppState.mainCanvas); if( changes != 0 ) { volumeWindowMoved_AuxData aux; aux.backgroundChanged = False; set_root_clip_area( AppState.mainCanvas ); iterate_asbidirlist (AppState.volumes, volumeWindowMoved, &aux, NULL, False); } show_activity ("changes = 0x%lx", changes); } break; case KeyPress : return ; case KeyRelease : return ; case ButtonPress: pressButton (event_volume, event); return; case ButtonRelease: LOCAL_DEBUG_OUT( "state(0x%X)->state&ButtonAnyMask(0x%X)", event->x.xbutton.state, event->x.xbutton.state&ButtonAnyMask ); if( (event->x.xbutton.state&ButtonAnyMask) == (Button1Mask<<(event->x.xbutton.button-Button1)) ) releaseButton(); return ; case EnterNotify : if( event->x.xcrossing.window == Scr.Root ) withdraw_active_balloon(); return ; case LeaveNotify : case MotionNotify : { static Bool root_pointer_moved = True ; if( event->x.type == MotionNotify ) root_pointer_moved = True ; if (event_volume) { on_astbar_pointer_action (event_volume->contents, event->context, (event->x.type == LeaveNotify), root_pointer_moved); root_pointer_moved = False ; } return ; } case ClientMessage: LOCAL_DEBUG_OUT("ClientMessage(\"%s\",format = %d, data=(%8.8lX,%8.8lX,%8.8lX,%8.8lX,%8.8lX)", XGetAtomName( dpy, event->x.xclient.message_type ), event->x.xclient.format, event->x.xclient.data.l[0], event->x.xclient.data.l[1], event->x.xclient.data.l[2], event->x.xclient.data.l[3], event->x.xclient.data.l[4]); if ( event->x.xclient.format == 32 && event->x.xclient.data.l[0] == _XA_WM_DELETE_WINDOW ) { DeadPipe(0); } return ; case PropertyNotify: if( event->x.xproperty.atom == _XA_NET_WM_STATE ) { LOCAL_DEBUG_OUT( "_XA_NET_WM_STATE updated!%s",""); return; } handle_wmprop_event (Scr.wmprops, &(event->x)); if( event->x.xproperty.atom == _AS_BACKGROUND ) { volumeWindowMoved_AuxData aux; aux.backgroundChanged = True; LOCAL_DEBUG_OUT( "root background updated!%s",""); safe_asimage_destroy( Scr.RootImage ); Scr.RootImage = NULL ; iterate_asbidirlist (AppState.volumes, volumeWindowMoved, &aux, NULL, False); }else if( event->x.xproperty.atom == _AS_STYLE ) { volumeWindowMoved_AuxData aux; aux.backgroundChanged = False; LOCAL_DEBUG_OUT( "AS Styles updated!%s",""); mystyle_list_destroy_all(&(Scr.Look.styles_list)); LoadColorScheme(); SetASMountLook(); /* now we need to update everything */ redecorateVolumes (); iterate_asbidirlist (AppState.volumes, volumeWindowMoved, &aux, NULL, False); } return ; default: #ifdef XSHMIMAGE LOCAL_DEBUG_OUT( "XSHMIMAGE> EVENT : completion_type = %d, event->type = %d ", Scr.ShmCompletionEventType, event->x.type ); if( event->x.type == Scr.ShmCompletionEventType ) handle_ShmCompletion( event ); #endif /* SHAPE */ return; } /*update_pager_shape();*/ }
void DispatchEvent (ASEvent * event) { SHOW_EVENT_TRACE(event); switch (event->x.type) { case ConfigureNotify: { ASFlagType changes = handle_canvas_config( IdentState.main_canvas ); if( changes != 0 ) set_root_clip_area( IdentState.main_canvas ); if( get_flags( changes, CANVAS_RESIZED ) ) { }else if( changes != 0 ) /* moved - update transparency ! */ { /* int i ; for( i = 0 ; i < Ident.windows_num ; ++i ) update_astbar_transparency( WinListState.window_order[i]->bar, WinListState.main_canvas, False ); */ } } break; case ButtonPress: break; case ButtonRelease: break; case EnterNotify : case LeaveNotify : case MotionNotify : break ; case ClientMessage: if ((event->x.xclient.format == 32) && (event->x.xclient.data.l[0] == _XA_WM_DELETE_WINDOW)) { DeadPipe(0); } break; case PropertyNotify: LOCAL_DEBUG_OUT( "property %s(%lX), _XROOTPMAP_ID = %lX, event->w = %lX, root = %lX", XGetAtomName(dpy, event->x.xproperty.atom), event->x.xproperty.atom, _XROOTPMAP_ID, event->w, Scr.Root ); handle_wmprop_event (Scr.wmprops, &(event->x)); if( event->x.xproperty.atom == _AS_BACKGROUND ) { /*int i ;*/ LOCAL_DEBUG_OUT( "root background updated!%s",""); safe_asimage_destroy( Scr.RootImage ); Scr.RootImage = NULL ; /* for( i = 0 ; i < WinListState.windows_num ; ++i ) if( update_astbar_transparency( WinListState.window_order[i]->bar, WinListState.main_canvas, True ) ) render_astbar( WinListState.window_order[i]->bar, WinListState.main_canvas ); */ if( is_canvas_dirty( IdentState.main_canvas ) ) { update_canvas_display( IdentState.main_canvas ); } }else if( event->x.xproperty.atom == _AS_STYLE ) { /*int i ;*/ LOCAL_DEBUG_OUT( "AS Styles updated!%s",""); mystyle_list_destroy_all(&(Scr.Look.styles_list)); LoadColorScheme(); CheckConfigSanity(); /* now we need to update everything */ } break; } }
void Loop(Window target) { Window root; int x,y,border_width,depth; XEvent Event; int tw,th; char *temp; char *prop = NULL; Atom actual = None; int actual_format; unsigned long nitems, bytesafter; while(1) { XNextEvent(dpy,&Event); switch(Event.type) { case Expose: exposed = 1; RedrawWindow(target); break; case ConfigureNotify: XGetGeometry(dpy,main_win,&root,&x,&y, (unsigned int *)&tw,(unsigned int *)&th, (unsigned int *)&border_width, (unsigned int *)&depth); if((tw != Width)||(th!= Height)) { XResizeWindow(dpy,holder_win,tw-BAR_WIDTH-PAD_WIDTH3, th-BAR_WIDTH-PAD_WIDTH3); Width = tw; Height = th; if(target_y_offset + Height - BAR_WIDTH > target_height) target_y_offset = target_height - Height + BAR_WIDTH; if(target_y_offset < 0) target_y_offset = 0; if(target_x_offset < 0) target_x_offset = 0; if(target_x_offset + Width - BAR_WIDTH > target_width) target_x_offset = target_width - Width + BAR_WIDTH; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); exposed = 1; RedrawWindow(target); } break; case ButtonPress: if((Event.xbutton.y > Height-BAR_WIDTH) && (Event.xbutton.x < SCROLL_BAR_WIDTH+PAD_WIDTH3)) { motion = LEFT; exposed = 2; RedrawWindow(target); } else if((Event.xbutton.y > Height-BAR_WIDTH) && (Event.xbutton.x > Width-BAR_WIDTH-SCROLL_BAR_WIDTH-2) && (Event.xbutton.x < Width-BAR_WIDTH)) { motion = RIGHT; exposed = 2; RedrawWindow(target); } else if((Event.xbutton.y < SCROLL_BAR_WIDTH+PAD_WIDTH3) && (Event.xbutton.x > Width-BAR_WIDTH)) { motion = TOP; exposed = 2; RedrawWindow(target); } else if((Event.xbutton.y > Height-BAR_WIDTH-SCROLL_BAR_WIDTH-2) && (Event.xbutton.y < Height-BAR_WIDTH)&& (Event.xbutton.x > Width-BAR_WIDTH)) { motion = BOTTOM; exposed = 2; RedrawWindow(target); } else if((Event.xbutton.x > Width - BAR_WIDTH)&& (Event.xbutton.y < Height- BAR_WIDTH)) { motion = VERTICAL; target_y_offset=(Event.xbutton.y-PAD_WIDTH3-SCROLL_BAR_WIDTH)* target_height/ (Height-BAR_WIDTH-PAD_WIDTH3 - 2*SCROLL_BAR_WIDTH); if(target_y_offset+Height-BAR_WIDTH -PAD_WIDTH3 > target_height) target_y_offset = target_height - Height+BAR_WIDTH+PAD_WIDTH3; if(target_y_offset < 0) target_y_offset = 0; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); RedrawWindow(target); } else if((Event.xbutton.y > Height- BAR_WIDTH ) && (Event.xbutton.x < Width- BAR_WIDTH)) { motion=HORIZONTAL; target_x_offset=(Event.xbutton.x -PAD_WIDTH3-SCROLL_BAR_WIDTH)* target_width/ (Width-BAR_WIDTH-PAD_WIDTH3-2*SCROLL_BAR_WIDTH); if(target_x_offset < 0) target_x_offset = 0; if(target_x_offset + Width - BAR_WIDTH -PAD_WIDTH3> target_width) target_x_offset = target_width - Width + BAR_WIDTH+PAD_WIDTH3; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); RedrawWindow(target); } else if((Event.xbutton.y > Height- BAR_WIDTH ) && (Event.xbutton.x > Width- BAR_WIDTH)) { exposed = 2; motion=QUIT; } RedrawWindow(target); break; case ButtonRelease: if((Event.xbutton.y > Height- BAR_WIDTH ) && (Event.xbutton.x > Width- BAR_WIDTH)&& (motion==QUIT)) { XUnmapWindow(dpy,main_win); XReparentWindow(dpy,target,Root,x,y); XSync(dpy,0); exit(0); } if((motion == LEFT)&&(Event.xbutton.y > Height-BAR_WIDTH) && (Event.xbutton.x < SCROLL_BAR_WIDTH+PAD_WIDTH3)) { target_x_offset -= (Width-BAR_WIDTH-PAD_WIDTH2); if(target_x_offset < 0) target_x_offset = 0; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); motion = NONE; exposed = 2; } else if((motion == RIGHT)&&(Event.xbutton.y > Height-BAR_WIDTH) && (Event.xbutton.x > Width-BAR_WIDTH-SCROLL_BAR_WIDTH-2) && (Event.xbutton.x < Width-BAR_WIDTH)) { target_x_offset += (Width-BAR_WIDTH-PAD_WIDTH2); if(target_x_offset+Width-BAR_WIDTH -PAD_WIDTH3 > target_width) target_x_offset = target_width - Width+BAR_WIDTH+PAD_WIDTH3; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); motion = NONE; exposed = 2; } else if((motion == TOP)&& (Event.xbutton.y<SCROLL_BAR_WIDTH+PAD_WIDTH3)&& (Event.xbutton.x > Width-BAR_WIDTH)) { target_y_offset -= (Height-BAR_WIDTH-PAD_WIDTH2); if(target_y_offset < 0) target_y_offset = 0; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); motion = NONE; exposed = 2; } else if((motion == BOTTOM)&& (Event.xbutton.y > Height-BAR_WIDTH-SCROLL_BAR_WIDTH-2) && (Event.xbutton.y < Height-BAR_WIDTH)&& (Event.xbutton.x > Width-BAR_WIDTH)) { target_y_offset += (Height-BAR_WIDTH-PAD_WIDTH2); if(target_y_offset+Height-BAR_WIDTH -PAD_WIDTH3 > target_height) target_y_offset = target_height - Height+BAR_WIDTH+PAD_WIDTH3; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); motion = NONE; exposed = 2; } if(motion == VERTICAL) { target_y_offset=(Event.xbutton.y-PAD_WIDTH3-SCROLL_BAR_WIDTH)*target_height/ (Height-BAR_WIDTH-PAD_WIDTH3 - 2*SCROLL_BAR_WIDTH); if(target_y_offset+Height-BAR_WIDTH -PAD_WIDTH3 > target_height) target_y_offset = target_height - Height+BAR_WIDTH+PAD_WIDTH3; if(target_y_offset < 0) target_y_offset = 0; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); } if(motion == HORIZONTAL) { target_x_offset=(Event.xbutton.x -PAD_WIDTH3-SCROLL_BAR_WIDTH)* target_width/ (Width-BAR_WIDTH-PAD_WIDTH3-2*SCROLL_BAR_WIDTH); if(target_x_offset < 0) target_x_offset = 0; if(target_x_offset + Width - BAR_WIDTH -PAD_WIDTH3> target_width) target_x_offset = target_width - Width + BAR_WIDTH+PAD_WIDTH3; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); } RedrawWindow(target); motion = NONE; break; case MotionNotify: if((motion == LEFT)&&((Event.xmotion.y < Height-BAR_WIDTH) || (Event.xmotion.x > SCROLL_BAR_WIDTH+PAD_WIDTH3))) { motion = NONE; exposed = 2; } else if((motion == RIGHT)&&((Event.xmotion.y < Height-BAR_WIDTH) || (Event.xmotion.x < Width-BAR_WIDTH-SCROLL_BAR_WIDTH-2) || (Event.xmotion.x > Width-BAR_WIDTH))) { motion = NONE; exposed = 2; } else if((motion == TOP)&& ((Event.xmotion.y>SCROLL_BAR_WIDTH+PAD_WIDTH3)|| (Event.xmotion.x < Width-BAR_WIDTH))) { motion = NONE; exposed = 2; } else if((motion == BOTTOM)&& ((Event.xmotion.y < Height-BAR_WIDTH-SCROLL_BAR_WIDTH-2) || (Event.xmotion.y > Height-BAR_WIDTH)|| (Event.xmotion.x < Width-BAR_WIDTH))) { motion = NONE; exposed = 2; } if(motion == VERTICAL) { target_y_offset=(Event.xmotion.y-PAD_WIDTH3-SCROLL_BAR_WIDTH)* target_height/ (Height-BAR_WIDTH-PAD_WIDTH3-2*SCROLL_BAR_WIDTH); if(target_y_offset+Height-BAR_WIDTH -PAD_WIDTH3 > target_height) target_y_offset = target_height - Height+BAR_WIDTH+PAD_WIDTH3; if(target_y_offset < 0) target_y_offset = 0; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); } if(motion == HORIZONTAL) { target_x_offset=(Event.xmotion.x -PAD_WIDTH3-SCROLL_BAR_WIDTH)* target_width/ (Width-BAR_WIDTH-PAD_WIDTH3-2*SCROLL_BAR_WIDTH); if(target_x_offset < 0) target_x_offset = 0; if(target_x_offset + Width - BAR_WIDTH -PAD_WIDTH3> target_width) target_x_offset = target_width - Width + BAR_WIDTH+PAD_WIDTH3; XMoveWindow(dpy,target,-target_x_offset, -target_y_offset); } if((motion == QUIT)&& ((Event.xbutton.y < Height- BAR_WIDTH )|| (Event.xbutton.x < Width- BAR_WIDTH))) { motion = NONE; exposed = 2; } RedrawWindow(target); break; case ClientMessage: if ((Event.xclient.format==32) && (Event.xclient.data.l[0]==wm_del_win)) { DeadPipe(1); } break; case PropertyNotify: if(Event.xproperty.atom == XA_WM_NAME) { if(XFetchName(dpy, target, &temp)==0) temp = NULL; change_window_name(temp); } else if (Event.xproperty.atom == XA_WM_ICON_NAME) { if (XGetWindowProperty (dpy, target, Event.xproperty.atom, 0, MAX_ICON_NAME_LEN, False, XA_STRING, &actual,&actual_format, &nitems, &bytesafter, (unsigned char **) &prop) == Success && (prop != NULL)) change_icon_name(prop); } else if(Event.xproperty.atom == XA_WM_HINTS) { XWMHints *wmhints; wmhints = XGetWMHints(dpy,target); XSetWMHints(dpy,main_win, wmhints); XFree(wmhints); } else if(Event.xproperty.atom == XA_WM_NORMAL_HINTS) { /* don't do Normal Hints. They alter the size of the window */ } else if (Event.xproperty.atom == _XA_WM_COLORMAP_WINDOWS) { } break; case DestroyNotify: DeadPipe(1); break; case UnmapNotify: break; case MapNotify: XMapWindow(dpy,main_win); break; case FocusIn: XSetInputFocus(dpy,target,RevertToParent,CurrentTime); break; case ColormapNotify: { XWindowAttributes xwa; if(XGetWindowAttributes(dpy,target, &xwa) != 0) { XSetWindowColormap(dpy,main_win,xwa.colormap); } } break; default: break; } } return; }