diff options
| author | Karoly Lorentey | 2006-10-14 17:36:28 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2006-10-14 17:36:28 +0000 |
| commit | 12b6af5c7ed2cfdb9783312bf890cf1e6c80c67a (patch) | |
| tree | 1775f9fd1c92defd8b61304a08ec00da95bc4539 /src/gtkutil.c | |
| parent | 3f87f67ee215ffeecbd2f53bd7f342cdf03f47df (diff) | |
| parent | f763da8d0808af7c80d72bc586bf4fcf50b37ddd (diff) | |
| download | emacs-12b6af5c7ed2cfdb9783312bf890cf1e6c80c67a.tar.gz emacs-12b6af5c7ed2cfdb9783312bf890cf1e6c80c67a.zip | |
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-413
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-414
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-415
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-416
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-417
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-418
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-419
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-420
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-421
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-422
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-423
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-424
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-425
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-426
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-427
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-428
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-429
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-430
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-431
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-432
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-433
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-434
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-435
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-436
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-437
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-438
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-439
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-440
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-441
lisp/url/url-methods.el: Fix format error when http_proxy is empty string
* emacs@sv.gnu.org/emacs--devo--0--patch-442
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-443
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-444
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-445
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-446
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-447
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-448
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-449
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-450
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-451
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-452
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-453
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-454
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-455
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-456
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-457
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-458
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-459
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-460
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-461
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-462
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-463
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-464
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-465
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-466
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-467
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-468
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-469
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-470
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-471
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-472
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-473
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-128
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-129
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-130
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-131
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-132
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-133
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-134
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-135
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-136
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-137
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-138
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-139
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-140
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-141
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-142
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-143
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-144
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-145
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-146
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-147
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-148
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-149
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-582
Diffstat (limited to 'src/gtkutil.c')
| -rw-r--r-- | src/gtkutil.c | 126 |
1 files changed, 100 insertions, 26 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c index 4329ce236de..18b3607fc6f 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -131,14 +131,8 @@ xg_display_close (Display *dpy) | |||
| 131 | #ifdef HAVE_GTK_MULTIDISPLAY | 131 | #ifdef HAVE_GTK_MULTIDISPLAY |
| 132 | GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy); | 132 | GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy); |
| 133 | 133 | ||
| 134 | /* GTK 2.2 has a bug that makes gdk_display_close crash (bug | ||
| 135 | http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way | ||
| 136 | we can continue running, but there will be memory leaks. */ | ||
| 137 | |||
| 138 | #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4 | ||
| 139 | |||
| 140 | /* If this is the default display, we must change it before calling | 134 | /* If this is the default display, we must change it before calling |
| 141 | dispose, otherwise it will crash. */ | 135 | dispose, otherwise it will crash on some Gtk+ versions. */ |
| 142 | if (gdk_display_get_default () == gdpy) | 136 | if (gdk_display_get_default () == gdpy) |
| 143 | { | 137 | { |
| 144 | struct x_display_info *dpyinfo; | 138 | struct x_display_info *dpyinfo; |
| @@ -160,10 +154,14 @@ xg_display_close (Display *dpy) | |||
| 160 | gdpy_new); | 154 | gdpy_new); |
| 161 | } | 155 | } |
| 162 | 156 | ||
| 163 | g_object_run_dispose (G_OBJECT (gdpy)); | 157 | /* GTK 2.2-2.8 has a bug that makes gdk_display_close crash (bug |
| 158 | http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way | ||
| 159 | we can continue running, but there will be memory leaks. */ | ||
| 164 | 160 | ||
| 161 | #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 10 | ||
| 162 | g_object_run_dispose (G_OBJECT (gdpy)); | ||
| 165 | #else | 163 | #else |
| 166 | /* I hope this will be fixed in GTK 2.4. It is what bug 85715 says. */ | 164 | /* This seems to be fixed in GTK 2.10. */ |
| 167 | gdk_display_close (gdpy); | 165 | gdk_display_close (gdpy); |
| 168 | #endif | 166 | #endif |
| 169 | #endif /* HAVE_GTK_MULTIDISPLAY */ | 167 | #endif /* HAVE_GTK_MULTIDISPLAY */ |
| @@ -509,10 +507,66 @@ get_utf8_string (str) | |||
| 509 | { | 507 | { |
| 510 | char *utf8_str = str; | 508 | char *utf8_str = str; |
| 511 | 509 | ||
| 510 | if (!str) return NULL; | ||
| 511 | |||
| 512 | /* If not UTF-8, try current locale. */ | 512 | /* If not UTF-8, try current locale. */ |
| 513 | if (str && !g_utf8_validate (str, -1, NULL)) | 513 | if (!g_utf8_validate (str, -1, NULL)) |
| 514 | utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0); | 514 | utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0); |
| 515 | 515 | ||
| 516 | if (!utf8_str) | ||
| 517 | { | ||
| 518 | /* Probably some control characters in str. Escape them. */ | ||
| 519 | size_t nr_bad = 0; | ||
| 520 | gsize bytes_read; | ||
| 521 | gsize bytes_written; | ||
| 522 | unsigned char *p = (unsigned char *)str; | ||
| 523 | char *cp, *up; | ||
| 524 | GError *error = NULL; | ||
| 525 | |||
| 526 | while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read, | ||
| 527 | &bytes_written, &error)) | ||
| 528 | && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) | ||
| 529 | { | ||
| 530 | ++nr_bad; | ||
| 531 | p += bytes_written+1; | ||
| 532 | g_error_free (error); | ||
| 533 | error = NULL; | ||
| 534 | } | ||
| 535 | |||
| 536 | if (error) | ||
| 537 | { | ||
| 538 | g_error_free (error); | ||
| 539 | error = NULL; | ||
| 540 | } | ||
| 541 | if (cp) g_free (cp); | ||
| 542 | |||
| 543 | up = utf8_str = xmalloc (strlen (str) + nr_bad * 4 + 1); | ||
| 544 | p = str; | ||
| 545 | |||
| 546 | while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read, | ||
| 547 | &bytes_written, &error)) | ||
| 548 | && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) | ||
| 549 | { | ||
| 550 | strncpy (up, p, bytes_written); | ||
| 551 | sprintf (up + bytes_written, "\\%03o", p[bytes_written]); | ||
| 552 | up[bytes_written+4] = '\0'; | ||
| 553 | up += bytes_written+4; | ||
| 554 | p += bytes_written+1; | ||
| 555 | g_error_free (error); | ||
| 556 | error = NULL; | ||
| 557 | } | ||
| 558 | |||
| 559 | if (cp) | ||
| 560 | { | ||
| 561 | strcat (utf8_str, cp); | ||
| 562 | g_free (cp); | ||
| 563 | } | ||
| 564 | if (error) | ||
| 565 | { | ||
| 566 | g_error_free (error); | ||
| 567 | error = NULL; | ||
| 568 | } | ||
| 569 | } | ||
| 516 | return utf8_str; | 570 | return utf8_str; |
| 517 | } | 571 | } |
| 518 | 572 | ||
| @@ -1158,8 +1212,8 @@ int | |||
| 1158 | xg_uses_old_file_dialog () | 1212 | xg_uses_old_file_dialog () |
| 1159 | { | 1213 | { |
| 1160 | #ifdef HAVE_GTK_FILE_BOTH | 1214 | #ifdef HAVE_GTK_FILE_BOTH |
| 1161 | extern int x_use_old_gtk_file_dialog; | 1215 | extern int x_gtk_use_old_file_dialog; |
| 1162 | return x_use_old_gtk_file_dialog; | 1216 | return x_gtk_use_old_file_dialog; |
| 1163 | #else /* ! HAVE_GTK_FILE_BOTH */ | 1217 | #else /* ! HAVE_GTK_FILE_BOTH */ |
| 1164 | 1218 | ||
| 1165 | #ifdef HAVE_GTK_FILE_SELECTION_NEW | 1219 | #ifdef HAVE_GTK_FILE_SELECTION_NEW |
| @@ -1296,6 +1350,8 @@ xg_get_file_with_chooser (f, prompt, default_filename, | |||
| 1296 | GTK_FILE_CHOOSER_ACTION_OPEN : | 1350 | GTK_FILE_CHOOSER_ACTION_OPEN : |
| 1297 | GTK_FILE_CHOOSER_ACTION_SAVE); | 1351 | GTK_FILE_CHOOSER_ACTION_SAVE); |
| 1298 | extern int x_gtk_show_hidden_files; | 1352 | extern int x_gtk_show_hidden_files; |
| 1353 | extern int x_gtk_file_dialog_help_text; | ||
| 1354 | |||
| 1299 | 1355 | ||
| 1300 | if (only_dir_p) | 1356 | if (only_dir_p) |
| 1301 | action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; | 1357 | action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; |
| @@ -1323,16 +1379,24 @@ xg_get_file_with_chooser (f, prompt, default_filename, | |||
| 1323 | g_signal_connect (G_OBJECT (filewin), "notify", | 1379 | g_signal_connect (G_OBJECT (filewin), "notify", |
| 1324 | G_CALLBACK (xg_toggle_notify_cb), wtoggle); | 1380 | G_CALLBACK (xg_toggle_notify_cb), wtoggle); |
| 1325 | 1381 | ||
| 1326 | message[0] = '\0'; | 1382 | if (x_gtk_file_dialog_help_text) |
| 1327 | if (action != GTK_FILE_CHOOSER_ACTION_SAVE) | 1383 | { |
| 1328 | strcat (message, "\nType C-l to display a file name text entry box.\n"); | 1384 | message[0] = '\0'; |
| 1329 | strcat (message, "\nIf you don't like this file selector, customize " | 1385 | /* Gtk+ 2.10 has the file name text entry box integrated in the dialog. |
| 1330 | "use-file-dialog\nto turn it off, or type C-x C-f to visit files."); | 1386 | Show the C-l help text only for versions < 2.10. */ |
| 1387 | if (gtk_check_version (2, 10, 0) && action != GTK_FILE_CHOOSER_ACTION_SAVE) | ||
| 1388 | strcat (message, "\nType C-l to display a file name text entry box.\n"); | ||
| 1389 | strcat (message, "\nIf you don't like this file selector, use the " | ||
| 1390 | "corresponding\nkey binding or customize " | ||
| 1391 | "use-file-dialog to turn it off."); | ||
| 1392 | |||
| 1393 | wmessage = gtk_label_new (message); | ||
| 1394 | gtk_widget_show (wmessage); | ||
| 1395 | } | ||
| 1331 | 1396 | ||
| 1332 | wmessage = gtk_label_new (message); | ||
| 1333 | gtk_widget_show (wmessage); | ||
| 1334 | gtk_box_pack_start (GTK_BOX (wbox), wtoggle, FALSE, FALSE, 0); | 1397 | gtk_box_pack_start (GTK_BOX (wbox), wtoggle, FALSE, FALSE, 0); |
| 1335 | gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0); | 1398 | if (x_gtk_file_dialog_help_text) |
| 1399 | gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0); | ||
| 1336 | gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (filewin), wbox); | 1400 | gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (filewin), wbox); |
| 1337 | 1401 | ||
| 1338 | if (default_filename) | 1402 | if (default_filename) |
| @@ -1340,6 +1404,7 @@ xg_get_file_with_chooser (f, prompt, default_filename, | |||
| 1340 | Lisp_Object file; | 1404 | Lisp_Object file; |
| 1341 | struct gcpro gcpro1; | 1405 | struct gcpro gcpro1; |
| 1342 | GCPRO1 (file); | 1406 | GCPRO1 (file); |
| 1407 | char *utf8_filename; | ||
| 1343 | 1408 | ||
| 1344 | file = build_string (default_filename); | 1409 | file = build_string (default_filename); |
| 1345 | 1410 | ||
| @@ -1347,14 +1412,23 @@ xg_get_file_with_chooser (f, prompt, default_filename, | |||
| 1347 | an absolute name starting with /. */ | 1412 | an absolute name starting with /. */ |
| 1348 | if (default_filename[0] != '/') | 1413 | if (default_filename[0] != '/') |
| 1349 | file = Fexpand_file_name (file, Qnil); | 1414 | file = Fexpand_file_name (file, Qnil); |
| 1350 | 1415 | ||
| 1351 | default_filename = SSDATA (file); | 1416 | utf8_filename = SSDATA (ENCODE_UTF_8 (file)); |
| 1352 | if (Ffile_directory_p (file)) | 1417 | if (! NILP (Ffile_directory_p (file))) |
| 1353 | gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filewin), | 1418 | gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filewin), |
| 1354 | default_filename); | 1419 | utf8_filename); |
| 1355 | else | 1420 | else |
| 1356 | gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filewin), | 1421 | { |
| 1357 | default_filename); | 1422 | gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filewin), |
| 1423 | utf8_filename); | ||
| 1424 | if (action == GTK_FILE_CHOOSER_ACTION_SAVE) | ||
| 1425 | { | ||
| 1426 | char *cp = strrchr (utf8_filename, '/'); | ||
| 1427 | if (cp) ++cp; | ||
| 1428 | else cp = utf8_filename; | ||
| 1429 | gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filewin), cp); | ||
| 1430 | } | ||
| 1431 | } | ||
| 1358 | 1432 | ||
| 1359 | UNGCPRO; | 1433 | UNGCPRO; |
| 1360 | } | 1434 | } |