diff --git a/data/gui/chat_control.ui b/data/gui/chat_control.ui index e1ea0892758a007899a5945369ab78cf161f8b2f..e5b8b1e40b7e106f83b0e18ca8a7e1ee11b4ae76 100644 --- a/data/gui/chat_control.ui +++ b/data/gui/chat_control.ui @@ -12,223 +12,279 @@ <property name="orientation">vertical</property> <property name="spacing">1</property> <child> - <object class="GtkVBox" id="vbox2"> + <object class="GtkHPaned" id="hpaned1"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">True</property> <child> - <object class="GtkAlignment" id="alignment"> + <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> - <property name="left_padding">3</property> - <property name="right_padding">3</property> + <property name="orientation">vertical</property> <child> - <object class="GtkEventBox" id="banner_eventbox"> + <object class="GtkAlignment" id="alignment"> <property name="visible">True</property> + <property name="left_padding">3</property> + <property name="right_padding">3</property> <child> - <object class="GtkHBox" id="hbox3004"> + <object class="GtkEventBox" id="banner_eventbox"> <property name="visible">True</property> <child> - <object class="GtkImage" id="banner_status_image"> - <property name="visible">True</property> - <property name="ypad">5</property> - <property name="stock">gtk-missing-image</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">5</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="banner_vbox"> + <object class="GtkHBox" id="hbox3004"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> - <object class="GtkLabel" id="banner_name_label"> + <object class="GtkImage" id="banner_status_image"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label"><span weight="heavy" size="large">Contact name</span></property> - <property name="use_markup">True</property> + <property name="ypad">5</property> + <property name="stock">gtk-missing-image</property> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkLabel" id="banner_label"> + <object class="GtkVBox" id="banner_vbox"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">label</property> - <property name="use_markup">True</property> - <property name="selectable">True</property> - <signal name="populate_popup" handler="on_banner_label_populate_popup"/> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="spacing">4</property> - <child> - <object class="GtkImage" id="mood_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkImage" id="activity_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="border_width">5</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="banner_name_label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label"><span weight="heavy" size="large">Contact name</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="banner_label"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label">label</property> + <property name="use_markup">True</property> + <property name="selectable">True</property> + <signal name="populate_popup" handler="on_banner_label_populate_popup"/> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="position">1</property> </packing> </child> <child> - <object class="GtkImage" id="tune_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkEventBox" id="location_eventbox"> + <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> - <property name="visible_window">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage" id="mood_image"> + <property name="no_show_all">True</property> + <property name="stock">None</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> <child> - <object class="GtkImage" id="location_image"> + <object class="GtkImage" id="activity_image"> <property name="no_show_all">True</property> <property name="stock">None</property> <property name="icon-size">1</property> </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="tune_image"> + <property name="no_show_all">True</property> + <property name="stock">None</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkEventBox" id="location_eventbox"> + <property name="visible">True</property> + <property name="visible_window">False</property> + <child> + <object class="GtkImage" id="location_image"> + <property name="no_show_all">True</property> + <property name="stock">None</property> + <property name="icon-size">1</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkImage" id="audio_banner_image"> + <property name="visible">True</property> + <property name="stock">None</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkImage" id="video_banner_image"> + <property name="visible">True</property> + <property name="stock">None</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment3"> + <property name="width_request">11</property> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">3</property> + <property name="position">2</property> </packing> </child> <child> - <object class="GtkImage" id="audio_banner_image"> + <object class="GtkEventBox" id="avatar_eventbox"> <property name="visible">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> + <property name="visible_window">False</property> + <child> + <object class="GtkImage" id="avatar_image"> + <property name="visible">True</property> + <property name="stock">None</property> + </object> + </child> </object> <packing> - <property name="position">4</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> </packing> </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox106"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> + <property name="height_request">60</property> + <property name="can_focus">True</property> + <property name="border_width">3</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child> + <object class="GtkButton" id="authentication_button"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="no_show_all">True</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="video_banner_image"> - <property name="visible">True</property> - <property name="stock">None</property> + <object class="GtkImage" id="lock_image"> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-dialog-authentication</property> <property name="icon-size">1</property> </object> - <packing> - <property name="position">5</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment3"> - <property name="width_request">11</property> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">6</property> - </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkEventBox" id="avatar_eventbox"> + <object class="GtkScrolledWindow" id="message_scrolledwindow"> <property name="visible">True</property> - <property name="visible_window">False</property> + <property name="can_focus">True</property> + <property name="border_width">3</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> <child> - <object class="GtkImage" id="avatar_image"> - <property name="visible">True</property> - <property name="stock">None</property> - </object> + <placeholder/> </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> + <property name="position">1</property> </packing> </child> </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox106"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> - <property name="height_request">60</property> - <property name="can_focus">True</property> - <property name="border_width">3</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> - <child> - <placeholder/> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> </child> </object> <packing> - <property name="position">0</property> + <property name="position">1</property> </packing> </child> <child> - <object class="GtkHBox" id="hbox"> + <object class="GtkHBox" id="actions_hbox"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <object class="GtkButton" id="authentication_button"> + <object class="GtkButton" id="emoticons_button"> + <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="no_show_all">True</property> <property name="relief">none</property> <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="lock_image"> + <object class="GtkImage" id="emoticons_button_image"> + <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-dialog-authentication</property> + <property name="stock">gtk-missing-image</property> <property name="icon-size">1</property> </object> </child> @@ -239,430 +295,430 @@ </packing> </child> <child> - <object class="GtkScrolledWindow" id="message_scrolledwindow"> + <object class="GtkButton" id="formattings_button"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="border_width">3</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <placeholder/> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="stock">gtk-bold</property> + <property name="icon-size">1</property> + </object> </child> </object> <packing> + <property name="expand">False</property> <property name="position">1</property> </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="actions_hbox"> - <property name="visible">True</property> - <child> - <object class="GtkButton" id="emoticons_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Show a list of emoticons (Alt+M)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="emoticons_button_image"> + <object class="GtkVSeparator" id="vseparator1"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="formattings_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Show a list of formattings</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="image10"> - <property name="visible">True</property> - <property name="stock">gtk-bold</property> - <property name="icon-size">1</property> + <property name="orientation">vertical</property> </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkVSeparator" id="vseparator1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="add_to_roster_button"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="no_show_all">True</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Add this contact to roster (Ctrl+D)</property> - <property name="relief">none</property> <child> - <object class="GtkImage" id="image9"> - <property name="visible">True</property> + <object class="GtkButton" id="add_to_roster_button"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-add</property> - <property name="icon-size">1</property> + <property name="no_show_all">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-add</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="send_file_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="image3"> + <object class="GtkButton" id="send_file_button"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="icon-size">1</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">4</property> - </packing> - </child> - <child> - <object class="GtkToggleButton" id="audio_togglebutton"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Toggle audio session</property> - <property name="relief">none</property> <child> - <object class="GtkImage" id="audio_image"> - <property name="visible">True</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> + <object class="GtkToggleButton" id="audio_togglebutton"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage" id="audio_image"> + <property name="visible">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">5</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">5</property> - </packing> - </child> - <child> - <object class="GtkToggleButton" id="video_togglebutton"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Toggle video session</property> - <property name="relief">none</property> <child> - <object class="GtkImage" id="video_image"> - <property name="visible">True</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> + <object class="GtkToggleButton" id="video_togglebutton"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage" id="video_image"> + <property name="visible">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">6</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">6</property> - </packing> - </child> - <child> - <object class="GtkButton" id="convert_to_gc_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Invite contacts to the conversation (Ctrl+G)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="convert_to_gc_button_image"> + <object class="GtkButton" id="convert_to_gc_button"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkImage" id="convert_to_gc_button_image"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">7</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">7</property> - </packing> - </child> - <child> - <object class="GtkButton" id="contact_information_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Show the contact's profile (Ctrl+I)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="image2"> + <object class="GtkButton" id="contact_information_button"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-info</property> - <property name="icon-size">1</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-info</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">8</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">8</property> - </packing> - </child> - <child> - <object class="GtkButton" id="history_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="image5"> + <object class="GtkButton" id="history_button"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-justify-fill</property> - <property name="icon-size">1</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-justify-fill</property> + <property name="icon-size">1</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="position">9</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">9</property> - </packing> - </child> - <child> - <object class="GtkVSeparator" id="vseparator3"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">10</property> - </packing> - </child> - <child> - <object class="GtkButton" id="message_window_actions_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">Show a menu of advanced functions (Alt+D)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="image1"> + <object class="GtkVSeparator" id="vseparator3"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-execute</property> - <property name="icon-size">1</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">11</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="audio_buttons_hbox"> - <property name="no_show_all">True</property> - <child> - <object class="GtkVSeparator" id="vseparator2"> - <property name="visible">True</property> <property name="orientation">vertical</property> </object> <packing> <property name="expand">False</property> - <property name="position">0</property> + <property name="position">10</property> </packing> </child> <child> - <object class="GtkVolumeButton" id="sound_hscale"> + <object class="GtkButton" id="message_window_actions_button"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="use_action_appearance">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="relief">none</property> <property name="focus_on_click">False</property> - <property name="orientation">vertical</property> - <property name="size">menu</property> - <property name="adjustment">adjustment1</property> - <property name="icons">audio-volume-muted -audio-volume-high -audio-volume-low -audio-volume-medium</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-execute</property> + <property name="icon-size">1</property> + </object> + </child> </object> <packing> <property name="expand">False</property> - <property name="position">1</property> + <property name="position">11</property> </packing> </child> <child> - <object class="GtkVolumeButton" id="mic_hscale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_action_appearance">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <property name="yalign">0.4699999988079071</property> - <property name="orientation">vertical</property> - <property name="size">menu</property> - <property name="adjustment">adjustment2</property> - <property name="icons">audio-mic-volume-muted + <object class="GtkHBox" id="audio_buttons_hbox"> + <property name="no_show_all">True</property> + <child> + <object class="GtkVSeparator" id="vseparator2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVolumeButton" id="sound_hscale"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">True</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <property name="orientation">vertical</property> + <property name="size">menu</property> + <property name="adjustment">adjustment1</property> + <property name="icons">audio-volume-muted +audio-volume-high +audio-volume-low +audio-volume-medium</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkVolumeButton" id="mic_hscale"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">True</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <property name="yalign">0.4699999988079071</property> + <property name="orientation">vertical</property> + <property name="size">menu</property> + <property name="adjustment">adjustment2</property> + <property name="icons">audio-mic-volume-muted audio-mic-volume-high audio-mic-volume-medium audio-mic-volume-low</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="dtmf_button"> + <property name="label" translatable="yes">#</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> - <property name="position">2</property> + <property name="position">12</property> </packing> </child> <child> - <object class="GtkButton" id="dtmf_button"> - <property name="label" translatable="yes">#</property> + <object class="GtkComboBox" id="label_selector"> + <property name="visible">True</property> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="send_button"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment102"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox3010"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image1339"> + <property name="visible">True</property> + <property name="stock">gtk-jump-to</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label373"> + <property name="visible">True</property> + <property name="label" translatable="yes" comments="Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> </object> <packing> - <property name="position">3</property> + <property name="expand">False</property> + <property name="position">15</property> </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="position">12</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="label_selector"> - <property name="visible">True</property> - </object> - <packing> - <property name="position">13</property> + <property name="position">2</property> </packing> </child> + </object> + <packing> + <property name="resize">False</property> + <property name="shrink">True</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="video_hbox"> + <property name="no_show_all">True</property> + <property name="spacing">6</property> <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <object class="GtkFixed" id="outgoing_fixed"> + <property name="no_show_all">True</property> <child> - <placeholder/> + <object class="GtkViewport" id="viewport1"> + <property name="width_request">160</property> + <property name="height_request">120</property> + <property name="visible">True</property> + <property name="resize_mode">queue</property> + <child> + <object class="GtkDrawingArea" id="outgoing_drawingarea"> + <property name="width_request">160</property> + <property name="height_request">120</property> + <property name="visible">True</property> + <property name="double_buffered">False</property> + </object> + </child> + </object> </child> </object> <packing> - <property name="position">14</property> + <property name="expand">False</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkButton" id="send_button"> + <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="orientation">vertical</property> <child> - <object class="GtkAlignment" id="alignment102"> + <object class="GtkViewport" id="viewport2"> <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> + <property name="resize_mode">queue</property> <child> - <object class="GtkHBox" id="hbox3010"> + <object class="GtkDrawingArea" id="incoming_drawingarea"> + <property name="width_request">320</property> + <property name="height_request">240</property> <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1339"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label373"> - <property name="visible">True</property> - <property name="label" translatable="yes" comments="Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> + <property name="double_buffered">False</property> </object> </child> </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> </child> </object> <packing> - <property name="expand">False</property> - <property name="position">15</property> + <property name="position">1</property> </packing> </child> </object> <packing> - <property name="expand">False</property> - <property name="position">2</property> + <property name="resize">True</property> + <property name="shrink">True</property> </packing> </child> </object> @@ -712,8 +768,8 @@ audio-mic-volume-low</property> <property name="relief">none</property> </object> <packing> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -727,8 +783,8 @@ audio-mic-volume-low</property> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -742,8 +798,8 @@ audio-mic-volume-low</property> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -757,8 +813,8 @@ audio-mic-volume-low</property> <packing> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -774,8 +830,8 @@ audio-mic-volume-low</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -791,8 +847,8 @@ audio-mic-volume-low</property> <property name="right_attach">3</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -806,8 +862,8 @@ audio-mic-volume-low</property> <packing> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -823,8 +879,8 @@ audio-mic-volume-low</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -840,8 +896,8 @@ audio-mic-volume-low</property> <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -855,8 +911,8 @@ audio-mic-volume-low</property> <packing> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -872,8 +928,8 @@ audio-mic-volume-low</property> <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -889,8 +945,8 @@ audio-mic-volume-low</property> <property name="right_attach">3</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> </object> diff --git a/data/gui/preferences_window.ui b/data/gui/preferences_window.ui index 0136e037ba5def554a68432c10e22738ecac8738..16c11804029c0c10a6c38a4a955caf3a134ba8b6 100644 --- a/data/gui/preferences_window.ui +++ b/data/gui/preferences_window.ui @@ -2174,7 +2174,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkTable" id="table8"> <property name="visible">True</property> - <property name="n_rows">4</property> + <property name="n_rows">5</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> @@ -2270,6 +2270,21 @@ $T will be replaced by auto-not-available timeout</property> <property name="bottom_attach">4</property> </packing> </child> + <child> + <object class="GtkCheckButton" id="video_see_self_checkbutton"> + <property name="label" translatable="yes">View own video source</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_video_see_self_checkbutton_toggled"/> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> </object> </child> </object> diff --git a/src/chat_control.py b/src/chat_control.py index 466ce7ba05b886d14ade90ae414144f174acd890..ddb2a916c50d727eb6f0f1876b70c95910e1a2a6 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -2151,10 +2151,27 @@ class ChatControl(ChatControlBase): if widget.get_active(): if getattr(self, jingle_type + '_state') == \ self.JINGLE_STATE_NULL: - sid = getattr(gajim.connections[self.account], + if jingle_type == 'video': + video_hbox = self.xml.get_object('video_hbox') + video_hbox.set_no_show_all(False) + if gajim.config.get('video_see_self'): + fixed = self.xml.get_object('outgoing_fixed') + fixed.set_no_show_all(False) + video_hbox.show_all() + in_xid = self.xml.get_object('incoming_drawingarea').window.xid + out_xid = self.xml.get_object('outgoing_drawingarea').window.xid + sid = gajim.connections[self.account].start_video( + self.contact.get_full_jid(), in_xid, out_xid) + else: + sid = getattr(gajim.connections[self.account], 'start_' + jingle_type)(self.contact.get_full_jid()) getattr(self, 'set_' + jingle_type + '_state')('connecting', sid) else: + video_hbox = self.xml.get_object('video_hbox') + video_hbox.set_no_show_all(True) + video_hbox.hide() + fixed = self.xml.get_object('outgoing_fixed') + fixed.set_no_show_all(True) self.close_jingle_content(jingle_type) img = getattr(self, '_' + jingle_type + '_button').get_property('image') diff --git a/src/common/config.py b/src/common/config.py index 928912f9edcb537b80767bd4553e33122df5ae4a..addbd3b6360311e9f5e82e673e96b79caaad985a 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -305,6 +305,7 @@ class Config: 'video_output_device': [opt_str, 'autovideosink'], 'video_framerate': [opt_str, '', _('Optionally fix jingle output video framerate. Example: 10/1 or 25/2')], 'video_size': [opt_str, '', _('Optionally resize jingle output video. Example: 320x240')], + 'video_see_self': [opt_bool, True, _('If True, You will also see your webcam')], 'audio_input_volume': [opt_int, 50], 'audio_output_volume': [opt_int, 50], 'use_stun_server': [opt_bool, False, _('If True, Gajim will try to use a STUN server when using jingle. The one in "stun_server" option, or the one given by the jabber server.')], diff --git a/src/common/jingle.py b/src/common/jingle.py index 57e26c3b11eb384601871cd801a9c001788160f7..0bb0b9d48a28ec8345490611a00279c3251be055 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -120,16 +120,18 @@ class ConnectionJingle(object): jingle.start_session() return jingle.sid - def start_video(self, jid): + def start_video(self, jid, in_xid, out_xid): if self.get_jingle_session(jid, media='video'): return self.get_jingle_session(jid, media='video').sid jingle = self.get_jingle_session(jid, media='audio') if jingle: - jingle.add_content('video', JingleVideo(jingle)) + jingle.add_content('video', JingleVideo(jingle, in_xid=in_xid, + out_xid=out_xid)) else: jingle = JingleSession(self, weinitiate=True, jid=jid) self._sessions[jingle.sid] = jingle - jingle.add_content('video', JingleVideo(jingle)) + jingle.add_content('video', JingleVideo(jingle, in_xid=in_xid, + out_xid=out_xid)) jingle.start_session() return jingle.sid diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 44b0a22fa7b1e57c4f7758820f10d3c12055176c..1691e2097d349f7d93c672c2d88b249417a6603e 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -22,6 +22,7 @@ import socket import nbxmpp import farstream, gst +import gst.interfaces from glib import GError import gajim @@ -63,6 +64,7 @@ class JingleRTPContent(JingleContent): # pipeline and bus self.pipeline = gst.Pipeline() bus = self.pipeline.get_bus() + bus.enable_sync_message_emission() bus.add_signal_watch() bus.connect('message', self._on_gst_message) @@ -366,8 +368,11 @@ class JingleAudio(JingleRTPContent): class JingleVideo(JingleRTPContent): - def __init__(self, session, transport=None): + def __init__(self, session, transport=None, in_xid=0, out_xid=0): JingleRTPContent.__init__(self, session, 'video', transport) + self.in_xid = in_xid + self.out_xid = out_xid + self.out_xid_set = False self.setup_stream() def setup_stream(self): @@ -375,6 +380,8 @@ class JingleVideo(JingleRTPContent): # sometimes, one window won't show up, # sometimes it'll freeze... JingleRTPContent.setup_stream(self, self._on_src_pad_added) + bus = self.pipeline.get_bus() + bus.connect('sync-message::element', self._on_sync_message) # the local parts if gajim.config.get('video_framerate'): @@ -390,17 +397,25 @@ class JingleVideo(JingleRTPContent): video_size = 'video/x-raw-yuv,width=%s,height=%s ! ' % (w, h) else: video_size = '' + if gajim.config.get('video_see_self'): + tee = '! tee name=t ! queue ! videoscale ! ' + \ + 'video/x-raw-yuv,width=160,height=120 ! ffmpegcolorspace ! ' + \ + '%s t. ! queue ' % gajim.config.get( + 'video_output_device') + else: + tee = '' + self.src_bin = self.make_bin_from_config('video_input_device', - '%%s ! %svideoscale ! %sffmpegcolorspace' % (framerate, video_size), - _("video input")) - #caps = gst.element_factory_make('capsfilter') - #caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) + '%%s %s! %svideoscale ! %sffmpegcolorspace' % (tee, framerate, + video_size), _("video input")) + self.pipeline.add(self.src_bin)#, caps) + self.pipeline.set_state(gst.STATE_PLAYING) #src_bin.link(caps) self.sink = self.make_bin_from_config('video_output_device', - 'videoscale ! ffmpegcolorspace ! %s force-aspect-ratio=True', + 'videoscale ! ffmpegcolorspace ! %s', _("video output")) self.pipeline.add(self.sink) @@ -410,11 +425,27 @@ class JingleVideo(JingleRTPContent): # The following is needed for farstream to process ICE requests: self.pipeline.set_state(gst.STATE_PLAYING) + def _on_sync_message(self, bus, message): + if message.structure is None: + return False + if message.structure.get_name() == 'prepare-xwindow-id': + message.src.set_property('force-aspect-ratio', True) + imagesink = message.src + if gajim.config.get('video_see_self') and not self.out_xid_set: + imagesink.set_xwindow_id(self.out_xid) + self.out_xid_set = True + else: + imagesink.set_xwindow_id(self.in_xid) + def get_fallback_src(self): # TODO: Use avatar? pipeline = 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1 ! ffmpegcolorspace' return gst.parse_bin_from_description(pipeline, True) + def destroy(self): + JingleRTPContent.destroy(self) + self.pipeline.get_bus().disconnect_by_func(self._on_sync_message) + def get_content(desc): if desc['media'] == 'audio': return JingleAudio diff --git a/src/common/multimedia_helpers.py b/src/common/multimedia_helpers.py index 98a91a26a4987eec9264a8f1dc4ebf11b0708a27..59270f0d79b8d3bea456e7cd9fd4b70c3ca4cb3c 100644 --- a/src/common/multimedia_helpers.py +++ b/src/common/multimedia_helpers.py @@ -102,7 +102,7 @@ class VideoOutputManager(DeviceManager): def detect(self): self.devices = {} # Fake video output - self.detect_element('fakesink', _('Fake audio output')) + self.detect_element('fakesink', _('Fake video output')) # Auto sink self.detect_element('xvimagesink', _('X Window System (X11/XShm/Xv): %s')) diff --git a/src/config.py b/src/config.py index 8a140ca00dc6a5982156fc159d6afd0ace76b1af..ded12ffbb8617fcedd0b09db1c9a8367f0813ff7 100644 --- a/src/config.py +++ b/src/config.py @@ -478,6 +478,8 @@ class PreferencesWindow: '800x600': '800x600', '640x480': '640x480', '320x240': '320x240'}, 'video_size', key=lambda x: -1 if \ not x[1] else int(x[0][:3])) + st = gajim.config.get('video_see_self') + self.xml.get_object('video_see_self_checkbutton').set_active(st) else: for opt_name in ('audio_input', 'audio_output', 'video_input', @@ -1131,6 +1133,9 @@ class PreferencesWindow: def on_video_size_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'video_size') + def on_video_see_self_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'video_see_self') + def on_stun_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'use_stun_server', [self.xml.get_object('stun_server_entry')]) diff --git a/src/gajim.py b/src/gajim.py index 894d7186e69ade6545bbc80c09d442028bca9ee5..c66f1b964bc25f25582f39de1c0b5ba6bd758510 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -73,7 +73,7 @@ demandimport.enable() demandimport.ignore += ['gobject._gobject', 'libasyncns', 'i18n', 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', - 'Crypto.PublicKey', 'IPython'] + 'Crypto.PublicKey', 'IPython', 'gst.interfaces'] if os.name == 'nt': import locale