Mercurial > pidgin
diff src/gnome_applet_mgr.c @ 1:2846a03bda67
[gaim-migrate @ 10]
The other missing files :)
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Thu, 23 Mar 2000 03:13:54 +0000 |
parents | |
children | 5cdd1f11db02 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gnome_applet_mgr.c Thu Mar 23 03:13:54 2000 +0000 @@ -0,0 +1,678 @@ +/************************************************************** +** +** 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 USE_APPLET +#include <string.h> +#include <gdk_imlib.h> +#include "gaim.h" +#include "gnome_applet_mgr.h" + +enum gaim_user_states MRI_user_status; +gint total_num_of_buddies; /* how many buddies I have in my list */ +gint num_of_buddies_online; /* how many of them are online */ + +gboolean buddy_created = FALSE; +gboolean applet_draw_open = FALSE; +GtkWidget *applet_popup = NULL; + +GtkWidget *applet; +GtkWidget *button; +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; + +/*************************************************************** +** +** function load_applet_icon +** visibility - private +** +** input: +** name - the name of the file to load +** height, width - the height and width +** that the icon should be +** scaled to. +** +** output: +** TRUE - success +** FALSE - failure +** pm - a GdkPixmap structure that the icon is loaded into +** bm - a GdkBitmap structure that the icon's transparancy +** mask is loaded into +** +** description - loads an icon from +** /usr/share/pixmap/gaim/gnome/ +** and scales it using imlib +** +****************************************************************/ + +gboolean load_applet_icon( const char *name, int height, int width, GdkPixmap **pm, GdkBitmap **bm ){ + gboolean result = TRUE; + char path[255] = GAIM_GNOME_PIXMAP_DIR; + GdkImlibImage *im; + GdkPixmap *temp_pm; + GdkPixmap *temp_bm; + + strcat( path, 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; + sprintf(debug_buff,"file not found: %s\n",path); + debug_print(debug_buff); + } + + return result; +} + +/*************************************************************** +** +** function update_applet +** visibility - private +** +** input: +** ap - not in use +** +** description - takes care of swapping status icons and +** updating the status label +** +****************************************************************/ + +gboolean update_applet( gpointer *ap ){ + char temp_string[25]; + static enum gaim_user_states old_user_status = offline; + static gint old_total_num_of_buddies = -1; + static gint old_num_of_buddies_online = -1; + if( applet_draw_open ){ + sprintf(debug_buff, "Drawer is open\n"); + debug_print(debug_buff); + } else { + sprintf(debug_buff, "Drawer is closed\n"); + debug_print(debug_buff); + } + + if( MRI_user_status != old_user_status ){ + + switch( MRI_user_status ){ + case offline: + gtk_pixmap_set( GTK_PIXMAP(icon), + icon_offline_pm, + icon_offline_bm ); + gtk_label_set( GTK_LABEL(status_label), _MSG_OFFLINE_ ); + break; + case signing_on: + gtk_pixmap_set( GTK_PIXMAP(icon), + icon_connect_pm, + icon_connect_bm ); + gtk_label_set( GTK_LABEL(status_label), _MSG_CONNECT_ ); + old_total_num_of_buddies = -1; + old_num_of_buddies_online = -1; + break; + case online: + gtk_pixmap_set( GTK_PIXMAP(icon), + icon_online_pm, + icon_online_bm ); + + gtk_label_set( GTK_LABEL(status_label), _MSG_ONLINE_ ); + break; + + case unread_message_pending: + gtk_pixmap_set( GTK_PIXMAP(icon), + icon_msg_pending_pm, + icon_msg_pending_bm ); + gtk_label_set( GTK_LABEL(status_label), "msg" ); + break; + case away: + gtk_pixmap_set( GTK_PIXMAP(icon), + icon_away_pm, + icon_away_bm ); + gtk_label_set( GTK_LABEL(status_label), "Away" ); + break; + } + old_user_status = MRI_user_status; + } +#ifdef _USE_BUDDY_COUNT_ + if( (( old_total_num_of_buddies != total_num_of_buddies ) || + ( old_num_of_buddies_online != num_of_buddies_online )) && + ( MRI_user_status == online ) ){ + /*make user buffer can not overflow*/ + if(total_num_of_buddies<1000){ + sprintf(temp_string, "%i/%i", num_of_buddies_online, total_num_of_buddies); + } else { + if(num_of_buddies_online<100000){ + sprintf(temp_string, "%i", num_of_buddies_online); + } else { + /*we most likely will never get to here but + hey, people also thought computer wouldn't + be around by the year 2000 :-) */ + sprintf(temp_string, _MSG_ONLINE_ ); + } + } + gtk_label_set( GTK_LABEL(status_label), temp_string ); + old_total_num_of_buddies = total_num_of_buddies; + old_num_of_buddies_online = num_of_buddies_online; + } +#endif /*_USE_BUDDY_COUNT_*/ + return TRUE; + +} + + +/*************************************************************** +** +** function make_buddy +** visibility - private +** +** description - If buddylist is not created create it +** else show the buddy list +** +****************************************************************/ +void make_buddy(void) { + set_applet_draw_open(); + if( !buddy_created ){ + show_buddy_list(); + buddy_created = TRUE; + } else { + gnome_buddy_show(); + } + applet_widget_unregister_callback(APPLET_WIDGET(applet),"buddy"); + +} + +/*************************************************************** +** +** function applet_show_login +** visibility - private +** +** input: +** +** +** description - I guess it shows the login dialog +** +****************************************************************/ + +void applet_show_login(AppletWidget *widget, gpointer data) { + show_login(); + applet_widget_unregister_callback(APPLET_WIDGET(applet),"signon"); + applet_widget_register_callback(APPLET_WIDGET(applet), + "signoff", + _("Signoff"), + signoff, + NULL); + applet_widget_register_callback(APPLET_WIDGET(applet), + "away", + _("Away Message"), + show_away_mess, + NULL); + applet_widget_register_callback(APPLET_WIDGET(applet), + "buddy", + _("Buddy List"), + (AppletCallbackFunc)make_buddy, + NULL); +} + +/*************************************************************** +** +** function applet_show_about +** visibility - public +** +** +** description - takes care of creating and +** displaying the about box +** +****************************************************************/ +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>", + + NULL}; + + GtkWidget *about=gnome_about_new(_("GAIM"), + _(VERSION), + _(""), + authors, + "", + NULL); + gtk_widget_show(about); +} + +/*************************************************************** +** +** function AppletCancelLogin (name should be changed to +** applet_cancel_login) +** visibility - public +** +** description - called when user cancels login +** +****************************************************************/ +void AppletCancelLogon(){ + applet_widget_unregister_callback(APPLET_WIDGET(applet),"signoff"); + applet_widget_register_callback(APPLET_WIDGET(applet), + "signon", + _("Signon"), + applet_show_login, + NULL); +} + +/*************************************************************** +** +** function get_applet_pos +** visibility - private +** +** output: +** GtKAllocation - a Gtk struct that holds the +** position of the dialog +** +** description - returns the x,y position the buddy list should +** should be placed based on the position +** of the applet and the orientation +** of the Gnome panel. +** +****************************************************************/ +GtkAllocation get_applet_pos(){ + GtkAllocation pos; + 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( button ),&x,&y ); + buddy_req = gnome_buddy_get_dimentions(); + applet_req = button->requisition; + 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 createOfflinePopup(){ + applet_show_login( APPLET_WIDGET(applet), NULL ); +} + + +void createSignonPopup(){ + applet_draw_open = FALSE; +} + + +void createOnlinePopup(){ + GtkAllocation al; + make_buddy(); + al = get_applet_pos(); + gnome_buddy_set_pos( al.x, al.y ); +} + + +void createPendingPopup(){ + applet_draw_open = FALSE; +} + + +void createAwayPopup(){ + applet_draw_open = FALSE; +} + + +void closeOfflinePopup(){ + cancel_logon(); + set_applet_draw_closed(); +} + + +void closeSignonPopup(){ + +} + + +void closeOnlinePopup(){ + set_applet_draw_closed(); + applet_destroy_buddy(); +} + + +void closePendingPopup(){ + applet_draw_open = FALSE; +} + + +void closeAwayPopup(){ + applet_draw_open = FALSE; +} + +/************************************************** +** +** Dummy function to fix compiles for gnome +** Feel free to implement an away message +** +***************************************************/ +void show_away_mess( AppletWidget *widget, gpointer data ) { +} + +void AppletClicked( GtkWidget *sender, gpointer data ){ + + if( applet_draw_open ){ + switch( MRI_user_status ){ + case offline: + closeOfflinePopup(); + break; + case signing_on: + closeSignonPopup(); + break; + case online: + closeOnlinePopup(); + + break; + case unread_message_pending: + closePendingPopup(); + break; + case away: + closeAwayPopup(); + break; + } + } else { + set_applet_draw_open(); + switch( MRI_user_status ){ + case offline: + createOfflinePopup(); + break; + case signing_on: + createSignonPopup(); + break; + case online: + createOnlinePopup(); + break; + case unread_message_pending: + createPendingPopup(); + break; + case away: + createAwayPopup(); + break; + } + + + } +} + + +#ifdef HAVE_PANEL_SIZE +/*************************************************************** +** +** Code for panel resizing +** +****************************************************************/ +static void applet_change_size(GtkWidget *w, PanelSizeType o, gpointer data) { + switch(o) { + case SIZE_TINY: + /*24x24*/ + gtk_widget_set_usize( button, 24,24 ); + + /*load offline icon*/ + load_applet_icon( GAIM_GNOME_OFFLINE_ICON, + 24, 24, &icon_offline_pm, &icon_offline_bm ); + + /*load connecting icon*/ + load_applet_icon( GAIM_GNOME_CONNECT_ICON, + 24, 24, &icon_connect_pm, &icon_connect_bm ); + + /*load online icon*/ + load_applet_icon( GAIM_GNOME_ONLINE_ICON, + 24, 24, &icon_online_pm, &icon_online_bm ); + break; + + case SIZE_STANDARD: + /*48x48*/ + gtk_widget_set_usize( button, 48,48 ); + + /*load offline icon*/ + load_applet_icon( GAIM_GNOME_OFFLINE_ICON, + 32, 34, &icon_offline_pm, &icon_offline_bm ); + + /*load connecting icon*/ + load_applet_icon( GAIM_GNOME_CONNECT_ICON, + 32, 34, &icon_connect_pm, &icon_connect_bm ); + + /*load online icon*/ + load_applet_icon( GAIM_GNOME_ONLINE_ICON, + 32, 34, &icon_online_pm, &icon_online_bm ); + break; + + case SIZE_LARGE: + /*64x64*/ + gtk_widget_set_usize( button, 64, 64 ); + + /*load offline icon*/ + load_applet_icon( GAIM_GNOME_OFFLINE_ICON, + 55, 55, &icon_offline_pm, &icon_offline_bm ); + + /*load connecting icon*/ + load_applet_icon( GAIM_GNOME_CONNECT_ICON, + 55, 55, &icon_connect_pm, &icon_connect_bm ); + + /*load online icon*/ + load_applet_icon( GAIM_GNOME_ONLINE_ICON, + 55, 55, &icon_online_pm, &icon_online_bm ); + break; + + case SIZE_HUGE: + /*80x80*/ + gtk_widget_set_usize( button, 80, 80 ); + + /*load offline icon*/ + load_applet_icon( GAIM_GNOME_OFFLINE_ICON, + 70, 70, &icon_offline_pm, &icon_offline_bm ); + + /*load connecting icon*/ + load_applet_icon( GAIM_GNOME_CONNECT_ICON, + 70, 70, &icon_connect_pm, &icon_connect_bm ); + + /*load online icon*/ + load_applet_icon( GAIM_GNOME_ONLINE_ICON, + 70, 70, &icon_online_pm, &icon_online_bm ); + + break; + } +} +#endif /*HAVE_PANEL_SIZE*/ + + +/*************************************************************** +** +** Initialize GNOME stuff +** +****************************************************************/ + +gint InitAppletMgr( 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!")); + + button=gtk_button_new(); + + + gtk_widget_set_usize( button, 48,48 ); + + + /*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); + + gtk_timeout_add( 1500, (GtkFunction)update_applet, NULL ); + + vbox = gtk_vbox_new(FALSE,0); + + gtk_box_pack_start(GTK_BOX(vbox), icon, FALSE, TRUE, 0); + + status_label = gtk_label_new("Offline"); + /*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 { + sprintf(debug_buff, "Font does not exist" ); + debug_print(debug_buff); + } + +#ifdef HAVE_PANEL_SIZE + gtk_signal_connect(GTK_OBJECT(applet),"change_size", + GTK_SIGNAL_FUNC(applet_change_size), + NULL); +#endif /*HAVE_PANEL_SIZE*/ + + gtk_box_pack_start(GTK_BOX(vbox), status_label, FALSE, TRUE, 0); + + gtk_container_add( GTK_CONTAINER(button), vbox ); + applet_widget_add(APPLET_WIDGET(applet), button); + + gtk_widget_show( status_label ); + gtk_widget_show( vbox ); + gtk_widget_show( button ); + + applet_widget_set_tooltip(APPLET_WIDGET(applet),"GAIM"); + + applet_widget_register_stock_callback(APPLET_WIDGET(applet), + "about", + GNOME_STOCK_MENU_ABOUT, + _("About..."), + applet_show_about, + NULL); + + gtk_signal_connect( GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC( AppletClicked), NULL); + + gtk_widget_show(icon); + gtk_widget_show(applet); + return 0; +} + +void setUserState( enum gaim_user_states state ){ + MRI_user_status = state; + update_applet( (gpointer *)applet ); +} + +void setTotalBuddies( gint num ){ + total_num_of_buddies = num; +} + +void setNumBuddiesOnline( gint num ){ + num_of_buddies_online=num; +} + +enum gaim_user_states getUserState(){ + return MRI_user_status; +} + +gint getTotalBuddies(){ + return total_num_of_buddies; +} + +gint getNumBuddiesOnline(){ + return num_of_buddies_online; +} + +void set_applet_draw_open(){ + applet_draw_open = TRUE; +} + +void set_applet_draw_closed(){ + applet_draw_open = FALSE; +} + +#endif /*USE_APPLET*/