Mercurial > pidgin.yaz
comparison src/browser.c @ 4430:801830dec409
[gaim-migrate @ 4705]
robot101 gave me a bad patch
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 26 Jan 2003 20:43:25 +0000 |
parents | bf770f11132b |
children | 50ef0203fdbf |
comparison
equal
deleted
inserted
replaced
4429:bf770f11132b | 4430:801830dec409 |
---|---|
485 | 485 |
486 gdk_property_change(window, GDKA_MOZILLA_COMMAND, | 486 gdk_property_change(window, GDKA_MOZILLA_COMMAND, |
487 gdk_x11_xatom_to_atom (XA_STRING), | 487 gdk_x11_xatom_to_atom (XA_STRING), |
488 8, GDK_PROP_MODE_REPLACE, (unsigned char *)command, strlen(command)); | 488 8, GDK_PROP_MODE_REPLACE, (unsigned char *)command, strlen(command)); |
489 | 489 |
490 gdk_window_add_filter(window, (GdkFilterFunc) netscape_response_cb, window); | 490 while (!done) { |
491 } | 491 GdkEvent *event; |
492 | 492 |
493 static gboolean netscape_command(const char *command) | 493 event = gdk_event_get(); |
494 { | 494 |
495 GdkWindow *window = NULL; | 495 if (!event) |
496 | 496 continue; |
497 if (netscape_lock) { | 497 |
498 debug_printf("netscape_command() is currently in use.\n"); | 498 if (event->any.window != window) { |
499 return FALSE; | 499 gtk_main_do_event(event); |
500 } | 500 continue; |
501 | 501 } |
502 netscape_lock = 1; | 502 |
503 if (event->type == GDK_DESTROY && event->any.window == window) { | |
504 | |
505 /* Print to warn user... */ | |
506 debug_printf("%s: window 0x%x was destroyed.\n", progname, (unsigned int)window); | |
507 result = 6; | |
508 done = True; | |
509 } else if (event->type == GDK_PROPERTY_NOTIFY && | |
510 event->property.state == GDK_PROPERTY_NEW_VALUE && | |
511 event->property.window == window && | |
512 event->property.atom == GDKA_MOZILLA_RESPONSE) { | |
513 GdkAtom actual_type; | |
514 gint actual_format, nitems; | |
515 unsigned char *data = 0; | |
516 | |
517 result = gdk_property_get(window, GDKA_MOZILLA_RESPONSE, | |
518 gdk_x11_xatom_to_atom (XA_STRING), 0, | |
519 (65536 / sizeof(long)), | |
520 1, &actual_type, &actual_format, &nitems, &data); | |
521 | |
522 | |
523 if (result == Success && data && *data) { | |
524 debug_printf("%s: (server sent " MOZILLA_RESPONSE_PROP | |
525 " \"%s\" to 0x%x.)\n", | |
526 progname, data, (unsigned int)window); | |
527 } | |
528 | |
529 if (result != Success) { | |
530 debug_printf("%s: failed reading " MOZILLA_RESPONSE_PROP | |
531 " from window 0x%0x.\n", progname, (unsigned int)window); | |
532 result = 6; | |
533 done = True; | |
534 } else if (!data || strlen((char *)data) < 5) { | |
535 debug_printf("%s: invalid data on " MOZILLA_RESPONSE_PROP | |
536 " property of window 0x%0x.\n", | |
537 progname, (unsigned int)window); | |
538 result = 6; | |
539 done = True; | |
540 } else if (*data == '1') { /* positive preliminary reply */ | |
541 debug_printf("%s: %s\n", progname, data + 4); | |
542 /* keep going */ | |
543 done = False; | |
544 } else if (!strncmp((char *)data, "200", 3)) { | |
545 result = 0; | |
546 done = True; | |
547 } else if (*data == '2') { | |
548 debug_printf("%s: %s\n", progname, data + 4); | |
549 result = 0; | |
550 done = True; | |
551 } else if (*data == '3') { | |
552 debug_printf("%s: internal error: " | |
553 "server wants more information? (%s)\n", progname, data); | |
554 result = 3; | |
555 done = True; | |
556 } else if (*data == '4' || *data == '5') { | |
557 debug_printf("%s: %s\n", progname, data + 4); | |
558 result = (*data - '0'); | |
559 done = True; | |
560 } else { | |
561 debug_printf("%s: unrecognised " MOZILLA_RESPONSE_PROP | |
562 " from window 0x%x: %s\n", | |
563 progname, (unsigned int)window, data); | |
564 result = 6; | |
565 done = True; | |
566 } | |
567 | |
568 if (data) | |
569 g_free(data); | |
570 } else if (event->type == GDK_PROPERTY_NOTIFY && | |
571 event->property.window == window && | |
572 event->property.state == GDK_PROPERTY_DELETE && | |
573 event->property.atom == GDKA_MOZILLA_COMMAND) { | |
574 debug_printf("%s: (server 0x%x has accepted " | |
575 MOZILLA_COMMAND_PROP ".)\n", progname, (unsigned int)window); | |
576 } | |
577 gdk_event_free(event); | |
578 } | |
579 | |
580 if (new_command) | |
581 g_free(new_command); | |
582 | |
583 return result; | |
584 } | |
585 | |
586 | |
587 gboolean check_netscape(gpointer data) | |
588 { | |
589 char *msg = data; | |
590 int status; | |
591 GdkWindow *window; | |
503 | 592 |
504 mozilla_remote_init_atoms(); | 593 mozilla_remote_init_atoms(); |
505 window = mozilla_remote_find_window(); | 594 window = mozilla_remote_find_window(); |
506 | 595 |
507 if (window == NULL || (GDK_WINDOW_OBJECT(window)->destroyed == TRUE)) { | 596 if (window && (GDK_WINDOW_OBJECT(window)->destroyed == FALSE)) { |
508 debug_printf("Remote window absent or unsuitable.\n"); | 597 |
598 XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), | |
599 (PropertyChangeMask | StructureNotifyMask)); | |
600 | |
601 | |
602 mozilla_remote_obtain_lock(window); | |
603 | |
604 status = mozilla_remote_command(window, msg, False); | |
605 | |
606 if (status != 6) | |
607 mozilla_remote_free_lock(window); | |
608 | |
509 netscape_lock = 0; | 609 netscape_lock = 0; |
610 | |
611 g_free(msg); | |
510 return FALSE; | 612 return FALSE; |
511 } | 613 } else |
512 | 614 return TRUE; |
513 mozilla_remote_command(window, command, False); | 615 } |
514 | 616 |
515 netscape_lock = 0; | 617 |
516 return TRUE; | 618 static void netscape_command(char *command) |
619 { | |
620 int status; | |
621 pid_t pid; | |
622 GdkWindow *window; | |
623 | |
624 if (netscape_lock) | |
625 return; | |
626 | |
627 netscape_lock = 1; | |
628 | |
629 | |
630 | |
631 mozilla_remote_init_atoms(); | |
632 window = mozilla_remote_find_window(); | |
633 | |
634 if (window && (GDK_WINDOW_OBJECT(window)->destroyed == FALSE)) { | |
635 | |
636 XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), | |
637 (PropertyChangeMask | StructureNotifyMask)); | |
638 | |
639 mozilla_remote_obtain_lock(window); | |
640 | |
641 status = mozilla_remote_command(window, command, False); | |
642 | |
643 if (status != 6) | |
644 mozilla_remote_free_lock(window); | |
645 | |
646 netscape_lock = 0; | |
647 | |
648 gdk_window_destroy(window); | |
649 } else { | |
650 pid = fork(); | |
651 if (pid == 0) { | |
652 char *args[2]; | |
653 int e; | |
654 | |
655 args[0] = g_strdup("netscape"); | |
656 args[1] = NULL; | |
657 e = execvp(args[0], args); | |
658 printf("Hello%d\n", getppid()); | |
659 | |
660 _exit(0); | |
661 } else { | |
662 char *tmp = g_strdup(command); | |
663 g_timeout_add(200, check_netscape, tmp); | |
664 } | |
665 } | |
666 | |
517 } | 667 } |
518 | 668 |
519 void open_url(GtkWidget *w, char *url) | 669 void open_url(GtkWidget *w, char *url) |
520 { | 670 { |
521 char *command = NULL; | 671 gchar *space_free_url; |
522 GError *error = NULL; | 672 |
523 | |
524 switch (web_browser) { | |
525 case BROWSER_NETSCAPE: { | |
526 char *args = NULL; | |
527 | |
528 if (misc_options & OPT_MISC_BROWSER_POPUP) | |
529 args = g_strdup_printf("OpenURL(%s, new-window)", url); | |
530 else | |
531 args = g_strdup_printf("OpenURL(%s)", url); | |
532 | |
533 if (netscape_command(args)) { | |
534 g_free(args); | |
535 return; | |
536 } | |
537 | |
538 /* if netscape is running ... | |
539 command = g_strdup_printf("netscape -remote %s", args); */ | |
540 | |
541 command = g_strdup_printf("netscape %s", url); | |
542 g_free(args); | |
543 } break; | |
544 | |
545 case BROWSER_OPERA: | |
546 command = g_strdup_printf("opera -newwindow %s", url); | |
547 break; | |
548 | |
549 case BROWSER_KONQ: | |
550 command = g_strdup_printf("kfmclient openURL %s", url); | |
551 break; | |
552 | |
553 case BROWSER_GALEON: | |
554 command = g_strdup_printf("galeon -w %s", url); | |
555 command = g_strdup_printf("galeon %s", url); | |
556 break; | |
557 | |
558 case BROWSER_MOZILLA: | |
559 command = g_strdup_printf("mozilla %s", url); | |
560 break; | |
561 | |
562 case BROWSER_MANUAL: { | |
563 char *space_free_url = NULL; | |
564 | |
565 if (!web_command[0]) { | |
566 do_error_dialog(_("Unable to launch your browser because the 'Manual' browser command has been chosen, but no command has been set."), NULL, GAIM_ERROR); | |
567 return; | |
568 } | |
569 | |
570 space_free_url = g_strdelimit(url, " ", '+'); | |
571 command = g_strdup_printf("%s %s", web_command, space_free_url); | |
572 g_free(space_free_url); | |
573 } break; | |
574 } | |
575 | |
576 if (g_spawn_command_line_async(command, &error) == FALSE) { | |
577 char *tmp = g_strdup_printf(_("There was an error launching your chosen browser: %s"), error->message); | |
578 do_error_dialog(tmp, NULL, GAIM_ERROR); | |
579 g_free(tmp); | |
580 g_error_free(error); | |
581 } | |
582 | |
583 g_free(command); | |
584 } | |
585 | |
586 void add_bookmark(GtkWidget *w, char *url) | |
587 { | |
588 if (web_browser == BROWSER_NETSCAPE) { | 673 if (web_browser == BROWSER_NETSCAPE) { |
589 char *command = g_strdup_printf("AddBookmark(%s)", url); | 674 char *command; |
675 | |
676 if (misc_options & OPT_MISC_BROWSER_POPUP) | |
677 command = g_strdup_printf("OpenURL(%s, new-window)", url); | |
678 else | |
679 command = g_strdup_printf("OpenURL(%s)", url); | |
590 | 680 |
591 netscape_command(command); | 681 netscape_command(command); |
592 g_free(command); | 682 g_free(command); |
683 /* fixme: GNOME helper * | |
684 * } else if (web_browser == BROWSER_GNOME) { * | |
685 * gnome_url_show(url); */ | |
686 } else { | |
687 pid_t pid; | |
688 | |
689 pid = fork(); | |
690 | |
691 if (pid == 0) { | |
692 /* args will be allocated below but we don't bother | |
693 * freeing it since we're just going to exec and | |
694 * exit */ | |
695 char **args=NULL; | |
696 char command[1024]; | |
697 | |
698 if (web_browser == BROWSER_OPERA) { | |
699 args = g_new(char *, 4); | |
700 args[0] = "opera"; | |
701 args[1] = "-newwindow"; | |
702 args[2] = url; | |
703 args[3] = NULL; | |
704 } else if (web_browser == BROWSER_KONQ) { | |
705 args = g_new(char *, 4); | |
706 args[0] = "kfmclient"; | |
707 args[1] = "openURL"; | |
708 args[2] = url; | |
709 args[3] = NULL; | |
710 } else if (web_browser == BROWSER_GALEON) { | |
711 args = g_new(char *, 4); | |
712 args[0] = "galeon"; | |
713 if (misc_options & OPT_MISC_BROWSER_POPUP) { | |
714 args[1] = "-w"; | |
715 args[2] = url; | |
716 args[3] = NULL; | |
717 } else { | |
718 args[1] = url; | |
719 args[2] = NULL; | |
720 } | |
721 } else if (web_browser == BROWSER_MOZILLA) { | |
722 args = g_new(char *, 4); | |
723 args[0] = "mozilla"; | |
724 args[1] = url; | |
725 args[2] = NULL; | |
726 } else if (web_browser == BROWSER_MANUAL) { | |
727 if(strcmp(web_command,"") == 0) | |
728 _exit(0); | |
729 space_free_url = g_strdelimit(url, " ", '+'); | |
730 g_snprintf(command, sizeof(command), web_command, space_free_url); | |
731 g_free(space_free_url); | |
732 args = g_strsplit(command, " ", 0); | |
733 } | |
734 | |
735 execvp(args[0], args); | |
736 _exit(0); | |
737 } | |
738 } | |
739 } | |
740 | |
741 void add_bookmark(GtkWidget *w, char *url) | |
742 { | |
743 if (web_browser == BROWSER_NETSCAPE) { | |
744 char *command = g_malloc(1024); | |
745 | |
746 g_snprintf(command, 1024, "AddBookmark(%s)", url); | |
747 | |
748 netscape_command(command); | |
749 g_free(command); | |
593 } | 750 } |
594 } | 751 } |
595 | 752 |
596 #else | 753 #else |
597 | 754 |