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 / desktops.c < prev    next >
C/C++ Source or Header  |  1997-11-16  |  13KB  |  422 lines

  1. #include "enlightenment.h"
  2.  
  3. void InitDesks()
  4. {
  5.    int i;
  6.    Image *im;
  7.    int im_w,im_h;
  8.    int dummy;
  9.    unsigned int w,h,dummyui;
  10.    Window wdummy;
  11.    
  12.    desk.icon_win=CreateBasicWin(root,0,0,desk.icon_width,desk.icon_height);
  13.    if (desk.icon_pmap) XSetWindowBackgroundPixmap(disp,desk.icon_win,desk.icon_pmap);
  14.    if (desk.icon_mask) XShapeCombineMask(disp,desk.icon_win,ShapeBounding,0,0,desk.icon_mask,ShapeSet);
  15.    XSelectInput(disp,desk.icon_win,ButtonMotionMask|PointerMotionMask|ButtonPressMask|ButtonReleaseMask);
  16.    for (i=0;i<MAX_DESKS;i++)
  17.      {
  18.     if (desk.background[i][0])
  19.       {
  20.          im=LoadImage(imd,desk.background[i],NULL);
  21.          XGetGeometry(disp,root,&wdummy,&dummy,&dummy,&w,&h,&dummyui,&dummyui);
  22.          if (desk.bg_width[i]==0) im_w=im->rgb_width;
  23.          else if (desk.bg_width[i]==-1) im_w=w;
  24.          else im_w=desk.bg_width[i];
  25.          if (desk.bg_height[i]==0) im_h=im->rgb_height;
  26.          else if (desk.bg_height[i]==-1) im_h=h;
  27.          else im_w=desk.bg_height[i];
  28.          ImlibRender(imd,im,im_w,im_h);
  29.          desk.bg_pmap[i]=ImlibMoveImageToPixmap(imd,im);
  30.          ImlibRender(imd,im,(desk.di[i].root_width*im_w)/w,
  31.              (desk.di[i].root_height*im_h)/h);
  32.          desk.di[i].root_pmap=
  33.            ImlibMoveImageToPixmap(imd,im);
  34.          XSetWindowBackgroundPixmap(disp,desk.di[i].root_win,
  35.                   desk.di[i].root_pmap);
  36.          XClearWindow(disp,desk.di[i].root_win);
  37.          ImlibDestroyImage(imd,im);
  38.       }
  39.      }
  40. }
  41.  
  42.  
  43. void NextDesk(void)
  44. {
  45.   ChangeToDesk(desk.current<(desk.num_desks)?desk.current+1:0);
  46. }
  47.  
  48. void PrevDesk(void)
  49. {
  50.   ChangeToDesk(desk.current>0?desk.current-1:desk.num_desks);
  51. }
  52.  
  53. void ChangeToDesk(int dsk)
  54. {
  55.    struct list *ptr;
  56.    
  57.    if (dsk==desk.current) return;
  58.    if (dsk<0) return;
  59.    if (dsk>=MAX_DESKS) return;
  60.    
  61.    XSetInputFocus(disp,root,RevertToNone,CurrentTime);
  62.    HighlightDeskInfo(desk.current,0);
  63.    MapDesk(desk.current,0);
  64.    if (desk.bg_pmap[dsk])
  65.      {
  66.         XSetWindowBackgroundPixmap(disp,root,desk.bg_pmap[dsk]);
  67.     XClearWindow(disp,root);
  68.      }
  69.    MapDesk(dsk,1);
  70.    XSync(disp,False);
  71.    desk.current=dsk;
  72.    ptr=global_l->first;
  73.    while(ptr)
  74.      {
  75.     MimickEwin(ptr->win);
  76.     ptr=ptr->next;
  77.      }
  78.    HighlightDeskInfo(dsk,1);
  79. }
  80.  
  81. void MapDesk(int dsk, int map)
  82. {
  83.    struct list *node;
  84.    
  85.    node=global_l->first;
  86.    
  87.    while(node)
  88.      {
  89.     if ((node->win->desk<0) || (node->win->desk==dsk))
  90.       {
  91.          if (map) 
  92.            {
  93.           if ((node->win->state&MAPPED)&&(!(node->win->state&ICONIFIED))&&
  94.               (!(node->win->state&UNMAPPED)))
  95.             {
  96.                XMapWindow(disp,node->win->frame_win); /* unmap the frame */
  97.                if (fx.shadow.on) XMapWindow(disp,node->win->fx.shadow_win);
  98.                MimickEwin(node->win);
  99.             }
  100.            }
  101.          else
  102.            {
  103.           if ((node->win->state&MAPPED)&&(!(node->win->state&ICONIFIED))&&
  104.               (!(node->win->state&UNMAPPED))&&(node->win->desk>-1))
  105.             {
  106.                XUnmapWindow(disp,node->win->frame_win); /* unmap the frame */
  107.                if (fx.shadow.on) XUnmapWindow(disp,node->win->fx.shadow_win);
  108.             }
  109.            }
  110.       }
  111.     node=node->next;
  112.      }
  113. }
  114.  
  115. void MoveEwinToDesk(EWin *ewin, int dsk)
  116. {
  117.    if (ewin->desk==dsk) return;
  118.    
  119.    if (ewin->desk==desk.current)
  120.      {
  121.     if ((ewin->state&MAPPED)&&(!(ewin->state&ICONIFIED))&&
  122.         (!(ewin->state&UNMAPPED)))
  123.       {
  124.          XUnmapWindow(disp,ewin->frame_win); /* unmap the frame */
  125.          if (fx.shadow.on) XUnmapWindow(disp,ewin->fx.shadow_win);
  126.       }
  127.      }
  128.    if (dsk==desk.current)
  129.      {
  130.     if ((ewin->state&MAPPED)&&(!(ewin->state&ICONIFIED))&&
  131.         (!(ewin->state&UNMAPPED)))
  132.       {
  133.          XMapWindow(disp,ewin->frame_win); /* unmap the frame */
  134.          if (fx.shadow.on) XMapWindow(disp,ewin->fx.shadow_win);
  135.       }
  136.      }
  137.    ewin->desk=dsk;
  138.    ewin->snapshotok=0;
  139.    /*Removed by Taco so that a motion to a desk can be a different position*/
  140.    /*MimickEwin(ewin);*/
  141. }
  142.  
  143. void CreateDeskInfo(int dsk, int x, int y, int w, int h, 
  144.             int bx, int by, int bw, int bh, 
  145.             char *bg, ImColor *bicl, char *hl, ImColor *hicl,
  146.             int above)
  147. {
  148.    if (dsk<0) return;
  149.    if (dsk>MAX_DESKS) return;
  150.    if (x<0) x=DisplayWidth(disp,screen)+1+x-w;
  151.    if (y<0) y=DisplayHeight(disp,screen)+1+y-h;
  152.    if (bx<0) bx=DisplayWidth(disp,screen)+1+bx-bw;
  153.    if (by<0) by=DisplayHeight(disp,screen)+1+by-bh;
  154.    desk.di[dsk].above=above;
  155.    desk.di[dsk].root_x=x;
  156.    desk.di[dsk].root_y=y;
  157.    desk.di[dsk].root_width=w;
  158.    desk.di[dsk].root_height=h;
  159.    desk.di[dsk].x=bx;
  160.    desk.di[dsk].y=by;
  161.    desk.di[dsk].width=bw;
  162.    desk.di[dsk].height=bh;
  163.    desk.di[dsk].root_win=CreateBasicWin(root,x,y,w,h);
  164.    desk.di[dsk].win=CreateBasicWin(root,bx,by,bw,bh);
  165.    desk.num_desks=dsk>desk.num_desks?dsk:desk.num_desks;
  166.    XSelectInput(disp,desk.di[dsk].root_win,ButtonMotionMask|PointerMotionMask|ButtonPressMask|ButtonReleaseMask);
  167.    XSelectInput(disp,desk.di[dsk].win,ButtonMotionMask|PointerMotionMask|ButtonPressMask|ButtonReleaseMask);
  168.    LoadImageSizeWithImlib(bg,bicl,&desk.di[dsk].bg_pmap,&desk.di[dsk].bg_mask,bw,bh);
  169.    LoadImageSizeWithImlib(hl,hicl,&desk.di[dsk].hl_pmap,&desk.di[dsk].hl_mask,bw,bh);
  170.    HighlightDeskInfo(dsk,0);
  171. }
  172.  
  173. void MapDeskInfo()
  174. {
  175.    int i;
  176.  
  177.    for (i=0;i<MAX_DESKS;i++)
  178.      {
  179.     if (desk.di[i].root_win)
  180.       {
  181.          XMapWindow(disp,desk.di[i].root_win);
  182.          XMapWindow(disp,desk.di[i].win);
  183.       }
  184.      }
  185.    XSync(disp,False);
  186. }
  187.  
  188. void HighlightDeskInfo(int dsk,int onoff)
  189. {
  190.    if (onoff)
  191.      {
  192.     if (desk.di[dsk].hl_pmap) XSetWindowBackgroundPixmap(disp,desk.di[dsk].win,desk.di[dsk].hl_pmap);
  193.     if (desk.di[dsk].hl_mask) XShapeCombineMask(disp,desk.di[dsk].win,ShapeBounding,0,0,desk.di[dsk].hl_mask,ShapeSet);
  194.      }
  195.    else
  196.      {
  197.     if (desk.di[dsk].bg_pmap) XSetWindowBackgroundPixmap(disp,desk.di[dsk].win,desk.di[dsk].bg_pmap);
  198.     if (desk.di[dsk].bg_mask) XShapeCombineMask(disp,desk.di[dsk].win,ShapeBounding,0,0,desk.di[dsk].bg_mask,ShapeSet);
  199.      }
  200.    XClearWindow(disp,desk.di[dsk].win);
  201.    XSync(disp,False);
  202. }
  203.  
  204. void MimickEwin(EWin *ewin)
  205. {
  206.    int dw,dh;
  207.    int dsk;
  208.    int w,h,j,i;
  209.    int r,g,b;
  210.    float x,y,inc;
  211.    XWindowChanges xwc;
  212.    Pixmap pmap,grab,tmp;
  213.    GC gc; 
  214.    XGCValues gcv; 
  215.    XImage *xim;
  216.    gc=XCreateGC(disp,ewin->client_win,0,&gcv);
  217.  
  218.    if (ewin->desk>=0)
  219.      dsk=ewin->desk;
  220.    else
  221.      dsk=desk.current;
  222.    if (!ewin->di_win)
  223.      {
  224.     ewin->di_win=CreateWin(desk.di[dsk].root_win,-10,-10,2,2);
  225.     XSelectInput(disp,ewin->di_win,ButtonPressMask|ButtonReleaseMask);
  226.          xwc.border_width=0;
  227.     XConfigureWindow(disp,ewin->di_win,CWBorderWidth,&xwc);
  228.      }
  229.    dw=desk.di[dsk].root_width;
  230.    dh=desk.di[dsk].root_height;
  231.    w=(ewin->frame_width*dw)/DisplayWidth(disp,screen);
  232.    h=(ewin->frame_height*dh)/DisplayHeight(disp,screen);
  233.    XReparentWindow(disp,ewin->di_win,desk.di[dsk].root_win,
  234.           (ewin->frame_x*dw)/DisplayWidth(disp,screen),
  235.           (ewin->frame_y*dh)/DisplayHeight(disp,screen));
  236.    XResizeWindow(disp,ewin->di_win,w,h);
  237.    if (ewin->state&ICONIFIED) XUnmapWindow(disp,ewin->di_win);
  238.    else XMapWindow(disp,ewin->di_win);
  239.    if (ewin->state&UNMAPPED) XUnmapWindow(disp,ewin->di_win);
  240.    if((ewin->snapshotok)&&(desk.snapshotpager)) {
  241.      /* Perhaps update a border? */
  242.      }
  243.    else if((desk.snapshotpager)&&!(ewin->state&UNMAPPED)&&
  244.        ((ewin->desk==-1)||(ewin->desk==desk.current))) 
  245.      { /* using w & h for a sizes */
  246.        tmp=XCreatePixmap(disp,ewin->client_win,ewin->client_width,h,depth); 
  247.        pmap=XCreatePixmap(disp,ewin->client_win,w,h,depth); 
  248.        xim=XGetImage(disp,ewin->client_win,0,0,ewin->client_width,ewin->client_height,0xffffffff,ZPixmap);  
  249.        if (!xim) {
  250.            /*ImlibFreePixmap(imd,grab);*/
  251.            grab=ewin->client_win;
  252.          } else {
  253.            grab=XCreatePixmap(disp,ewin->client_win,ewin->client_width,
  254.                                ewin->client_height,depth);
  255.            XPutImage(disp,grab,gc,xim,0,0,0,0,ewin->client_width,ewin->client_height);
  256.            XDestroyImage(xim);
  257.          }
  258.        inc=(float)ewin->client_height/(float)h;
  259.        j=0;
  260.        for (y=0;;y+=inc) {
  261.          i=(int)y;
  262.          if (i>=ewin->client_height) break;
  263.          XCopyArea(disp,grab,tmp,gc,0,i,ewin->client_width,1,0,j++);
  264.        }
  265.        inc=(float)ewin->client_width/(float)w;
  266.        j=0;
  267.        for (x=0;;x+=inc) {
  268.          i=(int)x;
  269.          if (i>=ewin->client_width) break;
  270.          XCopyArea(disp,tmp,pmap,gc,i,0,1,h,1+j++,1);
  271.        }                                                        
  272.  
  273.        r=255,g=255,b=255;
  274.        XSetForeground(disp,gc,ImlibBestColorMatch(imd,&r,&g,&b));
  275.        XDrawLine(disp,pmap,gc,0,0,w-1,0);
  276.        XDrawLine(disp,pmap,gc,0,0,0,h-1);
  277.        r=0,g=0,b=0;
  278.        XSetForeground(disp,gc,ImlibBestColorMatch(imd,&r,&g,&b));
  279.        XDrawLine(disp,pmap,gc,0,h-1,w-1,h-1);
  280.        XDrawLine(disp,pmap,gc,w-1,0,w-1,h-1);  
  281.        XSetWindowBackgroundPixmap(disp,ewin->di_win,pmap);
  282.        ImlibFreePixmap(imd,grab);
  283.        ImlibFreePixmap(imd,pmap);
  284.        ImlibFreePixmap(imd,tmp);
  285.        XFreeGC(disp,gc);
  286.        ewin->snapshotok=1; /* Flag so that I don't redraw unless necessary */
  287.  
  288.  
  289.      }
  290.    else /* Standard Pager */
  291.      {
  292.      if (ewin->state&SELECTED) 
  293.      {
  294.     ImlibRender(imd,desk.im_sel,w,h);
  295.     pmap=ImlibMoveImageToPixmap(imd,desk.im_sel);
  296.     if (pmap) XSetWindowBackgroundPixmap(disp,ewin->di_win,pmap);
  297.     ImlibFreePixmap(imd,pmap);
  298.     pmap=ImlibMoveMaskToPixmap(imd,desk.im_sel);
  299.     if (pmap) XShapeCombineMask(disp,ewin->di_win,ShapeBounding,0,0,pmap,ShapeSet);
  300.     ImlibFreePixmap(imd,pmap);
  301.     XClearWindow(disp,ewin->di_win);
  302.      }
  303.    else 
  304.      {
  305.     ImlibRender(imd,desk.im_unsel,w,h);
  306.     pmap=ImlibMoveImageToPixmap(imd,desk.im_unsel);
  307.     if (pmap) XSetWindowBackgroundPixmap(disp,ewin->di_win,pmap);
  308.     ImlibFreePixmap(imd,pmap);
  309.     pmap=ImlibMoveMaskToPixmap(imd,desk.im_unsel);
  310.     if (pmap) XShapeCombineMask(disp,ewin->di_win,ShapeBounding,0,0,pmap,ShapeSet);
  311.     ImlibFreePixmap(imd,pmap);
  312.     XClearWindow(disp,ewin->di_win);
  313.      }
  314.      }
  315.    XSync(disp,False);
  316. }
  317.  
  318. int WindowIsDeskInfo(Window win)
  319. {
  320.    int i;
  321.    
  322.    if (!win) return -1;
  323.    for(i=0;i<MAX_DESKS;i++)
  324.      if ((win==desk.di[i].root_win)||(win==desk.di[i].win)) return i;
  325.    return -1;
  326. }
  327.  
  328. EWin *WindowIsDeskInfoWin(Window win)
  329. {
  330.    struct list *ptr;
  331.    
  332.    ptr=global_l->first;
  333.    while (ptr)
  334.      {
  335.     if (ptr->win->di_win==win) return ptr->win;
  336.     ptr=ptr->next;
  337.      }
  338.    return NULL;
  339. }
  340.  
  341. void StartIconDrag(EWin *ewin) {
  342. /* This code was modified by CmdrTaco to allow the windows
  343. ** to behave friendlier.  These changes include moving windows
  344. ** on a desktop, and the icon_win is now sized relative
  345. ** to it's size on the pager, instead of relative to the pixmap
  346. ** size.     7/5/97
  347. */
  348.     Window w1,w2;
  349.     XEvent xev;
  350.     int sx,sy,xx,yy, wx,wy; /* my, mx; */
  351.     int dsk;
  352.     Window r;
  353.     unsigned int  wr, dui, hr, br, dr;
  354.     int dx, dy,tx,ty,rx,ry,d;
  355.  
  356.     if (ewin->state&ICONIFIED) {
  357.         DelIcon(ewin->icon->win);
  358.         Msg_DeIconify(ewin);
  359.     }    
  360.  
  361.     XSetInputFocus(disp,root,RevertToNone,CurrentTime);
  362.     XGetGeometry(disp, ewin->di_win, &r , &rx, &ry, &wr, &hr, &br, &dr);
  363.     XUnmapWindow(disp,ewin->di_win);
  364.  
  365.     XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&wx,&wy,&dui);
  366.     if ((w2==icfg.bg_win)||(ListGetWinID(global_l,w2))) {
  367.         XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&wx,&wy,&dui);
  368.         wx=wr/2;
  369.         wy=hr/2;
  370.         XReparentWindow(disp,ewin->di_win,root,sx-wx,sy-wy);
  371.     } else {
  372.         XQueryPointer(disp,ewin->di_win,&w1,&w2,&sx,&sy,&wx,&wy,&dui); 
  373.         XReparentWindow(disp,ewin->di_win,root,sx-wx,sy-wy);
  374.     }
  375.  
  376.     XGrabServer(disp);
  377.     XGrabPointer(disp,ewin->di_win,True, ButtonMotionMask|PointerMotionMask|ButtonReleaseMask, GrabModeAsync,GrabModeAsync,None,None,CurrentTime);
  378.     XSync(disp,False);
  379.  
  380.     for(;;) {
  381.          XRaiseWindow(disp,ewin->di_win);
  382.         XMapWindow(disp,ewin->di_win);
  383.         XMoveWindow(disp,ewin->di_win,sx-wx,sy-wy);
  384.  
  385.         XSync(disp,False);  
  386.  
  387.         XMaskEvent(disp,ButtonMotionMask|PointerMotionMask|ButtonReleaseMask,&xev);
  388.         XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&xx,&yy,&dui);
  389.         if (xev.type==ButtonRelease) {
  390.             XUnmapWindow(disp,ewin->di_win);
  391.             XSync(disp,False);
  392.             XUngrabPointer(disp, CurrentTime);
  393.             XUngrabServer(disp);
  394.             XQueryPointer(disp,root,&w1,&w2,&sx,&sy,&d,&d,&dui);
  395.             if ((dsk=WindowIsDeskInfo(w2))>=0) {
  396.                 ewin->snapshotok=0;
  397.                 MoveEwinToDesk(ewin,dsk);
  398.                 /* Move the Ewin to match location on pager */
  399.                 XGetGeometry(disp,desk.di[dsk].root_win,&r,&rx,&ry,&wr,&hr,&br,&dr);
  400.                 dx=DisplayWidth(disp,screen)/wr;
  401.                 dy=DisplayHeight(disp,screen)/hr;    
  402.  
  403.                 tx=dx*((sx-wx)-rx);
  404.                 ty=dy*((sy-wy)-ry);
  405.                 ModifyEWin(ewin,tx,ty,ewin->client_width,ewin->client_height);
  406.                 /*Do_RaiseWin(ewin);*/
  407.  
  408.             } else {
  409.                 if (w2==icfg.bg_win) /* Dragged off to Iconbox */ {
  410.                     if (!(ewin->state&ICONIFIED))
  411.                         Do_IconifyWin(ewin);
  412.                 } else /* Dragged off to desktop */ {
  413.                     ModifyEWin(ewin,(sx-wx-(ewin->frame_width/2)), (sy-wy-(ewin->frame_height/2)), ewin->client_width, ewin->client_height);
  414.                     MoveEwinToDesk(ewin,desk.current);
  415.                     MimickEwin(ewin);
  416.                 }
  417.             }
  418.             return;
  419.         }
  420.     }
  421. }
  422.