Yattm - unified GTK instant-messaging client logo
   [Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003]

Home - Main Page - Data Structures - File List - Data Fields - Globals

browser.c File Reference

#include "intl.h"
#include <stdio.h>
#include <string.h>
#include <gdk/gdkx.h>
#include <stdlib.h>
#include <gdk/gdkprivate.h>
#include "dialog.h"
#include "util.h"
#include "gtk_globals.h"
#include "prefs.h"
#include <X11/Xlib.h>
#include <X11/Xatom.h>

Include dependency graph for browser.c:

Include dependency graph

Go to the source code of this file.

Defines

#define MOZILLA_VERSION_PROP   "_MOZILLA_VERSION"
#define MOZILLA_LOCK_PROP   "_MOZILLA_LOCK"
#define MOZILLA_COMMAND_PROP   "_MOZILLA_COMMAND"
#define MOZILLA_RESPONSE_PROP   "_MOZILLA_RESPONSE"

Enumerations

enum  { BROWSER_NETSCAPE, BROWSER_KFM, BROWSER_MANUAL, BROWSER_INTERNAL }

Functions

Window VirtualRootWindowOfScreen (screen) Screen *screen
Window GClientWindow (dpy, win) Display *dpy
void mozilla_remote_obtain_lock (GdkWindow *window)
void mozilla_remote_free_lock (GdkWindow *window)
int mozilla_remote_command (GdkWindow *window, const char *command, Bool raise_p)
gint check_netscape (char *msg)
void netscape_command (char *command)
void open_url (GtkWidget *w, char *url)
void add_bookmark (GtkWidget *w, char *url)
void open_url_nw (GtkWidget *w, char *url)

Variables

gint web_browser = BROWSER_NETSCAPE
const char * expected_mozilla_version = "1.1"
GdkAtom XA_MOZILLA_VERSION = 0
GdkAtom XA_MOZILLA_LOCK = 0
GdkAtom XA_MOZILLA_COMMAND = 0
GdkAtom XA_MOZILLA_RESPONSE = 0
int netscape_lock
Window win
Atom WM_STATE


Define Documentation

#define MOZILLA_COMMAND_PROP   "_MOZILLA_COMMAND"
 

Definition at line 73 of file browser.c.

#define MOZILLA_LOCK_PROP   "_MOZILLA_LOCK"
 

Definition at line 72 of file browser.c.

#define MOZILLA_RESPONSE_PROP   "_MOZILLA_RESPONSE"
 

Definition at line 74 of file browser.c.

#define MOZILLA_VERSION_PROP   "_MOZILLA_VERSION"
 

Definition at line 71 of file browser.c.


Enumeration Type Documentation

anonymous enum
 

Enumeration values:
BROWSER_NETSCAPE 
BROWSER_KFM 
BROWSER_MANUAL 
BROWSER_INTERNAL 

Definition at line 49 of file browser.c.

00050 {
00051     BROWSER_NETSCAPE,
00052     BROWSER_KFM,
00053     BROWSER_MANUAL,
00054     BROWSER_INTERNAL
00055 };


Function Documentation

void add_bookmark GtkWidget *    w,
char *    url
 

Definition at line 579 of file browser.c.

References BROWSER_NETSCAPE, netscape_command(), and web_browser.

00579                                            {
00580     if (web_browser == BROWSER_NETSCAPE) {
00581                 char *command = g_malloc(1024);
00582 
00583         g_snprintf(command, 1024, "AddBookmark(%s)", url);
00584 
00585         netscape_command(command);
00586         g_free(command);
00587     }
00588 }

gint check_netscape char *    msg
 

Definition at line 469 of file browser.c.

References mozilla_remote_command(), mozilla_remote_free_lock(), mozilla_remote_obtain_lock(), and netscape_lock.

Referenced by netscape_command().

