Guest User

Untitled

a guest
Aug 8th, 2012
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 66.71 KB | None | 0 0
  1. /*
  2. * move/resize resize/move
  3.  * autotile
  4.  * auto trans
  5.  * diff layout per desktop
  6.  * untile
  7.  * delete actual desktop
  8.  * layout from file*/
  9.  
  10. #include <assert.h>  
  11. #include <X11/Xutil.h>
  12. #include <X11/keysym.h>
  13. #include <stdlib.h>
  14. #include <unistd.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <locale.h>
  18. #include <X11/Xlib.h>
  19. #include <X11/Xatom.h>
  20. #include <X11/cursorfont.h>
  21. #include <X11/Xmu/WinUtil.h>
  22. #include <glib.h>
  23. #include <X11/extensions/XTest.h>
  24. #include <X11/Xmu/Error.h>
  25. #define MAX_PROPERTY_VALUE_LEN 4096
  26. #define HELP "ctrlwm \n" \
  27. "App for automatic positioning and resizing of 1-9 windows\n" \
  28. "\n" \
  29. "Usage: ctrlwm [Action]...\n" \
  30. "  -rc            Read .rc file\n" \
  31. "  -gui           Start gui\n" \
  32. "Actions:\n" \
  33. "  -t  [Options]  Tile windows with active as main/biggest window    \n" \
  34. "  -v  [Options]  Tile windows in vertical stripes   \n" \
  35. "  -h  [Options]  Tile windows in horizontal stripes     \n" \
  36. "  -g  [Options]  Choose windows for tiling (Doubleclick last window to execute ) \n" \
  37. "  -m  [Options]  Maximize active       \n" \
  38. "  -n             Next window (like alt+esc, without bugs/features)\n" \
  39. "  -s  [-o]       Place active depending on mouse window border \n"\
  40. "                 - similar to aero snap \n" \
  41. "  -snap [-o]     Some sort of experimental snap \n" \
  42. "  -z  [-o]       Place active with placement/size depending on mouse position \n"\
  43. "      [-b]       Add moving windows to another workspace (bottom of screen)\n" \
  44. "      [-u]       Show sectors on screen    \n" \
  45. "  -e             Go on empty workspace.If none available, create one       \n" \
  46. "  -d             Delete last workspace     \n" \
  47. "  -i             Print some info   \n" \
  48. "  -k             Daemon Mode screen corner/border actions\n" \
  49. "  -r             Daemon Mode Auto-raise active window\n" \
  50. "Options:\n" \
  51. "  -p             Tile windows in order opened  \n" \
  52. "  -a             Use alternative layout for tiling \n" \
  53. "  -w             Tile minimized too    \n" \
  54. "  -o             Offset top/bottom/left/right   (-o XX XX XX XX)\n"\
  55. "  -f             Auto offset 1-3  (-f X)\n" \
  56. "  -c             Exclude selected window from tiling   \n"\
  57. "  -mn            Window decoration offset  (-mn XX XX)\n" \
  58. "\n" \
  59. "\n" \
  60. "Hints:\n" \
  61. "If Windows overlap with tiling, you have to try out different values for -mn\n" \
  62. "Default is -mn 12 29\n" \
  63. "Use the software with key shortcuts, mouse strokes or panel starters\n" \
  64. "\n" \
  65. "\n" \
  66. "Author, current maintainer: zlatko kartelo\n" \
  67. "Some code taken from wmctrl \n" \
  68. "Released under the GNU General Public License.\n" \
  69. "Copyright (C) 2009/2010\n"
  70. Window wcount;
  71. char *version="0.6.0.5";
  72. int i;
  73. float win_pm [9][4];
  74. char cornerNW [512];
  75. char cornerSW [512];
  76. char cornerNE [512];
  77. char cornerSE [512];
  78. char borderN [512];
  79. char borderS [512];
  80. char borderW [512];
  81. char borderE [512];
  82. /*window related */
  83. int winondesk=1;
  84. int winl [20]={0}; /*desk window list*/
  85. int activewin;
  86. int tmp_win_1, tmp_win_2;
  87. int winsnc[20][6]={{0}}; /*window old dimensions*/
  88. /*desk related */
  89. int nmbrdesks;
  90. int activedesk;
  91. int dskrw, dskrh;
  92. int dskww, dskwh;
  93. float dskcw, dskch;
  94. int deskZx, deskZy;
  95. /*options*/
  96. int dcw=12; /*decoration width*/
  97. int dch=29; /*decoration height*/
  98. int alternative_layout=0;
  99. int offset_auto=0;
  100. int tilewindowsoorder=0;
  101. int screen_sec=0;
  102. int tile_min_win=0;
  103. int tile_stripes=0;
  104. int tile_vert=0;
  105. int win_max=0;
  106. int win_move_desk=0;
  107. int win_exclude=0;
  108. unsigned int offset_top=0,offset_bottom=0,offset_left=0,offset_right=0;
  109. Window secwin;
  110. unsigned char get_xchar(void);
  111. int WIN_HEIGHT, WIN_WIDTH;
  112. int BUTHEIGHT=40;
  113. int BUTWIDTH,BUTTON1_X,BUTTON1_Y,BUTTON2_X,BUTTON2_Y,BUTTON3_X,BUTTON3_Y,
  114.     BUTTON4_X,BUTTON4_Y;
  115. unsigned char stillused;
  116. unsigned char toberefreshed;
  117. unsigned char cpslock;
  118. int mousex;
  119. int mousey;
  120. unsigned char clicked;
  121. unsigned char rightclicked;
  122. unsigned char typedchar;
  123. Display *display;
  124. int screen_num;
  125. Window win;
  126. XFontStruct *font_info;
  127. GC black_gc, color_gc, text_gc;
  128. XGCValues gc_values;
  129. unsigned long gc_valuemask = 0;
  130. XColor color_info;
  131. unsigned int color_table[256];
  132. unsigned short color_data[256][3];
  133. char *display_name = NULL;
  134. char *window_name = "ctrlwm";
  135. XTextProperty wname;
  136. char *font_name = "10x20";
  137. XEvent event;
  138. KeySym keysym;
  139.  
  140. int  Graphics_init ( unsigned int, unsigned int );
  141. void Graphics_shutdown ();
  142. void refresh();
  143. void Menu_gui ();
  144. void trans ();
  145. void Prepare_tile ();
  146. void Tile ();
  147. void Place_window ();  
  148. void Place_window_sugg ();
  149. void Place_sm_window_sugg ();
  150. void Print_screen_sections ();
  151. void Print_screen_menu ();
  152. void Tile_menu();
  153. void Exchange_active ();   
  154. void Exchange_select ();
  155. void Stripe_wins();
  156. void Get_info_desk ();
  157. void Get_info_active ();
  158. void Get_info_win_desk ();
  159. void Sort_list ();
  160. void Sort_list_xchg ();
  161. void Max_remove ();
  162. void Min_remove ();
  163. void Win_raise ();
  164. void Print_info ();
  165. void Print_info_t ();
  166. void Empty_desk ();
  167. void Del_desk ();
  168. static int Client_msg(Display *disp, Window win, char *msg,
  169.            unsigned long data0, unsigned long data1,unsigned long data2,
  170.            unsigned long data3, unsigned long data4);
  171. static Window Get_active_window(Display *disp);
  172. static gchar *Get_property (Display *disp, Window win,
  173.               Atom xa_prop_type, gchar *prop_name, unsigned long *size);
  174. static Window *Get_client_list (Display *disp, unsigned long *size);
  175. static Window Select_Window(Display *disp);
  176. void Mouse_daemon ();
  177. void Next_win ();
  178. void Auto_raise_active ();
  179. void Auto_op_win ();
  180. void Tile_choose_win();
  181. void Count_win (char *label);
  182. void Refresh_count (char *label);
  183. void Read_rc ();
  184. void Get_win_layout ();
  185. void ReadDim ();
  186. void LinSnap ();
  187. void Unsnap ();
  188.  
  189. int main (int argc, char *argv[])
  190. {XSetErrorHandler(XmuSimpleErrorHandler);
  191. Get_info_desk ();
  192. Get_info_win_desk ();
  193. Get_info_active ();
  194. /*Read_rc ();*/
  195. for (i = 1; i < argc; i++)  
  196.   {
  197.     if (strcmp(argv[i], "--help") == 0) {fputs(HELP, stdout);return 1;}
  198.     if (strcmp(argv[i], "-c") == 0) {win_exclude=1;}    
  199.     if (strcmp(argv[i], "-p") == 0) {tilewindowsoorder=1;}
  200.     if (strcmp(argv[i], "-w") == 0) {tile_min_win=1;}
  201.     if (strcmp(argv[i], "-a") == 0) {alternative_layout=1;}
  202.     if (strcmp(argv[i], "-u") == 0) {screen_sec=1;}
  203.     if (strcmp(argv[i], "-b") == 0) {win_move_desk=1;}
  204.     if (strcmp(argv[i], "-o") == 0)
  205.        {
  206.        if (i + 4 <= argc - 1)
  207.           {
  208.           i++;offset_top=atoi(argv[i]);i++;offset_bottom=atoi(argv[i]);
  209.           i++;offset_left=atoi(argv[i]);i++;offset_right=atoi(argv[i]);
  210.           }
  211.         }
  212.     if (strcmp(argv[i], "-f") == 0)
  213.        {if (i + 1 <= argc - 1){i++;offset_auto = atoi(argv[i]);}}
  214.     if (strcmp(argv[i], "-mn") == 0)
  215.        {if (i+2<=argc-1){i++;dcw=atoi(argv[i]);i++; dch = atoi(argv[i]);}}
  216.   }
  217. for (i = 1; i < argc; i++)  
  218.   {
  219.     if (strcmp(argv[i], "-rc") == 0) {Read_rc ();}
  220.   }
  221. for (i = 1; i < argc; i++)  
  222.   {
  223.     if (strcmp(argv[i], "-t") == 0) {Prepare_tile ();return 0;}
  224.     if (strcmp(argv[i], "-q") == 0) {Tile_menu ();return 0;}
  225.     if (strcmp(argv[i], "-m") == 0) {win_max=1;Prepare_tile ();return 0;}
  226.     if (strcmp(argv[i], "-n") == 0) {Next_win ();return 0;}
  227.     if (strcmp(argv[i], "-h") == 0) {tile_stripes=1;Prepare_tile ();return 0;}  
  228.     if (strcmp(argv[i], "-v") == 0) {tile_vert=1;tile_stripes=1;Prepare_tile ();return 0;}  
  229.     if (strcmp(argv[i], "-s") == 0) {Place_window ();return 0;}    
  230.     if (strcmp(argv[i], "-z") == 0) {Place_window_sugg ();return 0;}    
  231.     if (strcmp(argv[i], "-e") == 0) {Empty_desk();return 0;}
  232.     if (strcmp(argv[i], "-d") == 0) {Del_desk();return 0;}
  233.     if (strcmp(argv[i], "-x") == 0) {Exchange_active ();return 0;}
  234.     if (strcmp(argv[i], "-y") == 0) {Exchange_select ();return 0;}
  235.     if (strcmp(argv[i], "-i") == 0) {Print_info_t ();return 0;}
  236.     if (strcmp(argv[i], "-k") == 0) {Mouse_daemon ();return 0;}
  237.     if (strcmp(argv[i], "-r") == 0) {Auto_raise_active ();return 0;}
  238.     if (strcmp(argv[i], "-g") == 0) {Tile_choose_win ();return 0;}
  239.     if (strcmp(argv[i], "-gui") == 0) {Menu_gui ();return 0;}
  240.     if (strcmp(argv[i], "-snap") == 0) {LinSnap ();return 0;}
  241.   }
  242. fputs(HELP, stdout);
  243. return 1;
  244. }
  245.  
  246. void Read_rc ()
  247. {
  248. FILE *fp=fopen(".ctrlwm.rc","r");
  249. char var [512],value[512],line[512];
  250.   if (fp)
  251.      {
  252.       while (fgets(line,sizeof(line),fp))
  253.              {
  254.               memset (var,0,sizeof(var));
  255.               memset (value,0,sizeof(value));
  256.               sscanf(line,"%[^'=']=%[^\' '\n]%*[\t]%*[\t]",var,value);
  257.               if (strcmp (var, "dcw")==0){dcw=atoi (value);}
  258.               if (strcmp (var, "dch")==0){dch=atoi (value);}
  259.               if (strcmp (var, "alternative_layout")==0){alternative_layout=atoi (value);}
  260.               if (strcmp (var, "tilewindowsoorder")==0){tilewindowsoorder=atoi (value);}
  261.               if (strcmp (var, "tile_min_win")==0){tile_min_win=atoi (value);}
  262.               if (strcmp (var, "tile_vert")==0){tile_vert=atoi (value);}
  263.               if (strcmp (var, "tile_stripes")==0){tile_stripes=atoi (value);}
  264.               if (strcmp (var, "offset_top")==0){offset_top=atoi (value);}
  265.               if (strcmp (var, "offset_bottom")==0){offset_bottom=atoi (value);}
  266.               if (strcmp (var, "offset_left")==0){offset_left=atoi (value);}
  267.               if (strcmp (var, "offset_right")==0){offset_right=atoi (value);}
  268.               if (strcmp (var, "screen_sec")==0){screen_sec=atoi (value);}
  269.               if (strcmp (var, "win_move_desk")==0){win_move_desk=atoi (value);}
  270.               if (strcmp (var, "gui_button_height")==0){BUTHEIGHT=atoi (value);}
  271.               sscanf(line,"%[^'=']=%[^\'#'\n]%*[\t]%*[\t]",var,value);  
  272.               if (strcmp (var, "cornerNW")==0){for( i=0;i<100;i++){cornerNW[i]=value[i];}}
  273.               if (strcmp (var, "cornerSW")==0){for( i=0;i<512;i++){cornerSW[i]=value[i];}}
  274.               if (strcmp (var, "cornerNE")==0){for( i=0;i<512;i++){cornerNE[i]=value[i];}}
  275.               if (strcmp (var, "cornerSE")==0){for( i=0;i<512;i++){cornerSE[i]=value[i];}}
  276.               if (strcmp (var, "borderN")==0){for( i=0;i<512;i++){borderN[i]=value[i];}}
  277.               if (strcmp (var, "borderS")==0){for( i=0;i<512;i++){borderS[i]=value[i];}}
  278.               if (strcmp (var, "borderW")==0){for( i=0;i<512;i++){borderW[i]=value[i];}}
  279.               if (strcmp (var, "borderE")==0){for( i=0;i<512;i++){borderE[i]=value[i];}}
  280.               }
  281.       fclose (fp);
  282.       }
  283. return ;
  284. }
  285.  
  286. void Tile ()
  287. {
  288. int ow=deskZx+0;
  289. int oh=deskZy+0;
  290. Display *disp;
  291. disp = XOpenDisplay(NULL);
  292. /*Modify values if option*/
  293. dskch=dskch-offset_bottom;oh=deskZy+offset_top;dskch=dskch-offset_top;
  294. dskcw=dskcw-offset_right;ow=deskZx+offset_left;dskcw=dskcw-offset_left;
  295.   switch (offset_auto)
  296.     {
  297.     case 0:
  298.     break;
  299.     case 1:
  300.     ow=deskZx+dskcw/4;oh=deskZy+dskch/4;dskcw=dskcw/4*3;dskch=dskch/4*3;break;
  301.     case 2:
  302.     ow=deskZx+dskcw/3;oh=deskZy+dskch/3;dskcw=dskcw/3*2;dskch=dskch/3*2;break;
  303.     case 3:
  304.     ow=deskZx+dskcw/2;oh=deskZy+dskch/2;dskcw=dskcw/2;dskch=dskch/2;break;
  305.     }
  306. /*Place & resize the windows*/
  307. Get_win_layout ();
  308.   for (i =1; i < winondesk+1; i++)
  309.    {XMoveResizeWindow(disp,winl[i],(dskcw*win_pm [i-1][0])+ow,(dskch*win_pm [i-1][1])+oh,
  310.                                    (win_pm [i-1][2]*dskcw)-dcw,(win_pm [i-1][3]*dskch)-dch);
  311.    }
  312. XCloseDisplay(disp);return;
  313. }
  314.  
  315. void Mouse_daemon ()
  316. {
  317. Display *dpy;
  318. Window root;
  319. Window ret_root;
  320. Window ret_child;
  321. int root_x=10;
  322. int root_y=10;
  323. int win_x;
  324. int win_y;
  325. unsigned int mask;
  326. dpy = XOpenDisplay(NULL);
  327. root = XDefaultRootWindow(dpy);
  328.  
  329.   while ((root_x>6) & (root_y>6)& (root_x<(dskcw-6)) & (root_y<(dskch-6)) )
  330.   {
  331.     if(XQueryPointer(dpy, root, &ret_root, &ret_child, &root_x, &root_y,
  332.                      &win_x, &win_y, &mask))
  333.       {usleep (20000);}
  334.   }
  335.  /*corners*/
  336.  if ((root_x<(6)) & (root_y<(6)))
  337.     {system (cornerNW);}   
  338.  if ((root_x>(dskrw-6)) & (root_y<(6)))
  339.     {system (cornerNE);}
  340.  if ((root_x<(6)) & (root_y>(dskrh-6)))
  341.     {system (cornerSW);}
  342.  if ((root_x>(dskrw-6)) & (root_y>(dskrh-6)))
  343.     {system (cornerSE);}
  344.  /*borders*/
  345.  if ((root_x>((dskrw/8))) & (root_x<(dskrw-(dskrw/8))) & (root_y<(6)))
  346.     {system (borderN);}
  347.  if ((root_x>((dskrw/8))) & (root_x<(dskrw-(dskrw/8))) & (root_y>(dskrh-6)))
  348.     {system (borderS);}
  349.  if ((root_x<(6)) & (root_y>((dskrh/8))) & (root_y<(dskrh-(dskrh/8))))
  350.     {system (borderW);}
  351.  if ((root_x>(dskrw-6)) & (root_y>((dskrh/8))) & (root_y<(dskrh-(dskrh/8))))
  352.     {system (borderE);}
  353. XCloseDisplay(dpy);
  354. Mouse_daemon ();
  355. }
  356.  
  357. void Prepare_tile ()
  358. {
  359.  Get_info_desk ();
  360. Get_info_win_desk ();
  361. Get_info_active ();
  362.   if (!tilewindowsoorder){Sort_list();};
  363.   if (win_exclude)
  364.     {
  365.     Display *disp;
  366.     disp = XOpenDisplay(NULL);
  367.     tmp_win_1=Select_Window(disp);
  368.     tmp_win_2=winl[winondesk];
  369.     XCloseDisplay(disp);
  370.     Sort_list_xchg();
  371.     };
  372.   if (win_max){winondesk=1;};
  373.   Max_remove ();
  374.   if (tile_min_win){Win_raise ();Min_remove ();};
  375.   if (win_exclude){winondesk=winondesk-1;Win_raise ();Min_remove ();};
  376.   if (tile_stripes){Stripe_wins();return;};
  377. Tile ();    
  378. return;
  379. }
  380.  
  381. void Place_window ()
  382. {
  383. int ow=deskZx+0;
  384. int oh=deskZy+0;
  385. Sort_list();
  386. activewin=winl[1];
  387. if (winondesk==0) {return;}
  388. Display *disp;
  389. disp = XOpenDisplay(NULL);
  390. Client_msg(disp, activewin, "_NET_ACTIVE_WINDOW",
  391.             0, 0, 0, 0, 0);
  392. Client_msg(disp, activewin, "_NET_WM_STATE",
  393.            XInternAtom(disp,"_NET_WM_STATE_REMOVE",False) ,
  394.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_VERT",False),
  395.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_HORZ",False),0,0);
  396. XCloseDisplay(disp);
  397.     Display *dpy;
  398.     Window root;
  399.     Window ret_root;
  400.     Window ret_child;
  401.     int root_x=10;
  402.     int root_y=10;
  403.     int win_x;
  404.     int win_y;
  405.     unsigned int mask;
  406.     dpy = XOpenDisplay(NULL);
  407.     root = XDefaultRootWindow(dpy);
  408. /*pointer feedback*/
  409. int status;
  410. Cursor cursor;
  411. cursor = XCreateFontCursor(dpy, XC_crosshair);
  412. status = XGrabPointer(dpy, root, False,ButtonPressMask|ButtonReleaseMask,
  413.                       GrabModeSync,GrabModeAsync, root, cursor, CurrentTime);
  414.   if (status != GrabSuccess)
  415.     {
  416.      fputs("ERROR: Cannot grab mouse.\n", stderr);
  417.      return ;
  418.     }
  419. XAllowEvents(dpy, SyncPointer, CurrentTime);
  420. /*pointer feedback end -set this when no longer needed- XUngrabPointer(disp, CurrentTime);*/
  421. while ((root_x>3) & (root_y>3)& (root_x<(dskrw-3)) & (root_y<(dskrh-3)) )
  422.   {
  423.   if(XQueryPointer(dpy, root, &ret_root, &ret_child, &root_x, &root_y,
  424.                    &win_x, &win_y, &mask))
  425.     {
  426.     if (mask & (Button1Mask)){return;}
  427.     Display *disp;
  428.     disp = XOpenDisplay(NULL);
  429.     XMoveResizeWindow(disp,activewin,root_x,root_y,300,200);
  430.     XCloseDisplay(disp);
  431.     }
  432.   }
  433. dskch=dskch-offset_bottom;oh=deskZy+offset_top;dskch=dskch-offset_top;
  434. dskcw=dskcw-offset_right;ow=deskZx+offset_left;dskcw=dskcw-offset_left;
  435.  if ((root_x>(dskrw-3)))
  436.     {disp = XOpenDisplay(NULL);XMoveResizeWindow(disp,activewin,(dskcw/2)+ow,0+oh,
  437.                                                 (dskcw/2)-dcw,dskch-dch);}
  438.  if ((root_x<3))
  439.     {disp = XOpenDisplay(NULL);XMoveResizeWindow(disp,activewin,0+ow,0+oh,
  440.                                                 (dskcw/2)-dcw,dskch-dch);}
  441.  if ((root_y<3))
  442.     {disp = XOpenDisplay(NULL);XMoveResizeWindow(disp,activewin,0+ow,0+oh,
  443.                                                 (dskcw)-dcw,(dskch/2)-dch);}
  444.  if ((root_y>(dskrh-3)))
  445.     {disp = XOpenDisplay(NULL);XMoveResizeWindow(disp,activewin,0+ow,(dskch/2)+oh,
  446.                                                 (dskcw)-dcw,(dskch/2)-dch);}
  447. XCloseDisplay(disp); XUngrabPointer(dpy, CurrentTime);return ;
  448. }
  449.  
  450. void Place_window_sugg ()
  451. {
  452. int ow=deskZx+0;
  453. int oh=deskZy+0;
  454. if (winondesk==0) {return;}
  455. Sort_list();
  456. activewin=winl[1];
  457. Display *disp;
  458. disp = XOpenDisplay(NULL);
  459. Client_msg(disp, activewin, "_NET_ACTIVE_WINDOW",0,0,0,0,0);
  460. Client_msg(disp, activewin, "_NET_WM_STATE",
  461.            XInternAtom(disp,"_NET_WM_STATE_REMOVE",False) ,
  462.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_VERT",False),
  463.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_HORZ",False),0,0);
  464. XCloseDisplay(disp);
  465.     Display *dpy;
  466.     Window root;
  467.     Window ret_root;
  468.     Window ret_child;
  469.     int root_x=10;
  470.     int root_y=10;
  471.     int win_x;
  472.     int win_y;
  473.     unsigned int mask;
  474.     dpy = XOpenDisplay(NULL);
  475.     root = XDefaultRootWindow(dpy);
  476.  dskwh=dskch;
  477.  dskww=dskcw;
  478. dskch=dskch-offset_bottom;oh=deskZy+offset_top;dskch=dskch-offset_top;
  479. dskcw=dskcw-offset_right;ow=deskZx+offset_left;dskcw=dskcw-offset_left;
  480. /*pointer feedback*/
  481. int status;
  482. Cursor cursor;
  483. cursor = XCreateFontCursor(disp, XC_crosshair);
  484. status = XGrabPointer(disp, root, False,ButtonPressMask|ButtonReleaseMask,
  485.                       GrabModeSync,GrabModeAsync, root, cursor, CurrentTime);
  486.   if (status != GrabSuccess)
  487.     {
  488.      fputs("ERROR: Cannot grab mouse.\n", stderr);
  489.      return ;
  490.     }
  491. XAllowEvents(disp, SyncPointer, CurrentTime);
  492. /*pointer feedback end -set this when no longer needed- XUngrabPointer(disp, CurrentTime);*/
  493.  
  494.   if (screen_sec) {Print_screen_sections ();}
  495. while (1)
  496.   {
  497.  
  498.   if(XQueryPointer(dpy, root, &ret_root, &ret_child, &root_x, &root_y,
  499.                    &win_x, &win_y, &mask))
  500.     {
  501.     if (mask & (Button1Mask)){if (screen_sec) {Print_screen_sections ();};return;}
  502.     Display *disp;
  503.     disp = XOpenDisplay(NULL);
  504.     /*CenterVerticalB*/
  505.     if ((root_x>((dskww/16)*7)+ow) & (root_x<((dskww/16)*8)+ow)& (root_y>((dskwh/16)*7)+oh) & (root_y<((dskwh/16)*9)+oh))
  506.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(((dskcw/4)*3)-dcw),dskch-dch);}
  507.     if ((root_x>((dskww/16)*8)+ow) & (root_x<((dskww/16)*9)+ow)& (root_y>((dskwh/16)*7)+oh) & (root_y<((dskwh/16)*9)+oh))
  508.     {XMoveResizeWindow(disp,activewin,(dskcw/4)+ow,0+oh,(((dskcw/4)*3)-dcw),dskch-dch);}
  509.     /*CenterHorizontalB*/
  510.     if ((root_x>((dskww/16)*7)+ow) & (root_x<((dskww/16)*9)+ow)& (root_y>((dskwh/16)*6)+oh) & (root_y<((dskwh/16)*7)+oh))
  511.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(dskcw-dcw),((dskch/4)*3)-dch);}
  512.     if ((root_x>((dskww/16)*7)+ow) & (root_x<((dskww/16)*9)+ow)& (root_y>((dskwh/16)*9)+oh) & (root_y<((dskwh/16)*10)+oh))
  513.     {XMoveResizeWindow(disp,activewin,0+ow,(dskch/4)+oh,(dskcw-dcw),((dskch/4)*3)-dch);}
  514.     /*CenterVertical*/
  515.     if ((root_x>((dskww/16)*9)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  516.     {XMoveResizeWindow(disp,activewin,((dskcw/2))+ow,0+oh,((dskcw/2)-dcw),dskch);}
  517.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/16)*7)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  518.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,((dskcw/2)-dcw),dskch);}
  519.     /*CenterHorizontal*/
  520.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*3)+oh))
  521.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(dskcw-dcw),(dskch/2)-dch);}
  522.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*5)+oh) & (root_y<((dskwh/8)*6)+oh))
  523.     {XMoveResizeWindow(disp,activewin,0+ow,(dskch/2)+oh,(dskcw-dcw),(dskch/2)-dch);}
  524.     /*EastWestVertical*/
  525.     if ((root_x>((dskww/8)*2)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*4)+oh))
  526.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,((dskcw/2)-dcw),(dskch/2)-dch);}
  527.     if ((root_x>((dskww/8)*2)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*4)+oh) & (root_y<((dskwh/8)*6)+oh))
  528.     {XMoveResizeWindow(disp,activewin,0+ow,(dskch/2)+oh,((dskcw/2)-dcw),(dskch/2)-dch);}
  529.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*6)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*4)))
  530.     {XMoveResizeWindow(disp,activewin,((dskcw/2)-dcw)+ow,0+oh,((dskcw/2)-dcw),(dskch/2)-dch);}
  531.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*6)+ow)& (root_y>((dskwh/8)*4)+oh) & (root_y<((dskwh/8)*6)))
  532.     {XMoveResizeWindow(disp,activewin,((dskcw/2)-dcw)+ow,(dskch/2)+oh,((dskcw/2)-dcw),(dskch/2)-dch);}
  533.     /*MiddleCross*/
  534.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*1)+oh) & (root_y<((dskwh/8)*2)+oh))
  535.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*1)-dcw)+ow,0+oh,((dskcw/8)*6)-dcw,((dskch/8)*2)-dch);}
  536.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*6)+oh) & (root_y<((dskwh/8)*7)+oh))
  537.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*1)-dcw)+ow,((dskch/8)*6)+oh,((dskcw/8)*6)-dcw,((dskch/8)*2)-dch);}
  538.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*2)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  539.     {XMoveResizeWindow(disp,activewin,0+ow,((dskch/8)*1)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*6)-dch);}
  540.     if ((root_x>((dskww/8)*6)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  541.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,((dskch/8)*1)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*6)-dch);}
  542.     /*CornersMiddleScreen*/
  543.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*1)+oh) & (root_y<((dskwh/8)*2)+oh))
  544.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  545.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*1)+oh) & (root_y<((dskwh/8)*2)+oh))
  546.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*4))+ow,0+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  547.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*6)+oh) & (root_y<((dskwh/8)*7)+oh))
  548.     {XMoveResizeWindow(disp,activewin,0+ow,((dskch/8)*6)+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  549.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*6)+oh) & (root_y<((dskwh/8)*7)+oh))
  550.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*4))+ow,((dskch/8)*6)+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  551.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*2)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*3)+oh))
  552.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  553.     if ((root_x>((dskww/8)*6)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*3)+oh))
  554.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,0+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  555.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*2)+ow)& (root_y>((dskwh/8)*5)+oh) & (root_y<((dskwh/8)*6)+oh))
  556.     {XMoveResizeWindow(disp,activewin,0+ow,((dskch/8)*4)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  557.     if ((root_x>((dskww/8)*6)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*5)+oh) & (root_y<((dskwh/8)*6)+oh))
  558.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,((dskch/8)*4)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  559.     /*NorthEdge*/
  560.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*0)+oh) & (root_y<((dskwh/8)*1)+oh))
  561.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*0)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*1)-dch);}
  562.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*0)+oh) & (root_y<((dskwh/8)*1)+oh))
  563.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*0)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*2)-dch);}
  564.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*0)+oh) & (root_y<((dskwh/8)*1)+oh))
  565.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*2))+ow,((dskch/8)*0)+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  566.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*0)+oh) & (root_y<((dskwh/8)*1)+oh))
  567.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*5)+ow,((dskch/8)*0)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*2)-dch);}
  568.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*0)+oh) & (root_y<((dskwh/8)*1)+oh))
  569.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*5)+ow,((dskch/8)*0)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*1)-dch);}
  570.     /*SouthEdge*/
  571.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*7)+oh) & (root_y<(((dskwh/8)*8)+oh)))
  572.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*7)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*1)-dch);}
  573.     if ((root_x>((dskww/8)*1)+ow) & (root_x<((dskww/8)*3)+ow)& (root_y>((dskwh/8)*7)+oh) & (root_y<((dskwh/8)*7.5)+oh))
  574.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*7)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*2)-dch);}
  575.     if ((root_x>((dskww/8)*3)+ow) & (root_x<((dskww/8)*5)+ow)& (root_y>((dskwh/8)*7)+oh) & (root_y<((dskwh/8)*7.5)+oh))
  576.     {XMoveResizeWindow(disp,activewin,(((dskcw/8)*2))+ow,((dskch/8)*7)+oh,(((dskcw/8)*4)-dcw),((dskch/8)*2)-dch);}
  577.     if ((root_x>((dskww/8)*5)+ow) & (root_x<((dskww/8)*7)+ow)& (root_y>((dskwh/8)*7)+oh) & (root_y<((dskwh/8)*7.5)+oh))
  578.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*5)+ow,((dskch/8)*7)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*2)-dch);}
  579.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*7)+oh) & (root_y<(((dskwh/8)*8)+oh)))
  580.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*5)+ow,((dskch/8)*7)+oh,(((dskcw/8)*3)-dcw),((dskch/8)*1)-dch);}
  581.     /*LeftEdge*/
  582.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*1)+oh) & (root_y<((dskwh/8)*2)+oh))
  583.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*0)+oh,(((dskcw/8)*1)-dcw),((dskch/8)*2)-dch);}
  584.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*3)+oh))
  585.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*0)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*2)-dch);}
  586.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  587.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*2)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  588.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*5)+oh) & (root_y<((dskwh/8)*6)+oh))
  589.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*6)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*2)-dch);}
  590.     if ((root_x>((dskww/8)*0)+ow) & (root_x<((dskww/8)*1)+ow)& (root_y>((dskwh/8)*6)+oh) & (root_y<((dskwh/8)*7)+oh))
  591.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*0)+ow,((dskch/8)*6)+oh,(((dskcw/8)*1)-dcw),((dskch/8)*2)-dch);}
  592.     /*RightEdge*/
  593.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*1)+oh) & (root_y<((dskwh/8)*2)+oh))
  594.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*7)+ow,((dskch/8)*0)+oh,(((dskcw/8)*1)-dcw),((dskch/8)*2)-dch);}
  595.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*2)+oh) & (root_y<((dskwh/8)*3)+oh))
  596.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,((dskch/8)*0)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*2)-dch);}
  597.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*3)+oh) & (root_y<((dskwh/8)*5)+oh))
  598.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,((dskch/8)*2)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*4)-dch);}
  599.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*5)+oh) & (root_y<((dskwh/8)*6)+oh))
  600.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*6)+ow,((dskch/8)*6)+oh,(((dskcw/8)*2)-dcw),((dskch/8)*2)-dch);}
  601.     if ((root_x>((dskww/8)*7)+ow) & (root_x<((dskww/8)*8)+ow)& (root_y>((dskwh/8)*6)+oh) & (root_y<((dskwh/8)*7)+oh))
  602.     {XMoveResizeWindow(disp,activewin,((dskcw/8)*7)+ow,((dskch/8)*6)+oh,(((dskcw/8)*1)-dcw),((dskch/8)*2)-dch);}
  603.     if (win_move_desk)
  604.     {
  605.      for (i=1;i<nmbrdesks+1;i++)
  606.       {
  607.        if ((root_x>(((dskww/8)*1)+((((dskww/8)*6)/nmbrdesks)*(i-1)))+ow)& (root_x<(((dskww/8)*1)+((((dskww/8)*6)/nmbrdesks)*i))+ow)
  608.         & (root_y>((dskwh/16)*15)+oh) & ((root_y<((dskwh/16)*16)+oh)))
  609.                                   {Client_msg(disp, activewin, "_NET_WM_DESKTOP", i-1,
  610.              0, 0, 0, 0);XCloseDisplay(disp);XUngrabPointer(disp, CurrentTime);return;}
  611.       }
  612.     }
  613.     ;XCloseDisplay(disp);};
  614.   }
  615. disp = XOpenDisplay(NULL);
  616.   XMapRaised(disp, winl[1]);
  617.   XCloseDisplay(disp);XUngrabPointer(disp, CurrentTime);return;
  618. }
  619.  
  620. void Print_screen_sections ()
  621. {
  622. int dpw=dskww/8;
  623. int dph=dskwh/8;
  624. int ow=deskZx+0;
  625. int oh=deskZy+0;
  626. double transparency = 0.4;  /* between 1.0 and 0.0 */
  627. unsigned int opacity = (unsigned int) (0xffffffff * transparency);
  628. Display *display = XOpenDisplay(NULL);
  629. /*___________________________________________________________________________*/
  630. int blackColor = BlackPixel(display, DefaultScreen(display));
  631. int whiteColor = WhitePixel(display, DefaultScreen(display));
  632.  
  633. screen_num = DefaultScreen ( display );
  634. XSetWindowAttributes xwinattrs;
  635. xwinattrs.override_redirect = TRUE;
  636. win = XCreateWindow(display, RootWindow(display,screen_num),0,0,dskcw,dskch,0,0,0,0,CWOverrideRedirect,&xwinattrs);
  637. XSelectInput(display, win, StructureNotifyMask);
  638. GC gc = XCreateGC(display, win, 0, NULL);
  639. XSetForeground(display, gc, whiteColor);
  640. XSetBackground(display, gc, blackColor);
  641. XMapWindow(display,win );
  642. XStringListToTextProperty ( &window_name, 1, &wname );
  643. XSetWMProperties ( display, win, &wname, NULL, NULL, 0, NULL, NULL, NULL );
  644. Atom atom_window_opacity = XInternAtom(display, "_NET_WM_WINDOW_OPACITY", TRUE);
  645. XChangeProperty(display,win,atom_window_opacity,XA_CARDINAL,32,PropModeReplace,(unsigned char *) &opacity,1);
  646. XFlush(display);
  647. /*___________________________________________________________________________*/
  648.  
  649. char green[] = "#00FF00";
  650. Colormap colormap;
  651. XColor green_col;
  652. colormap = DefaultColormap(display, 0);
  653. XParseColor(display, colormap, green, &green_col);
  654. XAllocColor(display, colormap, &green_col);
  655. XSetForeground(display, gc, blackColor);
  656. XFillRectangle(display, win, gc, 0, 0, dskww,dskwh);
  657. XSetForeground(display, gc, green_col.pixel);
  658. /*CenterVerticalB*/
  659. XDrawRectangle(display, win, gc, ((dpw)*3.5)+ow, ((dph)*3.5)+oh, ((dpw)*0.5), ((dph)*1));
  660. XDrawRectangle(display, win, gc, ((dpw)*4)+ow, ((dph)*3.5)+oh, ((dpw)*0.5), ((dph)*1));
  661. /*CenterHorizontalB*/
  662. XDrawRectangle(display, win, gc, ((dpw)*3.5)+ow, ((dph)*3)+oh, ((dpw)*1), ((dph)*0.5));
  663. XDrawRectangle(display, win, gc, ((dpw)*3.5)+ow, ((dph)*4.5)+oh, ((dpw)*1), ((dph)*0.5));
  664. /*CenterVertical*/
  665. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*3)+oh, ((dpw)*0.5), ((dph)*2));
  666. XDrawRectangle(display, win, gc, ((dpw)*4.5)+ow, ((dph)*3)+oh, ((dpw)*0.5), ((dph)*2));
  667. /*CenterHorizontal*/
  668. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*2)+oh, ((dpw)*2), ((dph)*1));
  669. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*5)+oh, ((dpw)*2), ((dph)*1));
  670. /*EastWestVertical*/
  671. XDrawRectangle(display, win, gc, ((dpw)*2)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*2));
  672. XDrawRectangle(display, win, gc, ((dpw)*2)+ow, ((dph)*4)+oh, ((dpw)*1), ((dph)*2));
  673. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*2));
  674. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*4)+oh, ((dpw)*1), ((dph)*2));
  675. /*MiddleCross*/
  676. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*1)+oh, ((dpw)*2), ((dph)*1));
  677. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*6)+oh, ((dpw)*2), ((dph)*1));
  678. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*3)+oh, ((dpw)*1), ((dph)*2));
  679. XDrawRectangle(display, win, gc, ((dpw)*6)+ow, ((dph)*3)+oh, ((dpw)*1), ((dph)*2));
  680. /*CornersMiddleScreen*/
  681. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*1)+oh, ((dpw)*2), ((dph)*1));
  682. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*1)+oh, ((dpw)*2), ((dph)*1));
  683. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*6)+oh, ((dpw)*2), ((dph)*1));
  684. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*6)+oh, ((dpw)*2), ((dph)*1));
  685. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*1));
  686. XDrawRectangle(display, win, gc, ((dpw)*6)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*1));
  687. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*5)+oh, ((dpw)*1), ((dph)*1));
  688. XDrawRectangle(display, win, gc, ((dpw)*6)+ow, ((dph)*5)+oh, ((dpw)*1), ((dph)*1));
  689. /*NorthEdge*/
  690. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*0)+oh, ((dpw)*1), ((dph)*1));
  691. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*0)+oh, ((dpw)*2), ((dph)*1));
  692. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*0)+oh, ((dpw)*2), ((dph)*1));
  693. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*0)+oh, ((dpw)*2), ((dph)*1));
  694. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*0)+oh, ((dpw)*1), ((dph)*1));
  695. /*SouthEdge*/
  696. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*7)+oh, ((dpw)*1), (((dph)*1)-1));
  697. XDrawRectangle(display, win, gc, ((dpw)*1)+ow, ((dph)*7)+oh, ((dpw)*2), ((dph)*0.5));
  698. XDrawRectangle(display, win, gc, ((dpw)*3)+ow, ((dph)*7)+oh, ((dpw)*2), ((dph)*0.5));
  699. XDrawRectangle(display, win, gc, ((dpw)*5)+ow, ((dph)*7)+oh, ((dpw)*2), ((dph)*0.5));
  700. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*7)+oh, ((dpw)*1), (((dph)*1)-4));
  701. /*LeftEdge*/
  702. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*1)+oh, ((dpw)*1), ((dph)*1));
  703. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*1));
  704. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*3)+oh, ((dpw)*1), ((dph)*2));
  705. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*5)+oh, ((dpw)*1), ((dph)*1));
  706. XDrawRectangle(display, win, gc, ((dpw)*0)+ow, ((dph)*6)+oh, ((dpw)*1), ((dph)*1));
  707. /*RightEdge*/
  708. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*1)+oh, ((dpw)*1), ((dph)*1));
  709. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*2)+oh, ((dpw)*1), ((dph)*1));
  710. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*3)+oh, ((dpw)*1), ((dph)*2));
  711. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*5)+oh, ((dpw)*1), ((dph)*1));
  712. XDrawRectangle(display, win, gc, ((dpw)*7)+ow, ((dph)*6)+oh, ((dpw)*1), ((dph)*1));
  713. if (win_move_desk)
  714.   {
  715.    for (i=1;i<nmbrdesks;i++)
  716.        {
  717.         XDrawRectangle(display, win, gc, (((dpw)*1)+((((dpw)*6)/nmbrdesks)*i))+ow,((dph)*7.5)+oh,
  718.                                      (((dpw)*6)/nmbrdesks),((dph)*0.5));                                   
  719.        }
  720.   }
  721. XFlush(display);
  722.  
  723.  
  724. return ;
  725. }
  726.  
  727. void Print_screen_menu ()
  728. {
  729. Display *dpy = XOpenDisplay(NULL);
  730. Window win=XDefaultRootWindow(dpy);
  731. XMapWindow(dpy,win );
  732. char green[] = "#00FF00";
  733. Colormap colormap;
  734. XColor green_col;
  735. colormap = DefaultColormap(dpy, 0);
  736. XParseColor(dpy, colormap, green, &green_col);
  737. XAllocColor(dpy, colormap, &green_col);
  738. GC gc = XCreateGC(dpy,win, 0, NULL);
  739. XSetForeground(dpy, gc, green_col.pixel);
  740. XSetSubwindowMode(dpy, gc, IncludeInferiors);
  741. XSetFunction(dpy, gc, GXinvert);
  742. XDrawLine(dpy, win, gc,(dskww/2),0,(dskww/2),dskwh);
  743. XDrawLine(dpy, win, gc,0,(dskwh/2),dskww,(dskwh/2));
  744. XFlush(dpy);
  745. XCloseDisplay(dpy);
  746. return ;
  747. }
  748.  
  749. void Tile_menu()
  750. {
  751. Max_remove ();
  752. Display *dpy;
  753. Window root;
  754. Window ret_root;
  755. Window ret_child;
  756. int root_x=10;
  757. int root_y=10;
  758. int win_x;
  759. int win_y;
  760. unsigned int mask;
  761. dpy = XOpenDisplay(NULL);
  762. root = XDefaultRootWindow(dpy);
  763.  /*pointer feedback*/
  764. int status;
  765. Cursor cursor;
  766. cursor = XCreateFontCursor(dpy, XC_crosshair);
  767. status = XGrabPointer(dpy, root, False,ButtonPressMask|ButtonReleaseMask,
  768.                       GrabModeSync,GrabModeAsync, root, cursor, CurrentTime);
  769.   if (status != GrabSuccess)
  770.     {
  771.      fputs("ERROR: Cannot grab mouse.\n", stderr);
  772.      return ;
  773.     }
  774. XAllowEvents(dpy, SyncPointer, CurrentTime);
  775. /*pointer feedback end -set this when no longer needed- XUngrabPointer(disp, CurrentTime);*/
  776.    while (1)
  777.     {
  778.       if(XQueryPointer(dpy, root, &ret_root, &ret_child, &root_x, &root_y,
  779.                        &win_x, &win_y, &mask))
  780.         {
  781.           if (mask & (Button1Mask)){return;}
  782.           if ((root_x>(0)) & (root_x<(dskww/2))& (root_y>(0)) & (root_y<(dskwh/2)))
  783.           {alternative_layout=0;tile_stripes=0;Prepare_tile();}
  784.           if ((root_x>(dskww/2)) & (root_x<(dskww))& (root_y>(0)) & (root_y<(dskwh/2)))
  785.           {alternative_layout=1;tile_stripes=0;Prepare_tile();}
  786.           if ((root_x>(0)) & (root_x<(dskww/2))& (root_y>(dskwh/2)) & (root_y<(dskwh)))
  787.           {tile_vert=0;tile_stripes=1;Prepare_tile();}
  788.           if ((root_x>(dskww/2)) & (root_x<(dskww))& (root_y>(dskwh/2)) & (root_y<(dskwh)))
  789.           {tile_vert=1;tile_stripes=1;Prepare_tile();}
  790.         }
  791.     }
  792. XUngrabPointer(dpy, CurrentTime);
  793. }
  794.  
  795. void Exchange_select ()
  796. {
  797. Display *disp;
  798. disp = XOpenDisplay(NULL);
  799. tmp_win_1=Select_Window(disp);
  800. tmp_win_2=Select_Window(disp);
  801. XCloseDisplay(disp);
  802. Sort_list_xchg();
  803. Tile ();    
  804. }
  805.  
  806. void Exchange_active ()
  807. {
  808. tmp_win_1=activewin;
  809. Display *disp;
  810. disp = XOpenDisplay(NULL);
  811. tmp_win_2=Select_Window(disp);
  812. XCloseDisplay(disp);
  813. Sort_list_xchg();
  814. Tile ();    
  815. }
  816.  
  817. void Stripe_wins ()
  818. {
  819. int ow=deskZx+0;
  820. int oh=deskZy+0;
  821. dskch=dskch-offset_bottom;oh=deskZy+offset_top;dskch=dskch-offset_top;
  822. dskcw=dskcw-offset_right;ow=deskZx+offset_left;dskcw=dskcw-offset_left;
  823. Display *disp;
  824. disp = XOpenDisplay(NULL);
  825.   for (i = 1; i < winondesk+1;i++ )
  826.     {
  827.     if (tile_vert)
  828.       {XMoveResizeWindow(disp,winl[i],(((i-1)*(dskcw/winondesk))+ow),0+oh,((dskcw/winondesk)-dcw),dskch-dch);}
  829.     else
  830.       {XMoveResizeWindow(disp,winl[i],0+ow,(((i-1)*(dskch/winondesk))+oh),dskcw-dcw,((dskch/winondesk)-dch));}
  831.     }
  832.  XCloseDisplay(disp);
  833.  return;
  834. }
  835.  
  836. void Get_info_desk ()
  837. {
  838. Display *disp;
  839. disp = XOpenDisplay(NULL);
  840. Window root = DefaultRootWindow(disp);
  841. unsigned long *cur_desktop = NULL;
  842. cur_desktop = (unsigned long *)Get_property(disp, root,
  843.             XA_CARDINAL,"_NET_CURRENT_DESKTOP", NULL);
  844. activedesk= (int) *cur_desktop;
  845. cur_desktop = (unsigned long *)Get_property(disp, root,
  846.             XA_CARDINAL,"_NET_NUMBER_OF_DESKTOPS", NULL);
  847. nmbrdesks= (int) *cur_desktop;
  848. cur_desktop = (unsigned long *)Get_property(disp, root,
  849.             XA_CARDINAL,"_NET_DESKTOP_GEOMETRY",NULL);
  850. dskrw= (int) cur_desktop[0];
  851. dskrh= (int) cur_desktop[1];
  852. cur_desktop = (unsigned long *)Get_property(disp, root,
  853.             XA_CARDINAL,"_NET_WORKAREA",NULL);
  854. deskZx= (int) cur_desktop[0];
  855. deskZy= (int) cur_desktop[1];
  856. dskww= (int) cur_desktop[2];
  857. dskwh= (int) cur_desktop[3];
  858. dskcw=dskww;
  859. dskch=dskwh;
  860. XCloseDisplay(disp);
  861. return;
  862. }
  863.  
  864. void Get_info_active ()
  865. {
  866. Display *disp;
  867. disp = XOpenDisplay(NULL);
  868. activewin= Get_active_window(disp);
  869. XCloseDisplay(disp);
  870. return;
  871. }
  872.  
  873. void Get_info_win_desk ()
  874. {
  875. winondesk=1;
  876. Display *disp;
  877. Window *client_list;
  878. unsigned long client_list_size;
  879. int i;
  880. unsigned long *desktop;
  881. disp = XOpenDisplay(NULL);
  882. if ((client_list=Get_client_list(disp,&client_list_size))==NULL) {return;}          
  883. for (i = 0; i < client_list_size / sizeof(Window); i++)
  884.     {
  885.     if ((desktop=(unsigned long *)Get_property(disp, client_list[i],
  886.                                                XA_CARDINAL, "_NET_WM_DESKTOP", NULL)) == NULL)
  887.       {
  888.        desktop = (unsigned long *)Get_property(disp, client_list[i],
  889.                                                XA_CARDINAL, "_WIN_WORKSPACE", NULL);
  890.       }
  891.     if (desktop!=0)
  892.     {if ((signed long)*desktop==activedesk) {winl[winondesk]=client_list[i];winondesk=winondesk+1;}}  
  893.     }
  894. winondesk=winondesk-1;
  895. XCloseDisplay(disp);
  896. return;
  897. }
  898.  
  899. void Sort_list()
  900. {
  901. int wintemp=0;
  902. for (i =1; i < winondesk+1; i++)
  903.     {
  904.     if (winl[i]==activewin)
  905.       {wintemp=winl[1]; winl[1]=activewin;winl[i]=wintemp;}
  906.     }
  907. }
  908.  
  909. void Sort_list_xchg()
  910. {
  911. int b;
  912. for (i =1; i < winondesk+1;i++)
  913.     {
  914.      if (winl[i]==tmp_win_1){b=i;};
  915.     }
  916. for (i =1; i < winondesk+1;i++)
  917.     {
  918.      if (winl[i]==tmp_win_2){winl[b]=tmp_win_2 ;winl[i]=tmp_win_1; break;};
  919.     }
  920. }
  921.  
  922.  
  923. void Print_info ()
  924. {
  925. printf("Info:\n");
  926. printf ("Version: %s\n",version);
  927. printf("Windows on desktop:\n");
  928. for (i = 1; i < winondesk+1;i++ ){printf("Win id: %i\n",winl[i]);}  
  929. printf("Number of Windows on desk: %i   \n",winondesk) ;
  930. printf("Active window id: %i\n",activewin);
  931. printf("Active desktop: %i   ",activedesk);printf("Desks %i   \n",nmbrdesks);
  932. printf("Real width %i  ",dskrw);printf("Real height %i \n ",dskrh);
  933. printf("Work width %i  ",dskww);printf("Work_height %i \n ",dskwh);
  934. printf("Desk Zero x: %i  ",deskZx); printf("Desk Zero y: %i  \n ",deskZy) ;
  935. printf("Runtime Var:\n");
  936. printf("Custm width %f   ",dskcw); printf("Custom height %f\n",dskch) ;
  937. printf("i %i   ",i);printf("tmp_win_1 %i    ",tmp_win_1) ;printf("tmp_win_2 %i\n",tmp_win_2) ;
  938.  
  939. }
  940.  
  941. void Print_info_t ()
  942. {
  943. Sort_list ();
  944. Print_info ();
  945. }
  946.  
  947. static int Client_msg(Display *disp, Window win, char *msg, unsigned long data0,
  948.   unsigned long data1,unsigned long data2, unsigned long data3,
  949.   unsigned long data4)
  950. {
  951. XEvent event;
  952. long mask = SubstructureRedirectMask | SubstructureNotifyMask;
  953. event.xclient.type = ClientMessage;
  954. event.xclient.serial = 0;
  955. event.xclient.send_event = True;
  956. event.xclient.message_type = XInternAtom(disp, msg, False);
  957. event.xclient.window = win;
  958. event.xclient.format = 32;
  959. event.xclient.data.l[0] = data0;
  960. event.xclient.data.l[1] = data1;
  961. event.xclient.data.l[2] = data2;
  962. event.xclient.data.l[3] = data3;
  963. event.xclient.data.l[4] = data4;
  964.   if (XSendEvent(disp, DefaultRootWindow(disp), False, mask, &event))
  965.     {return EXIT_SUCCESS; }
  966.   else
  967.     {fprintf(stderr, "Cannot send %s event.\n", msg); return EXIT_FAILURE; }
  968. }
  969.  
  970. static Window Get_active_window(Display *disp)
  971. {
  972. char *prop;
  973. unsigned long size;
  974. Window ret = (Window)0;
  975. prop = Get_property(disp, DefaultRootWindow(disp), XA_WINDOW,
  976.                     "_NET_ACTIVE_WINDOW", &size);
  977. if (prop){ret = *((Window*)prop); g_free(prop);}
  978. return(ret);    
  979. }
  980.  
  981. static gchar *Get_property (Display *disp, Window win, /*{{{*/
  982.         Atom xa_prop_type, gchar *prop_name, unsigned long *size)
  983. {
  984. Atom xa_prop_name;
  985. Atom xa_ret_type;
  986. int ret_format;
  987. unsigned long ret_nitems;
  988. unsigned long ret_bytes_after;
  989. unsigned long tmp_size;
  990. unsigned char *ret_prop;
  991. gchar *ret;
  992. xa_prop_name = XInternAtom(disp, prop_name, False);
  993.   if (XGetWindowProperty(disp, win, xa_prop_name, 0, MAX_PROPERTY_VALUE_LEN / 4, False,
  994.                          xa_prop_type, &xa_ret_type, &ret_format,    
  995.             &ret_nitems, &ret_bytes_after, &ret_prop) != Success)
  996.     {return NULL;}
  997.   if (xa_ret_type != xa_prop_type)
  998.     {XFree(ret_prop); return NULL;}
  999. tmp_size = (ret_format / 8) * ret_nitems;
  1000. ret = g_malloc(tmp_size + 1);
  1001. memcpy(ret, ret_prop, tmp_size);
  1002. ret[tmp_size] = '\0';
  1003.   if (size)
  1004.     { *size = tmp_size; }
  1005. XFree(ret_prop);
  1006. return ret;
  1007. }
  1008.  
  1009. static Window *Get_client_list (Display *disp, unsigned long *size)
  1010. {
  1011. Window *client_list;
  1012.   if ((client_list=(Window *)Get_property(disp, DefaultRootWindow(disp),
  1013.                                           XA_WINDOW, "_NET_CLIENT_LIST", size)) == NULL)
  1014.     {
  1015.       if ((client_list = (Window *)Get_property(disp, DefaultRootWindow(disp),
  1016.                                                 XA_CARDINAL, "_WIN_CLIENT_LIST", size)) == NULL)
  1017.         {
  1018.          fputs("Cannot get client list properties. \n"
  1019.                "(_NET_CLIENT_LIST or _WIN_CLIENT_LIST)"
  1020.                "\n", stderr);
  1021.          return NULL;
  1022.         }
  1023.     }
  1024. return client_list;
  1025. }
  1026.  
  1027. void Count_win (char *label)
  1028. {
  1029. Display *disp = XOpenDisplay(NULL);
  1030. assert(disp);
  1031. int blackColor = BlackPixel(disp, DefaultScreen(disp));
  1032. int whiteColor = WhitePixel(disp, DefaultScreen(disp));
  1033. wcount = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0,
  1034.                              50, 50, 0, blackColor, blackColor);
  1035. XSelectInput(disp, wcount, StructureNotifyMask);
  1036. XMapWindow(disp, wcount);
  1037. GC gc = XCreateGC(disp, wcount, 0, NULL);
  1038. XSetForeground(disp, gc, whiteColor);
  1039. XMoveResizeWindow(disp,wcount,(dskww/2)-25,(dskwh/2)-25,50,50);
  1040. for(;;)
  1041.  {
  1042.   XEvent e;
  1043.   XNextEvent(disp, &e);
  1044.   if (e.type == MapNotify){ break;}
  1045.  }
  1046. XDrawString ( disp,wcount,gc,23,29,label,strlen (label));
  1047. XFlush(disp);
  1048. return;
  1049. }    
  1050.  
  1051. void Refresh_count (char *label)
  1052. {
  1053. Display *disp = XOpenDisplay(NULL);
  1054. GC gc = XCreateGC(disp, wcount, 0, NULL);
  1055. int whiteColor = WhitePixel(disp, DefaultScreen(disp));
  1056. XSetForeground(disp, gc, whiteColor);
  1057. XClearWindow (disp,wcount);
  1058. XDrawString ( disp,wcount,gc,23,29,label,strlen (label));
  1059. XFlush(disp);
  1060. return;
  1061. }
  1062.  
  1063.  
  1064. void Tile_choose_win()
  1065. {
  1066. char nrwindows[0];
  1067. char mystring[0];
  1068. winondesk=1;winl[0]=12;winl[1]=793;
  1069. Display *disp;
  1070. strcpy(nrwindows,"0");
  1071. Count_win (nrwindows);
  1072. while (1)
  1073.  {
  1074.   disp = XOpenDisplay(NULL);
  1075.    if (winl[winondesk-1]!=winl[winondesk-2])
  1076.    {
  1077.     winl[winondesk]=Select_Window(disp);
  1078.     mystring[0] = 0x30 + (winondesk);
  1079.     winondesk=winondesk+1;
  1080.     Refresh_count (nrwindows);
  1081.    }
  1082.    else {break;};
  1083.  }
  1084. winondesk=winondesk-2;Tile();
  1085. }
  1086.  
  1087. void Auto_op_win ()
  1088. {
  1089. Display *disp;
  1090. while (1)
  1091.  {
  1092.   disp = XOpenDisplay(NULL);
  1093.   Get_info_desk ();
  1094.   Get_info_win_desk ();
  1095.   Get_info_active ();
  1096.   double transparency = 0.5;    /* between 1.0 and 0.0 */
  1097.   unsigned int opacity = (unsigned int) (0xffffffff * transparency);
  1098.   Atom atom_window_opacity = XInternAtom(disp, "_NET_WM_WINDOW_OPACITY", FALSE);
  1099.   for (i =1; i < winondesk+1; i++)
  1100.       {XChangeProperty(disp,winl[i],atom_window_opacity,XA_CARDINAL,32,PropModeReplace,(unsigned char *) &opacity,1);}
  1101.   XFlush(disp);
  1102.   XCloseDisplay(disp);
  1103.   usleep (120000);
  1104.  }
  1105. return;
  1106. }
  1107.  
  1108. void Auto_raise_active ()
  1109. {
  1110. Display *disp;
  1111.     while (1)
  1112.     {
  1113.     disp = XOpenDisplay(NULL);
  1114.     activewin= Get_active_window(disp);
  1115.     Client_msg(disp, activewin, "_NET_ACTIVE_WINDOW", 0, 0, 0, 0, 0);
  1116.     /*XMapRaised(disp, activewin);*/
  1117.     XCloseDisplay(disp);
  1118.     usleep (120000);
  1119.     }
  1120. return;
  1121. }
  1122.  
  1123. static Window Select_Window(Display *disp) {
  1124. int status;
  1125. Cursor cursor;
  1126. XEvent event;
  1127. Window target_win = None, root = DefaultRootWindow(disp);
  1128. int buttons = 0;
  1129. int dummyi;
  1130. unsigned int dummy;
  1131. /* Make the target cursor */
  1132. cursor = XCreateFontCursor(disp, XC_crosshair);
  1133. /* Grab the pointer using target cursor, letting it room all over */
  1134. status = XGrabPointer(disp, root, False,ButtonPressMask|ButtonReleaseMask,
  1135.                       GrabModeSync,GrabModeAsync, root, cursor, CurrentTime);
  1136.   if (status != GrabSuccess)
  1137.     {
  1138.      fputs("ERROR: Cannot grab mouse.\n", stderr);
  1139.      return 0;
  1140.     }
  1141.   while ((target_win == None) || (buttons != 0))
  1142.     {
  1143.      /* allow one more event */
  1144.      XAllowEvents(disp, SyncPointer, CurrentTime);
  1145.      XWindowEvent(disp, root, ButtonPressMask|ButtonReleaseMask, &event);
  1146.        switch (event.type)
  1147.          {
  1148.           case ButtonPress:
  1149.             if (target_win == None)
  1150.               {
  1151.                target_win = event.xbutton.subwindow; /* window selected */
  1152.                  if (target_win == None) target_win = root;
  1153.               }
  1154.            buttons++;
  1155.            break;
  1156.           case ButtonRelease:
  1157.             if (buttons > 0)
  1158.             buttons--;
  1159.             break;
  1160.           }
  1161.     }
  1162. XUngrabPointer(disp, CurrentTime);      /* Done with pointer */
  1163.   if (XGetGeometry (disp, target_win, &root, &dummyi, &dummyi,
  1164.                     &dummy, &dummy, &dummy, &dummy) && target_win != root)
  1165.     {
  1166.     target_win = XmuClientWindow (disp, target_win);
  1167.     }  
  1168. return(target_win);
  1169. }
  1170.  
  1171. void Del_desk ()
  1172. {
  1173. Display *disp;
  1174. disp = XOpenDisplay(NULL);
  1175. Client_msg(disp, DefaultRootWindow(disp), "_NET_NUMBER_OF_DESKTOPS",
  1176.            nmbrdesks-1, 0, 0, 0, 0);
  1177. XCloseDisplay(disp);return;
  1178. }
  1179.  
  1180. void Empty_desk ()
  1181. {
  1182. Display *disp;
  1183. disp = XOpenDisplay(NULL);
  1184.   for (i = 0; i < nmbrdesks;i++ )
  1185.     {
  1186.     activedesk=i;
  1187.     Get_info_win_desk ();
  1188.       if (winondesk==0)
  1189.         {
  1190.         Client_msg(disp, DefaultRootWindow(disp), "_NET_CURRENT_DESKTOP",
  1191.                    i, 0, 0, 0, 0);
  1192.         XCloseDisplay(disp);
  1193.         return ;
  1194.         }
  1195.     }
  1196. Client_msg(disp, DefaultRootWindow(disp), "_NET_NUMBER_OF_DESKTOPS",
  1197.            i+1, 0, 0, 0, 0);
  1198. Client_msg(disp, DefaultRootWindow(disp), "_NET_CURRENT_DESKTOP",
  1199.            i, 0, 0, 0, 0);
  1200. XCloseDisplay(disp);return;
  1201. }
  1202.  
  1203. void Next_win ()
  1204. {
  1205. for (i =1; i < winondesk+1;)
  1206.     {
  1207.     if (winl[i]==activewin)
  1208.       {
  1209.        Display *disp;
  1210.        disp = XOpenDisplay(NULL);
  1211.        if (winl[i+1]!=0)
  1212.           {Client_msg(disp, winl[i+1], "_NET_ACTIVE_WINDOW",
  1213.                    0, 0, 0, 0, 0);i=winondesk+2;}
  1214.        else {Client_msg(disp, winl[1], "_NET_ACTIVE_WINDOW",
  1215.                    0, 0, 0, 0, 0);i=winondesk+2;}
  1216.        XCloseDisplay(disp);
  1217.        }
  1218.     i=i+1;
  1219.     }
  1220. }
  1221.    
  1222. void Max_remove ()
  1223. {
  1224. Display *disp;
  1225. disp = XOpenDisplay(NULL);
  1226. for (i =1; i < winondesk+1; i++)
  1227.     {
  1228.     Client_msg(disp, winl[i], "_NET_WM_STATE",
  1229.                XInternAtom(disp,"_NET_WM_STATE_TOGGLE",False),
  1230.                XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_VERT", False),
  1231.                XInternAtom (disp,"_NET_WM_STATE_MAXIMIZED_HORZ", False),0,0);
  1232.     }
  1233. XCloseDisplay(disp);
  1234. return;
  1235. }
  1236.  
  1237. void Min_remove ()
  1238. {
  1239. Display *disp;
  1240. disp = XOpenDisplay(NULL);
  1241. for (i =1; i < winondesk+1; i++)
  1242.     {Client_msg(disp, winl[i], "_NET_ACTIVE_WINDOW",0, 0, 0, 0, 0);}
  1243. XCloseDisplay(disp);return;
  1244. }
  1245.  
  1246. void Win_raise ()
  1247. {
  1248. Display *disp;
  1249. disp = XOpenDisplay(NULL);
  1250. for (i =1; i < winondesk+1; i++) {XMapRaised(disp, winl[i]);}
  1251. XCloseDisplay(disp);
  1252. return;
  1253. }
  1254.  
  1255. void Get_win_layout ()
  1256. {
  1257. int j;
  1258. int winondesk_tmp=winondesk;
  1259. float win_pm_tmp [20][9][4]={{{0}},
  1260.                             {{0,0,1,1}},
  1261.                             {{0,0,0.5,1},{0.5,0,0.5,1}},
  1262.                             {{0,0,0.5,1},{0.5,0,0.5,0.5},{0.5,0.5,0.5,0.5}},
  1263.                             {{0,0,0.5,0.5},{0,0.5,0.5,0.5},{0.5,0,0.5,0.5},{0.5,0.5,0.5,0.5}},
  1264.                             {{0,0,0.333,1},{0.333,0,0.333,0.5},{0.666,0,0.333,0.5},{0.333,0.5,0.333,0.5},{0.666,0.5,0.333,0.5}},
  1265.                             {{0,0,0.333,0.5},{0.333,0,0.333,0.5},{0.666,0,0.333,0.5},{0.333,0.5,0.333,0.5},{0.666,0.5,0.333,0.5},{0,0.5,0.333,0.5}},
  1266.                             {{0,0,0.333,0.333},{0.333,0,0.333,0.333},{0.666,0,0.333,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,1,0.333}},
  1267.                             {{0,0,0.5,0.333},{0.5,0,0.5,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,0.333,0.333},{0.333,0.666,0.333,0.333},{0.666,0.666,0.333,0.333}},
  1268.                             {{0,0,0.333,0.333},{0.333,0,0.333,0.333},{0.666,0,0.333,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,0.333,0.333},{0.333,0.666,0.333,0.333},{0.666,0.666,0.333,0.333}},
  1269.                             {{0}},
  1270.                             {{0,0,1,1}},
  1271.                             {{0,0,0.75,1},{0.75,0,0.25,1}},
  1272.                             {{0,0,0.75,1},{0.75,0,0.25,0.5},{0.75,0.5,0.25,0.5}},
  1273.                             {{0,0,0.5,1},{0.5,0,0.5,0.333},{0.5,0.333,0.5,0.333},{0.5,0.666,0.5,0.333}},
  1274.                             {{0,0,0.5,0.5},{0.5,0,0.5,0.5},{0.333,0.5,0.333,0.5},{0.666,0.5,0.333,0.5},{0,0.5,0.333,0.5}},
  1275.                             {{0,0,0.333,0.5},{0.333,0,0.333,0.5},{0.666,0,0.333,0.5},{0.333,0.5,0.333,0.5},{0.666,0.5,0.333,0.5},{0,0.5,0.333,0.5}},
  1276.                             {{0,0,0.333,0.333},{0.333,0,0.333,0.333},{0.666,0,0.333,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,1,0.333}},
  1277.                             {{0,0,0.5,0.333},{0.5,0,0.5,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,0.333,0.333},{0.333,0.666,0.333,0.333},{0.666,0.666,0.333,0.333}},
  1278.                             {{0,0,0.333,0.333},{0.333,0,0.333,0.333},{0.666,0,0.333,0.333},{0,0.333,0.333,0.333},{0.333,0.333,0.333,0.333},{0.666,0.333,0.333,0.333},{0,0.666,0.333,0.333},{0.333,0.666,0.333,0.333},{0.666,0.666,0.333,0.333}}};
  1279. if (alternative_layout) {winondesk_tmp=winondesk+10;};
  1280. for( i=0;i<9;i++)
  1281.    {for( j=0;j<4;j++)
  1282.        {win_pm[i][j]=win_pm_tmp[winondesk_tmp][i][j];}
  1283.    }
  1284. return;
  1285. }
  1286.  
  1287. void refresh(void)
  1288. {
  1289. XFillRectangle ( display, win, black_gc, BUTTON1_X, BUTTON1_Y,BUTWIDTH, BUTHEIGHT );
  1290. XFillRectangle ( display, win, black_gc, BUTTON2_X, BUTTON2_Y,BUTWIDTH, BUTHEIGHT );
  1291. XFillRectangle ( display, win, black_gc, BUTTON3_X, BUTTON3_Y,BUTWIDTH, BUTHEIGHT );
  1292. XFillRectangle ( display, win, black_gc, BUTTON4_X, BUTTON4_Y,BUTWIDTH, BUTHEIGHT );
  1293.  
  1294. XFillRectangle ( display, win, color_gc, BUTTON1_X+2, BUTTON1_Y+2,BUTWIDTH-4, BUTHEIGHT-4 );
  1295. XFillRectangle ( display, win, color_gc, BUTTON2_X+2, BUTTON2_Y+2,BUTWIDTH-4, BUTHEIGHT-4 );
  1296. XFillRectangle ( display, win, color_gc, BUTTON3_X+2, BUTTON3_Y+2,BUTWIDTH-4, BUTHEIGHT-4 );
  1297. XFillRectangle ( display, win, color_gc, BUTTON4_X+2, BUTTON4_Y+2,BUTWIDTH-4, BUTHEIGHT-4 );
  1298. Get_win_layout ();
  1299. for (i =1; i < winondesk+1; i++)
  1300.    {
  1301.     XDrawRectangle(display,win,black_gc,(BUTTON1_X+(BUTWIDTH*win_pm [i-1][0])),(BUTTON1_Y+( BUTHEIGHT*win_pm [i-1][1])),
  1302.                                                     (win_pm [i-1][2]*BUTWIDTH),(win_pm [i-1][3]*BUTHEIGHT));
  1303.     XDrawRectangle(display,win,black_gc,BUTTON3_X+(((i-1)*(BUTWIDTH/winondesk))),BUTTON3_Y,
  1304.                                                           ((BUTWIDTH/winondesk)),BUTHEIGHT );
  1305.     XDrawRectangle(display,win,black_gc,BUTTON4_X,BUTTON4_Y+(((i-1)*(BUTHEIGHT/winondesk))),
  1306.                                     BUTWIDTH,((BUTHEIGHT/winondesk)));
  1307.     }
  1308. alternative_layout=1;
  1309. Get_win_layout ();
  1310. for (i =1; i < winondesk+1; i++)
  1311.     {XDrawRectangle(display,win,black_gc,(BUTTON2_X+(BUTWIDTH*win_pm [i-1][0])),(BUTTON2_Y+( BUTHEIGHT*win_pm [i-1][1])),
  1312.                                                      (win_pm [i-1][2]*BUTWIDTH),(win_pm [i-1][3]*BUTHEIGHT));}
  1313. alternative_layout=0;
  1314. }
  1315.  
  1316. unsigned char get_xchar(void)
  1317. {
  1318. unsigned char key;
  1319. key = 0;
  1320. while ((key==0)&&(clicked==FALSE)&&(rightclicked==FALSE))
  1321.   {
  1322.   usleep(10000);
  1323.   XNextEvent ( display, &event );
  1324.   if (event.type==KeyPress)
  1325.      {
  1326.      keysym = XLookupKeysym ( &(event.xkey), 0 );
  1327.      if (keysym <= 255)
  1328.         {
  1329.         key = (unsigned char) keysym;
  1330.         if (cpslock==1)
  1331.            {
  1332.             if (key==',') {key='?';}
  1333.             if (key==';') {key='.';}
  1334.             if (key==':') {key='/';}
  1335.             }
  1336.         cpslock = 0;
  1337.         }
  1338.      else
  1339.         {
  1340.         switch ( keysym )
  1341.             {
  1342.             case  XK_KP_1:
  1343.             case XK_KP_End:
  1344.             key = 27;
  1345.             break;
  1346.             case  XK_KP_2:
  1347.             case XK_KP_Down:
  1348.             key = '2';
  1349.             break;
  1350.             case  XK_KP_3:
  1351.             case XK_KP_Page_Down:
  1352.             key = '3';
  1353.             break;
  1354.             case  XK_KP_4:
  1355.             case XK_KP_Left:
  1356.             key = '4';
  1357.             break;
  1358.             case XK_Escape:
  1359.             key = 27;
  1360.             break;
  1361.             default:
  1362.             key = '?';
  1363.             break;
  1364.             }
  1365.         }
  1366.      }
  1367.   else
  1368.      {
  1369.       if (event.type==Expose)
  1370.          {
  1371.          refresh();
  1372.          while (XCheckTypedEvent(display, Expose, &event));
  1373.          }
  1374.       else
  1375.          {
  1376.          if (event.type==ButtonPress)
  1377.             {
  1378.             if (event.xbutton.window==win)
  1379.                {
  1380.                 if(event.xbutton.button==Button1)
  1381.                   {
  1382.                   clicked = TRUE;
  1383.                   mousex = event.xbutton.x;
  1384.                   mousey = event.xbutton.y;
  1385.                   }
  1386.                 else
  1387.                   {rightclicked = TRUE;}
  1388.                 }
  1389.             }
  1390.          else
  1391.             {if (event.type==ButtonRelease){refresh();}}
  1392.           }
  1393.     }
  1394.   }
  1395. return key;
  1396. }
  1397.  
  1398. int Graphics_init ( unsigned int win_width, unsigned int win_height )
  1399. {
  1400. BUTWIDTH=(BUTHEIGHT*(((float) (dskcw/dskch))));
  1401. WIN_HEIGHT=BUTHEIGHT+1;
  1402. WIN_WIDTH=(BUTWIDTH*4)+16;
  1403. BUTTON1_X=0;
  1404. BUTTON1_Y=0;
  1405. BUTTON2_X=(BUTWIDTH)+5;
  1406. BUTTON2_Y=0;
  1407. BUTTON3_X=(BUTWIDTH*2)+10;
  1408. BUTTON3_Y=0;
  1409. BUTTON4_X=(BUTWIDTH*3)+15;
  1410. BUTTON4_Y=0;
  1411. display = XOpenDisplay ( display_name );
  1412. if ( !display ){ return FALSE;}
  1413. Window root;
  1414. Window ret_root;
  1415. Window ret_child;
  1416. int root_x=10;
  1417. int root_y=10;
  1418. int win_x;
  1419. int win_y;
  1420. unsigned int mask;
  1421. root = XDefaultRootWindow(display);
  1422. if(XQueryPointer(display,root,&ret_root,&ret_child,&root_x,&root_y,&win_x,&win_y, &mask));
  1423. int i, j;
  1424. screen_num = DefaultScreen ( display );
  1425. XSetWindowAttributes xwinattrs;
  1426. xwinattrs.override_redirect = TRUE;
  1427. if (dskww<WIN_WIDTH+root_x){root_x=dskww-WIN_WIDTH;};
  1428. if (dskwh<WIN_HEIGHT+root_y){root_y=dskwh-WIN_HEIGHT;};
  1429. win = XCreateWindow(display, RootWindow(display,screen_num), root_x, root_y,WIN_WIDTH, WIN_HEIGHT,0,
  1430.                    CopyFromParent, InputOutput, CopyFromParent  ,CWOverrideRedirect, &xwinattrs);
  1431. XSelectInput(display, win, ExposureMask | KeyPressMask | ButtonPressMask | KeyReleaseMask | ButtonReleaseMask | StructureNotifyMask);
  1432. XStringListToTextProperty ( &window_name, 1, &wname );
  1433. XSetWMProperties ( display, win, &wname, NULL, NULL, 0, NULL, NULL, NULL );
  1434. black_gc = XCreateGC ( display, win, gc_valuemask, &gc_values );
  1435. color_gc = XCreateGC ( display, win, gc_valuemask, &gc_values );
  1436. /* load default color scheme */
  1437. /* red */
  1438. for ( i=0, j=0; i<64; i++, j++ )
  1439.     {
  1440.     color_data[i][0] = 1024 * j;
  1441.     color_data[i][1] = color_data[i][2] = 0;
  1442.     }
  1443.    /* green */
  1444. for ( i=64, j=0; i<128; i++, j++ )
  1445.     {
  1446.     color_data[i][1] = 1024 * j;
  1447.     color_data[i][0] = color_data[i][2] = 0;
  1448.     }
  1449.    /* blue */
  1450. for ( i=128, j=0; i<192; i++, j++ )
  1451.     {
  1452.     color_data[i][2] = 1024 * j;
  1453.     color_data[i][0] = color_data[i][1] = 0;
  1454.     }
  1455.    /* white */
  1456. for ( i=192, j=0; i<256; i++, j++ )
  1457.     {color_data[i][0] = color_data[i][1] = color_data[i][2] = j * 1024;}
  1458.    /* yellow */
  1459.     color_data[192][0] = 63 * 1024;
  1460.     color_data[192][1] = 63 * 1024;
  1461.     color_data[192][2] = 32 * 1024;
  1462. for ( i=0; i<256; i++ )
  1463.     {
  1464.     color_info.red   = color_data[i][0];
  1465.     color_info.green = color_data[i][1];
  1466.     color_info.blue  = color_data[i][2];
  1467.     XAllocColor ( display, DefaultColormap ( display, screen_num ), &color_info );
  1468.     color_table[i] = color_info.pixel;
  1469.     }
  1470. XSetForeground ( display, black_gc, color_table[0] );
  1471. XSetForeground ( display, color_gc, color_table[224] );
  1472. XMapWindow ( display, win );
  1473. return TRUE;
  1474. }
  1475.  
  1476. void Graphics_shutdown ()
  1477. {
  1478.    XFreeGC ( display, black_gc );
  1479.    XFreeGC ( display, color_gc );
  1480.    XCloseDisplay ( display );
  1481. }
  1482.  
  1483. void Menu_gui ()
  1484. {
  1485. if (!Graphics_init (WIN_WIDTH , WIN_HEIGHT)){printf("X11 Error!\n");exit(0);}
  1486. stillused = TRUE;  /* Setting this variable to FALSE will terminate the application */
  1487. while (stillused == TRUE)
  1488.  {
  1489.   toberefreshed = FALSE;
  1490.   typedchar = get_xchar();
  1491.   if (typedchar == 27){stillused = FALSE;}
  1492.   if (clicked==TRUE)
  1493.      {
  1494.      if ((mousex>BUTTON1_X)&&(mousex<(BUTTON1_X+BUTWIDTH))&&(mousey>BUTTON1_Y)&&(mousey<(BUTTON1_Y+BUTHEIGHT)))
  1495.         {Graphics_shutdown();Prepare_tile ();stillused = FALSE;}
  1496.      if ((mousex>BUTTON2_X)&&(mousex<(BUTTON2_X+BUTWIDTH))&&(mousey>BUTTON2_Y)&&(mousey<(BUTTON2_Y+BUTHEIGHT)))
  1497.         {alternative_layout=1;Graphics_shutdown();Prepare_tile ();stillused = FALSE;}
  1498.      if ((mousex>BUTTON3_X)&&(mousex<(BUTTON3_X+BUTWIDTH))&&(mousey>BUTTON3_Y)&&(mousey<(BUTTON3_Y+BUTHEIGHT)))
  1499.         {tile_vert=1;tile_stripes=1;Prepare_tile ();stillused = FALSE;}
  1500.      if ((mousex>BUTTON4_X)&&(mousex<(BUTTON4_X+BUTWIDTH))&&(mousey>BUTTON4_Y)&&(mousey<(BUTTON4_Y+BUTHEIGHT)))
  1501.         {tile_stripes=1;Prepare_tile ();stillused = FALSE;}
  1502.     else {Graphics_shutdown();}
  1503.      clicked = FALSE;
  1504.      }
  1505.   if(toberefreshed == TRUE){refresh();}
  1506.   rightclicked = FALSE;
  1507.   }
  1508. Graphics_shutdown();
  1509. }
  1510.  
  1511. void trans ()
  1512. {
  1513. Sort_list();
  1514. Display *disp;
  1515. disp = XOpenDisplay(NULL);
  1516. double transparency = 0.5;  /* between 1.0 and 0.0 */
  1517. unsigned int opacity = (unsigned int) (0xffffffff * transparency);
  1518. Atom atom_window_opacity = XInternAtom(disp, "_NET_WM_WINDOW_OPACITY", FALSE);
  1519. /*for (i =1; i < winondesk+1; i++)
  1520.     {
  1521.      XChangeProperty(disp,winl[i],atom_window_opacity,XA_CARDINAL,32,PropModeReplace,(unsigned char *) &opacity,1);
  1522.     }
  1523. transparency = 0.2;*/
  1524. XChangeProperty(disp,activewin,atom_window_opacity,XA_CARDINAL,32,PropModeReplace,(unsigned char *) &opacity,1);
  1525. XFlush(disp);
  1526. XCloseDisplay(disp);
  1527. return;
  1528. }
  1529.  
  1530. void ReadDim ()
  1531. {
  1532. Display *disp;
  1533. disp = XOpenDisplay(NULL);
  1534. int x, y, junkx, junky;
  1535. unsigned int wwidth, wheight, bw, depth;
  1536. Window junkroot;
  1537.  
  1538.         if (!XGetGeometry (disp,activewin,&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1539.            { ;}
  1540.         else {
  1541.               XTranslateCoordinates (disp,activewin,junkroot,junkx,junky,&x,&y,&junkroot);
  1542.               winsnc[i][0]=activewin;
  1543.               winsnc[i][1]=x;
  1544.               winsnc[i][2]=y;
  1545.               winsnc[i][3]=wwidth;
  1546.               winsnc[i][4]=wheight;
  1547.               }
  1548.        
  1549. XCloseDisplay (disp);
  1550. }
  1551.  
  1552. void LinSnap ()
  1553. {
  1554. Get_info_desk ();
  1555. Get_info_win_desk ();
  1556. Display *disp;
  1557. disp = XOpenDisplay(NULL);
  1558. int winsn[20][6]={{0},};
  1559. int winsnb[20][6]={{0}};
  1560. for (i =1; i < 20; i++)
  1561.        {winsn[i][5]=0;}
  1562. int x, y, junkx, junky,wait;
  1563. unsigned int wwidth, wheight, bw, depth;
  1564. Window junkroot;
  1565. for (i =1; i < winondesk+1; i++)
  1566.        {
  1567.         if (!XGetGeometry (disp,winl[i],&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1568.            { ;}
  1569.         else {
  1570.               XTranslateCoordinates (disp,winl[i],junkroot,junkx,junky,&x,&y,&junkroot);
  1571.               winsnb[i][0]=winl[i];
  1572.               winsnb[i][1]=x;
  1573.               winsnb[i][2]=y;
  1574.               winsnb[i][3]=wwidth;
  1575.               winsnb[i][4]=wheight;
  1576.               }
  1577.         }      
  1578.         XCloseDisplay (disp);
  1579. while (1)
  1580.   {usleep (50000);wait=0;
  1581.     disp = XOpenDisplay(NULL);
  1582.     Get_info_desk ();
  1583.     Get_info_win_desk ();
  1584.    for (i =1; i < winondesk+1; i++)
  1585.        {
  1586.         if (!XGetGeometry (disp,winl[i],&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth)){ ;}
  1587.         else {XTranslateCoordinates (disp,winl[i],junkroot,junkx,junky,&x,&y,&junkroot);
  1588.         winsn[i][0]=winl[i];
  1589.         winsn[i][1]=x;//printf ("winsnx %i        ",winsn[i][1]);
  1590.         winsn[i][2]=y;//printf ("winsny %i\n",winsn[i][2]);
  1591.         winsn[i][3]=wwidth;
  1592.         winsn[i][4]=wheight;}
  1593.        
  1594.         if ((winsn[i][2]<50) && (winsnb[i][2]>y))
  1595.         {
  1596.          int ev, er, ma, mi;
  1597.          if(!XTestQueryExtension(disp, &ev, &er, &ma, &mi))
  1598.          {fprintf(stderr, "XTest extension not supported on server.\n");exit(1);}
  1599.          XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1600.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1601.          /*,***************************************************
  1602.          if (!XGetGeometry (disp,activewin,&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1603.            { ;}
  1604.         else {
  1605.               XTranslateCoordinates (disp,activewin,junkroot,junkx,junky,&x,&y,&junkroot);
  1606.               winsnc[i][0]=activewin;
  1607.               winsnc[i][1]=x;
  1608.               winsnc[i][2]=y;
  1609.               winsnc[i][3]=wwidth;
  1610.               winsnc[i][4]=wheight;
  1611.               };
  1612.          ***************************************************/
  1613.          XMoveResizeWindow(disp,winsn[i][0],0,0,dskcw-dcw,dskch-dch);
  1614.          winsn[i][5]=1;wait=1; XFlush(disp);      
  1615.         }
  1616.         if ((winsn[i][1]<5) && (winsnb[i][1]>x))
  1617.         {
  1618.          int ev, er, ma, mi;
  1619.          if(!XTestQueryExtension(disp, &ev, &er, &ma, &mi))
  1620.          {fprintf(stderr, "XTest extension not supported on server.\n");exit(1);}
  1621.          XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1622.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1623.          /*,***************************************************
  1624.          if (!XGetGeometry (disp,activewin,&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1625.            { ;}
  1626.         else {
  1627.               XTranslateCoordinates (disp,activewin,junkroot,junkx,junky,&x,&y,&junkroot);
  1628.               winsnc[i][0]=activewin;
  1629.               winsnc[i][1]=x;
  1630.               winsnc[i][2]=y;
  1631.               winsnc[i][3]=wwidth;
  1632.               winsnc[i][4]=wheight;
  1633.               };
  1634.          ************************************************************/
  1635.          XMoveResizeWindow(disp,winsn[i][0],0,0,(dskcw/2)-dcw,dskch-dch);
  1636.          winsn[i][5]=1;wait=1; XFlush(disp);
  1637.         }
  1638.         if ((winsn[i][1]+winsn[i][3]>dskww-5) && (winsnb[i][1]<x))
  1639.         {
  1640.          int ev, er, ma, mi;
  1641.          if(!XTestQueryExtension(disp, &ev, &er, &ma, &mi))
  1642.          {fprintf(stderr, "XTest extension not supported on server.\n");exit(1);}
  1643.          XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1644.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1645.          /*,**************************************************
  1646.          if (!XGetGeometry (disp,activewin,&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1647.            { ;}
  1648.         else {
  1649.               XTranslateCoordinates (disp,activewin,junkroot,junkx,junky,&x,&y,&junkroot);
  1650.               winsnc[i][0]=activewin;
  1651.               winsnc[i][1]=x;
  1652.               winsnc[i][2]=y;
  1653.               winsnc[i][3]=wwidth;
  1654.               winsnc[i][4]=wheight;
  1655.               };
  1656.          ***************************************************/
  1657.          XMoveResizeWindow(disp,winsn[i][0],(dskcw/2),0,(dskcw/2)-dcw,dskch-dch);
  1658.          winsn[i][5]=1;wait=1;
  1659.          XFlush(disp);
  1660.          }
  1661.        
  1662.        
  1663.    /*     if ((winsn[i][1]>15) && (winsnb[i][1]<x)&& (winsn[i][5]>0) && wait==0 )
  1664.            {
  1665.             winsn[i][5]=0;
  1666.             for (i =1; i < winondesk+1; i++)
  1667.                 {
  1668.                 if (activewin==winsnc [i][0])
  1669.                    {
  1670.                     XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1671.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1672.                     XMoveResizeWindow(disp,winsnc[i][0],winsnc[i][1],winsnc[i][2],winsnc[i][3],winsnc[i][4]);
  1673.                     XFlush(disp);
  1674.                     }
  1675.                  };
  1676.             }
  1677.         if ((winsn[i][1]+winsn[i][3]<dskww-15) && (winsnb[i][1]>x)  && (winsn[i][5]>0) && wait==0)
  1678.            {
  1679.             winsn[i][5]=0;
  1680.             for (i =1; i < winondesk+1; i++)
  1681.                 {
  1682.                 if (activewin==winsnc [i][0])
  1683.                    {
  1684.                     XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1685.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1686.                     XMoveResizeWindow(disp,winsnc[i][0],winsnc[i][1],winsnc[i][2],winsnc[i][3],winsnc[i][4]);
  1687.                     XFlush(disp);
  1688.                     }
  1689.                  };
  1690.             }
  1691.         if ((winsn[i][2]>70) && (winsnb[i][2]<y) && (winsn[i][5]>0) && wait==0)
  1692.            {
  1693.             winsn[i][5]=0;
  1694.             for (i =1; i < winondesk+1; i++)
  1695.                 {
  1696.                 if (activewin==winsnc [i][0])
  1697.                    {
  1698.                     XTestFakeButtonEvent(disp, 1, True, CurrentTime);
  1699.          XTestFakeButtonEvent(disp, 1, False, CurrentTime);
  1700.                     XMoveResizeWindow(disp,winsnc[i][0],winsnc[i][1],winsnc[i][2],winsnc[i][3],winsnc[i][4]);
  1701.                     XFlush(disp);
  1702.                     }
  1703.                  };
  1704.             }*/
  1705.         }
  1706.  for (i =1; i < winondesk+1; i++)
  1707.        {
  1708.         if (!XGetGeometry (disp,winl[i],&junkroot,&junkx,&junky,&wwidth,&wheight,&bw,&depth))
  1709.            { ;}
  1710.         else {
  1711.               XTranslateCoordinates (disp,winl[i],junkroot,junkx,junky,&x,&y,&junkroot);
  1712.               winsnb[i][0]=winl[i];
  1713.               winsnb[i][1]=x;
  1714.               winsnb[i][2]=y;
  1715.               winsnb[i][3]=wwidth;
  1716.               winsnb[i][4]=wheight;
  1717.               }
  1718.         }      
  1719.  
  1720.   XCloseDisplay (disp);}
  1721. }
  1722.  
  1723. void Unsnap ()
  1724. {
  1725.  
  1726.        
  1727. }
  1728.  
  1729. void Place_sm_window_sugg ()
  1730. {
  1731. int ow=deskZx+0;
  1732. int oh=deskZy+0;
  1733. if (winondesk==0) {return;}
  1734. Sort_list();
  1735. activewin=winl[1];
  1736. Display *disp;
  1737. disp = XOpenDisplay(NULL);
  1738. Client_msg(disp, activewin, "_NET_ACTIVE_WINDOW",0,0,0,0,0);
  1739. Client_msg(disp, activewin, "_NET_WM_STATE",
  1740.            XInternAtom(disp,"_NET_WM_STATE_REMOVE",False) ,
  1741.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_VERT",False),
  1742.            XInternAtom(disp,"_NET_WM_STATE_MAXIMIZED_HORZ",False),0,0);
  1743. XCloseDisplay(disp);
  1744.     Display *dpy;
  1745.     Window root;
  1746.     Window ret_root;
  1747.     Window ret_child;
  1748.     int root_x=10;
  1749.     int root_y=10;
  1750.     int win_x;
  1751.     int win_y;
  1752.     unsigned int mask;
  1753.     dpy = XOpenDisplay(NULL);
  1754.     root = XDefaultRootWindow(dpy);
  1755.  dskwh=dskch;
  1756.  dskww=dskcw;
  1757. dskch=dskch-offset_bottom;oh=deskZy+offset_top;dskch=dskch-offset_top;
  1758. dskcw=dskcw-offset_right;ow=deskZx+offset_left;dskcw=dskcw-offset_left;
  1759. /*pointer feedback*/
  1760. int status;
  1761. Cursor cursor;
  1762. cursor = XCreateFontCursor(disp, XC_crosshair);
  1763. status = XGrabPointer(disp, root, False,ButtonPressMask|ButtonReleaseMask,
  1764.                       GrabModeSync,GrabModeAsync, root, cursor, CurrentTime);
  1765.   if (status != GrabSuccess)
  1766.     {
  1767.      fputs("ERROR: Cannot grab mouse.\n", stderr);
  1768.      return ;
  1769.     }
  1770. XAllowEvents(disp, SyncPointer, CurrentTime);
  1771. /*pointer feedback end -set this when no longer needed- XUngrabPointer(disp, CurrentTime);*/
  1772.  
  1773.   if (screen_sec) {Print_screen_sections ();}
  1774. while (1)
  1775.   {
  1776.  
  1777.   if(XQueryPointer(dpy, root, &ret_root, &ret_child, &root_x, &root_y,
  1778.                    &win_x, &win_y, &mask))
  1779.     {
  1780.     if (mask & (Button1Mask)){if (screen_sec) {Print_screen_sections ();};return;}
  1781.     Display *disp;
  1782.     disp = XOpenDisplay(NULL);
  1783.     /*CenterVerticalB*/
  1784.     if ((root_y<root_x+ow) & (root_x<((dskww/2)+oh)))
  1785.     {XMoveResizeWindow(disp,activewin,0+ow,0+oh,(((dskcw/4)*3)-dcw),dskch);}
  1786.     if ((root_x>((dskww/16)*8)+ow) & (root_x<((dskww/16)*9)+ow)& (root_y>((dskwh/16)*7)+oh) & (root_y<((dskwh/16)*9)+oh))
  1787.     {XMoveResizeWindow(disp,activewin,(dskcw/4)+ow,0+oh,(((dskcw/4)*3)-dcw),dskch);}
  1788.    
  1789.     ;XCloseDisplay(disp);};
  1790.   }
  1791. disp = XOpenDisplay(NULL);
  1792.   XMapRaised(disp, winl[1]);
  1793.   XCloseDisplay(disp);XUngrabPointer(disp, CurrentTime);return;
  1794. }
Advertisement
Add Comment
Please, Sign In to add comment