aboutsummaryrefslogtreecommitdiff
path: root/nxdialog/nxdialog
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2019-03-01 13:47:39 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2019-03-01 15:20:18 +0100
commit57ca69fe09285ed7572d86f94e257484caa015a2 (patch)
treeb402739ddce203ab1504597400a0dcf90040005b /nxdialog/nxdialog
parentdf79c3b35a30a957be0125c42e766a7ea2f51123 (diff)
downloadnx-libs-57ca69fe09285ed7572d86f94e257484caa015a2.tar.gz
nx-libs-57ca69fe09285ed7572d86f94e257484caa015a2.tar.bz2
nx-libs-57ca69fe09285ed7572d86f94e257484caa015a2.zip
nxdialog: Turn into autotools project, add man page.
Diffstat (limited to 'nxdialog/nxdialog')
-rwxr-xr-xnxdialog/nxdialog394
1 files changed, 0 insertions, 394 deletions
diff --git a/nxdialog/nxdialog b/nxdialog/nxdialog
deleted file mode 100755
index e7ca10aad..000000000
--- a/nxdialog/nxdialog
+++ /dev/null
@@ -1,394 +0,0 @@
-#!/usr/bin/env python
-#
-# ^^^ This is working with python2 and python3 so we choose a shebang
-# that will find either version.
-# Citing PEP394: "One exception to this is scripts that are
-# deliberately written to be source compatible with both Python
-# 2.x and 3.x. Such scripts may continue to use python on their
-# shebang line.
-
-# Copyright (C) 2008 Google Inc.
-# Copyright (C) 2019 Ulrich Sibiller <uli42@gmx.de>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# This version is based on the nxdialog.py of the long abandoned
-# Google project "neatx" (https://code.google.com/archive/p/neatx/).
-# List of changes:
-# - pulled in the few parts of the neatx python modules that are actually
-# to make it a standlone script
-# - added usage output
-# - dropped logging code, print errors to stderr
-# - can handle the "yesno" dialog type
-# - added missing docstrings
-# - pylint improvements
-# - removed neatx entry from the pulldoww menu
-# - use PyGObject instead of PyGtk and thus Gtk3
-# - replace optparse by argparse
-# - make code compatible to python2 and python3.
-
-"""nxdialog program for handling dialog display."""
-
-# If an "NX_CLIENT" environment variable is not provided to nxagent
-# nxcomp library assumes this script is located in /usr/NX/bin/nxclient
-#
-# Example:
-# nxdialog --dialog yesno --message "message text" --caption "message title" --parent 0
-
-from __future__ import print_function
-
-import argparse
-import os
-import signal
-import sys
-
-import gi
-gi.require_version('Gtk', '3.0')
-# pylint: disable=wrong-import-position
-from gi.repository import Gtk, Gdk, GdkX11
-
-PROGRAM = "nxdialog"
-
-DISCONNECT = 1
-TERMINATE = 2
-
-EXIT_SUCCESS = 0
-EXIT_FAILURE = 1
-
-CANCEL_TEXT = "Cancel"
-DISCONNECT_TEXT = "Disconnect"
-TERMINATE_TEXT = "Terminate"
-YES_TEXT = "Yes"
-NO_TEXT = "No"
-
-DLG_TYPE_ERROR = "error"
-DLG_TYPE_OK = "ok"
-DLG_TYPE_PANIC = "panic"
-DLG_TYPE_PULLDOWN = "pulldown"
-DLG_TYPE_QUIT = "quit"
-DLG_TYPE_YESNO = "yesno"
-DLG_TYPE_YESNOSUSPEND = "yesnosuspend"
-
-VALID_DLG_TYPES = frozenset([
- DLG_TYPE_ERROR,
- DLG_TYPE_OK,
- DLG_TYPE_PANIC,
- DLG_TYPE_PULLDOWN,
- DLG_TYPE_QUIT,
- DLG_TYPE_YESNO,
- DLG_TYPE_YESNOSUSPEND,
-])
-
-
-class PullDownMenu(object):
- """ Shows a popup menu to disconnect/terminate session. """
-
- def __init__(self, window_id):
- """ Initializes this class.
-
- @type window_id: int
- @param window_id: X11 window id of target window
-
- """
- self.window_id = window_id
- self.result = None
-
- def show(self):
- """ Shows popup and returns result. """
-
- display = Gdk.Display.get_default()
- win = GdkX11.X11Window.foreign_new_for_display(display, self.window_id)
-
- menu = Gtk.Menu()
- menu.connect("deactivate", self.menu_deactivate)
-
- # TODO: Show title item in bold font
- title = Gtk.MenuItem(label="Session control")
- title.set_sensitive(False)
- menu.append(title)
-
- disconnect = Gtk.MenuItem(label=DISCONNECT_TEXT)
- disconnect.connect("activate", self.item_activate, DISCONNECT)
- menu.append(disconnect)
-
- terminate = Gtk.MenuItem(label=TERMINATE_TEXT)
- terminate.connect("activate", self.item_activate, TERMINATE)
- menu.append(terminate)
-
- menu.append(Gtk.SeparatorMenuItem())
-
- cancel = Gtk.MenuItem(label=CANCEL_TEXT)
- menu.append(cancel)
-
- menu.show_all()
-
- menu.popup(parent_menu_shell=None, parent_menu_item=None,
- func=self.pos_menu, data=win,
- button=0, activate_time=Gtk.get_current_event_time())
-
- Gtk.main()
-
- return self.result
-
- def item_activate(self, _, result):
- """ called when a menu item is selected """
- self.result = result
- Gtk.main_quit()
-
- @staticmethod
- def menu_deactivate(_):
- """ called when menu is deactivated """
- Gtk.main_quit()
-
- @staticmethod
- def pos_menu(menu, _xpos, _ypos, *data):
- """ Positions menu at the top center of the parent window. """
- parent = data[0]
-
- # Get parent geometry and origin
- _, _, win_width, _ = parent.get_geometry()
- _, win_x, win_y = parent.get_origin()
-
- # Calculate width of menu
- #menu_width = menu.get_preferred_width().natural_width
- menu_width = menu.get_allocated_width()
-
- # Calculate center
- center_x = int(win_x + ((win_width - menu_width) / 2))
-
- return (center_x, win_y, True)
-
-
-def show_yes_no_suspend_box(title, text):
- """ Shows a message box to disconnect/terminate session.
-
- @type title: str
- @param title: Message box title
- @type text: str
- @param text: Message box text
- @return: Choosen action
-
- """
- dlg = Gtk.MessageDialog(type=Gtk.MessageType.QUESTION,
- flags=Gtk.DialogFlags.MODAL)
- dlg.set_title(title)
- dlg.set_markup(text)
- dlg.add_button(DISCONNECT_TEXT, DISCONNECT)
- dlg.add_button(TERMINATE_TEXT, TERMINATE)
- dlg.add_button(CANCEL_TEXT, Gtk.ResponseType.CANCEL)
-
- res = dlg.run()
-
- if res in (DISCONNECT, TERMINATE):
- return res
-
- # Everything else is cancel
- return None
-
-
-def show_yes_no_box(title, text):
- """ Shows a message box with answers yes and no.
-
- @type title: str
- @param title: Message box title
- @type text: str
- @param text: Message box text
- @return: Choosen action
-
- """
- dlg = Gtk.MessageDialog(type=Gtk.MessageType.QUESTION,
- flags=Gtk.DialogFlags.MODAL)
- dlg.set_title(title)
- dlg.set_markup(text)
- dlg.add_button(YES_TEXT, TERMINATE)
- dlg.add_button(NO_TEXT, Gtk.ResponseType.CANCEL)
-
- res = dlg.run()
-
- if res == TERMINATE:
- return res
-
- # Everything else is cancel
- return None
-
-
-def handle_session_action(agentpid, action):
- """ Execute session action choosen by user.
-
- @type agentpid: int
- @param agentpid: Nxagent process id as passed by command line
- @type action: int or None
- @param action: Choosen action
-
- """
-
- if action == DISCONNECT:
- print("Disconnecting from session, sending SIGHUP to %s" % (agentpid))
- if agentpid != 0:
- os.kill(agentpid, signal.SIGHUP)
-
- elif action == TERMINATE:
- print("Terminating session, sending SIGTERM to process %s" % (agentpid))
- if agentpid != 0:
- os.kill(agentpid, signal.SIGTERM)
-
- elif action is None:
- pass
-
- else:
- raise NotImplementedError()
-
-
-def show_simple_message_box(icon, title, text):
- """ Shows a simple message box.
-
- @type icon: QMessageBox.Icon
- @param icon: Icon for message box
- @type title: str
- @param title: Message box title
- @type text: str
- @param text: Message box text
-
- """
- dlg = Gtk.MessageDialog(type=icon, flags=Gtk.DialogFlags.MODAL,
- buttons=Gtk.ButtonsType.OK)
- dlg.set_title(title)
- dlg.set_markup(text)
- dlg.run()
-
-
-class NxDialogProgram(object):
- """ the main program """
-
- def __init__(self):
- self.args = None
- self.options = None
-
- def main(self):
- """ let's do something """
- try:
- self.options = self.parse_args()
-
- self.run()
-
- except (SystemExit, KeyboardInterrupt):
- raise
-
- except Exception as expt:
- sys.stderr.write("Caught exception: %s\n" % (expt))
- sys.exit(EXIT_FAILURE)
-
- @staticmethod
- def parse_args():
- """ init parser """
-
- parser = argparse.ArgumentParser(description="Helper for nxagent to display dialogs")
-
- # nxagent 3.5.99.18 only uses yesno, ok, pulldown and yesnosuspend
- # yesno dialogs will always kill the session if "yes" is selected
- parser.add_argument("--dialog", dest="dialog_type",
- help='type of dialog to show, one of "yesno", \
- "ok", "error", "panic", "quit", "pulldown", \
- "yesnosuspend"')
- parser.add_argument("--message", dest="text",
- help="message text to display in the dialog")
- parser.add_argument("--caption", dest="caption",
- help="window title of the dialog")
- parser.add_argument("--display", dest="display",
- help="X11 display where the dialog should be \
- shown")
- parser.add_argument("--parent", type=int, dest="agentpid",
- help="pid of the nxagent")
- parser.add_argument("--window", type=int, dest="window",
- help="id of window where to embed the \
- pulldown dialog type")
- # -class, -local, -allowmultiple are unused in nxlibs 3.5.99.18
- parser.add_argument("--class", dest="dlgclass", default="info",
- help="class of the message (info, warning, error) \
- default: info) [currently unimplemented]")
- parser.add_argument("--local", action="store_true", dest="local",
- help="specify that proxy mode is used \
- [currently unimplemented]")
- parser.add_argument("--allowmultiple", action="store_true",
- dest="allowmultiple",
- help="allow launching more than one dialog with \
- the same message [currently unimplemented]")
-
- return parser.parse_args()
-
- def run(self):
- """ Disconnect/terminate NX session upon user's request. """
-
- if not self.options.dialog_type:
- sys.stderr.write("Dialog type not supplied via --type\n")
- sys.exit(EXIT_FAILURE)
-
- dlgtype = self.options.dialog_type
-
- if dlgtype not in VALID_DLG_TYPES:
- sys.stderr.write("Invalid dialog type '%s'\n" % (dlgtype))
- sys.exit(EXIT_FAILURE)
-
- if dlgtype in (DLG_TYPE_PULLDOWN,
- DLG_TYPE_YESNOSUSPEND,
- DLG_TYPE_YESNO) and self.options.agentpid is None:
- sys.stderr.write("Agent pid not supplied via --parent\n")
- sys.exit(EXIT_FAILURE)
-
- if dlgtype == DLG_TYPE_PULLDOWN and not self.options.window:
- sys.stderr.write("Window id not supplied via --window\n")
- sys.exit(EXIT_FAILURE)
-
- if self.options.caption:
- message_caption = self.options.caption
- else:
- message_caption = sys.argv[0]
-
- if self.options.text:
- message_text = self.options.text
- else:
- message_text = ""
-
- if self.options.display:
- os.environ["DISPLAY"] = self.options.display
-
- if dlgtype == DLG_TYPE_OK:
- show_simple_message_box(
- Gtk.MessageType.INFO, message_caption, message_text)
-
- elif dlgtype in (DLG_TYPE_ERROR, DLG_TYPE_PANIC):
- show_simple_message_box(
- Gtk.MessageType.ERROR, message_caption, message_text)
-
- elif dlgtype == DLG_TYPE_PULLDOWN:
- handle_session_action(self.options.agentpid,
- PullDownMenu(self.options.window).show())
-
- elif dlgtype == DLG_TYPE_YESNOSUSPEND:
- handle_session_action(self.options.agentpid,
- show_yes_no_suspend_box(message_caption, message_text))
-
- elif dlgtype == DLG_TYPE_YESNO:
- handle_session_action(self.options.agentpid,
- show_yes_no_box(message_caption, message_text))
-
- else:
- # TODO: Implement all dialog types
- sys.stderr.write("Dialog type '%s' not implemented" % (dlgtype))
- sys.exit(EXIT_FAILURE)
-
-
-NxDialogProgram().main()