00470 {
00471         int status;
00472         GdkWindow *window;
00473 
00474         mozilla_remote_init_atoms ();
00475         window = mozilla_remote_find_window();
00476 
00477         if (window) {
00478 
00479         XSelectInput(gdk_display, ((GdkWindowPrivate *)window)->xwindow,
00480                  (PropertyChangeMask|StructureNotifyMask));
00481 
00482         
00483                 mozilla_remote_obtain_lock(window);
00484 
00485                 status = mozilla_remote_command(window, msg, False);
00486 
00487                 if (status != 6)
00488                         mozilla_remote_free_lock(window);
00489 
00490                 gtk_timeout_add(1000, (GtkFunction)clean_pid, NULL);
00491 
00492                 netscape_lock = 0;
00493         
00494         g_free(msg);
00495                 return FALSE;
00496         } else
00497                 return TRUE;
00498 }

Window GClientWindow dpy   ,
win   
[static]
 

int mozilla_remote_command GdkWindow *    window,
const char *    command,
Bool    raise_p
[static]
 

Definition at line 359 of file browser.c.

References XA_MOZILLA_COMMAND, and XA_MOZILLA_RESPONSE.

Referenced by check_netscape(), and netscape_command().

00361 {
00362         int result = 0;
00363         Bool done = False;
00364         char *new_command = 0;
00365 
00366         /* The -noraise option is implemented by passing a "noraise" argument
00367          to each command to which it should apply.
00368          */
00369         if (!raise_p)
00370         {
00371                 char *close;
00372                 new_command = (char *) malloc (strlen (command) + 20);
00373                 strcpy (new_command, command);
00374                 close = strrchr (new_command, ')');
00375                 if (close)
00376                         strcpy (close, ", noraise)");
00377                 else
00378                         strcat (new_command, "(noraise)");
00379                 command = new_command;
00380         }
00381 
00382 
00383     gdk_property_change(window, XA_MOZILLA_COMMAND, XA_STRING, 8,
00384                 GDK_PROP_MODE_REPLACE, (unsigned char *) command,
00385                 strlen (command));
00386 
00387     while (!done) {
00388                 GdkEvent *event;
00389         
00390                 event = gdk_event_get();
00391         
00392         if (!event)
00393             continue;
00394         
00395         if (event->any.window != window) {
00396             gtk_main_do_event(event);
00397             continue;
00398         }
00399 
00400                 if (event->type == GDK_DESTROY &&
00401                     event->any.window == window) {
00402 
00403                         /* Print to warn user...*/
00404                         result = 6;
00405                         goto DONE;
00406         } else if (event->type == GDK_PROPERTY_NOTIFY &&
00407                          event->property.state == GDK_PROPERTY_NEW_VALUE &&
00408                          event->property.window == window &&
00409                          event->property.atom == XA_MOZILLA_RESPONSE) {
00410             GdkAtom actual_type;
00411             gint actual_format, nitems;
00412             unsigned char *data = 0;
00413 
00414             result = gdk_property_get (window, XA_MOZILLA_RESPONSE,
00415                            XA_STRING, 0,
00416                            (65536 / sizeof (long)),
00417                            1,
00418                            &actual_type, &actual_format,
00419                            &nitems, &data);
00420 
00421             
00422             if (result == Success && data && *data) {
00423             }
00424 
00425             if (result != Success) {
00426                 result = 6;
00427                 done = True;
00428             } else if (!data || strlen((char *) data) < 5) {
00429                 result = 6;
00430                 done = True;
00431             } else if (*data == '1') { /* positive preliminary reply */
00432             } else if (!strncmp ((char *)data, "200", 3)) {
00433                 result = 0;
00434                 done = True;
00435             } else if (*data == '2') {
00436                 result = 0;
00437                 done = True;
00438             } else if (*data == '3') {
00439                 result = 3;
00440                 done = True;
00441             } else if (*data == '4' || *data == '5') {
00442                 result = (*data - '0');
00443                 done = True;
00444             } else {
00445                 result = 6;
00446                 done = True;
00447             }
00448 
00449             if (data)
00450                 g_free(data);
00451         }
00452         else if (event->type == GDK_PROPERTY_NOTIFY &&
00453                          event->property.window == window &&
00454                          event->property.state == GDK_PROPERTY_DELETE &&
00455                          event->property.atom == XA_MOZILLA_COMMAND) {
00456         }
00457         gdk_event_free(event);
00458     }
00459 
00460 DONE:
00461 
00462     if (new_command)
00463         g_free (new_command);
00464 
00465     return result;
00466 }

