parent
13497e5c7a
commit
c7735f173d
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
<busconfig>
|
||||
<!-- Only root can own the service -->
|
||||
<policy user="root">
|
||||
<allow own="org.manjaro.pamac"/>
|
||||
</policy>
|
||||
|
||||
<!-- Allow anyone to invoke methods on the interfaces -->
|
||||
<policy context="default">
|
||||
<allow send_destination="org.manjaro.pamac"
|
||||
send_interface="org.manjaro.pamac"/>
|
||||
</policy>
|
||||
</busconfig>
|
||||
|
@ -1,5 +0,0 @@
|
||||
[D-BUS Service]
|
||||
Name=org.manjaro.pamac
|
||||
Exec=/usr/bin/pamac-daemon
|
||||
User=root
|
||||
SystemdService=pamac.service
|
@ -1,7 +0,0 @@
|
||||
[Unit]
|
||||
Description=Pamac
|
||||
|
||||
[Service]
|
||||
Type=dbus
|
||||
BusName=org.manjaro.pamac
|
||||
ExecStart=/usr/bin/pamac-daemon
|
@ -1,7 +1,9 @@
|
||||
./pamac-daemon.py
|
||||
./pamac-manager.py
|
||||
./pamac-updater.py
|
||||
./pamac-tray.py
|
||||
./pamac-install.py
|
||||
./pamac/main.py
|
||||
./pamac/common.py
|
||||
./gui/manager.glade
|
||||
./gui/updater.glade
|
||||
./pamac/transaction.py
|
||||
./gui/manager.ui
|
||||
./gui/updater.ui
|
||||
./gui/dialogs.ui
|
||||
|
@ -1,118 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<object class="GtkMessageDialog" id="ErrorDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<property name="message_type">error</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="InfoDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="QuestionDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">question</property>
|
||||
<property name="buttons">yes-no</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox8">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area8">
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="WarningDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">warning</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
@ -0,0 +1,528 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.6 -->
|
||||
<object class="GtkDialog" id="ChooseDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">Choose</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="dialog-vbox1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="dialog-action_area1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ChooseButton">
|
||||
<property name="label">gtk-ok</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="on_ChooseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="choose_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">300</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">choose_list</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection5"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
|
||||
<child>
|
||||
<object class="GtkCellRendererToggle" id="choose_renderertoggle">
|
||||
<signal name="toggled" handler="on_choose_renderertoggle_toggled" swapped="no"/>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="active">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="choose_renderertext"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="0">ChooseButton</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ConfDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Summary</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box7">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_top_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">330</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">transaction_sum</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<property name="show_expanders">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_action">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext5">
|
||||
<property name="yalign">0</property>
|
||||
<property name="weight">600</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="text">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_packages">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext6"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_bottom_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">7</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransCancelButton">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="is_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransValidButton">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransValidButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="ErrorDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<property name="message_type">error</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="InfoDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ProgressWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Progress</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="default_width">450</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box8">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box9">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="action_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="progresslabel2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkProgressBar" id="progressbar2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pulse_step">0.050000000000000003</property>
|
||||
<property name="show_text">True</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkExpander" id="progress_expander">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resize_toplevel">True</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow11">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="window_placement">bottom-left</property>
|
||||
<property name="window_placement_set">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_height">200</property>
|
||||
<child>
|
||||
<object class="GtkTextView" id="progress_textview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="wrap_mode">word</property>
|
||||
<property name="cursor_visible">False</property>
|
||||
<signal name="size-allocate" handler="on_progress_textview_size_allocate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">details</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ProgressCancelButton">
|
||||
<property name="label">gtk-cancel</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="on_ProgressCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="ProgressCloseButton">
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_ProgressCloseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="QuestionDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">question</property>
|
||||
<property name="buttons">yes-no</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox8">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area8">
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="WarningDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">warning</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkListStore" id="choose_list">
|
||||
<columns>
|
||||
<!-- column-name gboolean1 -->
|
||||
<column type="gboolean"/>
|
||||
<!-- column-name gchararray1 -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkListStore" id="transaction_sum">
|
||||
<columns>
|
||||
<!-- column-name action -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name packages -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
</interface>
|
@ -1,488 +0,0 @@
|
||||
#! /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
import dbus
|
||||
import dbus.service
|
||||
from dbus.mainloop.glib import DBusGMainLoop
|
||||
from gi.repository import GObject
|
||||
|
||||
import pyalpm
|
||||
from multiprocessing import Process
|
||||
from pamac import config, common
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
class PamacDBusService(dbus.service.Object):
|
||||
def __init__(self):
|
||||
bus=dbus.SystemBus()
|
||||
bus_name = dbus.service.BusName('org.manjaro.pamac', bus)
|
||||
dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac')
|
||||
self.t = None
|
||||
self.task = None
|
||||
self.error = ''
|
||||
self.warning = ''
|
||||
self.previous_action = ''
|
||||
self.action = _('Preparing')+'...'
|
||||
self.previous_icon = ''
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
self.previous_target = ''
|
||||
self.target = ''
|
||||
self.previous_percent = 0
|
||||
self.percent = 0
|
||||
self.total_size = 0
|
||||
self.already_transferred = 0
|
||||
self.handle = config.handle()
|
||||
|
||||
def get_handle(self):
|
||||
print('daemon get handle')
|
||||
self.handle = config.handle()
|
||||
self.handle.dlcb = self.cb_dl
|
||||
self.handle.totaldlcb = self.totaldlcb
|
||||
self.handle.eventcb = self.cb_event
|
||||
self.handle.questioncb = self.cb_conv
|
||||
self.handle.progresscb = self.cb_progress
|
||||
self.handle.logcb = self.cb_log
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitAction(self, action):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitIcon(self, icon):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTarget(self, target):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitPercent(self, percent):
|
||||
pass
|
||||
|
||||
def cb_event(self, ID, event, tupel):
|
||||
if ID is 1:
|
||||
self.action = _('Checking dependencies')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 2:
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
elif ID is 3:
|
||||
self.action = _('Checking file conflicts')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 5:
|
||||
self.action = _('Resolving dependencies')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
elif ID is 6:
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
elif ID is 7:
|
||||
self.action = _('Checking inter conflicts')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 9:
|
||||
self.action = _('Installing')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
elif ID is 10:
|
||||
formatted_event = 'Installed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 11:
|
||||
self.action = _('Removing')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-delete.png'
|
||||
elif ID is 12:
|
||||
formatted_event = 'Removed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 13:
|
||||
self.action = _('Upgrading')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-update.png'
|
||||
elif ID is 14:
|
||||
formatted_event = 'Upgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 15:
|
||||
self.action = _('Downgrading')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
print('Downgrading a package')
|
||||
#elif ID is 16:
|
||||
#formatted_event = 'Downgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
#common.write_log_file(formatted_event)
|
||||
#print(formatted_event)
|
||||
elif ID is 17:
|
||||
self.action = _('Reinstalling')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
print('Reinstalling a package')
|
||||
#elif ID is 18:
|
||||
#formatted_event = 'Reinstalled {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
#common.write_log_file(formatted_event)
|
||||
#print(formatted_event)
|
||||
elif ID is 19:
|
||||
self.action = _('Checking integrity')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
self.already_transferred = 0
|
||||
elif ID is 21:
|
||||
self.action = _('Loading packages files')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
print('Loading packages files')
|
||||
elif ID is 30:
|
||||
self.action = _('Configuring')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
self.EmitPercent(2)
|
||||
print('Configuring a package')
|
||||
elif ID is 31:
|
||||
print('Downloading a file')
|
||||
elif ID is 36:
|
||||
self.action = _('Checking keys in keyring')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
print('Checking keys in keyring')
|
||||
else :
|
||||
self.action = ''
|
||||
#self.EmitTarget('')
|
||||
#self.EmitPercent(0)
|
||||
if self.action != self.previous_action:
|
||||
self.previous_action = self.action
|
||||
self.EmitAction(self.action)
|
||||
if self.icon != self.previous_icon:
|
||||
self.previous_icon = self.icon
|
||||
self.EmitIcon(self.icon)
|
||||
print(ID,event)
|
||||
|
||||
def cb_conv(self, *args):
|
||||
print("conversation", args)
|
||||
|
||||
def cb_log(self, level, line):
|
||||
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
|
||||
if not (level & _logmask):
|
||||
return
|
||||
if level & pyalpm.LOG_ERROR:
|
||||
#self.error += "ERROR: "+line
|
||||
#self.EmitLogError(line)
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_WARNING:
|
||||
self.warning += "WARNING: "+line
|
||||
#self.EmitLogWarning(line)
|
||||
elif level & pyalpm.LOG_DEBUG:
|
||||
line = "DEBUG: " + line
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_FUNCTION:
|
||||
line = "FUNC: " + line
|
||||
print(line)
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitLogError(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitLogWarning(self, message):
|
||||
pass
|
||||
|
||||
def totaldlcb(self, _total_size):
|
||||
self.total_size = _total_size
|
||||
|
||||
def cb_dl(self, _target, _transferred, total):
|
||||
if self.total_size > 0:
|
||||
fraction = (_transferred+self.already_transferred)/self.total_size
|
||||
size = 0
|
||||
try:
|
||||
if (self.t.to_remove or self.t.to_add):
|
||||
for pkg in self.t.to_remove+self.t.to_add:
|
||||
if pkg.filename == _target:
|
||||
size = pkg.size
|
||||
if _transferred == size:
|
||||
self.already_transferred += size
|
||||
self.action = _('Downloading {size}').format(size = common.format_size(self.total_size))
|
||||
self.target = _target
|
||||
self.percent = round(fraction, 2)
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
|
||||
else:
|
||||
self.action = _('Refreshing')+'...'
|
||||
self.target = _target
|
||||
self.percent = 2
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
|
||||
if self.action != self.previous_action:
|
||||
self.previous_action = self.action
|
||||
self.EmitAction(self.action)
|
||||
if self.icon != self.previous_icon:
|
||||
self.previous_icon = self.icon
|
||||
self.EmitIcon(self.icon)
|
||||
if self.target != self.previous_target:
|
||||
self.previous_target = self.target
|
||||
self.EmitTarget(self.target)
|
||||
if self.percent != self.previous_percent:
|
||||
self.previous_percent = self.percent
|
||||
self.EmitPercent(self.percent)
|
||||
except pyalpm.error:
|
||||
pass
|
||||
|
||||
def cb_progress(self, _target, _percent, n, i):
|
||||
self.target = _target+' ('+str(i)+'/'+str(n)+')'
|
||||
#self.percent = round(_percent/100, 2)
|
||||
self.percent = round(i/n, 2)
|
||||
if self.target != self.previous_target:
|
||||
self.previous_target = self.target
|
||||
self.EmitTarget(self.target)
|
||||
if self.percent != self.previous_percent:
|
||||
self.previous_percent = self.percent
|
||||
self.EmitPercent(self.percent)
|
||||
|
||||
def policykit_test(self, sender, connexion, action):
|
||||
bus = dbus.SystemBus()
|
||||
proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
|
||||
dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
|
||||
sender_pid = dbus_info.GetConnectionUnixProcessID(sender)
|
||||
proxy_policykit = bus.get_object('org.freedesktop.PolicyKit1','/org/freedesktop/PolicyKit1/Authority',False)
|
||||
policykit_authority = dbus.Interface(proxy_policykit,'org.freedesktop.PolicyKit1.Authority')
|
||||
|
||||
Subject = ('unix-process', {'pid': dbus.UInt32(sender_pid, variant_level=1),
|
||||
'start-time': dbus.UInt64(0, variant_level=1)})
|
||||
(is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '')
|
||||
return is_authorized
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitAvailableUpdates(self, updates_nb):
|
||||
pass
|
||||
|
||||
def CheckUpdates(self):
|
||||
updates = 0
|
||||
_ignorepkgs = []
|
||||
for group in self.handle.ignoregrps:
|
||||
db = self.handle.get_localdb()
|
||||
grp = db.read_grp(group)
|
||||
if grp:
|
||||
name, pkg_list = grp
|
||||
for pkg in pkg_list:
|
||||
if not pkg.name in _ignorepkgs:
|
||||
_ignorepkgs.append(pkg.name)
|
||||
for name in self.handle.ignorepkgs:
|
||||
pkg = self.handle.get_localdb().get_pkg(name)
|
||||
if pkg:
|
||||
if not pkg.name in _ignorepkgs:
|
||||
_ignorepkgs.append(pkg.name)
|
||||
if config.syncfirst:
|
||||
for name in config.syncfirst:
|
||||
pkg = self.handle.get_localdb().get_pkg(name)
|
||||
if pkg:
|
||||
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
|
||||
if candidate:
|
||||
updates += 1
|
||||
if not updates:
|
||||
for pkg in self.handle.get_localdb().pkgcache:
|
||||
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
|
||||
if candidate:
|
||||
if not candidate.name in _ignorepkgs:
|
||||
updates += 1
|
||||
self.EmitAvailableUpdates(updates)
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
|
||||
def Refresh(self, success, nosuccess):
|
||||
def refresh():
|
||||
self.target = ''
|
||||
self.percent = 0
|
||||
self.error = ''
|
||||
self.get_handle()
|
||||
for db in self.handle.get_syncdbs():
|
||||
try:
|
||||
self.t = self.handle.init_transaction()
|
||||
db.update(force = False)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
break
|
||||
finally:
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
else:
|
||||
self.CheckUpdates()
|
||||
self.EmitTransactionDone('')
|
||||
self.task = Process(target=refresh)
|
||||
self.task.start()
|
||||
success('')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's')#, sender_keyword='sender', connection_keyword='connexion')
|
||||
def Init(self, options):#, sender=None, connexion=None):
|
||||
self.error = ''
|
||||
#if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
|
||||
try:
|
||||
self.get_handle()
|
||||
self.t = self.handle.init_transaction(**options)
|
||||
print('Init:',self.t.flags)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
return self.error
|
||||
#else:
|
||||
# return _('Authentication failed')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')
|
||||
def Sysupgrade(self):
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.sysupgrade(downgrade=False)
|
||||
print('to_upgrade:',self.t.to_add)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Remove(self, pkgname):
|
||||
self.error = ''
|
||||
try:
|
||||
pkg = self.handle.get_localdb().get_pkg(pkgname)
|
||||
if pkg is not None:
|
||||
self.t.remove_pkg(pkg)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Add(self, pkgname):
|
||||
self.error = ''
|
||||
try:
|
||||
for repo in self.handle.get_syncdbs():
|
||||
pkg = repo.get_pkg(pkgname)
|
||||
if pkg:
|
||||
self.t.add_pkg(pkg)
|
||||
break
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Load(self, tarball_path):
|
||||
self.error = ''
|
||||
try:
|
||||
pkg = self.handle.load_pkg(tarball_path)
|
||||
if pkg:
|
||||
self.t.add_pkg(pkg)
|
||||
except pyalpm.error:
|
||||
self.error += _('{pkgname} is not a valid path or package name').format(pkgname = tarball_path)
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')
|
||||
def Prepare(self):
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.prepare()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 'a(ss)')
|
||||
def To_Remove(self):
|
||||
liste = []
|
||||
for pkg in self.t.to_remove:
|
||||
liste.append((pkg.name, pkg.version))
|
||||
return liste
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 'a(ssi)')
|
||||
def To_Add(self):
|
||||
liste = []
|
||||
for pkg in self.t.to_add:
|
||||
liste.append((pkg.name, pkg.version, pkg.download_size))
|
||||
return liste
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
|
||||
def Interrupt(self, success, nosuccess):
|
||||
def interrupt():
|
||||
self.error = ''
|
||||
#try:
|
||||
# self.t.interrupt()
|
||||
#except pyalpm.error as e:
|
||||
# self.error += ' --> '+str(e)+'\n'
|
||||
try:
|
||||
self.t.release()
|
||||
#except pyalpm.error as e:
|
||||
#self.error += ' --> '+str(e)+'\n'
|
||||
except:
|
||||
pass
|
||||
#finally:
|
||||
#if self.error:
|
||||
#self.EmitTransactionError(self.error)
|
||||
self.task.terminate()
|
||||
interrupt()
|
||||
success('')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion', async_callbacks=('success', 'nosuccess'))
|
||||
def Commit(self, success, nosuccess, sender=None, connexion=None):
|
||||
def commit():
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.commit()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
#except dbus.exceptions.DBusException:
|
||||
#pass
|
||||
finally:
|
||||
self.CheckUpdates()
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
else:
|
||||
self.EmitTransactionDone(_('Transaction successfully finished'))
|
||||
try:
|
||||
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.commit')
|
||||
except dbus.exceptions.DBusException as e:
|
||||
self.EmitTransactionError(_('Authentication failed'))
|
||||
success('')
|
||||
else:
|
||||
if authorized:
|
||||
self.task = Process(target=commit)
|
||||
self.task.start()
|
||||
else :
|
||||
self.t.release()
|
||||
self.EmitTransactionError(_('Authentication failed'))
|
||||
success('')
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTransactionDone(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTransactionError(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')#, sender_keyword='sender', connection_keyword='connexion')
|
||||
def Release(self):#, sender=None, connexion=None):
|
||||
self.error = ''
|
||||
#if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
|
||||
try:
|
||||
self.t.release()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
#else :
|
||||
# return _('Authentication failed')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac')
|
||||
def StopDaemon(self):
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
common.rm_pid_file()
|
||||
mainloop.quit()
|
||||
|
||||
GObject.threads_init()
|
||||
DBusGMainLoop(set_as_default = True)
|
||||
myservice = PamacDBusService()
|
||||
common.write_pid_file()
|
||||
mainloop = GObject.MainLoop()
|
||||
mainloop.run()
|
@ -1,6 +1,718 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from pamac import main
|
||||
version = '0.8.0'
|
||||
|
||||
main.main('manager')
|
||||
from gi.repository import Gtk, Gdk
|
||||
from gi.repository.GdkPixbuf import Pixbuf
|
||||
import pyalpm
|
||||
from time import strftime, localtime
|
||||
|
||||
from pamac import config, common, transaction
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
import locale
|
||||
locale.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
interface = transaction.interface
|
||||
|
||||
interface.add_from_file('/usr/share/pamac/gui/manager.ui')
|
||||
ManagerWindow = interface.get_object("ManagerWindow")
|
||||
details_list = interface.get_object('details_list')
|
||||
deps_list = interface.get_object('deps_list')
|
||||
files_list = interface.get_object('files_list')
|
||||
files_scrolledwindow = interface.get_object('files_scrolledwindow')
|
||||
name_label = interface.get_object('name_label')
|
||||
desc_label = interface.get_object('desc_label')
|
||||
link_label = interface.get_object('link_label')
|
||||
licenses_label = interface.get_object('licenses_label')
|
||||
search_entry = interface.get_object('search_entry')
|
||||
search_list = interface.get_object('search_list')
|
||||
search_selection = interface.get_object('search_treeview_selection')
|
||||
packages_list_treeview = interface.get_object('packages_list_treeview')
|
||||
state_column = interface.get_object('state_column')
|
||||
name_column = interface.get_object('name_column')
|
||||
version_column = interface.get_object('version_column')
|
||||
size_column = interface.get_object('size_column')
|
||||
state_rendererpixbuf = interface.get_object('state_rendererpixbuf')
|
||||
name_renderertext = interface.get_object('name_renderertext')
|
||||
version_renderertext = interface.get_object('version_renderertext')
|
||||
size_renderertext = interface.get_object('size_renderertext')
|
||||
list_selection = interface.get_object('list_treeview_selection')
|
||||
groups_list = interface.get_object('groups_list')
|
||||
groups_selection = interface.get_object('groups_treeview_selection')
|
||||
states_list = interface.get_object('states_list')
|
||||
states_selection = interface.get_object('states_treeview_selection')
|
||||
repos_list = interface.get_object('repos_list')
|
||||
repos_selection = interface.get_object('repos_treeview_selection')
|
||||
AboutDialog = interface.get_object('AboutDialog')
|
||||
menu_button = interface.get_object('menu_button')
|
||||
main_menu = interface.get_object('main_menu')
|
||||
PackagesChooserDialog = interface.get_object('PackagesChooserDialog')
|
||||
|
||||
AboutDialog.set_version(version)
|
||||
menu_button.set_popup(main_menu)
|
||||
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
current_filter = (None, None)
|
||||
right_click_menu = Gtk.Menu()
|
||||
|
||||
installed_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-installed-updated.png')
|
||||
uninstalled_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-available.png')
|
||||
to_install_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-install.png')
|
||||
to_reinstall_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-reinstall.png')
|
||||
to_remove_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-remove.png')
|
||||
locked_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-installed-locked.png')
|
||||
|
||||
def state_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
pixbuf = None
|
||||
elif treemodel[treeiter][0].name in config.holdpkg:
|
||||
pixbuf = locked_icon
|
||||
elif treemodel[treeiter][0].db.name == 'local':
|
||||
if transaction.pkg_in_list(treemodel[treeiter][0], trans.to_add):
|
||||
pixbuf = to_reinstall_icon
|
||||
elif transaction.pkg_in_list(treemodel[treeiter][0], trans.to_remove):
|
||||
pixbuf = to_remove_icon
|
||||
else:
|
||||
pixbuf = installed_icon
|
||||
elif transaction.pkg_in_list(treemodel[treeiter][0], trans.to_add):
|
||||
pixbuf = to_install_icon
|
||||
else:
|
||||
pixbuf = uninstalled_icon
|
||||
cell.set_property("pixbuf", pixbuf)
|
||||
|
||||
def state_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
if treemodel[treeiter1][0].db.name == 'local':
|
||||
num1 = 1
|
||||
else:
|
||||
num1 = 0
|
||||
if treemodel[treeiter2][0].db.name == 'local':
|
||||
num2 = 1
|
||||
else:
|
||||
num2 = 0
|
||||
return num2 - num1
|
||||
|
||||
def name_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", _('No package found'))
|
||||
else:
|
||||
cell.set_property("text", treemodel[treeiter][0].name)
|
||||
|
||||
def name_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
str1 = treemodel[treeiter1][0].name
|
||||
str2 = treemodel[treeiter2][0].name
|
||||
if str1 < str2:
|
||||
return -1
|
||||
elif str1 > str2:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def version_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", '')
|
||||
else:
|
||||
cell.set_property("text", treemodel[treeiter][0].version)
|
||||
|
||||
def version_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
return pyalpm.vercmp(treemodel[treeiter1][0].version, treemodel[treeiter2][0].version)
|
||||
|
||||
def size_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", '')
|
||||
else:
|
||||
cell.set_property("text", common.format_size(treemodel[treeiter][0].isize))
|
||||
|
||||
def size_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
num1 = treemodel[treeiter1][0].isize
|
||||
num2 = treemodel[treeiter2][0].isize
|
||||
return num1 - num2
|
||||
|
||||
state_column.set_cell_data_func(state_rendererpixbuf, state_column_display_func)
|
||||
name_column.set_cell_data_func(name_renderertext, name_column_display_func)
|
||||
version_column.set_cell_data_func(version_renderertext, version_column_display_func)
|
||||
size_column.set_cell_data_func(size_renderertext, size_column_display_func)
|
||||
|
||||
def update_lists():
|
||||
for db in trans.handle.get_syncdbs():
|
||||
for name, pkgs in db.grpcache:
|
||||
groups_list.append([name])
|
||||
groups_list.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
states = [_('Installed'), _('Uninstalled'), _('Orphans'), _('To install'), _('To remove')]
|
||||
for state in states:
|
||||
states_list.append([state])
|
||||
for db in trans.syncdbs:
|
||||
repos_list.append([db.name])
|
||||
repos_list.append([_('local')])
|
||||
|
||||
def get_group_list(group):
|
||||
global groups_dict
|
||||
if group in groups_dict.keys():
|
||||
return groups_dict[group]
|
||||
else:
|
||||
groups_dict[group] = Gtk.ListStore(object)
|
||||
dbs_list = [trans.localdb]
|
||||
dbs_list.extend(trans.syncdbs.copy())
|
||||
pkgs = pyalpm.find_grp_pkgs(dbs_list, group)
|
||||
for pkg in pkgs:
|
||||
groups_dict[group].append([pkg])
|
||||
return groups_dict[group]
|
||||
|
||||
def get_state_list(state):
|
||||
global states_dict
|
||||
if state == _('To install'):
|
||||
liststore = Gtk.ListStore(object)
|
||||
for pkg in trans.to_add:
|
||||
liststore.append([pkg])
|
||||
return liststore
|
||||
elif state == _('To remove'):
|
||||
liststore = Gtk.ListStore(object)
|
||||
for pkg in trans.to_remove:
|
||||
liststore.append([pkg])
|
||||
return liststore
|
||||
elif state in states_dict.keys():
|
||||
return states_dict[state]
|
||||
else:
|
||||
states_dict[state] = Gtk.ListStore(object)
|
||||
if state == _('Installed'):
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
states_dict[state].append([pkg])
|
||||
elif state == _('Uninstalled'):
|
||||
for pkg in get_uninstalled_pkgs():
|
||||
states_dict[state].append([pkg])
|
||||
elif state == _('Orphans'):
|
||||
for pkg in get_orphan_pkgs():
|
||||
states_dict[state].append([pkg])
|
||||
return states_dict[state]
|
||||
|
||||
|
||||
def get_repo_list(repo):
|
||||
global repos_dict
|
||||
if repo in repos_dict.keys():
|
||||
return repos_dict[repo]
|
||||
else:
|
||||
repos_dict[repo] = Gtk.ListStore(object)
|
||||
if repo == _('local'):
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
if not trans.get_syncpkg(pkg.name):
|
||||
repos_dict[repo].append([pkg])
|
||||
else:
|
||||
for db in trans.syncdbs:
|
||||
if db.name ==repo:
|
||||
for pkg in db.pkgcache:
|
||||
local_pkg = trans.get_localpkg(pkg.name)
|
||||
if local_pkg:
|
||||
repos_dict[repo].append([local_pkg])
|
||||
else:
|
||||
repos_dict[repo].append([pkg])
|
||||
return repos_dict[repo]
|
||||
|
||||
def search_pkgs(search_string):
|
||||
global search_dict
|
||||
if search_string in search_dict.keys():
|
||||
return search_dict[search_string]
|
||||
else:
|
||||
search_dict[search_string] = Gtk.ListStore(object)
|
||||
names_list = []
|
||||
for pkg in trans.localdb.search(*search_string.split()):
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
search_dict[search_string].append([pkg])
|
||||
for db in trans.syncdbs:
|
||||
for pkg in db.search(*search_string.split()):
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
search_dict[search_string].append([pkg])
|
||||
if not names_list:
|
||||
search_dict[search_string].append([_('No package found')])
|
||||
else:
|
||||
if not search_string in [row[0] for row in search_list]:
|
||||
search_list.append([search_string])
|
||||
return search_dict[search_string]
|
||||
|
||||
def get_uninstalled_pkgs():
|
||||
pkgs_list = []
|
||||
names_list = []
|
||||
for repo in trans.syncdbs:
|
||||
for pkg in repo.pkgcache:
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
if not trans.get_localpkg(pkg.name):
|
||||
pkgs_list.append(pkg)
|
||||
return pkgs_list
|
||||
|
||||
def get_orphan_pkgs():
|
||||
pkgs_list = []
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
if pkg.reason == pyalpm.PKG_REASON_DEPEND:
|
||||
if not pkg.compute_requiredby():
|
||||
pkgs_list.append(pkg)
|
||||
return pkgs_list
|
||||
|
||||
def refresh_packages_list(liststore):
|
||||
#~ packages_list_treeview.freeze_child_notify()
|
||||
#~ packages_list_treeview.set_model(None)
|
||||
liststore.set_sort_func(0, name_column_sort_func, None)
|
||||
liststore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
packages_list_treeview.set_model(liststore)
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(True)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
#~ packages_list_treeview.thaw_child_notify()
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
|
||||
def set_infos_list(pkg):
|
||||
name_label.set_markup('<big><b>{} {}</b></big>'.format(pkg.name, pkg.version))
|
||||
# fix &,-,>,< in desc
|
||||
desc = pkg.desc.replace('&', '&')
|
||||
desc = desc.replace('<->', '/')
|
||||
desc_label.set_markup(desc)
|
||||
# fix & in url
|
||||
url = pkg.url.replace('&', '&')
|
||||
link_label.set_markup('<a href=\"{_url}\">{_url}</a>'.format(_url = url))
|
||||
licenses_label.set_markup(_('Licenses')+': {}'.format(' '.join(pkg.licenses)))
|
||||
|
||||
def set_deps_list(pkg, style):
|
||||
deps_list.clear()
|
||||
if pkg.depends:
|
||||
deps_list.append([_('Depends On')+':', '\n'.join(pkg.depends)])
|
||||
if pkg.optdepends:
|
||||
optdeps = []
|
||||
for optdep in pkg.optdepends:
|
||||
if trans.get_localpkg(optdep.split(':')[0]):
|
||||
optdeps.append(optdep+' ['+_('Installed')+']')
|
||||
else:
|
||||
optdeps.append(optdep)
|
||||
deps_list.append([_('Optional Deps')+':', '\n'.join(optdeps)])
|
||||
if style == 'local':
|
||||
if pkg.compute_requiredby():
|
||||
deps_list.append([_('Required By')+':', '\n'.join(pkg.compute_requiredby())])
|
||||
if pkg.provides:
|
||||
deps_list.append([_('Provides')+':', '\n'.join(pkg.provides)])
|
||||
if pkg.replaces:
|
||||
deps_list.append([_('Replaces')+':', '\n'.join(pkg.replaces)])
|
||||
if pkg.conflicts:
|
||||
deps_list.append([_('Conflicts With')+':', '\n'.join(pkg.conflicts)])
|
||||
|
||||
def set_details_list(pkg, style):
|
||||
details_list.clear()
|
||||
if style == 'sync':
|
||||
details_list.append([_('Repository')+':', pkg.db.name])
|
||||
if pkg.groups:
|
||||
details_list.append([_('Groups')+':', ' '.join(pkg.groups)])
|
||||
if style == 'sync':
|
||||
details_list.append([_('Compressed Size')+':', common.format_size(pkg.size)])
|
||||
details_list.append([_('Download Size')+':', common.format_size(pkg.download_size)])
|
||||
if style == 'local':
|
||||
details_list.append([_('Installed Size')+':', common.format_size(pkg.isize)])
|
||||
details_list.append([_('Packager')+':', pkg.packager])
|
||||
details_list.append([_('Architecture')+':', pkg.arch])
|
||||
#details_list.append([_('Build Date')+':', strftime("%a %d %b %Y %X %Z", localtime(pkg.builddate))])
|
||||
if style == 'local':
|
||||
details_list.append([_('Install Date')+':', strftime("%a %d %b %Y %X %Z", localtime(pkg.installdate))])
|
||||
if pkg.reason == pyalpm.PKG_REASON_EXPLICIT:
|
||||
reason = _('Explicitly installed')
|
||||
elif pkg.reason == pyalpm.PKG_REASON_DEPEND:
|
||||
reason = _('Installed as a dependency for another package')
|
||||
else:
|
||||
reason = _('Unknown')
|
||||
details_list.append([_('Install Reason')+':', reason])
|
||||
if style == 'sync':
|
||||
#details_list.append([_('Install Script')':', 'Yes' if pkg.has_scriptlet else 'No'])
|
||||
#details_list.append(['MD5 Sum:', pkg.md5sum])
|
||||
#details_list.append(['SHA256 Sum:', pkg.sha256sum])
|
||||
details_list.append([_('Signatures')+':', 'Yes' if pkg.base64_sig else 'No'])
|
||||
if style == 'local':
|
||||
if len(pkg.backup) != 0:
|
||||
#details_list.append(['_(Backup files)+':', '\n'.join(["%s %s" % (md5, file) for (file, md5) in pkg.backup])])
|
||||
details_list.append([_('Backup files')+':', '\n'.join(["%s" % (file) for (file, md5) in pkg.backup])])
|
||||
|
||||
def set_files_list(pkg):
|
||||
files_list.clear()
|
||||
if len(pkg.files) != 0:
|
||||
for file in pkg.files:
|
||||
files_list.append(['/'+file[0]])
|
||||
|
||||
def on_ManagerWindow_delete_event(*args):
|
||||
Gtk.main_quit()
|
||||
common.rm_pid_file()
|
||||
|
||||
def on_TransValidButton_clicked(*args):
|
||||
global search_dict
|
||||
global groups_dict
|
||||
global states_dict
|
||||
global repos_dict
|
||||
transaction.ConfDialog.hide()
|
||||
trans.finalize()
|
||||
trans.update_dbs()
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_TransCancelButton_clicked(*args):
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
transaction.ConfDialog.hide()
|
||||
trans.release()
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_ProgressCloseButton_clicked(*args):
|
||||
transaction.ProgressWindow.hide()
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
trans.do_sysupgrade(True)
|
||||
|
||||
def on_ProgressCancelButton_clicked(*args):
|
||||
trans.interrupt()
|
||||
|
||||
def on_search_entry_icon_press(*args):
|
||||
on_search_entry_activate(None)
|
||||
|
||||
def on_search_entry_activate(widget):
|
||||
global current_filter
|
||||
current_filter = (search_pkgs, search_entry.get_text())
|
||||
refresh_packages_list(search_pkgs(search_entry.get_text()))
|
||||
|
||||
def mark_to_install(widget, pkg):
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def mark_to_reinstall(widget, pkg):
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def mark_to_remove(widget, pkg):
|
||||
trans.to_remove.append(pkg)
|
||||
|
||||
def mark_to_unselect(widget, pkg):
|
||||
if pkg.db.name == 'local':
|
||||
if trans.pkg_in_list(pkg, trans.to_add):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_add)
|
||||
elif transaction.pkg_in_list(pkg, trans.to_remove):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_remove)
|
||||
else:
|
||||
if transaction.pkg_in_list(pkg, trans.to_add):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_add)
|
||||
|
||||
def select_optdeps(widget, pkg, optdeps):
|
||||
transaction.choose_only_one = False
|
||||
transaction.choose_label.set_markup(_('<b>{pkgname} has {number} uninstalled optional deps.\nPlease choose the one(s) you want to install:</b>').format(pkgname = pkg.name, number = str(len(optdeps))))
|
||||
transaction.choose_list.clear()
|
||||
transaction.choose_renderertoggle.set_radio(False)
|
||||
for long_string in optdeps:
|
||||
transaction.choose_list.append([False, long_string])
|
||||
transaction.ChooseDialog.run()
|
||||
for long_string in trans.to_provide:
|
||||
trans.to_add.append(trans.get_syncpkg(long_string.split(':')[0]))
|
||||
|
||||
def install_with_optdeps(widget, pkg, optdeps):
|
||||
select_optdeps(widget, pkg, optdeps)
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def on_list_treeview_button_press_event(treeview, event):
|
||||
global right_click_menu
|
||||
liststore = packages_list_treeview.get_model()
|
||||
# Check if right mouse button was clicked
|
||||
if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
treepath, viewcolumn, x, y = treeview.get_path_at_pos(int(event.x), int(event.y))
|
||||
treeiter = liststore.get_iter(treepath)
|
||||
if treeiter:
|
||||
if liststore[treeiter][0] != _('No package found') and not liststore[treeiter][0].name in config.holdpkg:
|
||||
right_click_menu = Gtk.Menu()
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_remove) or transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
item = Gtk.ImageMenuItem(_('Unselect'))
|
||||
item.set_image(Gtk.Image.new_from_stock('gtk-undo', Gtk.IconSize.MENU))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_unselect, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
elif liststore[treeiter][0].db.name == 'local':
|
||||
item = Gtk.ImageMenuItem(_('Remove'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_remove_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_remove, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
item = Gtk.ImageMenuItem(_('Reinstall'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_reinstall_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_reinstall, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
optdeps_strings = liststore[treeiter][0].optdepends
|
||||
if optdeps_strings:
|
||||
available_optdeps = []
|
||||
for optdep_string in optdeps_strings:
|
||||
optdep = optdep_string.split(':')[0]
|
||||
if not trans.get_localpkg(optdep):
|
||||
available_optdeps.append(optdep_string)
|
||||
if available_optdeps:
|
||||
item = Gtk.ImageMenuItem(_('Install optional deps'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', select_optdeps, liststore[treeiter][0], available_optdeps)
|
||||
right_click_menu.append(item)
|
||||
else:
|
||||
item = Gtk.ImageMenuItem(_('Install'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_install, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
optdeps_strings = liststore[treeiter][0].optdepends
|
||||
if optdeps_strings:
|
||||
available_optdeps = []
|
||||
for optdep_string in optdeps_strings:
|
||||
optdep = optdep_string.split(':')[0]
|
||||
if not trans.get_localpkg(optdep):
|
||||
available_optdeps.append(optdep_string)
|
||||
if available_optdeps:
|
||||
item = Gtk.ImageMenuItem(_('Install with optional deps'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', install_with_optdeps, liststore[treeiter][0], available_optdeps)
|
||||
right_click_menu.append(item)
|
||||
treeview.grab_focus()
|
||||
treeview.set_cursor(treepath, viewcolumn, 0)
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
right_click_menu.show_all()
|
||||
right_click_menu.popup(None, None, None, None, event.button, event.time)
|
||||
return True
|
||||
|
||||
def on_list_treeview_selection_changed(treeview):
|
||||
liststore, treeiter = list_selection.get_selected()
|
||||
if treeiter:
|
||||
if liststore[treeiter][0] != _('No package found'):
|
||||
set_infos_list(liststore[treeiter][0])
|
||||
if liststore[treeiter][0].db.name == 'local':
|
||||
set_deps_list(liststore[treeiter][0], "local")
|
||||
set_details_list(liststore[treeiter][0], "local")
|
||||
set_files_list(liststore[treeiter][0])
|
||||
files_scrolledwindow.set_visible(True)
|
||||
else:
|
||||
set_deps_list(liststore[treeiter][0], "sync")
|
||||
set_details_list(liststore[treeiter][0], "sync")
|
||||
files_scrolledwindow.set_visible(False)
|
||||
|
||||
def on_search_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = search_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (search_pkgs, search_list[line][0])
|
||||
refresh_packages_list(search_pkgs(search_list[line][0]))
|
||||
|
||||
def on_groups_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = groups_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_group_list, groups_list[line][0])
|
||||
refresh_packages_list(get_group_list(groups_list[line][0]))
|
||||
|
||||
def on_states_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = states_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_state_list, states_list[line][0])
|
||||
refresh_packages_list(get_state_list(states_list[line][0]))
|
||||
|
||||
def on_repos_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = repos_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_repo_list, repos_list[line][0])
|
||||
refresh_packages_list(get_repo_list(repos_list[line][0]))
|
||||
|
||||
def on_list_treeview_row_activated(treeview, treeiter, column):
|
||||
liststore = treeview.get_model()
|
||||
if not liststore[treeiter][0] == _('No package found'):
|
||||
if not liststore[treeiter][0].name in config.holdpkg:
|
||||
if liststore[treeiter][0].db.name == 'local':
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_add)
|
||||
elif transaction.pkg_in_list(liststore[treeiter][0], trans.to_remove):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_remove)
|
||||
else:
|
||||
trans.to_remove.append(liststore[treeiter][0])
|
||||
else:
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_add)
|
||||
else:
|
||||
trans.to_add.append(liststore[treeiter][0])
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
def on_notebook1_switch_page(notebook, page, page_num):
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
if page_num == 0:
|
||||
liste, line = search_selection.get_selected()
|
||||
if line:
|
||||
on_search_treeview_selection_changed(None)
|
||||
elif search_entry.get_text():
|
||||
on_search_entry_activate(None)
|
||||
elif page_num == 1:
|
||||
on_groups_treeview_selection_changed(None)
|
||||
elif page_num == 2:
|
||||
on_states_treeview_selection_changed(None)
|
||||
elif page_num == 3:
|
||||
on_repos_treeview_selection_changed(None)
|
||||
|
||||
def on_manager_valid_button_clicked(*args):
|
||||
trans.run()
|
||||
|
||||
def on_manager_cancel_button_clicked(*args):
|
||||
trans.to_add.clear()
|
||||
trans.to_remove.clear()
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_refresh_item_activate(*args):
|
||||
global search_dict
|
||||
global groups_dict
|
||||
global states_dict
|
||||
global repos_dict
|
||||
trans.refresh(False)
|
||||
transaction.ProgressWindow.hide()
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
trans.do_sysupgrade(True)
|
||||
|
||||
def on_local_item_activate(*args):
|
||||
response = PackagesChooserDialog.run()
|
||||
if response:
|
||||
PackagesChooserDialog.hide()
|
||||
|
||||
def on_about_item_activate(*args):
|
||||
response = AboutDialog.run()
|
||||
if response:
|
||||
AboutDialog.hide()
|
||||
|
||||
def on_package_open_button_clicked(*args):
|
||||
packages_paths = PackagesChooserDialog.get_filenames()
|
||||
print(packages_paths)
|
||||
if packages_paths:
|
||||
PackagesChooserDialog.hide()
|
||||
for path in packages_paths:
|
||||
trans.to_load.append(path)
|
||||
trans.run()
|
||||
|
||||
def on_PackagesChooserDialog_file_activated(*args):
|
||||
on_package_open_button_clicked(*args)
|
||||
|
||||
def on_package_cancel_button_clicked(*args):
|
||||
PackagesChooserDialog.hide()
|
||||
|
||||
def on_state_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(True)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, state_column_sort_func, None)
|
||||
|
||||
def on_name_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(True)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, name_column_sort_func, None)
|
||||
|
||||
def on_version_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(True)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, version_column_sort_func, None)
|
||||
|
||||
def on_size_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(True)
|
||||
liststore.set_sort_func(0, size_column_sort_func, None)
|
||||
|
||||
signals = {'on_ManagerWindow_delete_event' : on_ManagerWindow_delete_event,
|
||||
'on_TransValidButton_clicked' : on_TransValidButton_clicked,
|
||||
'on_TransCancelButton_clicked' : on_TransCancelButton_clicked,
|
||||
'on_ChooseButton_clicked' : transaction.on_ChooseButton_clicked,
|
||||
'on_progress_textview_size_allocate' : transaction.on_progress_textview_size_allocate,
|
||||
'on_choose_renderertoggle_toggled' : transaction.on_choose_renderertoggle_toggled,
|
||||
'on_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
|
||||
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
|
||||
'on_search_entry_icon_press' : on_search_entry_icon_press,
|
||||
'on_search_entry_activate' : on_search_entry_activate,
|
||||
'on_list_treeview_button_press_event' : on_list_treeview_button_press_event,
|
||||
'on_list_treeview_selection_changed' : on_list_treeview_selection_changed,
|
||||
'on_search_treeview_selection_changed' : on_search_treeview_selection_changed,
|
||||
'on_groups_treeview_selection_changed' : on_groups_treeview_selection_changed,
|
||||
'on_states_treeview_selection_changed' : on_states_treeview_selection_changed,
|
||||
'on_repos_treeview_selection_changed' : on_repos_treeview_selection_changed,
|
||||
'on_list_treeview_row_activated' : on_list_treeview_row_activated,
|
||||
'on_notebook1_switch_page' : on_notebook1_switch_page,
|
||||
'on_manager_valid_button_clicked' : on_manager_valid_button_clicked,
|
||||
'on_manager_cancel_button_clicked' : on_manager_cancel_button_clicked,
|
||||
'on_refresh_item_activate' : on_refresh_item_activate,
|
||||
'on_local_item_activate' : on_local_item_activate,
|
||||
'on_about_item_activate' : on_about_item_activate,
|
||||
'on_package_open_button_clicked' : on_package_open_button_clicked,
|
||||
'on_package_cancel_button_clicked' : on_package_cancel_button_clicked,
|
||||
'on_PackagesChooserDialog_file_activated' : on_PackagesChooserDialog_file_activated,
|
||||
'on_state_column_clicked' : on_state_column_clicked,
|
||||
'on_name_column_clicked' : on_name_column_clicked,
|
||||
'on_version_column_clicked' : on_version_column_clicked,
|
||||
'on_size_column_clicked' : on_size_column_clicked}
|
||||
|
||||
if common.pid_file_exists():
|
||||
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
common.write_pid_file()
|
||||
interface.connect_signals(signals)
|
||||
ManagerWindow.show_all()
|
||||
trans = transaction.Transaction()
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.refresh(False)
|
||||
update_lists()
|
||||
trans.do_sysupgrade(True)
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
Gtk.main()
|
||||
|
@ -1,31 +1,22 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from gi.repository import GObject
|
||||
from pamac import common
|
||||
import dbus
|
||||
|
||||
def reply(reply):
|
||||
transaction.StopDaemon()
|
||||
print('check updates done')
|
||||
loop.quit()
|
||||
|
||||
def error(error):
|
||||
transaction.StopDaemon()
|
||||
print('check updates failed')
|
||||
loop.quit()
|
||||
|
||||
loop = GObject.MainLoop()
|
||||
from pamac import common, config
|
||||
|
||||
if not common.pid_file_exists():
|
||||
print('checking updates')
|
||||
from pamac import transaction
|
||||
bus = dbus.SystemBus()
|
||||
bus.add_signal_receiver(reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
|
||||
bus.add_signal_receiver(error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
|
||||
try:
|
||||
transaction.Refresh()
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
loop.run()
|
||||
print('refreshing')
|
||||
handle = config.handle()
|
||||
for db in handle.get_syncdbs():
|
||||
try:
|
||||
t = handle.init_transaction()
|
||||
db.update(force = False)
|
||||
t.release()
|
||||
except:
|
||||
try:
|
||||
t.release()
|
||||
except:
|
||||
pass
|
||||
print('refreshing {} failed'.format(db.name))
|
||||
break
|
||||
else:
|
||||
print('refreshing {} succeeded'.format(db.name))
|
||||
|
@ -1,6 +1,112 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from pamac import main
|
||||
from gi.repository import Gtk, Gdk
|
||||
import pyalpm
|
||||
|
||||
main.main('updater')
|
||||
from pamac import config, common, transaction
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
import locale
|
||||
locale.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
interface = transaction.interface
|
||||
|
||||
interface.add_from_file('/usr/share/pamac/gui/updater.ui')
|
||||
UpdaterWindow = interface.get_object("UpdaterWindow")
|
||||
update_listore = interface.get_object('update_list')
|
||||
update_top_label = interface.get_object('update_top_label')
|
||||
update_bottom_label = interface.get_object('update_bottom_label')
|
||||
|
||||
update_top_label.set_markup(_('<big><b>Your system is up-to-date</b></big>'))
|
||||
update_bottom_label.set_markup('')
|
||||
|
||||
def have_updates():
|
||||
do_syncfirst, updates = trans.get_updates()
|
||||
update_listore.clear()
|
||||
update_top_label.set_justify(Gtk.Justification.CENTER)
|
||||
if not updates:
|
||||
update_bottom_label.set_markup('')
|
||||
update_top_label.set_markup(_('<big><b>Your system is up-to-date</b></big>'))
|
||||
else:
|
||||
dsize = 0
|
||||
for pkg in updates:
|
||||
pkgname = pkg.name+' '+pkg.version
|
||||
update_listore.append([pkgname, common.format_size(pkg.size)])
|
||||
dsize += pkg.download_size
|
||||
if dsize == 0:
|
||||
update_bottom_label.set_markup('')
|
||||
else:
|
||||
update_bottom_label.set_markup(_('<b>Total download size: </b>')+common.format_size(dsize))
|
||||
if len(updates) == 1:
|
||||
update_top_label.set_markup(_('<big><b>1 available update</b></big>'))
|
||||
else:
|
||||
update_top_label.set_markup(_('<big><b>{number} available updates</b></big>').format(number = len(updates)))
|
||||
|
||||
def on_TransValidButton_clicked(*arg):
|
||||
transaction.ConfDialog.hide()
|
||||
trans.finalize()
|
||||
|
||||
def on_TransCancelButton_clicked(*arg):
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
transaction.ConfDialog.hide()
|
||||
trans.release()
|
||||
|
||||
def on_ProgressCloseButton_clicked(*arg):
|
||||
transaction.ProgressWindow.hide()
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
have_updates()
|
||||
|
||||
def on_ProgressCancelButton_clicked(*args):
|
||||
trans.interrupt()
|
||||
|
||||
def on_UpdaterWindow_delete_event(*arg):
|
||||
Gtk.main_quit()
|
||||
common.rm_pid_file()
|
||||
|
||||
def on_Updater_ApplyButton_clicked(*arg):
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.do_sysupgrade(False)
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
|
||||
def on_Updater_RefreshButton_clicked(*arg):
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
trans.refresh(False)
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
|
||||
signals = {'on_ChooseButton_clicked' : transaction.on_ChooseButton_clicked,
|
||||
'on_progress_textview_size_allocate' : transaction.on_progress_textview_size_allocate,
|
||||
'on_choose_renderertoggle_toggled' : transaction.on_choose_renderertoggle_toggled,
|
||||
'on_TransValidButton_clicked' :on_TransValidButton_clicked,
|
||||
'on_TransCancelButton_clicked' :on_TransCancelButton_clicked,
|
||||
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
|
||||
'on_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
|
||||
'on_UpdaterWindow_delete_event' : on_UpdaterWindow_delete_event,
|
||||
'on_Updater_ApplyButton_clicked' : on_Updater_ApplyButton_clicked,
|
||||
'on_Updater_RefreshButton_clicked' : on_Updater_RefreshButton_clicked}
|
||||
|
||||
if common.pid_file_exists():
|
||||
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
common.write_pid_file()
|
||||
interface.connect_signals(signals)
|
||||
UpdaterWindow.show_all()
|
||||
trans = transaction.Transaction()
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.refresh(False)
|
||||
have_updates()
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
Gtk.main()
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
/usr/bin/pamac-daemon &
|
Loading…
Reference in new issue