URL強調上で文字を入力したとき不要な描画が発生しないようにした
@@ -2899,6 +2899,33 @@ | ||
2899 | 2899 | #endif |
2900 | 2900 | |
2901 | 2901 | #if UNICODE_INTERNAL_BUFF |
2902 | +/** | |
2903 | + * カーソル位置とのURLアトリビュートの先頭との距離を計算する | |
2904 | + */ | |
2905 | +int get_url_len(int cur_x, int cur_y) | |
2906 | +{ | |
2907 | + int sp = cur_x + cur_y * NumOfColumns; | |
2908 | + int cp; | |
2909 | + int dp; | |
2910 | + { | |
2911 | + int p = sp; | |
2912 | + p--; | |
2913 | + while (p > 0) { | |
2914 | + int sy = p / NumOfColumns; | |
2915 | + int sx = p % NumOfColumns; | |
2916 | + int ptr = GetLinePtr(PageStart + sy) + sx; | |
2917 | + if ((AttrBuff[ptr] & AttrURL) == 0) { | |
2918 | + break; | |
2919 | + } | |
2920 | + p--; | |
2921 | + } | |
2922 | + sp = p; | |
2923 | + } | |
2924 | + cp = cur_x + cur_y * NumOfColumns; | |
2925 | + dp = cp - sp; | |
2926 | + return dp; | |
2927 | +} | |
2928 | + | |
2902 | 2929 | static const struct schemes_t { |
2903 | 2930 | const wchar_t *str; |
2904 | 2931 | int len; |
@@ -3081,6 +3108,9 @@ | ||
3081 | 3108 | } |
3082 | 3109 | } |
3083 | 3110 | |
3111 | +/** | |
3112 | + * カーソル位置からURL強調を行う | |
3113 | + */ | |
3084 | 3114 | static void mark_url_w(int cur_x, int cur_y) |
3085 | 3115 | { |
3086 | 3116 | buff_char_t *b = &CodeLineW[cur_x]; |
@@ -3095,13 +3125,7 @@ | ||
3095 | 3125 | int ey; |
3096 | 3126 | int len; |
3097 | 3127 | |
3098 | - // カーソル位置がURL | |
3099 | - if ((AttrLine[x] & AttrURL) != 0) { | |
3100 | - mark_url_line_w(cur_x, cur_y); | |
3101 | - return; | |
3102 | - } | |
3103 | - | |
3104 | - // 1つ前のキャラクタがURL? | |
3128 | + // 1つ前のセルがURL? | |
3105 | 3129 | if (x == 0) { |
3106 | 3130 | // 一番左の時は、前の行から継続していて、前の行の最後がURLだった時 |
3107 | 3131 | if ((AttrLine[0] & AttrLineContinued) != 0) { |
@@ -3135,15 +3159,31 @@ | ||
3135 | 3159 | |
3136 | 3160 | if (prev == TRUE) { |
3137 | 3161 | if (next == TRUE) { |
3162 | + if (isURLchar(u32)) { | |
3163 | + // URLにはさまれていて、URLになりえるキャラクタ | |
3164 | + int ptr = GetLinePtr(PageStart + cur_y) + cur_x; | |
3165 | + AttrBuff[ptr] |= AttrURL; | |
3166 | + return; | |
3167 | + } | |
3138 | 3168 | // 1line検査 |
3139 | 3169 | mark_url_line_w(cur_x, cur_y); |
3140 | 3170 | return; |
3141 | 3171 | } |
3142 | - if (isURLchar(u32)) { | |
3143 | - // URLを伸ばす | |
3144 | - AttrLine[x] |= AttrURL; | |
3172 | + | |
3173 | + len = get_url_len(cur_x, cur_y); | |
3174 | + if (len >= 9) { | |
3175 | + // URLアトリビュートがついている先頭から、 | |
3176 | + // 9文字以上離れている場合は | |
3177 | + // 文字が上書きされてもURLが壊れることはない | |
3178 | + // → カーソル位置にURLアトリビュートをつける | |
3179 | + if (isURLchar(u32)) { | |
3180 | + // URLを伸ばす | |
3181 | + AttrLine[x] |= AttrURL; | |
3182 | + } | |
3145 | 3183 | return; |
3146 | 3184 | } |
3185 | + mark_url_line_w(cur_x, cur_y); | |
3186 | + return; | |
3147 | 3187 | } |
3148 | 3188 | |
3149 | 3189 | // '/' が入力されたら調べ始める |