home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Enlightenment / enl_DR-0.10.tar.gz / enl_DR-0.10.tar / enl / events.c < prev    next >
C/C++ Source or Header  |  1997-06-24  |  18KB  |  712 lines

  1. #include "enlightenment.h"
  2.  
  3. XErrorHandler handleError(Display *dpy, XErrorEvent *ev)
  4. {
  5. /*   printf("!X err trapped\n");*/
  6.    return 0;
  7. }
  8.  
  9. void handleEvent(XEvent *ev,listhead *l)
  10. {
  11. /*   printf("%i\n",ev->type);*/
  12.    switch (ev->type)
  13.      {
  14.       case KeyPress:
  15.     handleKeyDown(ev,l);
  16.     break;
  17.       case KeyRelease:
  18.     handleKeyUp(ev,l);
  19.     break;
  20.       case ButtonPress:
  21.     handleButtonDown(ev,l);
  22.     break;
  23.       case ButtonRelease:
  24.     handleButtonUp(ev,l);
  25.     break;
  26.       case MotionNotify:
  27.     handleMotion(ev,l);
  28.     break;
  29.       case EnterNotify:
  30.     handleEnter(ev,l);
  31.     break;
  32.       case LeaveNotify:
  33.     handleLeave(ev,l);
  34.     break;
  35.       case FocusIn:
  36.     handleFocusIn(ev,l);
  37.     break;
  38.       case FocusOut:
  39.     handleFocusOut(ev,l);
  40.     break;
  41.       case KeymapNotify:
  42.     break;
  43.       case Expose:
  44.     break;
  45.       case GraphicsExpose:
  46.     break;
  47.       case NoExpose:
  48.     break;
  49.       case VisibilityNotify:
  50.     break;
  51.       case CreateNotify:
  52.     break;
  53.       case DestroyNotify:
  54.     handleDestroy(ev,l);
  55.     break;
  56.       case UnmapNotify:
  57.     handleUnmap(ev,l);
  58.     break;
  59.       case MapNotify:
  60.     break;
  61.       case MapRequest:
  62.     handleMap(ev,l);
  63.     break;
  64.       case ReparentNotify:
  65.     break;
  66.       case ConfigureNotify:
  67.     break;
  68.       case ConfigureRequest:
  69.     handleConfigure(ev,l);
  70.     break;
  71.       case GravityNotify:
  72.     break;
  73.       case ResizeRequest:
  74.     handleResize(ev,l);
  75.     break;
  76.       case CirculateNotify:
  77.     break;
  78.       case CirculateRequest:
  79.     handleCirculate(ev,l);
  80.     break;
  81.       case PropertyNotify:
  82.     handleProperty(ev,l);
  83.     break;
  84.       case SelectionClear:
  85.     break;
  86.       case SelectionRequest:
  87.     break;
  88.       case SelectionNotify:
  89.     break;
  90.       case ColormapNotify:
  91.     break;
  92.       case ClientMessage:
  93.     break;
  94.       case MappingNotify:
  95.     break;
  96.       default:
  97.     break;
  98.      }
  99. }
  100.  
  101. void handleKeyDown(XEvent *ev,listhead *l)
  102. {
  103. }
  104.  
  105. void handleKeyUp(XEvent *ev,listhead *l)
  106. {
  107. }
  108.  
  109. void handleButtonDown(XEvent *ev,listhead *l)
  110. {
  111.    Window tmp_win;
  112.    Window wwin,dwin;
  113.    int dummy;
  114.    int button;
  115.    int modifier;
  116.    int win_button;
  117.    EWin *ewin;
  118.    BWin *bwin;
  119.    Icon *icon;
  120.  
  121.    tmp_win=ev->xbutton.subwindow;
  122.    button=ev->xbutton.button;
  123.    modifier=ev->xbutton.state;
  124.    XQueryPointer(disp,root,&dwin,&wwin,&dummy,&dummy,&dummy,&dummy,&dummy);
  125.    if (modifier==0) modifier=0;
  126.    else if (modifier==1) modifier=1;
  127.    else if (modifier==4) modifier=2;
  128.    else if (modifier==8) modifier=3;
  129.    else modifier=0;
  130.    if (wwin==0)
  131.      {
  132.     evmd.mode=MODE_MENU;
  133.     tmp_menu=NULL;
  134.     DoRootMenu(button,modifier,ev->xbutton.x,ev->xbutton.y);
  135.      }
  136.    else if (ewin=ListGetSubWinID(l,tmp_win))
  137.      {
  138.     win_button=GetEWinButtonID(ewin,tmp_win);
  139.     evmd.px=ev->xbutton.x_root;
  140.     evmd.py=ev->xbutton.y_root;
  141.     DoWindowButton(ewin,tmp_win,button,modifier,win_button);
  142.      }
  143.    else if (bwin=GetButtonWinID(tmp_win))
  144.      {
  145.     bwin->state=BTN_CLICK;
  146.     btmd.bwin=bwin;
  147.     DoButton(bwin,button,modifier);
  148.      }
  149.    else if(icon=GetIconWinID(tmp_win))
  150.      {
  151.     DoIcon(icon,button,modifier);
  152.      }
  153.    if (tmp_win==icfg.left_win)
  154.      {
  155.     XSetWindowBackgroundPixmap(disp,icfg.left_win,icfg.left_clk_pmap);
  156.     if (icfg.left_clk_mask)
  157.       XShapeCombineMask(disp,icfg.left_win,ShapeBounding,0,0,icfg.left_clk_mask,ShapeSet);
  158.     sel_win=icfg.left_win;
  159.     XClearWindow(disp,icfg.left_win);
  160.     XSync(disp,False);
  161.     IconLeft();
  162.      }
  163.    else if (tmp_win==icfg.right_win)
  164.      {
  165.     XSetWindowBackgroundPixmap(disp,icfg.right_win,icfg.right_clk_pmap);
  166.     if (icfg.right_clk_mask)
  167.       XShapeCombineMask(disp,icfg.right_win,ShapeBounding,0,0,icfg.right_clk_mask,ShapeSet);
  168.     sel_win=icfg.right_win;
  169.     XClearWindow(disp,icfg.right_win);
  170.     XSync(disp,False);
  171.     IconRight();
  172.      }
  173.    
  174. }
  175.  
  176. void handleButtonUp(XEvent *ev,listhead *l)
  177. {
  178.    Menu *m;
  179.    
  180.    if (evmd.ewin) evmd.ewin->subwin_state[evmd.wbtn]=NORM;
  181.    if (evmd.mode==MODE_MENU) 
  182.      {
  183.     if ((tmp_menu)&&(tmp_menu->sel_item>=0)) 
  184.       {
  185.          DoMenu(tmp_menu,tmp_menu->sel_item);
  186.       }
  187.     DeleteToActiveMenu("");
  188.     tmp_menu=NULL;
  189.     evmd.mname[0]=0;
  190.      }
  191.    if ((evmd.wbtn>=0)&&(evmd.ewin)) DrawButton(evmd.ewin,evmd.wbtn);
  192.    if (btmd.bwin)
  193.      {
  194.     btmd.bwin->state=BTN_SEL;
  195.     ButtonDraw(btmd.bwin);
  196.     btmd.bwin=NULL;
  197.      }
  198.    if (sel_win==icfg.left_win)
  199.      {
  200.     XSetWindowBackgroundPixmap(disp,icfg.left_win,icfg.left_sel_pmap);
  201.     if (icfg.left_sel_mask)
  202.       XShapeCombineMask(disp,icfg.left_win,ShapeBounding,0,0,icfg.left_sel_mask,ShapeSet);
  203.     sel_win=0;
  204.     XClearWindow(disp,icfg.left_win);
  205.     XSync(disp,False);
  206.      }
  207.    else if (sel_win==icfg.right_win)
  208.      {
  209.     XSetWindowBackgroundPixmap(disp,icfg.right_win,icfg.right_sel_pmap);
  210.     if (icfg.right_sel_mask)
  211.       XShapeCombineMask(disp,icfg.right_win,ShapeBounding,0,0,icfg.right_sel_mask,ShapeSet);
  212.     sel_win=0;
  213.     XClearWindow(disp,icfg.right_win);
  214.     XSync(disp,False);
  215.      }
  216.    if(evmd.mode==MODE_MOVE)
  217.      {
  218.     Draw_Cursor(evmd.ewin, evmd.x1, evmd.y1, '+', 2);
  219.     XUngrabPointer(disp, CurrentTime);
  220.      }
  221.    else if(evmd.mode==MODE_RESIZE)
  222.      {
  223.     Draw_Cursor(evmd.ewin, evmd.x2, evmd.y2, 'x', 2);
  224.     XUngrabPointer(disp, CurrentTime);
  225.      }
  226.    evmd.mode=MODE_NORMAL;
  227.    evmd.ewin=NULL;
  228. }
  229.  
  230. void handleMotion(XEvent *ev,listhead *l)
  231. {
  232.    XEvent xev;
  233.    int sx,sy;
  234.    Window w1,w2;
  235.    int x,y,xx,yy;
  236.    int d;
  237.    int wx,wy;
  238.    Window dummyw,focwin;
  239.    int dummy;
  240.    
  241.    XQueryPointer(disp,root,&dummyw,&focwin,&mouse_x,&mouse_y,&dummy,&dummy,&dummy);
  242.    if (evmd.mode==MODE_NORMAL) 
  243.      {
  244.     if (FocusWin!=focwin) FocWin(focwin);
  245.     return;
  246.      }
  247.    else if (evmd.mode==MODE_MOVE)
  248.      {
  249. /*    if (XCheckTypedEvent(disp,MotionNotify,&xev)) return;*/
  250.     XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&xx,&yy,&d);
  251.     x=evmd.ewin->frame_x+sx-evmd.px;
  252.     y=evmd.ewin->frame_y+sy-evmd.py;
  253.     Draw_Cursor(evmd.ewin, x, y, '+', 0);
  254.     ModifyEWin(evmd.ewin,x,y,evmd.ewin->client_width,evmd.ewin->client_height);
  255.     evmd.px=sx;
  256.     evmd.py=sy;
  257.      }
  258.    else if (evmd.mode==MODE_RESIZE)
  259.      {
  260. /*    if (XCheckTypedEvent(disp,MotionNotify,&xev)) return;*/
  261.         XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&xx,&yy,&d);
  262.     wx=sx-evmd.px;
  263.     while ((wx%evmd.ewin->sizeinc_x)>0) wx--;
  264.     while ((wx%evmd.ewin->sizeinc_x)<0) wx++;
  265.     wy=sy-evmd.py;
  266.     while ((wy%evmd.ewin->sizeinc_y)>0) wy--;
  267.     while ((wy%evmd.ewin->sizeinc_y)<0) wy++;
  268.     if ((wx!=0)||(wy!=0))
  269.       {
  270.          if (evmd.resize_mode==0)
  271.            {
  272.           if ((wx>0)&&(evmd.x2<wx)) wx=0;
  273.           if ((wy>0)&&(evmd.y2<wy)) wy=0;
  274.           evmd.x1+=wx;evmd.y1+=wy;
  275.           evmd.x2-=wx;evmd.y2-=wy;
  276.            }
  277.          else if (evmd.resize_mode==1)
  278.            {
  279.           if ((wx<0)&&(evmd.x2<-wx)) wx=0;
  280.           if ((wy>0)&&(evmd.y2<wy)) wy=0;
  281.           evmd.y1+=wy;
  282.           evmd.x2+=wx;evmd.y2-=wy;
  283.            }
  284.          else if (evmd.resize_mode==2)
  285.            {
  286.           if ((wx>0)&&(evmd.x2<wx)) wx=0;
  287.           if ((wy<0)&&(evmd.y2<-wy)) wy=0;
  288.           evmd.x1+=wx;
  289.           evmd.x2-=wx;evmd.y2+=wy;
  290.            }
  291.          else if (evmd.resize_mode==3)
  292.            {
  293.           if ((wx<0)&&(evmd.x2<-wx)) wx=0;
  294.           if ((wy<0)&&(evmd.y2<-wy)) wy=0;
  295.           evmd.x2+=wx;evmd.y2+=wy;
  296.            }
  297.          if (evmd.x2>evmd.ewin->max_width) evmd.x2=evmd.ewin->max_width;
  298.          if (evmd.x2<evmd.ewin->min_width) evmd.x2=evmd.ewin->min_width;
  299.          if (evmd.y2>evmd.ewin->max_height) evmd.y2=evmd.ewin->max_height;
  300.          if (evmd.y2<evmd.ewin->min_height) evmd.y2=evmd.ewin->min_height;
  301.          ModifyEWin(evmd.ewin,evmd.x1,evmd.y1,evmd.x2,evmd.y2);
  302.          Draw_Cursor(evmd.ewin,(evmd.x2-evmd.ewin->base_width)/evmd.ewin->sizeinc_x,(evmd.y2-evmd.ewin->base_height)/evmd.ewin->sizeinc_y, '+', 0);
  303.          evmd.px+=wx;
  304.          evmd.py+=wy;
  305.       }
  306.      }
  307.    else if (evmd.mode==MODE_MENU)
  308.      {
  309.     Menu *m;
  310.     Menu *mm;
  311.     int i;
  312.     int px,py;
  313.     XWindowAttributes xwa;
  314.     
  315.         XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&xx,&yy,&d);
  316.     m=GetMenuWin(w2);
  317.     if (m) 
  318.       {
  319.          tmp_menu=m;
  320.          XQueryPointer(disp,w2,&w1,&w2,&sx,&sy,&xx,&yy,&d);
  321.          for (i=0;i<m->num_items;i++)
  322.            {
  323.           if (m->items[i]->win==w2)
  324.             {
  325.                if (m->sel_item!=i)
  326.              {
  327.                 if (m->sel_item>=0) DrawMenuItem(m,m->sel_item,0);
  328.                 DrawMenuItem(m,i,1);
  329.                 m->sel_item=i;
  330.                 i=m->num_items;
  331.                 DeleteToActiveMenu(m->name);
  332.                 if (m->items[m->sel_item]->action.id==12)
  333.                   {
  334.                  mm=FindMenu(m->items[m->sel_item]->action.params);
  335.                  if (mm)
  336.                    {
  337.                       XGetWindowAttributes(disp,m->win,&xwa);
  338.                       px=xwa.x+m->items[m->sel_item]->x+
  339.                     (m->items[m->sel_item]->width/2);
  340.                       py=xwa.y+m->items[m->sel_item]->y+
  341.                     (m->items[m->sel_item]->height/2);
  342.                       DoBaseMenu(mm,px,py);
  343.                       tmp_menu=mm;
  344.                    }
  345.                   }
  346.              }
  347.             }
  348.            }
  349.       }
  350.     else
  351.       {
  352.          if ((tmp_menu)&&(tmp_menu->sel_item>=0)) 
  353.            {
  354.           DrawMenuItem(tmp_menu,tmp_menu->sel_item,0);
  355.           tmp_menu->sel_item=-1;
  356.           tmp_menu=NULL;
  357.            }
  358.       }
  359.      }
  360. }
  361.  
  362. void handleEnter(XEvent *ev,listhead *l)
  363. {
  364.    Window tmp_win;
  365.    Window dummyw,focwin;
  366.    int dummy;
  367.    
  368.    if (evmd.mode!=MODE_NORMAL) return;
  369.    tmp_win=ev->xcrossing.window;
  370.    XQueryPointer(disp,root,&dummyw,&focwin,&dummy,&dummy,&dummy,&dummy,&dummy);
  371.    if (tmp_win!=focwin) tmp_win=focwin;
  372.    FocWin(tmp_win);
  373. }
  374.  
  375. void handleLeave(XEvent *ev,listhead *l)
  376. {
  377. }
  378.  
  379. void handleFocusIn(XEvent *ev,listhead *l)
  380. {
  381. }
  382.  
  383. void handleFocusOut(XEvent *ev,listhead *l)
  384. {
  385. }
  386.  
  387. void handleDestroy(XEvent *ev,listhead *l)
  388. {
  389.    Window tmp_win;
  390.    EWin *ewin;
  391.    
  392.    tmp_win=ev->xdestroywindow.window;
  393.    if (ewin=ListGetClientWinID(l,tmp_win)) /* if it was a client */
  394.      {
  395.     ListDelWinID(l,ewin->frame_win); /* get rid of the ewin */
  396.      }
  397.    XSync(disp,False);
  398. }
  399.  
  400. void handleUnmap(XEvent *ev,listhead *l)
  401. {
  402.    XEvent xev;
  403.    Window tmp_win;
  404.    EWin *ewin;
  405.    
  406.    tmp_win=ev->xunmap.event;
  407.    if ((ewin=ListGetWinID(l,tmp_win))&& /* if its a client */
  408.        (ewin->state&MAPPED))  /* and the frame was mapped then */
  409.      {
  410.     XUnmapWindow(disp,ewin->frame_win); /* unmap the frame */
  411.     if (fx.shadow.on) XUnmapWindow(disp,ewin->fx.shadow_win);
  412.     ewin->state&=~MAPPED; /* and flag it as not mapped */
  413.     ewin->state|=UNMAPPED; /* flage it explicitly as unmapped */
  414.      if (ewin->state&ICONIFIED) return;
  415. /*    if (XCheckTypedWindowEvent(disp,ev->xunmap.event,DestroyNotify,&xev))
  416.  *      {
  417.  *         XDestroyWindow(disp,ewin->client_win);
  418.  *      }
  419.  */
  420.      }
  421. }
  422.  
  423. void handleMap(XEvent *ev,listhead *l)
  424. {
  425.    Window tmp_win;
  426.    EWin *ewin;
  427.    
  428.    tmp_win=ev->xmap.window;
  429.    if (ListGetWinID(l,tmp_win)) return;
  430.    if (GetButtonWinID(tmp_win)) return;
  431.    if (tmp_win==icfg.bg_win) return;
  432.    if (tmp_win==icfg.left_win) return;
  433.    if (tmp_win==icfg.right_win) return;
  434.    if (!(ewin=ListGetClientWinID(l,tmp_win)))
  435.      {
  436.     ewin=InitEWin(tmp_win); 
  437.     ListAdd(l,ewin);
  438.      }
  439.    XRaiseWindow(disp,ewin->frame_win);
  440.    XMapSubwindows(disp,ewin->frame_win);
  441.    if (fx.shadow.on) XMapWindow(disp,ewin->fx.shadow_win);
  442.    if (!(ewin->state&ICONIFIED)) 
  443.      {
  444.     XMapWindow(disp,ewin->frame_win);
  445.     if (fx.shadow.on) XMapWindow(disp,ewin->fx.shadow_win);
  446.     ewin->state|=MAPPED;
  447.      }
  448.    else 
  449.      {
  450.     XMapWindow(disp,ewin->frame_win);
  451.     if (fx.shadow.on) XMapWindow(disp,ewin->fx.shadow_win);
  452.     ewin->state|=MAPPED;
  453.      }
  454.    RaiseLowerButtons();
  455.    RaiseLowerIcons();
  456.    XSync(disp,False);
  457. }
  458.  
  459. void handleReparent(XEvent *ev,listhead *l)
  460. {
  461.    Window tmp_win;
  462.    EWin *ewin;
  463.    
  464.    tmp_win=ev->xreparent.window;
  465.    if (ListGetClientWinID(l,tmp_win))
  466.      {
  467.     if (!(ewin=ListGetWinID(l,ev->xreparent.parent))) 
  468.       ListDelWinID(l,ewin->frame_win); 
  469.      }
  470. }
  471.  
  472. void handleConfigure(XEvent *ev,listhead *l)
  473. {
  474.    Window tmp_win;
  475.    EWin *ewin;
  476.    int x,y,w,h;
  477.    XWindowChanges val;
  478.    int mask;
  479.    
  480.    tmp_win=ev->xconfigurerequest.window;
  481.    if (ewin=ListGetClientWinID(l,tmp_win))
  482.      {    
  483.     x=ewin->frame_x;
  484.     y=ewin->frame_y;
  485.     w=ewin->client_width;
  486.     h=ewin->client_height;
  487.     if (ev->xconfigurerequest.value_mask&CWX) x=ev->xconfigurerequest.x;
  488.     if (ev->xconfigurerequest.value_mask&CWY) y=ev->xconfigurerequest.y;
  489.     if (ev->xconfigurerequest.value_mask&CWWidth) w=ev->xconfigurerequest.width;
  490.     if (ev->xconfigurerequest.value_mask&CWHeight) h=ev->xconfigurerequest.height;
  491.     GetWinName(tmp_win,ewin->title);
  492.     ewin->changes|=MOD_TITLE;
  493.     GetWinColors(tmp_win,ewin);
  494.     ModifyEWin(ewin,x,y,w,h);
  495.      }
  496.    else
  497.      {
  498.     val.x=ev->xconfigurerequest.x;
  499.     val.y=ev->xconfigurerequest.y;
  500.     val.width=ev->xconfigurerequest.width;
  501.     val.height=ev->xconfigurerequest.height;
  502.     mask=0;
  503.     if (ev->xconfigurerequest.value_mask&CWX) mask|=CWX;
  504.     if (ev->xconfigurerequest.value_mask&CWY) mask|=CWY;
  505.     if (ev->xconfigurerequest.value_mask&CWWidth) mask|=CWWidth;
  506.     if (ev->xconfigurerequest.value_mask&CWHeight) mask|=CWHeight;
  507.     XConfigureWindow(disp,tmp_win,mask,&val);
  508.      }
  509.    RaiseLowerButtons();
  510. }
  511.  
  512. void handleResize(XEvent *ev,listhead *l)
  513. {
  514.    Window tmp_win;
  515.    EWin *ewin;
  516.    int x,y,w,h;
  517.    
  518.    tmp_win=ev->xresizerequest.window;
  519.    if (ewin=ListGetClientWinID(l,tmp_win))
  520.      {    
  521.     x=ewin->frame_x;
  522.     y=ewin->frame_y;
  523.     w=ev->xresizerequest.width;
  524.     h=ev->xresizerequest.height;
  525.     GetWinName(tmp_win,ewin->title);
  526.     ewin->changes|=MOD_TITLE;
  527.     GetWinColors(tmp_win,ewin);
  528.     ModifyEWin(ewin,x,y,w,h);
  529.      }
  530.    else
  531.      {
  532.     w=ev->xresizerequest.width;
  533.     h=ev->xresizerequest.height;
  534.     XResizeWindow(disp,tmp_win,w,h);
  535.      }
  536.    RaiseLowerButtons();
  537. }
  538.  
  539. void handleCirculate(XEvent *ev,listhead *l)
  540. {
  541. }
  542.  
  543. void handleProperty(XEvent *ev,listhead *l)
  544. {
  545.    EWin *ewin;
  546.    Window tmp_win;
  547.    int state;
  548.    char s[1024];
  549.    
  550.    tmp_win=ev->xproperty.window;
  551.    
  552.    if (ewin=ListGetClientWinID(l,tmp_win))
  553.      {
  554.     switch (ev->xproperty.atom)
  555.       {
  556.        case XA_WM_NAME:
  557.          GetWinName(tmp_win,ewin->title);
  558.          ewin->changes|=MOD_TITLE;
  559.          DrawWindowBorder(ewin);
  560.          break;
  561.        case XA_WM_ICON_NAME:
  562.          break;
  563.        case XA_WM_HINTS:
  564.          state=ewin->state;
  565.          GetWinSize(tmp_win,ewin);
  566.          if (state!=ewin->state) ewin->changes|=MOD_STATE;
  567.          DrawWindowBorder(ewin);
  568.          break;
  569.        case XA_WM_NORMAL_HINTS:
  570.          state=ewin->state;
  571.          GetWinSize(tmp_win,ewin);
  572.          if (state!=ewin->state) ewin->changes|=MOD_STATE;
  573.          DrawWindowBorder(ewin);
  574.          break;
  575.        default:
  576.          break;
  577.       }
  578.      }
  579. }
  580.  
  581. void AutoRaise()
  582. {
  583.    Window dummyw,focwin;
  584.    int dummy;
  585.    EWin *ewin;
  586.    
  587.    if (FocusWin==raisewin)
  588.      {
  589.     if (ewin=ListGetWinID(global_l,raisewin))
  590.       {
  591.          Do_RaiseWin(ewin);
  592.          RaiseLowerButtons();
  593.          XSync(disp,False);
  594.       }
  595.      }
  596.    ifb.nodo=0;
  597.    raisewin=0;
  598. }
  599.  
  600. void FocWin(Window tmp_win)
  601. {
  602.    EWin *ewin;
  603.    BWin *bwin;
  604.    Window dummyw,focwin;
  605.    int dummy;
  606.    struct itimerval tv1,tv2;
  607.    
  608.    if (FocusWin!=tmp_win) /* if the new focus isnt the current one */
  609.      {
  610.     raisewin=0;
  611.     if (FocusWin) /* if there was a previous focus win */
  612.       {
  613.          if (ewin=ListGetWinID(global_l,FocusWin)) /* if it exists */
  614.            {
  615.           ewin->state&=~SELECTED; /* unfocus it */
  616.           ewin->changes|=MOD_SELECT;
  617.           DrawWindowBorder(ewin); /* redraw the window */
  618.            }
  619.          else if (bwin=GetButtonWinID(FocusWin))
  620.            {
  621.           if (bwin->state==BTN_SEL)
  622.             {
  623.                bwin->state=BTN_NORM;
  624.                ButtonDraw(bwin);
  625.             }
  626.            }
  627.          else if (FocusWin==icfg.left_win)
  628.            {
  629.           XSetWindowBackgroundPixmap(disp,icfg.left_win,icfg.left_pmap);
  630.           if (icfg.left_mask)
  631.             XShapeCombineMask(disp,icfg.left_win,ShapeBounding,0,0,icfg.left_mask,ShapeSet);
  632.           XClearWindow(disp,icfg.left_win);
  633.           XSync(disp,False);
  634.            }
  635.          else if (FocusWin==icfg.right_win)
  636.            {
  637.           XSetWindowBackgroundPixmap(disp,icfg.right_win,icfg.right_pmap);
  638.           if (icfg.right_mask)
  639.             XShapeCombineMask(disp,icfg.right_win,ShapeBounding,0,0,icfg.right_mask,ShapeSet);
  640.           XClearWindow(disp,icfg.right_win);
  641.           XSync(disp,False);
  642.            }
  643.       }
  644.     FocusWin=tmp_win; /* change the focus to the new window */
  645.     if (tmp_win==0)  FocusWin=root;
  646.     if (FocusWin==root) /* if the new focus win is root */
  647.       {
  648.          FocusWin=0; /* nullify the focus... so all windows */
  649.          XInstallColormap(disp,root_cmap);          
  650.          XSetInputFocus(disp,None,RevertToNone,CurrentTime);
  651.          return; /* are unfocused..... */
  652.       }
  653.     if (ewin=ListGetWinID(global_l,tmp_win)) /* if it exists */
  654.       {
  655.          ewin->state|=SELECTED; /* focus it */
  656.          if (ewin->colormap) XInstallColormap(disp,ewin->colormap);
  657.          else XInstallColormap(disp,root_cmap);
  658.          ewin->changes|=MOD_SELECT;
  659.          XSetInputFocus(disp,ewin->client_win,RevertToNone,CurrentTime);
  660.          DrawWindowBorder(ewin); /* redraw the window */
  661.          if (cfg.autoraise)
  662.            {
  663.                   struct sigaction sa;
  664.  
  665.           ifb.nodo=1;
  666.                   sa.sa_handler = AutoRaise;
  667.                   sa.sa_flags = 0;
  668.                   sigemptyset (&sa.sa_mask);
  669.           tv1.it_value.tv_sec=0;
  670.           tv1.it_value.tv_usec=cfg.autoraise_time*1000;
  671.           tv2.it_value.tv_sec=0;
  672.           tv2.it_value.tv_usec=cfg.autoraise_time*1000;
  673.           tv1.it_interval.tv_sec=0;
  674.           tv1.it_interval.tv_usec=0;
  675.           tv2.it_interval.tv_sec=0;
  676.           tv2.it_interval.tv_usec=0;
  677.           raisewin=FocusWin;
  678.           setitimer(ITIMER_REAL,&tv1,&tv2);
  679.           sigaction(SIGALRM,&sa,(struct sigaction *)0);
  680.            }
  681.       }
  682.     else if (bwin=GetButtonWinID(tmp_win))
  683.       {
  684.          if (bwin->state==BTN_NORM)
  685.            {
  686.           bwin->state=BTN_SEL;
  687.           ButtonDraw(bwin);
  688.            }
  689.       }
  690.     else if (tmp_win==icfg.left_win)
  691.       {
  692.          XSetWindowBackgroundPixmap(disp,icfg.left_win,icfg.left_sel_pmap);
  693.          if (icfg.left_sel_mask)
  694.            XShapeCombineMask(disp,icfg.left_win,ShapeBounding,0,0,icfg.left_sel_mask,ShapeSet);
  695.          XClearWindow(disp,icfg.left_win);
  696.          XSync(disp,False);
  697.       }
  698.     else if (tmp_win==icfg.right_win)
  699.       {
  700.          XSetWindowBackgroundPixmap(disp,icfg.right_win,icfg.right_sel_pmap);
  701.          if (icfg.right_sel_mask)
  702.            XShapeCombineMask(disp,icfg.right_win,ShapeBounding,0,0,icfg.right_sel_mask,ShapeSet);
  703.          XClearWindow(disp,icfg.right_win);
  704.          XSync(disp,False);
  705.       }
  706.      }
  707.    XQueryPointer(disp,root,&dummyw,&focwin,&dummy,&dummy,&dummy,&dummy,&dummy);
  708.    if (FocusWin!=focwin) FocWin(focwin);
  709. }
  710.  
  711.  
  712.