Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • gajim/gajim
  • lovetox/gajim
  • ag/gajim
  • linkmauve/gajim
  • asterix/gajim
  • andre/gajim
  • mimi89999/gajim
  • bronko/gajim
  • wurstsalat/gajim
  • baitisj/gajim
  • Dicson/gajim
  • PolynomialDivision/gajim
  • troom/gajim
  • sophie-h/gajim
  • marmistrz/gajim
  • mrDoctorWho/gajim
  • orhideous/gajim
  • jjrh/gajim
  • streaps/gajim
  • jhuffine/gajim
  • maltel/gajim
  • Dominion/gajim
  • norstbox/gajim
  • synchrone/gajim
  • mick3247652/gajim
  • Yuki/gajim
  • l-n-s/gajim
  • ehuelsmann/gajim
  • hrxi/gajim
  • SaltyBones/gajim
  • rlgh/gajim
  • genofire/gajim
  • weblate/gajim
  • PapaTutuWawa/gajim
  • eta/gajim
  • jelmer/gajim
  • Ge0rG/gajim
  • TSRh/gajim
  • tolosaeduard/gajim
  • pitchum/gajim
  • mexicarne/gajim
  • prmcgs/gajim
  • mehw/gajim
  • ecxod/gajim
  • wannestas/gajim
  • XutaxKamay/gajim
  • emil/gajim-fork
  • gs/gajim
  • jurajlutter/gajim
  • Sheldon/gajim-cme
  • dexgs/gajim
  • bodqhrohro/gajim
  • Ermine/gajim
  • mesonium/gajim
  • mjk/gajim
  • nicoco/gajim
  • Polarian/gajim
  • izaya/gajim
  • kurion/gajim
  • npmania/gajim
  • ebertus/gajim
  • intelfx/gajim
  • musipusi/gajim
  • wusspuss/gajim
  • slicht/gajim
  • toms/gajim
  • singpolyma/gajim
  • Antiz/gajim
  • hendursaga/gajim
  • cve-1312/gajim
  • smemes2/gajim
  • amlor/gajim
