pidgin/pidgin
Clone
Summary
Browse
Changes
Graph
Move Pidgin/Finch plugins to XDG data directory.
2019-10-08, Elliott Sales de Andrade
e843e8fab70c
Move Pidgin/Finch plugins to XDG data directory.
/*
* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* 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"
#include
"buddylist.h"
#include
"prefs.h"
#include
"sound.h"
#include
"sound-theme-loader.h"
#include
"theme-manager.h"
static
PurpleSoundUiOps
*
sound_ui_ops
=
NULL
;
static
gint64
last_played
[
PURPLE_NUM_SOUNDS
];
static
gboolean
purple_sound_play_required
(
PurpleAccount
*
account
)
{
gint
pref_status
=
purple_prefs_get_int
(
"/purple/sound/while_status"
);
if
(
pref_status
==
PURPLE_SOUND_STATUS_ALWAYS
)
{
/* Play sounds: Always */
return
TRUE
;
}
if
(
account
!=
NULL
)
{
PurpleStatus
*
status
=
purple_account_get_active_status
(
account
);
if
(
purple_status_is_online
(
status
))
{
gboolean
available
=
purple_status_is_available
(
status
);
return
((
available
&&
pref_status
==
PURPLE_SOUND_STATUS_AVAILABLE
)
||
(
!
available
&&
pref_status
==
PURPLE_SOUND_STATUS_AWAY
));
}
}
/* We get here a couple of ways. Either the request has been OK'ed
* by purple_sound_play_event() and we're here because the UI has
* called purple_sound_play_file(), or we're here for something
* not related to an account (like testing a sound). */
return
TRUE
;
}
void
purple_sound_play_file
(
const
char
*
filename
,
PurpleAccount
*
account
)
{
if
(
!
purple_sound_play_required
(
account
))
return
;
if
(
sound_ui_ops
&&
sound_ui_ops
->
play_file
)
sound_ui_ops
->
play_file
(
filename
);
}
void
purple_sound_play_event
(
PurpleSoundEventID
event
,
PurpleAccount
*
account
)
{
if
(
!
purple_sound_play_required
(
account
))
return
;
g_return_if_fail
(
event
<
PURPLE_NUM_SOUNDS
);
if
(
g_get_monotonic_time
()
-
last_played
[
event
]
<
2
*
G_USEC_PER_SEC
)
return
;
last_played
[
event
]
=
g_get_monotonic_time
();
if
(
sound_ui_ops
&&
sound_ui_ops
->
play_event
)
{
int
plugin_return
;
plugin_return
=
GPOINTER_TO_INT
(
purple_signal_emit_return_1
(
purple_sounds_get_handle
(),
"playing-sound-event"
,
event
,
account
));
if
(
plugin_return
)
return
;
else
sound_ui_ops
->
play_event
(
event
);
}
}
static
PurpleSoundUiOps
*
purple_sound_ui_ops_copy
(
PurpleSoundUiOps
*
ops
)
{
PurpleSoundUiOps
*
ops_new
;
g_return_val_if_fail
(
ops
!=
NULL
,
NULL
);
ops_new
=
g_new
(
PurpleSoundUiOps
,
1
);
*
ops_new
=
*
ops
;
return
ops_new
;
}
GType
purple_sound_ui_ops_get_type
(
void
)
{
static
GType
type
=
0
;
if
(
type
==
0
)
{
type
=
g_boxed_type_register_static
(
"PurpleSoundUiOps"
,
(
GBoxedCopyFunc
)
purple_sound_ui_ops_copy
,
(
GBoxedFreeFunc
)
g_free
);
}
return
type
;
}
void
purple_sound_set_ui_ops
(
PurpleSoundUiOps
*
ops
)
{
if
(
sound_ui_ops
&&
sound_ui_ops
->
uninit
)
sound_ui_ops
->
uninit
();
sound_ui_ops
=
ops
;
if
(
sound_ui_ops
&&
sound_ui_ops
->
init
)
sound_ui_ops
->
init
();
}
PurpleSoundUiOps
*
purple_sound_get_ui_ops
(
void
)
{
return
sound_ui_ops
;
}
void
purple_sound_init
()
{
void
*
handle
=
purple_sounds_get_handle
();
/**********************************************************************
* Register signals
**********************************************************************/
purple_signal_register
(
handle
,
"playing-sound-event"
,
purple_marshal_BOOLEAN__INT_POINTER
,
G_TYPE_BOOLEAN
,
2
,
G_TYPE_INT
,
PURPLE_TYPE_ACCOUNT
);
purple_prefs_add_none
(
"/purple/sound"
);
purple_prefs_add_int
(
"/purple/sound/while_status"
,
PURPLE_SOUND_STATUS_AVAILABLE
);
memset
(
last_played
,
0
,
sizeof
(
last_played
));
purple_theme_manager_register_type
(
g_object_new
(
PURPLE_TYPE_SOUND_THEME_LOADER
,
"type"
,
"sound"
,
NULL
));
}
void
purple_sound_uninit
()
{
if
(
sound_ui_ops
&&
sound_ui_ops
->
uninit
)
sound_ui_ops
->
uninit
();
purple_signals_unregister_by_instance
(
purple_sounds_get_handle
());
}
void
*
purple_sounds_get_handle
()
{
static
int
handle
;
return
&
handle
;
}