pidgin/pidgin
Clone
Summary
Browse
Changes
Graph
Add a get_minimum_search_length to PurpleProtocolContacts
default
tip
4 days ago, Gary Kramlich
5ebb4beb29b7
Add a get_minimum_search_length to PurpleProtocolContacts
This can be used by user interfaces, to not call
PurpleProtocolContacts.search_async with strings smaller than this length.
Testing Done:
Called in the turtles and ran the protocol_contacts test under valgrind.
Reviewed at https://reviews.imfreedom.org/r/3164/
/*
* Mouse gestures plugin for Purple
*
* Copyright (C) 2003 Christian Hammond.
*
* 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
<glib/gi18n-lib.h>
#include
<purple.h>
#include
<pidgin.h>
#include
"gstroke.h"
#define GESTURES_PLUGIN_ID "gtk-x11-gestures"
#define SETTINGS_SCHEMA_ID "im.pidgin.Pidgin.plugin.Gestures"
static
void
stroke_close
(
GtkWidget
*
widget
,
void
*
data
)
{
PurpleConversation
*
conv
;
PidginConversation
*
gtkconv
;
conv
=
(
PurpleConversation
*
)
data
;
/* Double-check */
if
(
!
PIDGIN_IS_PIDGIN_CONVERSATION
(
conv
))
return
;
gtkconv
=
PIDGIN_CONVERSATION
(
conv
);
gstroke_cleanup
(
gtkconv
->
history
);
g_object_unref
(
conv
);
}
static
void
stroke_prev_tab
(
GtkWidget
*
widget
,
void
*
data
)
{
PurpleConversation
*
conv
;
PidginConversation
*
gtkconv
;
GtkWidget
*
win
;
conv
=
(
PurpleConversation
*
)
data
;
gtkconv
=
PIDGIN_CONVERSATION
(
conv
);
win
=
gtk_widget_get_toplevel
(
gtkconv
->
tab_cont
);
pidgin_display_window_select_previous
(
PIDGIN_DISPLAY_WINDOW
(
win
));
}
static
void
stroke_next_tab
(
GtkWidget
*
widget
,
void
*
data
)
{
PurpleConversation
*
conv
;
PidginConversation
*
gtkconv
;
GtkWidget
*
win
;
conv
=
(
PurpleConversation
*
)
data
;
gtkconv
=
PIDGIN_CONVERSATION
(
conv
);
win
=
gtk_widget_get_toplevel
(
gtkconv
->
tab_cont
);
pidgin_display_window_select_next
(
PIDGIN_DISPLAY_WINDOW
(
win
));
}
static
void
stroke_new_win
(
GtkWidget
*
widget
,
void
*
data
)
{
GtkWidget
*
new_win
,
*
old_win
;
PurpleConversation
*
conv
;
conv
=
(
PurpleConversation
*
)
data
;
old_win
=
gtk_widget_get_parent
(
PIDGIN_CONVERSATION
(
conv
)
->
tab_cont
);
if
(
pidgin_display_window_get_count
(
PIDGIN_DISPLAY_WINDOW
(
old_win
))
<=
1
)
{
return
;
}
new_win
=
pidgin_display_window_new
();
pidgin_display_window_remove
(
PIDGIN_DISPLAY_WINDOW
(
old_win
),
conv
);
pidgin_display_window_add
(
PIDGIN_DISPLAY_WINDOW
(
new_win
),
conv
);
gtk_widget_set_visible
(
new_win
,
TRUE
);
}
static
void
attach_signals
(
PurpleConversation
*
conv
)
{
PidginConversation
*
gtkconv
;
gtkconv
=
PIDGIN_CONVERSATION
(
conv
);
gstroke_enable
(
gtkconv
->
history
);
gstroke_signal_connect
(
gtkconv
->
history
,
"14789"
,
stroke_close
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"1456"
,
stroke_close
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"1489"
,
stroke_close
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"74123"
,
stroke_next_tab
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"7456"
,
stroke_next_tab
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"96321"
,
stroke_prev_tab
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"9654"
,
stroke_prev_tab
,
conv
);
gstroke_signal_connect
(
gtkconv
->
history
,
"25852"
,
stroke_new_win
,
conv
);
}
static
void
new_conv_cb
(
PurpleConversation
*
conv
)
{
if
(
PIDGIN_IS_PIDGIN_CONVERSATION
(
conv
))
attach_signals
(
conv
);
}
static
void
settings_change_cb
(
GSettings
*
settings
,
char
*
key
,
G_GNUC_UNUSED
gpointer
data
)
{
if
(
purple_strequal
(
key
,
"button"
))
{
gstroke_set_mouse_button
(
g_settings_get_enum
(
settings
,
key
));
}
else
if
(
purple_strequal
(
key
,
"visual"
))
{
gstroke_set_draw_strokes
(
g_settings_get_boolean
(
settings
,
key
));
}
else
{
g_warning
(
"Got gestures settings change for unknown key: %s"
,
key
);
}
}
static
GPluginPluginInfo
*
gestures_query
(
GError
**
error
)
{
const
gchar
*
const
authors
[]
=
{
"Christian Hammond <chipx86@gnupdate.org>"
,
NULL
};
return
purple_plugin_info_new
(
"id"
,
GESTURES_PLUGIN_ID
,
"name"
,
N_
(
"Mouse Gestures"
),
"version"
,
DISPLAY_VERSION
,
"category"
,
N_
(
"User interface"
),
"summary"
,
N_
(
"Provides support for mouse gestures"
),
"description"
,
N_
(
"Allows support for mouse gestures in "
"conversation windows. Drag the middle "
"mouse button to perform certain "
"actions:
\n
"
" • Drag down and then to the right to "
"close a conversation.
\n
"
" • Drag up and then to the left to "
"switch to the previous conversation.
\n
"
" • Drag up and then to the right to "
"switch to the next conversation."
),
"authors"
,
authors
,
"website"
,
PURPLE_WEBSITE
,
"abi-version"
,
PURPLE_ABI_VERSION
,
"settings-schema"
,
SETTINGS_SCHEMA_ID
,
NULL
);
}
static
gboolean
gestures_load
(
GPluginPlugin
*
plugin
,
GError
**
error
)
{
GSettings
*
settings
=
NULL
;
PurpleConversation
*
conv
;
PurpleConversationManager
*
manager
;
GList
*
list
;
settings
=
g_settings_new_with_backend
(
SETTINGS_SCHEMA_ID
,
purple_core_get_settings_backend
());
g_signal_connect
(
settings
,
"changed"
,
G_CALLBACK
(
settings_change_cb
),
NULL
);
gstroke_set_mouse_button
(
g_settings_get_enum
(
settings
,
"button"
));
gstroke_set_draw_strokes
(
g_settings_get_boolean
(
settings
,
"visual"
));
g_object_unref
(
settings
);
manager
=
purple_conversation_manager_get_default
();
list
=
purple_conversation_manager_get_all
(
manager
);
while
(
list
!=
NULL
)
{
conv
=
PURPLE_CONVERSATION
(
list
->
data
);
if
(
!
PIDGIN_IS_PIDGIN_CONVERSATION
(
conv
))
{
list
=
g_list_delete_link
(
list
,
list
);
continue
;
}
attach_signals
(
conv
);
list
=
g_list_delete_link
(
list
,
list
);
}
purple_signal_connect
(
purple_conversations_get_handle
(),
"conversation-created"
,
plugin
,
G_CALLBACK
(
new_conv_cb
),
NULL
);
return
TRUE
;
}
static
gboolean
gestures_unload
(
G_GNUC_UNUSED
GPluginPlugin
*
plugin
,
G_GNUC_UNUSED
gboolean
shutdown
,
G_GNUC_UNUSED
GError
**
error
)
{
PurpleConversation
*
conv
;
PurpleConversationManager
*
manager
;
PidginConversation
*
gtkconv
;
GList
*
list
;
manager
=
purple_conversation_manager_get_default
();
list
=
purple_conversation_manager_get_all
(
manager
);
while
(
list
!=
NULL
)
{
conv
=
PURPLE_CONVERSATION
(
list
->
data
);
if
(
!
PIDGIN_IS_PIDGIN_CONVERSATION
(
conv
))
{
list
=
g_list_delete_link
(
list
,
list
);
continue
;
}
gtkconv
=
PIDGIN_CONVERSATION
(
conv
);
gstroke_cleanup
(
gtkconv
->
history
);
gstroke_disable
(
gtkconv
->
history
);
list
=
g_list_delete_link
(
list
,
list
);
}
return
TRUE
;
}
GPLUGIN_NATIVE_PLUGIN_DECLARE
(
gestures
)