void mozilla_remote_free_lock GdkWindow *    window [static]
 

Definition at line 327 of file browser.c.

References XA_MOZILLA_LOCK.

Referenced by check_netscape(), and netscape_command().

00328 {
00329         int result = 0;
00330         GdkAtom actual_type;
00331         gint actual_format;
00332         gint nitems;
00333         unsigned char *data = 0;
00334 
00335 
00336         result = gdk_property_get(window, XA_MOZILLA_LOCK, XA_STRING,
00337                   0, (65536 / sizeof (long)),
00338                   1, &actual_type, &actual_format,
00339                   &nitems, &data);
00340         if (result != Success)
00341         {
00342              return;
00343         }
00344         else if (!data || !*data)
00345         {
00346               return;
00347         }
00348         else if (strcmp ((char *) data, lock_data))
00349         {
00350             return;
00351         }
00352 
00353         if (data)
00354                 g_free(data);
00355 }

void mozilla_remote_obtain_lock GdkWindow *    window [static]
 

Definition at line 280 of file browser.c.

References XA_MOZILLA_LOCK.

Referenced by check_netscape(), and netscape_command().

00281 {
00282         Bool locked = False;
00283 
00284         if (!lock_data) {
00285         lock_data = (char *)g_malloc (255);
00286         sprintf (lock_data, "pid%d@", getpid ());
00287         if (gethostname (lock_data + strlen (lock_data), 100)) {
00288             return;
00289         }
00290     }
00291 
00292         do {
00293                 int result;
00294                 GdkAtom actual_type;
00295                 gint actual_format;
00296         gint nitems;
00297                 unsigned char *data = 0;
00298 
00299                 result = gdk_property_get (window, XA_MOZILLA_LOCK,
00300                        XA_STRING, 0,
00301                        (65536 / sizeof (long)), 0,
00302                        &actual_type, &actual_format,
00303                        &nitems, &data);
00304                 if (result != Success || actual_type == None)
00305                 {
00306                         /* It's not now locked - lock it. */
00307 
00308                     gdk_property_change(window, XA_MOZILLA_LOCK, XA_STRING,
00309                             8, PropModeReplace,
00310                             (unsigned char *) lock_data,
00311                             strlen (lock_data));
00312                     locked = True;
00313                 }
00314 
00315                 if (!locked) {
00316                         /* Then just fuck it. */
00317                         if (data)
00318                                 g_free(data);
00319                         return;
00320                 }
00321                 if (data)
00322                         g_free(data);
00323         } while (!locked);
00324 }

void netscape_command char *    command [static]
 

Definition at line 501 of file browser.c.

References check_netscape(), mozilla_remote_command(), mozilla_remote_free_lock(), mozilla_remote_obtain_lock(), and netscape_lock.

Referenced by add_bookmark(), open_url(), and open_url_nw().

00502 {
00503         int status;
00504         pid_t pid;
00505     GdkWindow *window;
00506 
00507     if (netscape_lock)
00508         return;
00509 
00510     netscape_lock = 1;
00511 
00512 
00513 
00514     mozilla_remote_init_atoms();
00515     window = mozilla_remote_find_window();
00516 
00517     if (window) {
00518 
00519         XSelectInput(gdk_display, ((GdkWindowPrivate *)window)->xwindow,
00520                  (PropertyChangeMask|StructureNotifyMask));
00521 
00522         mozilla_remote_obtain_lock(window);
00523 
00524         status = mozilla_remote_command(window, command, False);
00525 
00526         if (status != 6)
00527             mozilla_remote_free_lock(window);
00528 
00529         netscape_lock = 0;
00530         
00531     } else {
00532         pid = fork();
00533         if (pid == 0) {
00534             char *args[2];
00535             int e;
00536 
00537             args[0] = g_strdup("netscape");
00538             args[1] = NULL;
00539                         e = execvp(args[0], args);
00540                         
00541             _exit(0);
00542         } else {
00543             char *tmp = g_strdup(command);
00544             gtk_timeout_add(200, (GtkFunction)check_netscape, tmp);
00545         }
00546     }
00547 
00548 }

