def __init__(self, datadir, dist, debug, test, sound, silent): GObject.GObject.__init__(self) logger.debug("Setting variables.") prefs.datadir = datadir prefs.get_sound_files() self.startup = True prefs.debug = debug prefs.test = test prefs.dist = dist prefs.silent = silent prefs.sound = sound self.setup_translations() if prefs.sound: try: from kazam.pulseaudio.pulseaudio import pulseaudio_q prefs.sound = True except: logger.warning( _("Pulse Audio Failed to load. Sound recording disabled.")) prefs.sound = False self.icons = Gtk.IconTheme.get_default() self.icons.append_search_path(datadir) self.default_cursor = Gdk.Cursor(Gdk.CursorType.LEFT_PTR) # Initialize all the variables self.main_x = 0 self.main_y = 0 self.countdown = None self.tempfile = "" self.recorder = None self.area_window = None self.select_window = None self.outline_window = None self.old_vid_path = None self.old_pic_path = None self.in_countdown = False self.recording_paused = False self.recording = False self.main_mode = 0 self.record_mode = 0 self.last_mode = None self.keypress_detect = False self.keypress_viewer = None self.cam = None if prefs.sound: try: prefs.pa_q = pulseaudio_q() prefs.pa_q.start() except: logger.warning( "Pulse Audio Failed to load. Sound recording disabled.") prefs.sound = False prefs.get_webcam_sources() self.mainmenu = MainMenu() logger.debug("Connecting indicator signals.") logger.debug("Starting in silent mode: {0}".format(prefs.silent)) self.indicator = KazamIndicator(prefs.silent) self.indicator.connect("indicator-quit-request", self.cb_quit_request) self.indicator.connect("indicator-show-request", self.cb_show_request) self.indicator.connect("indicator-help-request", self.cb_help_request) self.indicator.connect("indicator-start-request", self.cb_start_request) self.indicator.connect("indicator-stop-request", self.cb_stop_request) self.indicator.connect("indicator-pause-request", self.cb_pause_request) self.indicator.connect("indicator-unpause-request", self.cb_unpause_request) self.indicator.connect("indicator-about-request", self.cb_about_request) self.mainmenu.connect("file-quit", self.cb_quit_request) self.mainmenu.connect("file-preferences", self.cb_preferences_request) self.mainmenu.connect("help-help", self.cb_help_request) self.mainmenu.connect("help-about", self.cb_help_about) self.webcam = HW.webcam self.webcam.connect("webcam-change", self.cb_webcam_change) # # Detect Xlib, if there's no Xlib, there's no KeyViewer # try: imp.find_module('Xlib') self.keypress_viewer = KeypressViewer() self.keypress_viewer.connect("keypress", self.cb_got_keypress) self.keypress_detect = True except ImportError: logger.warning( _("No Xlib support in python3, unable to capture key and mouse clicks." )) self.keypress_detect = False # # Setup UI # logger.debug("Main Window UI setup.") self.builder = Gtk.Builder() self.builder.add_from_file( os.path.join(prefs.datadir, "ui", "kazam.ui")) self.builder.connect_signals(self) for w in self.builder.get_objects(): if issubclass(type(w), Gtk.Buildable): name = Gtk.Buildable.get_name(w) setattr(self, name, w) else: logger.debug("Unable to get name for '%s'" % w) # Retrieve gdk_win for the root window self.gdk_win = self.window.get_root_window() # # Attach main menu, so that # self.MainGrid.attach(self.mainmenu.menubar, 0, 0, 1, 1) self.main_context = self.toolbar_main.get_style_context() self.main_context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) self.main_context.connect("changed", self.cb_main_context_change) self.main_fg_color = self.main_context.get_color(Gtk.StateFlags.ACTIVE) # # Screen cast mode # self.btn_screencast = Gtk.RadioToolButton(group=None) self.btn_screencast.set_label(_("Screencast")) self.btn_screencast.set_tooltip_text( _("Record a video of your desktop.")) screencast_icon = self.icons.lookup_icon( "kazam-screencast-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if screencast_icon: cast_icon_pixbuf, was_sym = screencast_icon.load_symbolic( self.main_fg_color, None, None, None) cast_img = Gtk.Image.new_from_pixbuf(cast_icon_pixbuf) self.btn_screencast.set_icon_widget(cast_img) self.btn_screencast.set_active(True) self.btn_screencast.set_name("MAIN_SCREENCAST") self.btn_screencast.connect("toggled", self.cb_main_toggled) # # Screen shot mode # self.btn_screenshot = Gtk.RadioToolButton(group=self.btn_screencast) self.btn_screenshot.set_label(_("Screenshot")) self.btn_screenshot.set_tooltip_text( _("Record a picture of your desktop.")) screenshot_icon = self.icons.lookup_icon( "kazam-screenshot-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if screenshot_icon: shot_icon_pixbuf, was_sym = screenshot_icon.load_symbolic( self.main_fg_color, None, None, None) shot_img = Gtk.Image.new_from_pixbuf(shot_icon_pixbuf) self.btn_screenshot.set_icon_widget(shot_img) self.btn_screenshot.set_name("MAIN_SCREENSHOT") self.btn_screenshot.connect("toggled", self.cb_main_toggled) # # Broadcast mode # self.btn_broadcast = Gtk.RadioToolButton(group=self.btn_screencast) self.btn_broadcast.set_label(_("Broadcast")) self.btn_broadcast.set_tooltip_text(_("Broadcast your desktop.")) broadcast_icon = self.icons.lookup_icon("kazam-broadcast-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if broadcast_icon: cam_icon_pixbuf, was_sym = broadcast_icon.load_symbolic( self.main_fg_color, None, None, None) cam_img = Gtk.Image.new_from_pixbuf(cam_icon_pixbuf) self.btn_broadcast.set_icon_widget(cam_img) self.btn_broadcast.set_name("MAIN_BROADCAST") self.btn_broadcast.connect("toggled", self.cb_main_toggled) # # Webcam mode # self.btn_webcam = Gtk.RadioToolButton(group=self.btn_screencast) self.btn_webcam.set_label(_("Webcam")) self.btn_webcam.set_tooltip_text(_("Capture form your webcam.")) webcam_icon = self.icons.lookup_icon("kazam-webcam-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if webcam_icon: cam_icon_pixbuf, was_sym = webcam_icon.load_symbolic( self.main_fg_color, None, None, None) cam_img = Gtk.Image.new_from_pixbuf(cam_icon_pixbuf) self.btn_webcam.set_icon_widget(cam_img) self.btn_webcam.set_name("MAIN_WEBCAM") self.btn_webcam.connect("toggled", self.cb_main_toggled) self.sep_1 = Gtk.SeparatorToolItem() self.sep_1.set_draw(False) self.sep_1.set_expand(True) self.sep_1a = Gtk.SeparatorToolItem() self.sep_1a.set_draw(False) self.sep_1a.set_expand(True) self.toolbar_main.insert(self.sep_1, -1) self.toolbar_main.insert(self.btn_screencast, -1) self.toolbar_main.insert(self.btn_screenshot, -1) self.toolbar_main.insert(self.btn_broadcast, -1) if prefs.webcam_sources: self.toolbar_main.insert(self.btn_webcam, -1) else: self.chk_webcam.set_sensitive(False) self.chk_webcam_broadcast.set_sensitive(False) self.toolbar_main.insert(self.sep_1a, -1) # Auxiliary toolbar self.aux_context = self.toolbar_aux.get_style_context() self.aux_context.add_class(Gtk.STYLE_CLASS_TOOLBAR) self.aux_fg_color = self.aux_context.get_color(Gtk.StateFlags.ACTIVE) self.btn_full = Gtk.RadioToolButton(group=None) self.btn_full.set_label(_("Fullscreen")) self.btn_full.set_tooltip_text( _("Capture contents of the current screen.")) full_icon = self.icons.lookup_icon("kazam-fullscreen-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if full_icon: full_icon_pixbuf, was_sym = full_icon.load_symbolic( self.aux_fg_color, None, None, None) full_img = Gtk.Image.new_from_pixbuf(full_icon_pixbuf) self.btn_full.set_icon_widget(full_img) self.btn_full.set_active(True) self.btn_full.set_name("MODE_FULL") self.btn_full.connect("toggled", self.cb_record_mode_toggled) self.btn_allscreens = Gtk.RadioToolButton(group=self.btn_full) self.btn_allscreens.set_label(_("All Screens")) self.btn_allscreens.set_tooltip_text( _("Capture contents of all of your screens.")) allscreens_icon = self.icons.lookup_icon( "kazam-all-screens-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if allscreens_icon: allscreens_icon_pixbuf, was_sym = allscreens_icon.load_symbolic( self.aux_fg_color, None, None, None) allscreens_img = Gtk.Image.new_from_pixbuf(allscreens_icon_pixbuf) self.btn_allscreens.set_icon_widget(allscreens_img) self.btn_allscreens.set_name("MODE_ALL") self.btn_allscreens.connect("toggled", self.cb_record_mode_toggled) if HW.combined_screen is None: self.btn_allscreens.set_sensitive(False) self.btn_window = Gtk.RadioToolButton(group=self.btn_full) self.btn_window.set_label(_("Window")) self.btn_window.set_tooltip_text( _("Capture contents of a single window.")) window_icon = self.icons.lookup_icon("kazam-window-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if window_icon: window_icon_pixbuf, was_sym = window_icon.load_symbolic( self.aux_fg_color, None, None, None) window_img = Gtk.Image.new_from_pixbuf(window_icon_pixbuf) self.btn_window.set_icon_widget(window_img) self.btn_window.set_name("MODE_WIN") self.btn_window.connect("toggled", self.cb_record_mode_toggled) self.btn_window.connect("clicked", self.cb_record_window_clicked) self.btn_area = Gtk.RadioToolButton(group=self.btn_full) self.btn_area.set_label(_("Area")) self.btn_area.set_tooltip_text( _("Capture a pre-selected area of your screen.")) area_icon = self.icons.lookup_icon("kazam-area-symbolic", 24, Gtk.IconLookupFlags.FORCE_SIZE) if area_icon: area_icon_pixbuf, was_sym = area_icon.load_symbolic( self.aux_fg_color, None, None, None) area_img = Gtk.Image.new_from_pixbuf(area_icon_pixbuf) self.btn_area.set_icon_widget(area_img) self.btn_area.set_name("MODE_AREA") self.btn_area.connect("toggled", self.cb_record_mode_toggled) self.btn_area.connect("clicked", self.cb_record_area_clicked) self.sep_2 = Gtk.SeparatorToolItem() self.sep_2.set_draw(False) self.sep_2.set_expand(True) self.sep_2a = Gtk.SeparatorToolItem() self.sep_2a.set_draw(False) self.sep_2a.set_expand(True) self.toolbar_aux.insert(self.sep_2, -1) self.toolbar_aux.insert(self.btn_full, -1) self.toolbar_aux.insert(self.btn_allscreens, -1) self.toolbar_aux.insert(self.btn_window, -1) self.toolbar_aux.insert(self.btn_area, -1) self.toolbar_aux.insert(self.sep_2a, -1) self.ntb_main.set_current_page(0) self.btn_record.grab_focus() # # Take care of screen size changes. # self.default_screen = Gdk.Screen.get_default() self.default_screen.connect("size-changed", self.cb_screen_size_changed) self.window.connect("configure-event", self.cb_configure_event) # self.window.connect("delete-event", self.cb_delete_event) # Fetch sources info, take care of all the widgets and saved settings and show main window if prefs.sound: prefs.get_audio_sources() self.instructions = (""" SUPER-CTRL-W to toggle main window.\n""" """ SUPER-CTRL-R to start recording.\n""" """ SUPER-CTRL-F to finish recording.\n""" """ SUPER-CTRL-P to pause/resume recording.\n""" """ SUPER-CTRL-Q to quit.\n""") if not prefs.silent: self.window.show_all() else: logger.info("""Starting in silent mode:\n""" + self.instructions) self.restore_UI() if not self.keypress_detect: self.chk_keypresses.set_sensitive(False) self.chk_keypresses.set_active(False) #HW.get_current_screen(self.window) self.startup = False self.noSelectNextModeActive = False screen = HW.get_current_screen(self.window) prefs.current_screen = screen