qulogic/pidgin
Clone
Summary
Browse
Changes
Graph
Add disconnection reasons to oscar.
cpw.resiak.disconnectreason
2007-10-01, Will Thompson
a9fc6198b5c6
Add disconnection reasons to oscar.
/*
* Conversation Colors
* Copyright (C) 2006
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
* 02111-1301, USA.
*/
#include
"internal.h"
#define PLUGIN_ID "gtk-plugin_pack-convcolors"
#define PLUGIN_NAME N_("Conversation Colors")
#define PLUGIN_STATIC_NAME "Conversation Colors"
#define PLUGIN_SUMMARY N_("Customize colors in the conversation window")
#define PLUGIN_DESCRIPTION N_("Customize colors in the conversation window")
#define PLUGIN_AUTHOR "Sadrul H Chowdhury <sadrul@users.sourceforge.net>"
/* System headers */
#include
<gdk/gdk.h>
#include
<glib.h>
#include
<gtk/gtk.h>
/* Purple headers */
#include
<gtkplugin.h>
#include
<version.h>
#include
<conversation.h>
#include
<gtkconv.h>
#include
<gtkprefs.h>
#include
<gtkutils.h>
#define PREF_PREFIX "/plugins/gtk/" PLUGIN_ID
#define PREF_IGNORE PREF_PREFIX "/ignore_incoming"
#define PREF_CHATS PREF_PREFIX "/chats"
#define PREF_IMS PREF_PREFIX "/ims"
#define PREF_SEND PREF_PREFIX "/send"
#define PREF_SEND_C PREF_SEND "/color"
#define PREF_SEND_F PREF_SEND "/format"
#define PREF_RECV PREF_PREFIX "/recv"
#define PREF_RECV_C PREF_RECV "/color"
#define PREF_RECV_F PREF_RECV "/format"
#define PREF_SYSTEM PREF_PREFIX "/system"
#define PREF_SYSTEM_C PREF_SYSTEM "/color"
#define PREF_SYSTEM_F PREF_SYSTEM "/format"
#define PREF_ERROR PREF_PREFIX "/error"
#define PREF_ERROR_C PREF_ERROR "/color"
#define PREF_ERROR_F PREF_ERROR "/format"
#define PREF_NICK PREF_PREFIX "/nick"
#define PREF_NICK_C PREF_NICK "/color"
#define PREF_NICK_F PREF_NICK "/format"
enum
{
FONT_BOLD
=
1
<<
0
,
FONT_ITALIC
=
1
<<
1
,
FONT_UNDERLINE
=
1
<<
2
};
struct
{
PurpleMessageFlags
flag
;
char
*
prefix
;
const
char
*
text
;
}
formats
[]
=
{
{
PURPLE_MESSAGE_ERROR
,
PREF_ERROR
,
N_
(
"Error Messages"
)},
{
PURPLE_MESSAGE_NICK
,
PREF_NICK
,
N_
(
"Highlighted Messages"
)},
{
PURPLE_MESSAGE_SYSTEM
,
PREF_SYSTEM
,
N_
(
"System Messages"
)},
{
PURPLE_MESSAGE_SEND
,
PREF_SEND
,
N_
(
"Sent Messages"
)},
{
PURPLE_MESSAGE_RECV
,
PREF_RECV
,
N_
(
"Received Messages"
)},
{
0
,
NULL
,
NULL
}
};
static
gboolean
displaying_msg
(
PurpleAccount
*
account
,
const
char
*
who
,
char
**
displaying
,
PurpleConversation
*
conv
,
PurpleMessageFlags
flags
)
{
int
i
;
char
tmp
[
128
],
*
t
;
gboolean
bold
,
italic
,
underline
;
int
f
;
const
char
*
color
;
for
(
i
=
0
;
formats
[
i
].
prefix
;
i
++
)
if
(
flags
&
formats
[
i
].
flag
)
break
;
if
(
!
formats
[
i
].
prefix
)
return
FALSE
;
if
((
purple_conversation_get_type
(
conv
)
==
PURPLE_CONV_TYPE_IM
&&
!
purple_prefs_get_bool
(
PREF_IMS
))
||
(
purple_conversation_get_type
(
conv
)
==
PURPLE_CONV_TYPE_CHAT
&&
!
purple_prefs_get_bool
(
PREF_CHATS
)))
return
FALSE
;
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/color"
,
formats
[
i
].
prefix
);
color
=
purple_prefs_get_string
(
tmp
);
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/format"
,
formats
[
i
].
prefix
);
f
=
purple_prefs_get_int
(
tmp
);
bold
=
(
f
&
FONT_BOLD
);
italic
=
(
f
&
FONT_ITALIC
);
underline
=
(
f
&
FONT_UNDERLINE
);
if
(
purple_prefs_get_bool
(
PREF_IGNORE
))
{
t
=
*
displaying
;
*
displaying
=
purple_markup_strip_html
(
t
);
g_free
(
t
);
t
=
*
displaying
;
*
displaying
=
g_markup_escape_text
(
t
,
-1
);
g_free
(
t
);
/* Restore the links */
t
=
*
displaying
;
*
displaying
=
purple_markup_linkify
(
t
);
g_free
(
t
);
}
if
(
color
&&
*
color
)
{
t
=
*
displaying
;
*
displaying
=
g_strdup_printf
(
"<FONT COLOR=
\"
%s
\"
>%s</FONT>"
,
color
,
t
);
g_free
(
t
);
}
t
=
*
displaying
;
*
displaying
=
g_strdup_printf
(
"%s%s%s%s%s%s%s"
,
bold
?
"<B>"
:
"</B>"
,
italic
?
"<I>"
:
"</I>"
,
underline
?
"<U>"
:
"</U>"
,
t
,
bold
?
"</B>"
:
"<B>"
,
italic
?
"</I>"
:
"<I>"
,
underline
?
"</U>"
:
"<U>"
);
g_free
(
t
);
return
FALSE
;
}
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
)
{
purple_signal_connect
(
pidgin_conversations_get_handle
(),
"displaying-im-msg"
,
plugin
,
PURPLE_CALLBACK
(
displaying_msg
),
NULL
);
purple_signal_connect
(
pidgin_conversations_get_handle
(),
"displaying-chat-msg"
,
plugin
,
PURPLE_CALLBACK
(
displaying_msg
),
NULL
);
return
TRUE
;
}
static
gboolean
plugin_unload
(
PurplePlugin
*
plugin
)
{
return
TRUE
;
}
/* Ripped from PurpleRC */
static
void
color_response
(
GtkDialog
*
color_dialog
,
gint
response
,
const
char
*
data
)
{
if
(
response
==
GTK_RESPONSE_OK
)
{
GtkWidget
*
colorsel
=
GTK_COLOR_SELECTION_DIALOG
(
color_dialog
)
->
colorsel
;
GdkColor
color
;
char
colorstr
[
8
];
char
tmp
[
128
];
gtk_color_selection_get_current_color
(
GTK_COLOR_SELECTION
(
colorsel
),
&
color
);
g_snprintf
(
colorstr
,
sizeof
(
colorstr
),
"#%02X%02X%02X"
,
color
.
red
/
256
,
color
.
green
/
256
,
color
.
blue
/
256
);
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/color"
,
data
);
purple_prefs_set_string
(
tmp
,
colorstr
);
}
gtk_widget_destroy
(
GTK_WIDGET
(
color_dialog
));
}
static
void
set_color
(
GtkWidget
*
widget
,
const
char
*
data
)
{
GtkWidget
*
color_dialog
=
NULL
;
GdkColor
color
;
char
title
[
128
];
char
tmp
[
128
];
g_snprintf
(
title
,
sizeof
(
title
),
_
(
"Select Color for %s"
),
_
(
data
));
color_dialog
=
gtk_color_selection_dialog_new
(
title
);
g_signal_connect
(
G_OBJECT
(
color_dialog
),
"response"
,
G_CALLBACK
(
color_response
),
(
gpointer
)
data
);
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/color"
,
data
);
if
(
gdk_color_parse
(
purple_prefs_get_string
(
tmp
),
&
color
))
{
gtk_color_selection_set_current_color
(
GTK_COLOR_SELECTION
(
GTK_COLOR_SELECTION_DIALOG
(
color_dialog
)
->
colorsel
),
&
color
);
}
gtk_window_present
(
GTK_WINDOW
(
color_dialog
));
}
static
void
toggle_something
(
const
char
*
prefix
,
int
format
)
{
int
f
;
char
tmp
[
128
];
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/format"
,
prefix
);
f
=
purple_prefs_get_int
(
tmp
);
f
^=
format
;
purple_prefs_set_int
(
tmp
,
f
);
}
static
void
toggle_bold
(
GtkWidget
*
widget
,
gpointer
data
)
{
toggle_something
(
data
,
FONT_BOLD
);
}
static
void
toggle_italic
(
GtkWidget
*
widget
,
gpointer
data
)
{
toggle_something
(
data
,
FONT_ITALIC
);
}
static
void
toggle_underline
(
GtkWidget
*
widget
,
gpointer
data
)
{
toggle_something
(
data
,
FONT_UNDERLINE
);
}
static
GtkWidget
*
get_config_frame
(
PurplePlugin
*
plugin
)
{
GtkWidget
*
ret
;
GtkWidget
*
frame
;
int
i
;
ret
=
gtk_vbox_new
(
FALSE
,
PIDGIN_HIG_CAT_SPACE
);
gtk_container_set_border_width
(
GTK_CONTAINER
(
ret
),
PIDGIN_HIG_BORDER
);
for
(
i
=
0
;
formats
[
i
].
prefix
;
i
++
)
{
char
tmp
[
128
];
int
f
;
GtkWidget
*
vbox
,
*
hbox
,
*
button
;
g_snprintf
(
tmp
,
sizeof
(
tmp
),
"%s/format"
,
formats
[
i
].
prefix
);
f
=
purple_prefs_get_int
(
tmp
);
frame
=
pidgin_make_frame
(
ret
,
_
(
formats
[
i
].
text
));
vbox
=
gtk_vbox_new
(
FALSE
,
PIDGIN_HIG_BOX_SPACE
);
gtk_box_pack_start
(
GTK_BOX
(
frame
),
vbox
,
FALSE
,
FALSE
,
0
);
hbox
=
gtk_hbox_new
(
FALSE
,
PIDGIN_HIG_BOX_SPACE
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
hbox
,
FALSE
,
FALSE
,
0
);
button
=
pidgin_pixbuf_button_from_stock
(
" Color"
,
GTK_STOCK_SELECT_COLOR
,
PIDGIN_BUTTON_HORIZONTAL
);
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
FALSE
,
FALSE
,
0
);
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
set_color
),
formats
[
i
].
prefix
);
button
=
gtk_check_button_new_with_label
(
_
(
"Bold"
));
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
FALSE
,
FALSE
,
0
);
if
(
f
&
FONT_BOLD
)
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
button
),
TRUE
);
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
toggle_bold
),
formats
[
i
].
prefix
);
button
=
gtk_check_button_new_with_label
(
_
(
"Italic"
));
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
FALSE
,
FALSE
,
0
);
if
(
f
&
FONT_ITALIC
)
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
button
),
TRUE
);
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
toggle_italic
),
formats
[
i
].
prefix
);
button
=
gtk_check_button_new_with_label
(
_
(
"Underline"
));
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
FALSE
,
FALSE
,
0
);
if
(
f
&
FONT_UNDERLINE
)
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
button
),
TRUE
);
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
toggle_underline
),
formats
[
i
].
prefix
);
}
frame
=
pidgin_make_frame
(
ret
,
_
(
"General"
));
pidgin_prefs_checkbox
(
_
(
"Ignore incoming format"
),
PREF_IGNORE
,
frame
);
pidgin_prefs_checkbox
(
_
(
"Apply in Chats"
),
PREF_CHATS
,
frame
);
pidgin_prefs_checkbox
(
_
(
"Apply in IMs"
),
PREF_IMS
,
frame
);
gtk_widget_show_all
(
ret
);
return
ret
;
}
static
PidginPluginUiInfo
ui_info
=
{
get_config_frame
,
0
,
/* padding */
NULL
,
NULL
,
NULL
,
NULL
};
static
PurplePluginInfo
info
=
{
PURPLE_PLUGIN_MAGIC
,
/* Magic */
PURPLE_MAJOR_VERSION
,
/* Purple Major Version */
PURPLE_MINOR_VERSION
,
/* Purple Minor Version */
PURPLE_PLUGIN_STANDARD
,
/* plugin type */
PIDGIN_PLUGIN_TYPE
,
/* ui requirement */
0
,
/* flags */
NULL
,
/* dependencies */
PURPLE_PRIORITY_DEFAULT
,
/* priority */
PLUGIN_ID
,
/* plugin id */
PLUGIN_NAME
,
/* name */
VERSION
,
/* version */
PLUGIN_SUMMARY
,
/* summary */
PLUGIN_DESCRIPTION
,
/* description */
PLUGIN_AUTHOR
,
/* author */
PURPLE_WEBSITE
,
/* website */
plugin_load
,
/* load */
plugin_unload
,
/* unload */
NULL
,
/* destroy */
&
ui_info
,
/* ui_info */
NULL
,
/* extra_info */
NULL
,
/* prefs_info */
NULL
,
/* actions */
/* padding */
NULL
,
NULL
,
NULL
,
NULL
};
static
void
init_plugin
(
PurplePlugin
*
plugin
)
{
purple_prefs_add_none
(
PREF_PREFIX
);
purple_prefs_add_bool
(
PREF_IGNORE
,
TRUE
);
purple_prefs_add_bool
(
PREF_CHATS
,
TRUE
);
purple_prefs_add_bool
(
PREF_IMS
,
TRUE
);
purple_prefs_add_none
(
PREF_SEND
);
purple_prefs_add_none
(
PREF_RECV
);
purple_prefs_add_none
(
PREF_SYSTEM
);
purple_prefs_add_none
(
PREF_ERROR
);
purple_prefs_add_none
(
PREF_NICK
);
purple_prefs_add_string
(
PREF_SEND_C
,
"#909090"
);
purple_prefs_add_string
(
PREF_RECV_C
,
"#000000"
);
purple_prefs_add_string
(
PREF_SYSTEM_C
,
"#50a050"
);
purple_prefs_add_string
(
PREF_ERROR_C
,
"#ff0000"
);
purple_prefs_add_string
(
PREF_NICK_C
,
"#0000dd"
);
purple_prefs_add_int
(
PREF_SEND_F
,
0
);
purple_prefs_add_int
(
PREF_RECV_F
,
0
);
purple_prefs_add_int
(
PREF_SYSTEM_F
,
FONT_ITALIC
);
purple_prefs_add_int
(
PREF_ERROR_F
,
FONT_BOLD
|
FONT_UNDERLINE
);
purple_prefs_add_int
(
PREF_NICK_F
,
FONT_BOLD
);
}
PURPLE_INIT_PLUGIN
(
PLUGIN_STATIC_NAME
,
init_plugin
,
info
)