void open_url GtkWidget *    w,
char *    url
 

Definition at line 550 of file browser.c.

References BROWSER_KFM, BROWSER_NETSCAPE, netscape_command(), and web_browser.

00550                                        {
00551     if (web_browser == BROWSER_NETSCAPE) {
00552                 char *command = g_malloc(1024);
00553 
00554         g_snprintf(command, 1024, "OpenURL(%s)", url);
00555 
00556         netscape_command(command);
00557         g_free(command);
00558     } else if (web_browser == BROWSER_KFM) {
00559         pid_t pid;
00560 
00561         pid = fork();
00562 
00563         if (pid == 0) {
00564             char *args[4];
00565 
00566             args[0] = g_strdup("kfmclient");
00567             args[1] = g_strdup("openURL");
00568                         args[2] = url;;
00569             args[3] = NULL;
00570 
00571             execvp(args[0], args);
00572             _exit(0);
00573         } else {
00574             gtk_timeout_add(1000, (GtkFunction)clean_pid, NULL);
00575         }
00576     }  
00577 }

void open_url_nw GtkWidget *    w,
char *    url
 

Definition at line 590 of file browser.c.

References BROWSER_NETSCAPE, cGetLocalPref(), DBG_CORE, eb_debug, netscape_command(), and web_browser.

Referenced by handle_click(), show_manual(), and show_website().

00590                                           {
00591     char *alternate_browser=cGetLocalPref("alternate_browser");
00592     if ((use_alternate_browser == 1) && (strlen(alternate_browser) > 0)) {
00593         char *command = g_malloc(1024);
00594         char *url_pos = strstr(alternate_browser, "%s");
00595         /*
00596          * if alternate_browser contains a %s, then we put
00597          * the url in place of the %s, else, put the url
00598          * at the end.
00599          */
00600         if(url_pos) {
00601             int pre_len = url_pos-alternate_browser;
00602             strncpy(command, alternate_browser, pre_len);
00603             command[pre_len] = 0;
00604             strncat(command, url, 1024 - pre_len);
00605             strncat(command, url_pos+2, 1024 - strlen(command));
00606             strncat(command, " &", 1024 - strlen(command));
00607         } else
00608             g_snprintf(command, 1024, "%s \"%s\" &", alternate_browser, url);
00609         eb_debug(DBG_CORE, "launching %s\n", command);
00610         system(command);
00611         g_free(command);
00612     } else if (web_browser == BROWSER_NETSCAPE) {
00613         char *command = g_malloc(1024);
00614         g_snprintf(command, 1024, "OpenURL(%s, new-window)", url);
00615 
00616         netscape_command(command);
00617         g_free(command);
00618     }
00619 }

Window VirtualRootWindowOfScreen screen    [static]
 


Variable Documentation

const char* expected_mozilla_version = "1.1" [static]
 

Definition at line 69 of file browser.c.

int netscape_lock [static]
 

Definition at line 82 of file browser.c.

Referenced by check_netscape(), and netscape_command().

gint web_browser = BROWSER_NETSCAPE
 

Definition at line 58 of file browser.c.

Referenced by add_bookmark(), open_url(), and open_url_nw().

Window win
 

Definition at line 164 of file browser.c.

Atom WM_STATE
 

Definition at line 165 of file browser.c.

GdkAtom XA_MOZILLA_COMMAND = 0 [static]
 

Definition at line 78 of file browser.c.

Referenced by mozilla_remote_command().

GdkAtom XA_MOZILLA_LOCK = 0 [static]
 

Definition at line 77 of file browser.c.

Referenced by mozilla_remote_free_lock(), and mozilla_remote_obtain_lock().

GdkAtom XA_MOZILLA_RESPONSE = 0 [static]
 

Definition at line 79 of file browser.c.

Referenced by mozilla_remote_command().

GdkAtom XA_MOZILLA_VERSION = 0 [static]
 

Definition at line 76 of file browser.c.


Contact: Andy Maloney     [Documentation generated by doxygen]