int main(int argc, char* argv[]){ char* action; Window window; int arg[5]={0}; // Connexion à un serveur X display = XOpenDisplay(NULL); if(!display){ printf("Can not open display.\n"); exit(EXIT_FAILURE); } // Récupère la valeur par default des différentes variables. screen = DefaultScreen(display); gc = DefaultGC (display, screen); root = RootWindow (display, screen); // Détermine l'action à effectuer : // On vérifie que le 2er argument (autre que nom fichier) est un id de fenetre : if(argc>2 && ((!strncmp(argv[2],"0x",2) && strtoll(argv[2],NULL,16)) || strtoll(argv[2],NULL,10)) ){ action = argv[1]; window = get_window(argv); // Si 5 arguments, c'est soit un move, soit un resize: if (argc==3){ // 1 seul argument (ex: 0x32422 ) if(!strcmp(action,"mapRaise")) do_map_and_raise(window); else if(!strcmp(action,"map")) do_map(window); else if(!strcmp(action,"raise")) do_raise(window); else if(!strcmp(action,"destroy")) do_destroy(window); else if(!strcmp(action,"focus")) do_focus(window); else if(!strcmp(action,"minimize")) do_minimize(window); else if(!strcmp(action,"set_desktop")) set_desktop((int)strtoll(argv[2],NULL,10)); else fail(); } else if(argc==4){ // 2 arguments (ex : 0x4242535 1 ) if(!strcmp(action,"set_desktop_for_window")){ set_desktop(strtoll(argv[3],NULL,10)); set_desktop_for_window(window,strtoll(argv[3],NULL,10)); } else if(!strcmp(action,"set_viewport")) set_viewport((int)strtoll(argv[2],NULL,10),(int)strtoll(argv[3],NULL,10)); else fail(); } else if(argc==5){ arg[0]=(int)strtoll(argv[3],NULL,10); arg[1]=(int)strtoll(argv[4],NULL,10); if(!strcmp(action,"move")) do_move(window, arg[0], arg[1]); else if(!strcmp(action,"resize")) do_resize(window,arg[0],arg[1]); else fail(); } else if(argc==7){ arg[0]=(int)strtoll(argv[3],NULL,10); arg[1]=(int)strtoll(argv[4],NULL,10); arg[2]=(int)strtoll(argv[5],NULL,10); arg[3]=(int)strtoll(argv[6],NULL,10); if(!strcmp(action,"moveResize")) do_move_and_resize(window, arg[0], arg[1], arg[2], arg[3]); else fail(); } else fail(); } else fail(); XCloseDisplay(display); return EXIT_SUCCESS; }
void event_button_release(XEvent* e) { Panel* panel = get_panel(e->xany.window); if (!panel) return; if (wm_menu && !tinto_handles_click(panel, &e->xbutton)) { forward_click(e); if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } int action = TOGGLE_ICONIFY; switch (e->xbutton.button) { case 1: action = mouse_left; break; case 2: action = mouse_middle; break; case 3: action = mouse_right; break; case 4: action = mouse_scroll_up; break; case 5: action = mouse_scroll_down; break; case 6: action = mouse_tilt_left; break; case 7: action = mouse_tilt_right; break; } point_T point = {e->xbutton.x, e->xbutton.y}; if (click_clock(panel, point)) { clock_action(e->xbutton.button); if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } point.x = e->xbutton.x; point.y = e->xbutton.y; if (click_launcher(panel, point)) { point.x = e->xbutton.x; point.y = e->xbutton.y; LauncherIcon* icon = click_launcher_icon(panel, point); if (icon) { launcher_action(icon, e); } task_drag = 0; return; } Taskbar* tskbar; if (!(tskbar = click_taskbar(panel, point))) { // TODO: check better solution to keep window below if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } // drag and drop task if (task_dragged) { task_drag = 0; task_dragged = 0; return; } // switch desktop if (panel_mode == MULTI_DESKTOP) { if (tskbar->desktop != server.desktop && action != CLOSE && action != DESKTOP_LEFT && action != DESKTOP_RIGHT) set_desktop(tskbar->desktop); } // action on task // e->xbutton.x, e->xbutton.y window_action(click_task(panel, point), action); // to keep window below if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win); }