home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Enlightenment / enl_BETA-0.13.src.tar.gz / enl_BETA-0.13.src.tar / enl-0.13 / events.c < prev    next >
C/C++ Source or Header  |  1997-11-17  |  21KB  |  779 lines

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