diff src/applet.c @ 1261:07f0bb41bbe1

[gaim-migrate @ 1271] this name was getting too long committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Thu, 14 Dec 2000 09:05:36 +0000
parents
children d55aad6e05d9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/applet.c	Thu Dec 14 09:05:36 2000 +0000
@@ -0,0 +1,422 @@
+/**************************************************************
+**
+** GaimGnomeAppletMgr
+** Author - Quinticent (John Palmieri: johnp@martianrock.com)
+**
+** Purpose - Takes over the task of managing the GNOME applet
+**           code and provides a centralized codebase for
+**	     GNOME integration for Gaim.
+**
+**
+** gaim
+**
+** Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+#ifdef USE_APPLET
+#include <string.h>
+#include <gdk_imlib.h>
+#include "gaim.h"
+#include "applet.h"
+
+static int connecting = 0;
+
+gboolean applet_buddy_show = FALSE;
+GtkWidget *applet_popup = NULL;
+
+GtkWidget *applet;
+GtkWidget *appletframe;
+GtkWidget *status_label;
+
+GtkWidget *icon;
+GdkPixmap *icon_offline_pm=NULL;
+GdkPixmap *icon_offline_bm=NULL;
+
+GdkPixmap *icon_online_pm=NULL;
+GdkPixmap *icon_online_bm=NULL;
+
+GdkPixmap *icon_connect_pm=NULL;
+GdkPixmap *icon_connect_bm=NULL;
+
+GdkPixmap *icon_msg_pending_pm=NULL;
+GdkPixmap *icon_msg_pending_bm=NULL;
+
+GdkPixmap *icon_away_pm=NULL;
+GdkPixmap *icon_away_bm=NULL;
+
+static GtkAllocation get_applet_pos(gboolean);
+gint sizehint=48;
+
+static gboolean load_applet_icon(const char *name, int height, int width,
+				 GdkPixmap **pm, GdkBitmap **bm)
+{
+	gboolean result = TRUE;
+	char *path;
+	GdkImlibImage *im;
+
+	path = gnome_pixmap_file(name);	
+
+	im=gdk_imlib_load_image( path );
+	
+	if ((*pm)!=NULL)
+		gdk_imlib_free_pixmap((*pm));
+	
+	if( im!= NULL ){
+		gdk_imlib_render(im,width,height);
+	
+		(*pm) = gdk_imlib_move_image(im);
+		(*bm) = gdk_imlib_move_mask(im);	
+		
+	} else {
+		result = FALSE;
+		debug_printf(_("file not found: %s\n"),path);
+	}
+	
+	free(path);
+	return result;
+}
+
+#ifdef HAVE_PANEL_PIXEL_SIZE
+static void applet_change_pixel_size(GtkWidget *w, int size, gpointer data)
+{
+	sizehint = size;
+	update_pixmaps();
+}
+#endif
+
+static gboolean update_applet(){
+	char buf[BUF_LONG];
+	GSList *c = connections;
+
+	if (connecting) {
+		gtk_pixmap_set( GTK_PIXMAP(icon),
+				icon_connect_pm,
+				icon_connect_bm );   
+		gtk_label_set( GTK_LABEL(status_label), _MSG_CONNECT_ );
+		applet_set_tooltips(_("Attempting to sign on...."));
+	} else if (!connections) {
+		gtk_pixmap_set( GTK_PIXMAP(icon),
+				icon_offline_pm,
+				icon_offline_bm );
+		gtk_label_set( GTK_LABEL(status_label), _MSG_OFFLINE_ );
+		applet_set_tooltips(_("Offilne. Click to bring up login box."));
+	} else if (!awaymessage) {
+		gtk_pixmap_set( GTK_PIXMAP(icon),
+				icon_online_pm,
+				icon_online_bm );                
+		gtk_label_set( GTK_LABEL(status_label), _MSG_ONLINE_ );
+		g_snprintf(buf, sizeof buf, "Online: ");
+		while (c) {
+			strcat(buf, ((struct gaim_connection *)c->data)->username);
+			c = g_slist_next(c);
+			if (c) strcat(buf, ", ");
+		}
+		applet_set_tooltips(buf);
+	} else {
+		gtk_pixmap_set( GTK_PIXMAP(icon),
+				icon_online_pm,
+				icon_online_bm );   
+		gtk_label_set( GTK_LABEL(status_label), _("Away") );
+	}
+
+	return TRUE;
+}
+
+void update_pixmaps() {
+	load_applet_icon( GAIM_GNOME_OFFLINE_ICON, (sizehint-16), (sizehint-12),
+			&icon_offline_pm, &icon_offline_bm );
+	load_applet_icon( GAIM_GNOME_CONNECT_ICON, (sizehint-16), (sizehint-12),
+			&icon_connect_pm, &icon_connect_bm );
+	load_applet_icon( GAIM_GNOME_ONLINE_ICON, (sizehint-16), (sizehint-12),
+			&icon_online_pm, &icon_online_bm );
+	update_applet();
+	gtk_widget_set_usize(appletframe, sizehint, sizehint);
+}
+
+
+extern GtkWidget *mainwindow;
+void applet_show_login(AppletWidget *widget, gpointer data) {
+        show_login();
+	if (general_options & OPT_GEN_NEAR_APPLET) {
+		GtkAllocation a = get_applet_pos(FALSE);
+		gtk_widget_set_uposition(mainwindow, a.x, a.y);
+	}
+}
+
+void applet_do_signon(AppletWidget *widget, gpointer data) {
+	applet_show_login(NULL, 0);
+}
+
+void insert_applet_away() {
+	GSList *awy = away_messages;
+	struct away_message *a;
+	char  *awayname;
+
+	applet_widget_register_callback_dir(APPLET_WIDGET(applet),
+		"away/",
+		_("Away"));
+	applet_widget_register_callback(APPLET_WIDGET(applet),
+		"away/new",
+		_("New Away Message"),
+		(AppletCallbackFunc)create_away_mess,
+		NULL);
+
+	while(awy) {
+		a = (struct away_message *)awy->data;
+
+		awayname = g_malloc(sizeof *awayname * (6 + strlen(a->name)));
+		awayname[0] = '\0';
+		strcat(awayname, "away/");
+		strcat(awayname, a->name);
+		applet_widget_register_callback(APPLET_WIDGET(applet),
+			awayname,
+			a->name,
+			(AppletCallbackFunc)do_away_message,
+			a);
+
+		awy = g_slist_next(awy);
+		free(awayname);
+	}
+}
+
+void remove_applet_away() {
+	GSList *awy = away_messages;
+	struct away_message *a;
+	char  *awayname;
+
+	applet_widget_unregister_callback(APPLET_WIDGET(applet), "away/new");
+
+	while (awy) {
+		a = (struct away_message *)awy->data;
+
+		awayname = g_malloc(sizeof *awayname * (6 + strlen(a->name)));
+		awayname[0] = '\0';
+		strcat(awayname, "away/");
+		strcat(awayname, a->name);
+		applet_widget_unregister_callback(APPLET_WIDGET(applet), awayname);
+
+		awy = g_slist_next(awy);
+		free(awayname);
+	}
+	applet_widget_unregister_callback_dir(APPLET_WIDGET(applet), "away/");
+	applet_widget_unregister_callback(APPLET_WIDGET(applet), "away");
+}
+
+static void applet_show_about(AppletWidget *widget, gpointer data) {
+  
+  const gchar *authors[] = {"Mark Spencer <markster@marko.net>",
+                            "Jim Duchek <jimduchek@ou.edu>",
+                            "Rob Flynn <rflynn@blueridge.net>",
+			    "Eric Warmenhoven <warmenhoven@yahoo.com>",
+			    "Syd Logan",
+                            NULL};
+
+  GtkWidget *about=gnome_about_new(_("GAIM"),
+				   _(VERSION),
+				   _(""),
+				   authors,
+				   "",
+				   NULL);
+  gtk_widget_show(about);
+}
+
+static GtkAllocation get_applet_pos(gboolean for_blist) {
+	gint x,y,pad;
+	GtkRequisition buddy_req, applet_req;
+	GtkAllocation result;
+	GNOME_Panel_OrientType orient = applet_widget_get_panel_orient( APPLET_WIDGET(applet) );
+	pad = 5;
+
+	gdk_window_get_position(gtk_widget_get_parent_window(appletframe), &x, &y);
+	if (for_blist) {
+	        if (general_options & OPT_GEN_SAVED_WINDOWS) {
+			buddy_req.width = blist_pos.width;
+			buddy_req.height = blist_pos.height;
+		} else {
+			buddy_req = blist->requisition;
+		}
+	} else {
+		buddy_req = mainwindow->requisition;
+	}
+	applet_req = appletframe->requisition;
+
+	/* FIXME : we need to be smarter here */
+	switch( orient ){
+	case ORIENT_UP:
+		result.x=x;
+		result.y=y-(buddy_req.height+pad);
+		break;
+	case ORIENT_DOWN:
+		result.x=x; 
+		result.y=y+applet_req.height+pad; 
+		break;
+	case ORIENT_LEFT:
+		result.x=x-(buddy_req.width + pad );
+		result.y=y;
+		break;
+	case ORIENT_RIGHT:
+		result.x=x+applet_req.width+pad;
+		result.y=y;
+		break;
+	} 
+	return result;
+}
+
+void createOnlinePopup(){
+	GtkAllocation al;
+	if (blist) gtk_widget_show(blist);
+	al  = get_applet_pos(TRUE);  
+        if (general_options & OPT_GEN_NEAR_APPLET)
+                gtk_widget_set_uposition ( blist, al.x, al.y );
+        else if (general_options & OPT_GEN_SAVED_WINDOWS)
+                gtk_widget_set_uposition(blist, blist_pos.x - blist_pos.xoff, blist_pos.y - blist_pos.yoff);
+}
+
+void AppletClicked( GtkWidget *sender, GdkEventButton *ev, gpointer data ){
+	if (!ev || ev->button != 1 || ev->type != GDK_BUTTON_PRESS)
+		return;
+        
+	if(applet_buddy_show) {
+		applet_buddy_show = FALSE;
+		if (!connections && mainwindow)
+			gtk_widget_hide(mainwindow);
+		else
+			gtk_widget_hide(blist);
+	} else {
+		applet_buddy_show = TRUE;
+		if (!connections)
+			applet_show_login( APPLET_WIDGET(applet), NULL );
+		else
+			createOnlinePopup();
+	}
+}
+
+
+/***************************************************************
+**
+** Initialize GNOME stuff
+**
+****************************************************************/
+
+gint init_applet_mgr(int argc, char *argv[]) {
+	GtkWidget *vbox;
+	
+	GtkStyle *label_style;
+	GdkFont *label_font = NULL;
+
+        applet_widget_init("GAIM",VERSION,argc,argv,NULL,0,NULL);
+        
+        /*init imlib for graphics*/ 
+        gdk_imlib_init();
+        gtk_widget_push_visual(gdk_imlib_get_visual());
+        gtk_widget_push_colormap(gdk_imlib_get_colormap());
+
+        applet=applet_widget_new("gaim_applet");
+        if(!applet) g_error(_("Can't create GAIM applet!"));
+	gtk_widget_set_events(applet, gtk_widget_get_events(applet) |
+				GDK_BUTTON_PRESS_MASK);
+
+        appletframe = gtk_frame_new(NULL);
+#ifdef HAVE_PANEL_PIXEL_SIZE
+	gtk_widget_set_usize(appletframe, 5, 5);
+#else
+        gtk_widget_set_usize(appletframe, 48, 48);
+#endif   
+	
+	/*load offline icon*/
+	load_applet_icon( GAIM_GNOME_OFFLINE_ICON, 32, 32,
+			&icon_offline_pm, &icon_offline_bm );
+ 
+ 	/*load connecting icon*/
+ 	load_applet_icon( GAIM_GNOME_CONNECT_ICON, 32, 32,
+			&icon_connect_pm, &icon_connect_bm );
+							 
+	/*load online icon*/
+	load_applet_icon( GAIM_GNOME_ONLINE_ICON, 32, 32,
+			&icon_online_pm, &icon_online_bm );
+ 	
+ 	/*icon_away and icon_msg_pennding need to be implemented*/		
+		
+	icon=gtk_pixmap_new(icon_offline_pm,icon_offline_bm);
+	
+	vbox = gtk_vbox_new(FALSE,0);
+	
+	gtk_box_pack_start(GTK_BOX(vbox), icon, FALSE, TRUE, 0);
+	
+	status_label = gtk_label_new(_("Offline"));
+
+	update_applet();
+	
+	/*set this label's font*/
+	label_style = gtk_widget_get_style( status_label );
+	
+	label_font = gdk_font_load( _MSG_FONT_ );
+	         
+	
+	if( label_font != NULL ){
+		label_style->font = label_font; 
+		gtk_widget_set_style( status_label, label_style );
+	} else {
+		debug_printf(_("Font does not exist") );
+	}
+	
+	gtk_box_pack_start(GTK_BOX(vbox), status_label, FALSE, TRUE, 0);
+	
+	gtk_container_add( GTK_CONTAINER(appletframe), vbox );
+	applet_widget_add(APPLET_WIDGET(applet), appletframe);
+	
+	gtk_widget_show( status_label );
+	gtk_widget_show( vbox );
+	gtk_widget_show( appletframe );
+	        
+	applet_widget_register_stock_callback(APPLET_WIDGET(applet),
+					      "about",
+					      GNOME_STOCK_MENU_ABOUT,
+					      _("About..."),
+					      applet_show_about,
+					      NULL);
+					      
+	gtk_signal_connect( GTK_OBJECT(applet), "button_press_event", GTK_SIGNAL_FUNC( AppletClicked), NULL);
+
+	gtk_signal_connect( GTK_OBJECT(applet), "destroy", GTK_SIGNAL_FUNC( do_quit), NULL);
+
+#ifdef HAVE_PANEL_PIXEL_SIZE
+	gtk_signal_connect(GTK_OBJECT(applet), "change_pixel_size",
+			GTK_SIGNAL_FUNC(applet_change_pixel_size), NULL);
+#endif
+	
+        gtk_widget_show(icon);
+        gtk_widget_show(applet);
+        return 0;
+}
+
+void set_user_state( enum gaim_user_states state ){
+	if (state == signing_on)
+		connecting++;
+	else if ((state == away || state == online) && connecting > 0)
+		connecting--;
+	update_applet();
+}
+
+void applet_set_tooltips(char *msg) {
+	applet_widget_set_tooltip(APPLET_WIDGET(applet), msg);
+}
+
+#endif /*USE_APPLET*/