Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
liblinphone
Commits
389a9bcf
Commit
389a9bcf
authored
Oct 18, 2012
by
Margaux Clerc
Browse files
work in progress: chat, new ui blabla
parent
8761f481
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1428 additions
and
913 deletions
+1428
-913
coreapi/chat.c
coreapi/chat.c
+1
-1
gtk/Makefile.am
gtk/Makefile.am
+0
-1
gtk/chat.c
gtk/chat.c
+144
-47
gtk/chatroom.ui
gtk/chatroom.ui
+0
-118
gtk/friendlist.c
gtk/friendlist.c
+213
-95
gtk/incall_view.c
gtk/incall_view.c
+9
-3
gtk/linphone.h
gtk/linphone.h
+6
-1
gtk/main.c
gtk/main.c
+18
-14
gtk/main.ui
gtk/main.ui
+1035
-632
pixmaps/Makefile.am
pixmaps/Makefile.am
+2
-0
pixmaps/addcall-green.png
pixmaps/addcall-green.png
+0
-0
pixmaps/call.png
pixmaps/call.png
+0
-0
pixmaps/chat.png
pixmaps/chat.png
+0
-0
pixmaps/hold_off.png
pixmaps/hold_off.png
+0
-0
pixmaps/hold_on.png
pixmaps/hold_on.png
+0
-0
pixmaps/mic_active.png
pixmaps/mic_active.png
+0
-0
pixmaps/mic_muted.png
pixmaps/mic_muted.png
+0
-0
pixmaps/startcall-green.png
pixmaps/startcall-green.png
+0
-0
pixmaps/stopcall-red.png
pixmaps/stopcall-red.png
+0
-0
po/POTFILES.in
po/POTFILES.in
+0
-1
No files found.
coreapi/chat.c
View file @
389a9bcf
...
...
@@ -245,4 +245,4 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg)
new_message
->
cb
=
msg
->
cb
;
if
(
msg
->
from
)
new_message
->
from
=
linphone_address_clone
(
msg
->
from
);
return
new_message
;
}
\ No newline at end of file
}
gtk/Makefile.am
View file @
389a9bcf
...
...
@@ -4,7 +4,6 @@ UI_FILES= about.ui \
contact.ui
\
parameters.ui
\
sip_account.ui
\
chatroom.ui
\
call_logs.ui
\
log.ui
\
buddylookup.ui
\
...
...
gtk/chat.c
View file @
389a9bcf
...
...
@@ -24,38 +24,34 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <gtkosxapplication.h>
#endif
GtkWidget
*
linphone_gtk_init_chatroom
(
LinphoneChatRoom
*
cr
,
const
char
*
with
){
GtkWidget
*
w
;
GtkTextBuffer
*
b
;
gchar
*
tmp
;
w
=
linphone_gtk_create_window
(
"chatroom"
);
tmp
=
g_strdup_printf
(
_
(
"Chat with %s"
),
with
);
gtk_window_set_title
(
GTK_WINDOW
(
w
),
tmp
);
g_free
(
tmp
);
g_object_set_data
(
G_OBJECT
(
w
),
"cr"
,
cr
);
gtk_widget_show
(
w
);
linphone_chat_room_set_user_data
(
cr
,
w
);
b
=
gtk_text_view_get_buffer
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
w
,
"textlog"
)));
gtk_text_buffer_create_tag
(
b
,
"blue"
,
"foreground"
,
"blue"
,
NULL
);
gtk_text_buffer_create_tag
(
b
,
"green"
,
"foreground"
,
"green"
,
NULL
);
return
w
;
void
linphone_gtk_quit_chatroom
(
LinphoneChatRoom
*
cr
)
{
GtkWidget
*
main_window
=
linphone_gtk_get_main_window
();
GtkWidget
*
w
=
linphone_gtk_get_widget
(
main_window
,
"chatroom_frame"
);
GtkWidget
*
nb
=
linphone_gtk_get_widget
(
main_window
,
"viewswitch"
);
int
idx
;
g_return_if_fail
(
w
!=
NULL
);
idx
=
gtk_notebook_page_num
(
GTK_NOTEBOOK
(
nb
),
w
);
gtk_notebook_remove_page
(
GTK_NOTEBOOK
(
nb
),
idx
);
linphone_chat_room_set_user_data
(
cr
,
NULL
);
gtk_widget_destroy
(
w
);
}
void
linphone_gtk_create_chatroom
(
const
char
*
with
){
GtkWidget
*
create_tab_chat_header
(
LinphoneChatRoom
*
cr
){
GtkWidget
*
w
=
gtk_hbox_new
(
FALSE
,
0
);
GtkWidget
*
i
=
create_pixmap
(
"chat.png"
);
GtkWidget
*
l
;
GtkWidget
*
b
=
gtk_button_new_with_label
(
"x"
);
gtk_widget_set_size_request
(
b
,
20
,
20
);
g_signal_connect_swapped
(
G_OBJECT
(
b
),
"clicked"
,
G_CALLBACK
(
linphone_gtk_quit_chatroom
),
cr
);
LinphoneChatRoom
*
cr
=
linphone_core_create_chat_room
(
linphone_gtk_get_core
(),
with
);
if
(
!
cr
)
return
;
linphone_gtk_init_chatroom
(
cr
,
with
);
}
void
linphone_gtk_chat_destroyed
(
GtkWidget
*
w
){
LinphoneChatRoom
*
cr
=
(
LinphoneChatRoom
*
)
g_object_get_data
(
G_OBJECT
(
w
),
"cr"
);
linphone_chat_room_destroy
(
cr
);
}
void
linphone_gtk_chat_close
(
GtkWidget
*
button
){
GtkWidget
*
w
=
gtk_widget_get_toplevel
(
button
);
gtk_widget_destroy
(
w
);
gchar
*
text
=
g_strdup_printf
(
"Chat "
);
l
=
gtk_label_new
(
text
);
gtk_box_pack_start
(
GTK_BOX
(
w
),
i
,
FALSE
,
FALSE
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
w
),
l
,
FALSE
,
FALSE
,
0
);
gtk_box_pack_end
(
GTK_BOX
(
w
),
b
,
TRUE
,
TRUE
,
0
);
gtk_widget_show_all
(
w
);
return
w
;
}
void
linphone_gtk_push_text
(
GtkTextView
*
v
,
const
char
*
from
,
const
char
*
message
,
gboolean
me
){
...
...
@@ -69,7 +65,7 @@ void linphone_gtk_push_text(GtkTextView *v, const char *from, const char *messag
gtk_text_buffer_insert
(
b
,
&
iter
,
":
\t
"
,
-
1
);
gtk_text_buffer_get_end_iter
(
b
,
&
iter
);
gtk_text_buffer_get_iter_at_offset
(
b
,
&
begin
,
off
);
gtk_text_buffer_apply_tag_by_name
(
b
,
me
?
"green"
:
"blue"
,
&
begin
,
&
iter
);
//
gtk_text_buffer_apply_tag_by_name(b,me ? "green" : "blue" ,&begin,&iter);
gtk_text_buffer_insert
(
b
,
&
iter
,
message
,
-
1
);
gtk_text_buffer_get_end_iter
(
b
,
&
iter
);
gtk_text_buffer_insert
(
b
,
&
iter
,
"
\n
"
,
-
1
);
...
...
@@ -82,27 +78,61 @@ void linphone_gtk_push_text(GtkTextView *v, const char *from, const char *messag
//gtk_text_view_scroll_to_iter(v,&iter,0,TRUE,1.0,1.0);
}
/*void linphone_gtk_push_text_start(GtkTextView *v, const char *from, const char *message){
GtkTextBuffer *b=gtk_text_view_get_buffer(v);
GtkTextIter iter,begin;
int off;
gtk_text_buffer_get_end_iter(b,&iter);
off=gtk_text_iter_get_offset(&iter);
gtk_text_buffer_insert(b,&iter,from,-1);
gtk_text_buffer_get_end_iter(b,&iter);
gtk_text_buffer_insert(b,&iter,":\t",-1);
gtk_text_buffer_get_end_iter(b,&iter);
gtk_text_buffer_get_iter_at_offset(b,&begin,off);
//gtk_text_buffer_apply_tag_by_name(b,me ? "green" : "blue" ,&begin,&iter);
gtk_text_buffer_insert(b,&iter,message,-1);
gtk_text_buffer_get_end_iter(b,&iter);
gtk_text_buffer_insert(b,&iter,"\n",-1);
gtk_text_buffer_get_end_iter(b,&iter);
//GtkTextMark *mark=gtk_text_buffer_create_mark(b,NULL,&iter,FALSE);
//gtk_text_view_scroll_mark_onscreen(v,mark);
//gtk_text_buffer_get_end_iter(b,&iter);
//gtk_text_iter_forward_to_line_end(&iter);
//gtk_text_view_scroll_to_iter(v,&iter,0,TRUE,1.0,1.0);
}*/
const
char
*
linphone_gtk_get_used_identity
(){
LinphoneCore
*
lc
=
linphone_gtk_get_core
();
LinphoneProxyConfig
*
cfg
;
linphone_core_get_default_proxy
(
lc
,
&
cfg
);
if
(
cfg
)
return
linphone_proxy_config_get_identity
(
cfg
);
else
return
linphone_core_get_primary_contact
(
lc
);
const
char
*
display
;
const
LinphoneAddress
*
u
;
if
(
cfg
)
{
u
=
linphone_address_new
(
linphone_proxy_config_get_identity
(
cfg
));
}
else
{
u
=
linphone_core_get_primary_contact_parsed
(
lc
);
}
display
=
linphone_address_get_display_name
(
u
);
if
(
display
==
NULL
||
display
[
0
]
==
'\0'
)
{
display
=
linphone_address_as_string
(
u
);
}
return
display
;
}
static
void
on_chat_state_changed
(
LinphoneChatMessage
*
msg
,
LinphoneChatMessageState
state
,
void
*
user_pointer
){
g_message
(
"chat message state is %s"
,
linphone_chat_message_state_to_string
(
state
));
}
void
linphone_gtk_send_text
(
GtkWidget
*
button
){
GtkWidget
*
w
=
gtk_widget_get_toplevel
(
button
);
GtkWidget
*
entry
=
linphone_gtk_get_widget
(
w
,
"text_entry"
);
LinphoneChatRoom
*
cr
=
(
LinphoneChatRoom
*
)
g_object_get_data
(
G_OBJECT
(
w
),
"cr"
);
void
linphone_gtk_send_text
(
LinphoneChatRoom
*
cr
){
GtkWidget
*
chat_view
=
(
GtkWidget
*
)
linphone_chat_room_get_user_data
(
cr
);
GtkWidget
*
entry
=
linphone_gtk_get_widget
(
chat_view
,
"text_entry"
);
const
gchar
*
entered
;
entered
=
gtk_entry_get_text
(
GTK_ENTRY
(
entry
));
if
(
strlen
(
entered
)
>
0
)
{
LinphoneChatMessage
*
msg
;
linphone_gtk_push_text
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
w
,
"text
log
"
)),
linphone_gtk_push_text
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
chat_vie
w
,
"text
view
"
)),
linphone_gtk_get_used_identity
(),
entered
,
TRUE
);
msg
=
linphone_chat_room_create_message
(
cr
,
entered
);
...
...
@@ -111,31 +141,98 @@ void linphone_gtk_send_text(GtkWidget *button){
}
}
void
linphone_gtk_init_chatroom
(
LinphoneChatRoom
*
cr
,
const
char
*
with
){
GtkWidget
*
chat_view
=
linphone_gtk_create_widget
(
"main"
,
"chatroom_frame"
);
GtkWidget
*
main_window
=
linphone_gtk_get_main_window
();
GtkNotebook
*
notebook
=
(
GtkNotebook
*
)
linphone_gtk_get_widget
(
main_window
,
"viewswitch"
);
GtkTextBuffer
*
b
;
int
idx
;
b
=
gtk_text_view_get_buffer
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
chat_view
,
"textview"
)));
gtk_text_buffer_create_tag
(
b
,
"blue"
,
"foreground"
,
"blue"
,
NULL
);
gtk_text_buffer_create_tag
(
b
,
"green"
,
"foreground"
,
"green"
,
NULL
);
gtk_notebook_append_page
(
notebook
,
chat_view
,
create_tab_chat_header
(
cr
));
idx
=
gtk_notebook_page_num
(
notebook
,
chat_view
);
gtk_notebook_set_current_page
(
notebook
,
idx
);
gtk_widget_show
(
chat_view
);
g_object_set_data
(
G_OBJECT
(
chat_view
),
"cr"
,
cr
);
linphone_chat_room_set_user_data
(
cr
,
chat_view
);
//linphone_gtk_get_used_identity()
GtkWidget
*
text
=
linphone_gtk_get_widget
(
chat_view
,
"textview"
);
gtk_text_view_set_wrap_mode
(
GTK_TEXT_VIEW
(
text
),
GTK_WRAP_WORD
);
//linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")),NULL,
// "Conversation avec moi",FALSE);
//linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")),with,
// "Conversation avec ",FALSE);
//Initialisation des signaux
GtkWidget
*
button
=
linphone_gtk_get_widget
(
chat_view
,
"send"
);
g_signal_connect_swapped
(
G_OBJECT
(
button
),
"clicked"
,(
GCallback
)
linphone_gtk_send_text
,
cr
);
GtkWidget
*
entry
=
linphone_gtk_get_widget
(
chat_view
,
"text_entry"
);
g_signal_connect_swapped
(
G_OBJECT
(
entry
),
"activate"
,(
GCallback
)
linphone_gtk_send_text
,
cr
);
}
LinphoneChatRoom
*
linphone_gtk_create_chatroom
(
const
char
*
with
){
LinphoneChatRoom
*
cr
=
linphone_core_create_chat_room
(
linphone_gtk_get_core
(),
with
);
if
(
!
cr
)
return
NULL
;
linphone_gtk_init_chatroom
(
cr
,
with
);
return
cr
;
}
void
linphone_gtk_load_chatroom
(
LinphoneChatRoom
*
cr
,
const
char
*
uri
){
GtkWidget
*
w
=
(
GtkWidget
*
)
linphone_chat_room_get_user_data
(
cr
);
if
(
w
==
NULL
){
linphone_gtk_init_chatroom
(
cr
,
uri
);
}
else
{
//TODO
}
}
void
linphone_gtk_chat_destroyed
(
GtkWidget
*
w
){
LinphoneChatRoom
*
cr
=
(
LinphoneChatRoom
*
)
g_object_get_data
(
G_OBJECT
(
w
),
"cr"
);
linphone_chat_room_destroy
(
cr
);
}
void
linphone_gtk_chat_close
(
GtkWidget
*
button
){
GtkWidget
*
w
=
gtk_widget_get_toplevel
(
button
);
gtk_widget_destroy
(
w
);
}
void
linphone_gtk_text_received
(
LinphoneCore
*
lc
,
LinphoneChatRoom
*
room
,
const
LinphoneAddress
*
from
,
const
char
*
message
){
GtkWidget
*
w
=
(
GtkWidget
*
)
linphone_chat_room_get_user_data
(
room
);
if
(
w
==
NULL
){
w
=
linphone_gtk_init_chatroom
(
room
,
linphone_address_as_string_uri_only
(
from
));
g_object_set_data
(
G_OBJECT
(
w
),
"is_notified"
,
GINT_TO_POINTER
(
FALSE
)
);
linphone_gtk_init_chatroom
(
room
,
linphone_address_as_string_uri_only
(
from
));
w
=
(
GtkWidget
*
)
linphone_chat_room_get_user_data
(
room
);
}
#ifdef HAVE_GTK_OSX
/* Notified when a new message is sent */
linphone_gtk_status_icon_set_blinking
(
TRUE
);
#else
if
(
!
gtk_window_is_active
((
GtkWindow
*
)
w
)){
if
(
!
GPOINTER_TO_INT
(
g_object_get_data
(
G_OBJECT
(
w
),
"is_notified"
))){
linphone_gtk_notify
(
NULL
,
message
);
g_object_set_data
(
G_OBJECT
(
w
),
"is_notified"
,
GINT_TO_POINTER
(
TRUE
));
}
if
(
!
GPOINTER_TO_INT
(
g_object_get_data
(
G_OBJECT
(
w
),
"is_notified"
))){
linphone_gtk_notify
(
NULL
,
message
);
g_object_set_data
(
G_OBJECT
(
w
),
"is_notified"
,
GINT_TO_POINTER
(
TRUE
));
}
else
{
g_object_set_data
(
G_OBJECT
(
w
),
"is_notified"
,
GINT_TO_POINTER
(
FALSE
));
}
#endif
linphone_gtk_push_text
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
w
,
"textlog"
)),
linphone_address_as_string_uri_only
(
from
),
const
char
*
display
=
linphone_address_get_display_name
(
from
);
if
(
display
==
NULL
){
display
=
linphone_address_as_string
(
from
);
}
linphone_gtk_push_text
(
GTK_TEXT_VIEW
(
linphone_gtk_get_widget
(
w
,
"textview"
)),
display
,
message
,
FALSE
);
gtk_window_present
(
GTK_WINDOW
(
w
));
//
gtk_window_present(GTK_WINDOW(w));
/*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/
}
gtk/chatroom.ui
deleted
100644 → 0
View file @
8761f481
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy toplevel-contextual -->
<object
class=
"GtkWindow"
id=
"chatroom"
>
<signal
name=
"destroy"
handler=
"linphone_gtk_chat_destroyed"
/>
<child>
<object
class=
"GtkVBox"
id=
"vbox1"
>
<property
name=
"visible"
>
True
</property>
<child>
<object
class=
"GtkScrolledWindow"
id=
"scrolledwindow1"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"hscrollbar_policy"
>
never
</property>
<property
name=
"vscrollbar_policy"
>
automatic
</property>
<child>
<object
class=
"GtkTextView"
id=
"textlog"
>
<property
name=
"width_request"
>
400
</property>
<property
name=
"height_request"
>
200
</property>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"editable"
>
False
</property>
<property
name=
"wrap_mode"
>
word
</property>
</object>
</child>
</object>
<packing>
<property
name=
"position"
>
0
</property>
</packing>
</child>
<child>
<object
class=
"GtkHBox"
id=
"hbox1"
>
<property
name=
"visible"
>
True
</property>
<child>
<object
class=
"GtkEntry"
id=
"text_entry"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"has_focus"
>
True
</property>
<signal
name=
"activate"
handler=
"linphone_gtk_send_text"
/>
</object>
<packing>
<property
name=
"position"
>
0
</property>
</packing>
</child>
<child>
<object
class=
"GtkButton"
id=
"send"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"receives_default"
>
True
</property>
<signal
name=
"clicked"
handler=
"linphone_gtk_send_text"
/>
<child>
<object
class=
"GtkHBox"
id=
"hbox2"
>
<property
name=
"visible"
>
True
</property>
<child>
<object
class=
"GtkImage"
id=
"image1"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"stock"
>
gtk-ok
</property>
</object>
<packing>
<property
name=
"position"
>
0
</property>
</packing>
</child>
<child>
<object
class=
"GtkLabel"
id=
"label1"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"label"
translatable=
"yes"
>
Send
</property>
</object>
<packing>
<property
name=
"padding"
>
7
</property>
<property
name=
"position"
>
1
</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property
name=
"expand"
>
False
</property>
<property
name=
"fill"
>
False
</property>
<property
name=
"position"
>
1
</property>
</packing>
</child>
</object>
<packing>
<property
name=
"expand"
>
False
</property>
<property
name=
"fill"
>
False
</property>
<property
name=
"position"
>
1
</property>
</packing>
</child>
<child>
<object
class=
"GtkHButtonBox"
id=
"hbuttonbox1"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"layout_style"
>
end
</property>
<child>
<object
class=
"GtkButton"
id=
"button1"
>
<property
name=
"label"
>
gtk-close
</property>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"receives_default"
>
True
</property>
<property
name=
"use_stock"
>
True
</property>
<signal
name=
"clicked"
handler=
"linphone_gtk_chat_close"
/>
</object>
<packing>
<property
name=
"expand"
>
False
</property>
<property
name=
"fill"
>
False
</property>
<property
name=
"pack_type"
>
end
</property>
<property
name=
"position"
>
0
</property>
</packing>
</child>
</object>
<packing>
<property
name=
"expand"
>
False
</property>
<property
name=
"position"
>
2
</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
gtk/friendlist.c
View file @
389a9bcf
...
...
@@ -27,8 +27,11 @@ enum{
FRIEND_NAME
,
FRIEND_PRESENCE_STATUS
,
FRIEND_ID
,
FRIEND_CHATROOM
,
FRIEND_SIP_ADDRESS
,
FRIEND_ICON
,
FRIEND_CALL
,
FRIEND_CHAT
,
FRIEND_LIST_NCOL
};
...
...
@@ -67,6 +70,18 @@ static GdkPixbuf *create_status_picture(LinphoneOnlineStatus ss){
return
NULL
;
}
static
GdkPixbuf
*
create_call_picture
(){
GdkPixbuf
*
pixbuf
;
pixbuf
=
create_pixbuf
(
"call.png"
);
return
pixbuf
;
}
static
GdkPixbuf
*
create_chat_picture
(){
GdkPixbuf
*
pixbuf
;
pixbuf
=
create_pixbuf
(
"chat.png"
);
return
pixbuf
;
}
void
linphone_gtk_set_friend_status
(
GtkWidget
*
friendlist
,
LinphoneFriend
*
fid
,
const
gchar
*
url
,
const
gchar
*
status
,
const
gchar
*
img
){
GtkTreeIter
iter
;
LinphoneFriend
*
tmp
=
0
;
...
...
@@ -86,11 +101,9 @@ void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid
}
}
}
while
(
gtk_tree_model_iter_next
(
model
,
&
iter
));
}
}
}
static
void
linphone_gtk_set_selection_to_uri_bar
(
GtkTreeView
*
treeview
){
GtkTreeSelection
*
select
;
GtkTreeIter
iter
;
...
...
@@ -107,6 +120,46 @@ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){
}
}
void
linphone_gtk_add_contact
(){
GtkWidget
*
w
=
linphone_gtk_create_window
(
"contact"
);
int
presence_enabled
=
linphone_gtk_get_ui_config_int
(
"use_subscribe_notify"
,
1
);
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
linphone_gtk_get_widget
(
w
,
"show_presence"
)),
presence_enabled
);
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
linphone_gtk_get_widget
(
w
,
"allow_presence"
)),
presence_enabled
);
gtk_widget_show
(
w
);
}
void
linphone_gtk_edit_contact
(
GtkWidget
*
button
){
GtkWidget
*
w
=
gtk_widget_get_toplevel
(
button
);
GtkTreeSelection
*
select
;
GtkTreeIter
iter
;
GtkTreeModel
*
model
;
LinphoneFriend
*
lf
=
NULL
;
select
=
gtk_tree_view_get_selection
(
GTK_TREE_VIEW
(
linphone_gtk_get_widget
(
w
,
"contact_list"
)));
if
(
gtk_tree_selection_get_selected
(
select
,
&
model
,
&
iter
))
{
gtk_tree_model_get
(
model
,
&
iter
,
FRIEND_ID
,
&
lf
,
-
1
);
linphone_gtk_show_contact
(
lf
);
}
}
void
linphone_gtk_remove_contact
(
GtkWidget
*
button
){
GtkWidget
*
w
=
gtk_widget_get_toplevel
(
button
);
GtkTreeSelection
*
select
;
GtkTreeIter
iter
;
GtkTreeModel
*
model
;
LinphoneFriend
*
lf
=
NULL
;
select
=
gtk_tree_view_get_selection
(
GTK_TREE_VIEW
(
linphone_gtk_get_widget
(
w
,
"contact_list"
)));
if
(
gtk_tree_selection_get_selected
(
select
,
&
model
,
&
iter
))
{
gtk_tree_model_get
(
model
,
&
iter
,
FRIEND_ID
,
&
lf
,
-
1
);
linphone_core_remove_friend
(
linphone_gtk_get_core
(),
lf
);
linphone_gtk_show_friends
();
}
}
static
void
linphone_gtk_call_selected
(
GtkTreeView
*
treeview
){
linphone_gtk_set_selection_to_uri_bar
(
treeview
);
linphone_gtk_start_call
(
linphone_gtk_get_widget
(
gtk_widget_get_toplevel
(
GTK_WIDGET
(
treeview
)),
...
...
@@ -118,11 +171,25 @@ void linphone_gtk_contact_activated(GtkTreeView *treeview,
GtkTreeViewColumn
*
column
,
gpointer
user_data
)
{
linphone_gtk_call_selected
(
treeview
);
//
linphone_gtk_call_selected(treeview);
}
void
linphone_gtk_contact_clicked
(
GtkTreeView
*
treeview
){
linphone_gtk_set_selection_to_uri_bar
(
treeview
);
}
void
linphone_gtk_add_button_clicked
(
void
){
linphone_gtk_add_contact
();
}
void
linphone_gtk_edit_button_clicked
(
GtkWidget
*
button
){
linphone_gtk_edit_contact
(
button
);
}
void
linphone_gtk_remove_button_clicked
(
GtkWidget
*
button
){
linphone_gtk_remove_contact
(
button
);
}
static
GtkWidget
*
create_presence_menu
(){
...
...
@@ -320,12 +387,12 @@ static int friend_compare_func(const LinphoneFriend *lf1, const LinphoneFriend *
return
w2
-
w1
;
}
static
gint
friend_sort_with_presence
(
GtkTreeModel
*
model
,
GtkTreeIter
*
a
,
GtkTreeIter
*
b
,
gpointer
user_data
){
/*
static gint friend_sort_with_presence(GtkTreeModel *model, GtkTreeIter *a,GtkTreeIter *b,gpointer user_data){
LinphoneFriend *lf1=NULL,*lf2=NULL;
gtk_tree_model_get(model,a,FRIEND_ID,&lf1,-1);
gtk_tree_model_get(model,b,FRIEND_ID,&lf2,-1);
return friend_compare_func(lf1,lf2);
}
}
*/
static
MSList
*
sort_friend_list
(
const
MSList
*
friends
){
...
...
@@ -352,43 +419,51 @@ static void on_presence_column_clicked(GtkTreeModel *model){
gtk_tree_sortable_set_sort_column_id
(
GTK_TREE_SORTABLE
(
model
),
FRIEND_ID
,
st
);
}
static
void
linphone_gtk_friend_list_init
(
GtkWidget
*
friendlist
)
{
void
create_button
(){
GtkWidget
*
main_window
=
linphone_gtk_get_main_window
();
GtkWidget
*
button_add
=
linphone_gtk_get_widget
(
main_window
,
"add_button"
);
GtkWidget
*
image
;
image
=
gtk_image_new_from_stock
(
GTK_STOCK_ADD
,
GTK_ICON_SIZE_MENU
);
gtk_container_add
(
GTK_CONTAINER
(
button_add
),
image
);
}
/* Creation of contact list*/
static
void
linphone_gtk_friend_list_init
(
GtkWidget
*
friendlist
){
GtkListStore
*
store
;
GtkCellRenderer
*
renderer
;
GtkTreeViewColumn
*
column
;
GtkTreeSelection
*
select
;
linphone_gtk_init_bookmark_icon
();
store
=
gtk_list_store_new
(
FRIEND_LIST_NCOL
,
GDK_TYPE_PIXBUF
,
G_TYPE_STRING
,
G_TYPE_STRING
,
G_TYPE_POINTER
,
G_TYPE_STRING
,
GDK_TYPE_PIXBUF
);
store
=
gtk_list_store_new
(
FRIEND_LIST_NCOL
,
GDK_TYPE_PIXBUF
,
G_TYPE_STRING
,
G_TYPE_STRING
,
G_TYPE_POINTER
,
G_TYPE_POINTER
,
G_TYPE_STRING
,
GDK_TYPE_PIXBUF
,
GDK_TYPE_PIXBUF
,
GDK_TYPE_PIXBUF
);
gtk_tree_view_set_model
(
GTK_TREE_VIEW
(
friendlist
),
GTK_TREE_MODEL
(
store
));
g_object_unref
(
G_OBJECT
(
store
));
/* Tree specification*/
gtk_tree_view_set_headers_visible
(
GTK_TREE_VIEW
(
friendlist
),
FALSE
);
gtk_tree_view_set_search_equal_func
(
GTK_TREE_VIEW
(
friendlist
),
friend_search_func
,
NULL
,
NULL
);
gtk_tree_view_set_search_column
(
GTK_TREE_VIEW
(
friendlist
),
FRIEND_NAME
);
gtk_tree_sortable_set_sort_func
(
GTK_TREE_SORTABLE
(
store
),
FRIEND_NAME
,
friend_sort
,
NULL
,
NULL
);
gtk_tree_sortable_set_sort_func
(
GTK_TREE_SORTABLE
(
store
),
FRIEND_ID
,
friend_sort_with_presence
,
NULL
,
NULL
);
renderer
=
gtk_cell_renderer_pixbuf_new
();
/*Name and presence column*/
renderer
=
gtk_cell_renderer_text_new
();
column
=
gtk_tree_view_column_new_with_attributes
(
_
(
"Name"
),
renderer
,
"pixbuf"
,
FRIEND_ICON
,
NULL
);
"text"
,
FRIEND_NAME
,
NULL
);
g_object_set
(
G_OBJECT
(
column
),
"resizable"
,
TRUE
,
NULL
);
g_signal_connect_swapped
(
G_OBJECT
(
column
),
"clicked"
,(
GCallback
)
on_name_column_clicked
,
GTK_TREE_MODEL
(
store
));
gtk_tree_view_column_set_clickable
(
column
,
TRUE
);
renderer
=
gtk_cell_renderer_text_new
();
gtk_tree_view_column_pack_start
(
column
,
renderer
,
FALSE
);
gtk_tree_view_column_add_attribute
(
column
,
renderer
,
"text"
,
FRIEND_NAME
);
gtk_tree_view_append_column
(
GTK_TREE_VIEW
(
friendlist
),
column
);
gtk_tree_view_column_set_expand
(
column
,
TRUE
);
gtk_tree_view_column_set_max_width
(
column
,
60
);
gtk_tree_view_append_column
(
GTK_TREE_VIEW
(
friendlist
),
column
);
column
=
gtk_tree_view_column_new_with_attributes
(
_
(
"Presence status"
),
renderer
,
...
...
@@ -396,23 +471,38 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist)
NULL
);
g_object_set
(
G_OBJECT
(
column
),
"resizable"
,
TRUE
,
NULL
);
g_signal_connect_swapped
(
G_OBJECT
(
column
),
"clicked"
,(
GCallback
)
on_presence_column_clicked
,
GTK_TREE_MODEL
(
store
));
gtk_tree_view_column_set_clickable
(
column
,
TRUE
);
gtk_tree_view_column_set_clickable
(
column
,
TRUE
);
gtk_tree_view_column_set_visible
(
column
,
linphone_gtk_get_ui_config_int
(
"friendlist_status"
,
1
));
renderer
=
gtk_cell_renderer_pixbuf_new
();
gtk_tree_view_column_pack_start
(
column
,
renderer
,
FALS
E
);
gtk_tree_view_column_pack_start
(
column
,
renderer
,
TRU
E
);
gtk_tree_view_column_add_attribute
(
column
,
renderer
,
"pixbuf"
,
FRIEND_PRESENCE_IMG
);
gtk_tree_view_append_column
(
GTK_TREE_VIEW
(
friendlist
),
column
);
/* Call column*/
renderer
=
gtk_cell_renderer_pixbuf_new
();
column
=
gtk_tree_view_column_new_with_attributes
(
_
(
"Call"
),
renderer
,
"pixbuf"
,
FRIEND_CALL
,
NULL
);
gtk_tree_view_append_column
(
GTK_TREE_VIEW
(
friendlist
),
column
);
/* chat column*/
renderer
=
gtk_cell_renderer_pixbuf_new
();
column
=
gtk_tree_view_column_new_with_attributes
(
_
(
"Chat"
),
renderer
,
"pixbuf"
,
FRIEND_CHAT
,
NULL
);