72 results
Show changes
Commits on Source (10)
......@@ -23,6 +23,7 @@ build_script:
- ps: |
$filename = "Gajim-$($env:GAJIM_VERSION)-$($env:ARCH)"
$filename_portable = "Gajim-Portable-$($env:GAJIM_VERSION)-$($env:ARCH)"
$filename_msixbundle = "Gajim-$($env:GAJIM_VERSION)"
if ($env:GAJIM_VERSION -eq "Nightly") {
$time_string=(get-date -UFormat "%Y-%m-%d").ToString()
......@@ -43,6 +44,7 @@ build_script:
Push-AppveyorArtifact "$($buildroot)/Gajim.exe" -FileName "$($filename).exe"
Push-AppveyorArtifact "$($buildroot)/Gajim-Portable.exe" -FileName "$($filename_portable).exe"
Push-AppveyorArtifact "$($buildroot)/Gajim.msixbundle" -FileName "$($filename_msixbundle).msixbundle"
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
# on_finish:
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="gtk+" version="3.24"/>
<object class="GtkBox" id="box">
<property name="visible">True</property>
<property name="can-focus">False</property>
......@@ -11,8 +11,8 @@
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">6</property>
<property name="margin-end">6</property>
<property name="margin-start">18</property>
<property name="margin-end">18</property>
<property name="margin-top">12</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
......@@ -98,6 +98,8 @@
<object class="GtkTreeView" id="roster_treeview">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="margin-start">18</property>
<property name="margin-end">18</property>
<property name="headers-visible">False</property>
<property name="expander-column">expander</property>
<property name="enable-search">False</property>
......
......@@ -988,10 +988,6 @@ popover.combo scrollbar.vertical {
.start-chat-row:not(.activatable) label { color: @insensitive_fg_color; }
.start-chat-row:focus { outline: none; }
/* GroupChatRoster */
.groupchat-roster treeview { padding-left: 4px; }
.groupchat-roster { padding: 0 18px 0 18px; }
/* GroupchatConfig */
#GroupchatConfig stack { border-bottom: 1px solid; border-color: @borders;}
#GroupchatConfig stacksidebar > scrolledwindow {
......
......@@ -27,6 +27,7 @@ from gajim.common import ged
from gajim.common import types
from gajim.common.const import AvatarSize
from gajim.common.const import SimpleClientState
from gajim.common.const import XmppUriQuery
from gajim.common.events import AccountEnabled
from gajim.common.events import BookmarksReceived
from gajim.common.events import MessageReceived
......@@ -37,7 +38,6 @@ from gajim.common.i18n import _
from gajim.common.modules.contacts import BareContact
from gajim.common.modules.contacts import GroupchatContact
from gajim.common.modules.contacts import GroupchatParticipant
from gajim.common.util.text import jid_to_iri
from gajim.gtk.builder import get_builder
from gajim.gtk.groupchat_voice_requests_button import VoiceRequestsButton
......@@ -333,19 +333,22 @@ class ChatBanner(Gtk.Box, EventHelper):
not self._contact.is_pm_contact)
self._ui.jid_label.set_text(str(self._contact.jid))
def _on_share_clicked(self, _button: Gtk.Button) -> None:
# Generate QR code on demand (i.e. not when switching chats)
def _get_share_uri(self) -> str:
assert self._contact is not None
text = jid_to_iri(str(self._contact.jid))
jid = self._contact.get_address()
if self._contact.is_groupchat:
text = f'{text}?join'
self._ui.qr_code_image.set_from_pixbuf(generate_qr_code(text))
return jid.to_iri(XmppUriQuery.JOIN.value)
else:
# TODO: add verified OMEMO FPs
return jid.to_iri()
def _on_share_clicked(self, _button: Gtk.Button) -> None:
# Generate QR code on demand (i.e. not when switching chats)
self._ui.qr_code_image.set_from_pixbuf(
generate_qr_code(self._get_share_uri()))
def _on_copy_jid_clicked(self, _button: Gtk.Button) -> None:
assert self._contact is not None
text = f'xmpp:{self._contact.jid}'
if self._contact.is_groupchat:
text = f'{text}?join'
text = self._get_share_uri()
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.set_text(text, -1)
self._ui.share_popover.popdown()
......
......@@ -278,7 +278,8 @@ class ChatListStack(Gtk.Stack, EventHelper):
client = app.get_client(account)
contact = client.get_module('Contacts').get_contact(jid, groupchat=True)
if contact.is_not_joined:
if contact.is_not_joined and client.state.is_available:
# For example a chat opened from the search bar
_remove()
return
......
......@@ -33,7 +33,9 @@ from nbxmpp.task import Task
from gajim.common import app
from gajim.common import ged
from gajim.common import types
from gajim.common.const import AvatarSize
from gajim.common.const import SimpleClientState
from gajim.common.events import SubscribedPresenceReceived
from gajim.common.events import UnsubscribedPresenceReceived
from gajim.common.ged import EventHelper
......@@ -87,6 +89,8 @@ class ContactInfo(Gtk.ApplicationWindow, EventHelper):
self.account = account
self.contact = contact
self._client = app.get_client(account)
self._client.connect_signal(
'state-changed', self._on_client_state_changed)
self._ui = get_builder('contact_info.ui')
......@@ -142,6 +146,17 @@ class ContactInfo(Gtk.ApplicationWindow, EventHelper):
if event.keyval == Gdk.KEY_Escape:
self.destroy()
def _on_client_state_changed(self,
_client: types.Client,
_signal_name: str,
state: SimpleClientState
) -> None:
self._ui.edit_name_button.set_sensitive(state.is_connected)
self._ui.edit_name_button.set_tooltip_text(
_('Not connected') if not state.is_connected else _('Edit Name…'))
self._ui.subscription_listbox.set_sensitive(state.is_connected)
def _on_stack_child_changed(self,
_widget: Gtk.Stack,
_pspec: GObject.ParamSpec) -> None:
......@@ -166,13 +181,17 @@ class ContactInfo(Gtk.ApplicationWindow, EventHelper):
def _fill_information_page(self, contact: ContactT) -> None:
self._vcard_grid = VCardGrid(self.account)
self._ui.vcard_box.add(self._vcard_grid)
self._client.get_module('VCard4').request_vcard(
jid=self.contact.jid,
callback=self._on_vcard_received)
if self._client.state.is_available:
self._client.get_module('VCard4').request_vcard(
jid=self.contact.jid,
callback=self._on_vcard_received)
jid = str(contact.get_address())
self._ui.contact_name_label.set_text(contact.name)
self._ui.edit_name_button.set_sensitive(
self._client.state.is_available)
self._ui.contact_jid_label.set_text(jid)
self._ui.contact_jid_label.set_tooltip_text(jid)
......@@ -210,6 +229,9 @@ class ContactInfo(Gtk.ApplicationWindow, EventHelper):
self._ui.from_subscription_switch.set_state(contact.is_subscribed)
self._ui.subscription_listbox.set_sensitive(
self._client.state.is_available)
if contact.subscription in ('to', 'both'):
self._ui.to_subscription_stack.set_visible_child_name('checkmark')
......@@ -231,7 +253,7 @@ class ContactInfo(Gtk.ApplicationWindow, EventHelper):
params.to_variant())
def _fill_groups_page(self, contact: BareContact) -> None:
if not contact.is_in_roster:
if not contact.is_in_roster or not self._client.state.is_available:
return
model = self._ui.groups_treeview.get_model()
......
......@@ -36,6 +36,7 @@ from gajim.common import ged
from gajim.common import helpers
from gajim.common import types
from gajim.common.const import KindConstant
from gajim.common.const import XmppUriQuery
from gajim.common.ged import EventHelper
from gajim.common.helpers import AdditionalDataDict
from gajim.common.helpers import get_retraction_text
......@@ -1096,8 +1097,8 @@ class ChatControl(EventHelper):
message = _('Group chat has been destroyed%s') % reason
if event.alternate is not None:
message += '\n' + _('You can join this group chat instead: '
'xmpp:%s?join') % str(event.alternate)
message += '\n' + _('You can join this group chat instead: %s') % (
event.alternate.to_iri(XmppUriQuery.JOIN.value))
self.add_info_message(message, event.timestamp)
......
......@@ -14,6 +14,7 @@
from typing import Optional
import logging
import time
from gi.repository import Gdk
......@@ -27,6 +28,7 @@ from nbxmpp.structs import MucSubject
from gajim.common import app
from gajim.common.const import AvatarSize
from gajim.common.const import RFC5646_LANGUAGE_TAGS
from gajim.common.const import XmppUriQuery
from gajim.common.helpers import get_groupchat_name
from gajim.common.helpers import open_uri
from gajim.common.i18n import _
......@@ -35,6 +37,8 @@ from gajim.common.i18n import p_
from gajim.gtk.builder import get_builder
from gajim.gtk.util import make_href_markup
log = logging.getLogger('gajim.gtk.groupchat_info')
MUC_FEATURES = {
'muc_open': (
'feather-globe-symbolic',
......@@ -200,7 +204,12 @@ class GroupChatInfoScrolled(Gtk.ScrolledWindow):
has_contacts = bool(info.muc_contacts)
if has_contacts:
for contact in info.muc_contacts:
self._ui.contact_box.add(self._get_contact_button(contact))
try:
jid = JID.from_string(contact).new_as_bare()
except Exception as e:
log.debug('Bad MUC contact address %s: %s', contact, str(e))
else:
self._ui.contact_box.add(self._get_contact_button(jid))
self._ui.contact_box.set_visible(has_contacts)
self._ui.contact_label.set_visible(has_contacts)
......@@ -250,7 +259,7 @@ class GroupChatInfoScrolled(Gtk.ScrolledWindow):
def _on_copy_address(self, _button: Gtk.Button) -> None:
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.set_text(f'xmpp:{self._info.jid}?join', -1)
clipboard.set_text(self._info.jid.to_iri(XmppUriQuery.JOIN.value), -1)
@staticmethod
def _on_activate_log_link(button: Gtk.LinkButton) -> int:
......@@ -258,7 +267,7 @@ class GroupChatInfoScrolled(Gtk.ScrolledWindow):
return Gdk.EVENT_STOP
def _on_activate_contact_link(self, button: Gtk.LinkButton) -> int:
open_uri(f'xmpp:{button.get_uri()}?message', account=self._account)
open_uri(button.get_uri(), account=self._account)
return Gdk.EVENT_STOP
@staticmethod
......@@ -283,8 +292,9 @@ class GroupChatInfoScrolled(Gtk.ScrolledWindow):
label.set_valign(Gtk.Align.START)
return label
def _get_contact_button(self, contact: str) -> Gtk.Button:
button = Gtk.LinkButton(label=contact)
def _get_contact_button(self, contact: JID) -> Gtk.Button:
button = Gtk.LinkButton(contact.to_iri(XmppUriQuery.MESSAGE.value),
label=str(contact))
button.set_halign(Gtk.Align.START)
button.get_style_context().add_class('link-button')
button.connect('activate-link', self._on_activate_contact_link)
......
......@@ -33,6 +33,7 @@ from omemo_dr.identitykeypair import IdentityKeyPair
from gajim.common import app
from gajim.common import ged
from gajim.common import types
from gajim.common.const import XmppUriQuery
from gajim.common.events import AccountConnected
from gajim.common.events import AccountDisconnected
from gajim.common.ged import EventHelper
......@@ -113,7 +114,7 @@ class OMEMOTrustManager(Gtk.Box, EventHelper):
'contact’s screen to ensure the safety of '
'your end-to-end encrypted chat.')
else:
header_text = _('Devices connected with %s') % self._contact.name
header_text = _('Devices connected with "%s"') % self._contact.name
popover_qr_text = _('Compare this code with the one shown on your '
'contact’s screen to ensure the safety of '
'your end-to-end encrypted chat '
......@@ -234,19 +235,20 @@ class OMEMOTrustManager(Gtk.Box, EventHelper):
self._ui.list.add(row)
@staticmethod
def _get_qrcode(jid: str,
def _get_qrcode(jid: JID,
sid: int,
identity_key: IdentityKeyPair
) -> GdkPixbuf.Pixbuf | None:
fingerprint = get_fingerprint(identity_key)
ver_string = 'xmpp:{}?omemo-sid-{}={}'.format(jid, sid, fingerprint)
qry = (XmppUriQuery.MESSAGE.value, [(f'omemo-sid-{sid}', fingerprint)])
ver_string = jid.new_as_bare().to_iri(qry)
log.debug('Verification String: %s', ver_string)
return generate_qr_code(ver_string)
def _load_qrcode(self) -> None:
client = app.get_client(self._account)
pixbuf = self._get_qrcode(client.get_own_jid().bare,
pixbuf = self._get_qrcode(client.get_own_jid(),
self._omemo.backend.own_device,
self._identity_key)
self._ui.qr_code_image.set_from_pixbuf(pixbuf)
......@@ -342,8 +344,6 @@ class KeyRow(Gtk.ListBoxRow):
app.check_finalize(self)
def delete_fingerprint(self, *args: Any) -> None:
listbox = cast(Gtk.ListBox, self.get_parent())
window = cast(Gtk.Window, listbox.get_window())
def _remove():
self._omemo.backend.remove_device(str(self.jid), self.device_id)
......@@ -352,6 +352,7 @@ class KeyRow(Gtk.ListBoxRow):
self._omemo.backend.storage.deleteIdentity(
str(self.jid), self._identity_key)
listbox = cast(Gtk.ListBox, self.get_parent())
listbox.remove(self)
self.destroy()
......@@ -363,7 +364,7 @@ class KeyRow(Gtk.ListBoxRow):
DialogButton.make('Remove',
text=_('Delete'),
callback=_remove)],
transient_for=window).show()
transient_for=cast(Gtk.Window, self.get_toplevel())).show()
def set_trust(self) -> None:
icon_name, tooltip, css_class = TRUST_DATA[self.trust]
......
......@@ -863,8 +863,7 @@ class ContactRow(Gtk.ListBoxRow):
def get_search_text(self) -> str:
if self.contact is None and not self.groupchat:
return str(self.jid)
if self.show_account:
return f'{self.name} {self.jid} {self.account_label}'
return f'{self.name} {self.jid}'
......
......@@ -49,6 +49,7 @@ function install_pre_deps {
wget \
intltool \
mingw-w64-x86_64-nsis \
"${MINGW_PACKAGE_PREFIX}"-librsvg \
"${MINGW_PACKAGE_PREFIX}"-toolchain \
"${MINGW_PACKAGE_PREFIX}"-python
}
......@@ -314,7 +315,46 @@ function cleanup_install {
}
function makeappx {
"$(find /c/Program\ Files\ \(x86\)/Windows\ Kits/10/bin/*/x64/ -name makeappx.exe -print -quit)" "$@"
}
function makepri {
"$(find /c/Program\ Files\ \(x86\)/Windows\ Kits/10/bin/*/x64/ -name makepri.exe -print -quit)" "$@"
}
function build_installer {
MSYSTEM='MINGW64' /usr/bin/bash -lc "cd ${BUILD_ROOT} && makensis -NOCD -DVERSION=\"$QL_VERSION_DESC\" -DARCH=\"${MSYSTEM_CARCH}\" -DPREFIX=\"${MSYSTEM_PREFIX:1}\" ${MISC}/gajim.nsi"
MSYSTEM='MINGW64' /usr/bin/bash -lc "cd ${BUILD_ROOT} && makensis -NOCD -DVERSION=\"$QL_VERSION_DESC\" -DARCH=\"${MSYSTEM_CARCH}\" -DPREFIX=\"${MSYSTEM_PREFIX:1}\" ${MISC}/gajim-portable.nsi"
(
cd ${BUILD_ROOT}
rm -rf assets bundle filemapping.txt assets.resfiles appxmanifest.xml resources.pri
echo "[Files]" > filemapping.txt
find ${MSYSTEM_PREFIX:1} -type f | while read line; do
echo "\"$line\" \"${line/${MSYSTEM_PREFIX:1}\///}\"" >> filemapping.txt
done
mkdir -p assets bundle
# https://learn.microsoft.com/en-us/windows/apps/design/style/iconography/app-icon-construction
for size in {44,50,150}; do
for scale in {100,125,150,200,400}; do
scaled_size=$(( (${size}*${scale}+100/2)/100 ))
rsvg-convert -w ${scaled_size} -h ${scaled_size} -o assets/gajim${size}x${size}.scale-${scale}.png ${DIR}/../gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg
echo "\"assets/gajim${size}x${size}.scale-${scale}.png\" \"assets/gajim${size}x${size}.scale-${scale}.png\"" >> filemapping.txt
done
done
for size in {16,24,32,48,256}; do
rsvg-convert -w ${size} -h ${size} -o assets/gajim44x44.targetsize-${size}.png ${DIR}/../gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg
cp assets/gajim44x44.targetsize-${size}.png assets/gajim44x44.targetsize-${size}_altform-unplated.png
cp assets/gajim44x44.targetsize-${size}.png assets/gajim44x44.targetsize-${size}_altform-lightunplated.png
echo "\"assets/gajim44x44.targetsize-${size}.png\" \"assets/gajim44x44.targetsize-${size}.png\"" >> filemapping.txt
echo "\"assets/gajim44x44.targetsize-${size}_altform-unplated.png\" \"assets/gajim44x44.targetsize-${size}_altform-unplated.png\"" >> filemapping.txt
echo "\"assets/gajim44x44.targetsize-${size}_altform-lightunplated.png\" \"assets/gajim44x44.targetsize-${size}_altform-lightunplated.png\"" >> filemapping.txt
done
makepri new -pr . -cf ${MISC}/priconfig.xml -mn ${MISC}/appxmanifest.xml -of resources.pri -o
echo "\"resources.pri\" \"resources.pri\"" >> filemapping.txt
sed "s/QL_VERSION_DESC/${QL_VERSION_DESC}.0/" ${MISC}/appxmanifest.xml > AppxManifest.xml
echo "\"AppxManifest.xml\" \"AppxManifest.xml\"" >> filemapping.txt
makeappx pack -f filemapping.txt -p bundle/Gajim_x64.msix -o
makeappx bundle -d bundle/ -p Gajim.msixbundle -o
)
}
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
<Identity
Name="2126Gajim.Gajim"
Version="QL_VERSION_DESC"
Publisher="CN=7BA5D718-F03F-4E0C-BC3A-3CBC8E87B36A"
ProcessorArchitecture="x64" />
<Properties>
<DisplayName>Gajim</DisplayName>
<PublisherDisplayName>Gajim</PublisherDisplayName>
<Description>A fully-featured XMPP client</Description>
<Logo>gajim50x50.png</Logo>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22621.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust"/>
</Capabilities>
<Applications>
<Application Id="Gajim" Executable="bin\Gajim.exe" EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements
BackgroundColor="transparent"
DisplayName="Gajim"
Square44x44Logo="gajim44x44.png"
Square150x150Logo="gajim150x150.png"
Description="Gajim">
</uap:VisualElements>
<Extensions>
<desktop:Extension Category="windows.startupTask" Executable="bin\Gajim.exe" EntryPoint="Windows.FullTrustApplication">
<desktop:StartupTask TaskId="Gajim" Enabled="true" DisplayName="Gajim"/>
</desktop:Extension>
</Extensions>
</Application>
</Applications>
</Package>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resources targetOsVersion="10.0.0" majorVersion="1">
<index root="\" startIndexAt="\assets">
<default>
<qualifier name="Language" value="en-US"/>
<qualifier name="Contrast" value="standard"/>
<qualifier name="Scale" value="100"/>
<qualifier name="HomeRegion" value="001"/>
<qualifier name="TargetSize" value="256"/>
<qualifier name="LayoutDirection" value="LTR"/>
<qualifier name="Theme" value="dark"/>
<qualifier name="AlternateForm" value=""/>
<qualifier name="DXFeatureLevel" value="DX9"/>
<qualifier name="Configuration" value=""/>
<qualifier name="DeviceFamily" value="Universal"/>
<qualifier name="Custom" value=""/>
</default>
<indexer-config type="folder" foldernameAsQualifier="true" filenameAsQualifier="true" qualifierDelimiter="."/>
</index>
<!--<index startIndexAt="Start Index Here" root="Root Here">-->
<!-- <indexer-config type="resfiles" qualifierDelimiter="."/>-->
<!-- <indexer-config type="priinfo" emitStrings="true" emitPaths="true" emitEmbeddedData="true"/>-->
<!--</index>-->
</resources>
\ No newline at end of file