Ticket #333: angband_moving_windows.diff

File angband_moving_windows.diff, 6.1 KB (added by morth@…, 12 years ago)

diff

  • main-x11.c

    old new  
    246246struct infowin 
    247247{ 
    248248        Window win; 
     249        Window root; 
    249250        long mask; 
    250251 
    251252        s16b ox, oy; 
    252253 
    253254        s16b x, y; 
    254         s16b x_save, y_save; 
     255        s16b px, py; 
    255256        s16b w, h; 
    256257        u16b b; 
    257258 
     
    472473static infoclr *clr[MAX_COLORS]; 
    473474 
    474475 
    475  
    476476/**** Generic code ****/ 
    477477 
    478478 
     
    679679{ 
    680680        infowin *iwin = Infowin; 
    681681 
    682         Window tmp_win; 
     682        Window root; 
    683683        XWindowAttributes xwa; 
    684684        int x, y; 
    685685        unsigned int w, h, b, d; 
     
    688688        iwin->win = xid; 
    689689 
    690690        /* Check For Error XXX Extract some ACTUAL data from 'xid' */ 
    691         XGetGeometry(Metadpy->dpy, xid, &tmp_win, &x, &y, &w, &h, &b, &d); 
     691        XGetGeometry(Metadpy->dpy, xid, &root, &x, &y, &w, &h, &b, &d); 
    692692 
    693693        /* Apply the above info */ 
     694        iwin->root = root; 
    694695        iwin->x = x; 
    695696        iwin->y = y; 
    696         iwin->x_save = x; 
    697         iwin->y_save = y; 
     697        iwin->px = 0; 
     698        iwin->py = 0; 
    698699        iwin->w = w; 
    699700        iwin->h = h; 
    700701        iwin->b = b; 
     
    15001501/* 
    15011502 * Path to the X11 settings file 
    15021503 */ 
     1504static const char *x11_prefs = "x11-settings.prf"; 
    15031505char settings[1024]; 
    15041506 
    15051507 
    1506  
    15071508/* 
    15081509 * Remember the number of terminal windows open 
    15091510 */ 
     
    17851786                        int oy = Infowin->oy; 
    17861787 
    17871788                        /* Save the new Window Parms */ 
    1788                         Infowin->x = xev->xconfigure.x; 
    1789                         Infowin->y = xev->xconfigure.y; 
     1789                        Infowin->x = xev->xconfigure.x - Infowin->px; 
     1790                        Infowin->y = xev->xconfigure.y - Infowin->py; 
    17901791                        Infowin->w = xev->xconfigure.width; 
    17911792                        Infowin->h = xev->xconfigure.height; 
    17921793 
     
    18221823 
    18231824                        break; 
    18241825                } 
     1826 
     1827                case ReparentNotify: 
     1828                { 
     1829                        /* XXX is this correct? */ 
     1830                        if (xev->xreparent.parent == Infowin->root) { 
     1831                                Infowin->x += Infowin->px; 
     1832                                Infowin->y += Infowin->py; 
     1833                                Infowin->px = Infowin->py = 0; 
     1834                        } else { 
     1835                                Infowin->x += Infowin->px - xev->xreparent.x; 
     1836                                Infowin->y += Infowin->py - xev->xreparent.y; 
     1837                                Infowin->px = xev->xreparent.x; 
     1838                                Infowin->py = xev->xreparent.y; 
     1839                        } 
     1840                        break; 
     1841                } 
    18251842        } 
    18261843 
    18271844 
     
    21192136{ 
    21202137        FILE *fff; 
    21212138        int i; 
     2139        int num_term = 0; 
    21222140 
    21232141        /* Open the settings file */ 
    21242142        fff = my_fopen(settings, "w"); 
     
    21392157 
    21402158                if (!td->t.mapped_flag) continue; 
    21412159 
     2160                num_term++; 
     2161 
    21422162                /* Header */ 
    21432163                fprintf(fff, "# Term %d\n", i); 
    21442164 
    2145                 /* 
    2146                  * This doesn't seem to work under various WMs 
    2147                  * since the decoration messes the position up 
    2148                  * 
    2149                  * Hack -- Use saved window positions. 
    2150                  * This means that we won't remember ingame repositioned 
    2151                  * windows, but also means that WMs won't screw predefined 
    2152                  * positions up. -CJN- 
    2153                  */ 
    2154  
    21552165                /* Window specific location (x) */ 
    2156                 fprintf(fff, "AT_X_%d=%d\n", i, td->win->x_save); 
     2166                fprintf(fff, "AT_X_%d=%d\n", i, td->win->x); 
    21572167 
    21582168                /* Window specific location (y) */ 
    2159                 fprintf(fff, "AT_Y_%d=%d\n", i, td->win->y_save); 
     2169                fprintf(fff, "AT_Y_%d=%d\n", i, td->win->y); 
    21602170 
    21612171                /* Window specific cols */ 
    21622172                fprintf(fff, "COLS_%d=%d\n", i, td->t.wid); 
     
    21832193                fprintf(fff, "\n"); 
    21842194        } 
    21852195 
     2196        fprintf(fff, "NUM_TERM=%d\n", num_term); 
     2197 
    21862198        /* Close */ 
    21872199        (void)my_fclose(fff); 
    21882200} 
     
    22322244        /* Get default font for this term */ 
    22332245        font = get_default_font(i); 
    22342246 
    2235         /* Build the filename */ 
    2236         path_build(settings, sizeof(settings), ANGBAND_DIR_USER, "x11-settings.prf"); 
    2237  
    22382247        /* Open the file */ 
    22392248        fff = my_fopen(settings, "r"); 
    22402249 
     
    24722481        /* Oops */ 
    24732482        if (sh == NULL) quit("XAllocSizeHints failed"); 
    24742483 
     2484        sh->flags = 0; 
     2485        if (x || y) 
     2486                sh->flags |= USPosition; 
     2487 
    24752488        /* Main window has a differing minimum size */ 
    24762489        if (i == 0) 
    24772490        { 
    24782491                /* Main window min size is 80x24 */ 
    2479                 sh->flags = PMinSize | PMaxSize; 
     2492                sh->flags |= PMinSize | PMaxSize; 
    24802493                sh->min_width = 80 * td->tile_wid + (ox + ox); 
    24812494                sh->min_height = 24 * td->tile_hgt + (oy + oy); 
    24822495                sh->max_width = 255 * td->tile_wid + (ox + ox); 
     
    24872500        else 
    24882501        { 
    24892502                /* Other windows */ 
    2490                 sh->flags = PMinSize | PMaxSize; 
     2503                sh->flags |= PMinSize | PMaxSize; 
    24912504                sh->min_width = td->tile_wid + (ox + ox); 
    24922505                sh->min_height = td->tile_hgt + (oy + oy); 
    24932506                sh->max_width = 255 * td->tile_wid + (ox + ox); 
     
    25462559} 
    25472560 
    25482561 
    2549 const char help_x11[] = "Basic X11, subopts -d<display> -n<windows>" 
     2562const char help_x11[] = "Basic X11, subopts -d<display> -n<windows> -x<file>" 
    25502563#ifdef USE_GRAPHICS 
    2551                         " -s(moothRescale)" 
    2552                         "\n           -b(Bigtile) -o(original) -a(AdamBolt) -g(David Gervais)" 
     2564                        "\n           -s(moothRescale) -b(Bigtile) -o(original) -a(AdamBolt) -g(David Gervais)" 
    25532565#endif 
    25542566                        ; 
    25552567 
     
    26152627 
    26162628        cptr dpy_name = ""; 
    26172629 
    2618         int num_term = 1; 
     2630        int num_term = 0; 
    26192631 
    26202632        FILE *fff; 
    26212633 
     
    26432655         */ 
    26442656 
    26452657        /* Build the filename */ 
    2646         (void)path_build(settings, sizeof(settings), ANGBAND_DIR_USER, "x11-settings.prf"); 
     2658        (void)path_build(settings, sizeof(settings), ANGBAND_DIR_USER, x11_prefs); 
    26472659 
    26482660        /* Open the file */ 
    26492661        fff = my_fopen(settings, "r"); 
     
    27312743                        continue; 
    27322744                } 
    27332745 
     2746                if (prefix(argv[i], "-x")) 
     2747                { 
     2748                        x11_prefs = argv[i] + 2; 
     2749                        continue; 
     2750                } 
     2751 
     2752                if (prefix(argv[i], "-x")) 
     2753                { 
     2754                        x11_prefs = argv[i] + 2; 
     2755                        continue; 
     2756                } 
     2757 
    27342758                plog_fmt("Ignoring option: %s", argv[i]); 
    27352759        } 
    27362760 
     
    27792803                Infoclr_init_ppn(pixel, Metadpy->bg, "cpy", 0); 
    27802804        } 
    27812805 
     2806        /* Build the filename */ 
     2807        path_build(settings, sizeof(settings), ANGBAND_DIR_USER, x11_prefs); 
     2808 
     2809        if (!num_term) { 
     2810                FILE *fff; 
     2811 
     2812                /* Look for saved number of terms. */ 
     2813 
     2814                /* Open the file */ 
     2815                fff = my_fopen(settings, "r"); 
     2816                if (fff) { 
     2817                        char buf[1024]; 
     2818                        const char *cmd = "NUM_TERM"; 
     2819 
     2820                        /* Process the file */ 
     2821                        while (0 == my_fgets(fff, buf, sizeof(buf))) 
     2822                        { 
     2823                                /* Skip "empty" lines */ 
     2824                                if (!buf[0]) continue; 
     2825 
     2826                                /* Skip "blank" lines */ 
     2827                                if (isspace((unsigned char)buf[0])) continue; 
     2828 
     2829                                /* Skip comments */ 
     2830                                if (buf[0] == '#') continue; 
     2831 
     2832                                if (prefix(buf, cmd)) 
     2833                                { 
     2834                                        char *str = strstr(buf, "="); 
     2835                                        if (str) 
     2836                                                num_term = atoi(str + 1); 
     2837                                        break; 
     2838                                } 
     2839                        } 
     2840 
     2841                        /* Close */ 
     2842                        my_fclose(fff); 
     2843                } 
     2844        } 
     2845        if (num_term < 1) 
     2846                num_term = 1; 
     2847 
    27822848 
    27832849        /* Initialize the windows */ 
    27842850        for (i = 0; i < num_term; i++)