class DisplayView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.brightness_id = None self.display_manager = DisplayManager() self.__xrandr_settings = self.display_manager.get_xrandr_settings() self.__xrandr_settings.connect("changed", self.__xrandr_changed) self.resize_width = 790 self.resize_height = 200 self.monitor_items = [] self.__output_names = [] self.__current_output_name = self.display_manager.get_primary_output_name() self.__setup_monitor_items() self.sizes_items = [] self.monitor_combo = None if len(self.monitor_items) > 1 and self.display_manager.is_copy_monitors(): self.__set_same_sizes() else: self.__setup_sizes_items() self.multi_monitors_items = [(_("Copy Display"), 1), (_("Extend Display"), 2), (_("Only shown in display 1"), 3), (_("Only shown in display 2"), 4)] self.rotation_items = [(_("Normal"), 1), (_("Right"), 2), (_("Left"), 3), (_("Inverted"), 4)] self.duration_items = [("1 %s" % _("Minute"), 1), ("2 %s" % _("Minutes"), 2), ("3 %s" % _("Minutes"), 3), ("5 %s" % _("Minutes"), 5), ("10 %s" % _("Minutes"), 10), ("30 %s" % _("Minutes"), 30), ("1 %s" % _("Hour"), 60), (_("Never"), DisplayManager.BIG_NUM / 60)] ''' scrolled_window ''' self.scrolled_window = ScrolledWindow() self.scrolled_window.set_size_request(-1, 425) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.main_box = gtk.VBox() self.main_box.set_size_request(600, -1) self.body_box = gtk.HBox() ''' left, right align ''' self.left_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, padding_left = TEXT_WINDOW_LEFT_PADDING) self.right_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, padding_left = 0) ''' left, right box ''' self.left_box = gtk.VBox(spacing = WIDGET_SPACING) self.right_box = gtk.VBox(spacing = WIDGET_SPACING) ''' monitor operation && detect ''' self.monitor_resize_align = self.__setup_align(padding_top = 11, padding_left = int(TEXT_WINDOW_LEFT_PADDING / 2)) self.monitor_resize_box = MonitorResizableBox(self.display_manager) self.monitor_resize_box.select_output(self.__current_output_name) self.monitor_resize_box.connect("select-output", self.__select_output) self.monitor_resize_box.connect("resize", self.__resize_box) self.monitor_resize_align.add(self.monitor_resize_box) ''' monitor display ''' self.monitor_display_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_display.png"), _("Display"), 0) ''' monitor ''' self.monitor_align = self.__setup_align() self.monitor_box = gtk.HBox(spacing = WIDGET_SPACING) self.monitor_label = self.__setup_label(_("Monitor")) self.monitor_combo = self.__setup_combo(self.monitor_items) self.monitor_combo.set_select_index(self.display_manager.get_primary_output_name_index(self.monitor_items)) self.monitor_combo.connect("item-selected", self.__combo_item_selected, "monitor_combo") self.__widget_pack_start(self.monitor_box, [self.monitor_label, self.monitor_combo]) self.monitor_align.add(self.monitor_box) ''' goto individuation or power setting ''' self.goto_align = self.__setup_align() self.goto_box = gtk.VBox(spacing = WIDGET_SPACING) self.goto_label = self.__setup_label(_("Relevant Settings"), text_size = TITLE_FONT_SIZE, width = None, align = ALIGN_START) goto_color = GOTO_FG_COLOR self.goto_individuation_label = self.__setup_label( text = _("<span foreground=\"%s\" underline=\"single\">Personalization</span>") % goto_color, width = None, align = ALIGN_START) self.goto_individuation_label.connect("button-press-event", self.__button_press, "individuation") set_clickable_cursor(self.goto_individuation_label) self.goto_power_label = self.__setup_label( text = _("<span foreground=\"%s\" underline=\"single\">Power</span>") % goto_color, width = None, align = ALIGN_START) self.goto_power_label.connect("button-press-event", self.__button_press, "power") set_clickable_cursor(self.goto_power_label) self.__widget_pack_start(self.goto_box, [self.goto_label, self.goto_individuation_label, self.goto_power_label ]) self.goto_align.add(self.goto_box) ''' sizes ''' self.sizes_align = self.__setup_align() self.sizes_box = gtk.HBox(spacing = WIDGET_SPACING) self.sizes_label = self.__setup_label(_("Resolution")) self.sizes_combo = self.__setup_combo(self.sizes_items) if self.sizes_combo: self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index(self.__current_output_name, self.sizes_items)) self.sizes_combo.connect("item-selected", self.__combo_item_selected, "sizes_combo") self.__widget_pack_start(self.sizes_box, [self.sizes_label, self.sizes_combo]) self.sizes_align.add(self.sizes_box) ''' rotation ''' self.rotation_align = self.__setup_align() self.rotation_box = gtk.HBox(spacing = WIDGET_SPACING) self.rotation_label = self.__setup_label(_("Rotation")) self.rotation_combo = self.__setup_combo(self.rotation_items) self.rotation_combo.set_select_index(self.display_manager.get_screen_rotation_index(self.__current_output_name)) self.rotation_combo.connect("item-selected", self.__combo_item_selected, "rotation_combo") self.__widget_pack_start(self.rotation_box, [self.rotation_label, self.rotation_combo]) self.rotation_align.add(self.rotation_box) ''' multi-monitors ''' self.multi_monitors_align = self.__setup_align() self.multi_monitors_box = gtk.HBox(spacing = WIDGET_SPACING) self.multi_monitors_label = self.__setup_label(_("Multi-Monitor")) self.multi_monitors_combo = self.__setup_combo(self.multi_monitors_items) self.multi_monitors_combo.set_select_index(self.display_manager.get_multi_monitor_index()) self.multi_monitors_combo.connect("item-selected", self.__combo_item_selected, "multi_monitors_combo") self.__widget_pack_start(self.multi_monitors_box, [self.multi_monitors_label, self.multi_monitors_combo]) self.multi_monitors_align.add(self.multi_monitors_box) if self.display_manager.get_output_count() < 2: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) ''' monitor brightness ''' self.monitor_bright_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_bright.png"), _("Brightness")) ''' brightness ''' self.brightness_align = self.__setup_align() self.brightness_box = gtk.HBox(spacing = 2) self.brightness_label_align = self.__setup_align(padding_top = 8, padding_left = 0, padding_right = 5) self.brightness_label = self.__setup_label(_("Brightness")) self.brightness_label_align.add(self.brightness_label) self.brightness_scale = HScalebar(point_dpixbuf = app_theme.get_pixbuf("scalebar/point.png"), value_min = 0.1, value_max = 1.0) self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33) self.brightness_scale.set_value(self.display_manager.get_screen_brightness()) self.brightness_scale.connect("value-changed", self.__set_brightness) self.__widget_pack_start(self.brightness_box, [self.brightness_label_align, self.brightness_scale]) self.brightness_align.add(self.brightness_box) ''' auto adjust monitor brightness ''' self.auto_adjust_align = self.__setup_align() self.auto_adjust_box = gtk.HBox(spacing = WIDGET_SPACING) self.auto_adjust_label = self.__setup_label(_("Auto-Brightness")) self.auto_adjust_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158) self.auto_adjust_toggle = self.__setup_toggle() self.auto_adjust_toggle.set_active(self.display_manager.is_enable_close_monitor()) self.auto_adjust_toggle.connect("toggled", self.__toggled, "auto_adjust_toggle") self.auto_adjust_toggle_align.add(self.auto_adjust_toggle) self.__widget_pack_start(self.auto_adjust_box, [self.auto_adjust_label, self.auto_adjust_toggle_align]) self.auto_adjust_align.add(self.auto_adjust_box) ''' close monitor ''' self.close_monitor_align = self.__setup_align() self.close_monitor_box = gtk.HBox(spacing = WIDGET_SPACING) self.close_monitor_label = self.__setup_label(_("Turn off monitor")) self.close_monitor_combo = self.__setup_combo(self.duration_items) self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items)) self.close_monitor_combo.connect("item-selected", self.__combo_item_selected, "close_monitor_combo") self.__widget_pack_start(self.close_monitor_box, [self.close_monitor_label, self.close_monitor_combo]) self.close_monitor_align.add(self.close_monitor_box) ''' monitor lock ''' self.monitor_lock_align = self.__setup_title_align( app_theme.get_pixbuf("lock/lock.png"), _("Lock Screen")) ''' auto monitor lock ''' self.auto_lock_align = self.__setup_align() self.auto_lock_box = gtk.HBox(spacing = WIDGET_SPACING) self.auto_lock_label = self.__setup_label(_("Lock screen automatically")) self.auto_lock_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158) self.auto_lock_toggle = self.__setup_toggle() is_enable_lock_display = self.display_manager.is_enable_lock_display() self.auto_lock_toggle.set_active(is_enable_lock_display) self.auto_lock_toggle.connect("toggled", self.__toggled, "auto_lock_toggle") self.auto_lock_toggle_align.add(self.auto_lock_toggle) self.__widget_pack_start(self.auto_lock_box, [self.auto_lock_label, self.auto_lock_toggle_align]) self.auto_lock_align.add(self.auto_lock_box) ''' lock display ''' self.lock_display_align = self.__setup_align(padding_bottom = 20) self.lock_display_box = gtk.HBox(spacing = WIDGET_SPACING) self.lock_display_label = self.__setup_label(_("Lock Screen")) self.lock_display_combo = self.__setup_combo(self.duration_items) self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items)) self.lock_display_combo.connect("item-selected", self.__combo_item_selected, "lock_display_combo") self.__widget_pack_start(self.lock_display_box, [self.lock_display_label, self.lock_display_combo]) self.lock_display_align.add(self.lock_display_box) ''' left_align pack_start ''' self.__widget_pack_start(self.left_box, [self.monitor_display_align, self.monitor_align, self.sizes_align, self.rotation_align, self.multi_monitors_align, self.monitor_bright_align, self.brightness_align, #self.auto_adjust_align, #self.close_monitor_align, self.monitor_lock_align, self.auto_lock_align, self.lock_display_align]) self.left_align.add(self.left_box) ''' right_align pack_start ''' self.__widget_pack_start(self.right_box, [self.goto_align]) self.right_box.set_size_request(280, -1) self.right_align.add(self.right_box) ''' main && body box ''' self.main_box.pack_start(self.monitor_resize_align, False, False) self.body_box.pack_start(self.left_align) self.body_box.pack_start(self.right_align, False, False) self.main_box.pack_start(self.body_box) ''' this->HBox pack_start ''' self.scrolled_window.add_child(self.main_box) self.pack_start(self.scrolled_window) self.__send_message("status", ("display", "")) def show_again(self): self.__send_message("status", ("display", "")) def reset(self): self.__send_message("status", ("display", _("Reset to default value"))) self.display_manager.reset() self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items)) self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items)) self.multi_monitors_combo.set_select_index(0) def __handle_dbus_replay(self, *reply): pass def __handle_dbus_error(self, *error): pass def __send_message(self, message_type, message_content): if is_dbus_name_exists(APP_DBUS_NAME): bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME, APP_OBJECT_NAME) method = bus_object.get_dbus_method("message_receiver") method(message_type, message_content, reply_handler=self.__handle_dbus_replay, error_handler=self.__handle_dbus_error) def __button_press(self, widget, event, module_id): self.__send_message("goto", (module_id, "")) def __expose(self, widget, event): try: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() except e: print "DEBUG", e def __change_current_output(self, output_name, from_monitor_combo=True): self.__current_output_name = output_name if not from_monitor_combo: self.monitor_combo.set_select_index(self.display_manager.get_output_name_index(output_name, self.monitor_items)) if not self.display_manager.is_copy_monitors(): self.__setup_sizes_items() if len(self.sizes_items): self.sizes_combo.add_items(items = self.sizes_items) self.sizes_combo.set_select_index(self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) def __select_output(self, widget, output_name): print "Output name:", output_name self.__change_current_output(output_name, False) def __set_same_sizes(self): same_sizes = self.display_manager.get_same_sizes( self.display_manager.get_screen_sizes(self.monitor_items[0][1]), self.display_manager.get_screen_sizes(self.monitor_items[1][1])) i = 0 del self.sizes_items[:] while i < len(same_sizes): self.sizes_items.append((same_sizes[i], i)) i += 1 def __xrandr_changed(self, key): if key == "output-names": self.display_manager.init_xml() self.__setup_monitor_items() self.monitor_combo.add_items(items = self.monitor_items) if len(self.monitor_items) > 1: if self.display_manager.is_copy_monitors(): self.__set_same_sizes() self.sizes_combo.add_items(items = self.sizes_items) self.multi_monitors_align.set_size_request(-1, 30) self.multi_monitors_align.set_child_visible(True) else: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) return if key == "brightness": self.brightness_scale.set_value(self.display_manager.get_screen_brightness()) return def __set_brightness_value(self, value): self.display_manager.set_screen_brightness(self.__current_output_name, value) def __set_brightness(self, widget, event): value = self.brightness_scale.get_value() self.__send_message("status", ("display", _("Changed brightness to %d%%") % int(value * 100))) if self.brightness_id: gobject.source_remove(self.brightness_id) self.brightness_id = gobject.timeout_add_seconds(1, self.__set_brightness_value, value) def __setup_monitor_items(self): self.__output_names = self.display_manager.get_output_names() del self.monitor_items[:] i = 0 while (i < len(self.__output_names)): self.monitor_items.append(self.display_manager.get_output_name(self.__output_names[i])) i += 1 def __setup_sizes_items(self): screen_sizes = self.display_manager.get_screen_sizes(self.__current_output_name) del self.sizes_items[:] i = 0 while i < len(screen_sizes): self.sizes_items.append((screen_sizes[i], i)) i += 1 def __toggled(self, widget, object=None): if object == "auto_adjust_toggle": if not widget.get_active(): self.__send_message("status", ("display", _("Changed to manual adjustment"))) self.display_manager.set_close_monitor(DisplayManager.BIG_NUM / 60) else: self.__send_message("status", ("display", _("Changed to automatic adjustment"))) return if object == "auto_lock_toggle": if not widget.get_active(): self.lock_display_combo.set_sensitive(False) self.__send_message("status", ("display", _("Changed to manual lock"))) else: self.lock_display_combo.set_sensitive(True) self.__send_message("status", ("display", _("Changed to automatic lock"))) return def __combo_item_selected(self, widget, item_text=None, item_value=None, item_index=None, object=None): if object == "monitor_combo": self.__send_message("status", ("display", _("Changed current output to %s") % item_text)) self.__change_current_output(item_value) return if object == "sizes_combo": size = self.sizes_items[item_value][0] self.__send_message("status", ("display", _("Changed resolution to %s") % size)) self.display_manager.set_screen_size(self.__current_output_name, size) return if object == "rotation_combo": self.__send_message("status", ("display", _("Changed rotation to %s") % item_text)) self.display_manager.set_screen_rotation(self.__current_output_name, item_value) return if object == "multi_monitors_combo": self.__send_message("status", ("display", _("Changed multi-monitor mode to %s") % item_text)) self.display_manager.set_multi_monitor(item_value) return if object == "close_monitor_combo": self.__send_message("status", ("display", _("Idle time before turning off display has been changed to to %s") % item_text)) self.display_manager.set_close_monitor(item_value) return if object == "lock_display_combo": self.__send_message("status", ("display", _("Idle time before locking display has been changed to %s") % item_text)) if item_value == DisplayManager.BIG_NUM / 60: self.auto_lock_toggle.set_active(False) else: self.auto_lock_toggle.set_active(True) self.display_manager.set_lock_display(item_value) return def __resize_box(self, widget, height): self.monitor_resize_box.set_size_request(self.resize_width, height - FRAME_TOP_PADDING) def __setup_separator(self): hseparator = HSeparator(app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0) hseparator.set_size_request(500, HSEPARATOR_HEIGHT) return hseparator def __setup_title_label(self, text="", text_color=app_theme.get_color("globalTitleForeground"), text_size=TITLE_FONT_SIZE, text_x_align=ALIGN_START, label_width=180): return Label(text = text, text_color = text_color, text_size = text_size, text_x_align = text_x_align, label_width = label_width, enable_select = False, enable_double_click = False) def __setup_label(self, text="", text_size=CONTENT_FONT_SIZE, width=180, align=ALIGN_END, wrap_width=None): label = Label(text = text, text_color = None, text_size = text_size, text_x_align = align, label_width = width, wrap_width = wrap_width, enable_select = False, enable_double_click = False) return label def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH): if len(items) == 0: return None combo = ComboBox(items = items, select_index = 0, max_width = width, fixed_width = width) combo.set_size_request(width, WIDGET_HEIGHT) return combo def __setup_toggle(self): toggle = ToggleButton(app_theme.get_pixbuf("toggle_button/inactive_normal.png"), app_theme.get_pixbuf("toggle_button/active_normal.png")) return toggle def __setup_title_align(self, pixbuf, text, padding_top=FRAME_TOP_PADDING, padding_left=0): align = self.__setup_align(padding_top = padding_top, padding_left = padding_left) align_box = gtk.VBox(spacing = WIDGET_SPACING) title_box = gtk.HBox(spacing = WIDGET_SPACING) image = ImageBox(pixbuf) label = self.__setup_title_label(text) separator = self.__setup_separator() self.__widget_pack_start(title_box, [image, label]) self.__widget_pack_start(align_box, [title_box, separator]) align.add(align_box) return align def __setup_align(self, xalign=0, yalign=0, xscale=0, yscale=0, padding_top=0, padding_bottom=0, padding_left=FRAME_LEFT_PADDING + int(WIDGET_SPACING / 2), padding_right=0): align = gtk.Alignment() align.set(xalign, yalign, xscale, yscale) align.set_padding(padding_top, padding_bottom, padding_left, padding_right) align.connect("expose-event", self.__expose) return align def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False): if parent_widget == None: return for item in widgets: parent_widget.pack_start(item, expand, fill)
class DisplayView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.brightness_id = None self.display_manager = DisplayManager() self.__xrandr_settings = self.display_manager.get_xrandr_settings() self.__xrandr_settings.connect("changed", self.__xrandr_changed) self.resize_width = 790 self.resize_height = 200 self.monitor_items = [] self.__output_names = [] self.__current_output_name = self.display_manager.get_primary_output_name( ) self.__setup_monitor_items() self.sizes_items = [] self.monitor_combo = None if len(self.monitor_items ) > 1 and self.display_manager.is_copy_monitors(): self.__set_same_sizes() else: self.__setup_sizes_items() self.multi_monitors_items = [(_("Copy Display"), 1), (_("Extend Display"), 2), (_("Only shown in display 1"), 3), (_("Only shown in display 2"), 4)] self.rotation_items = [(_("Normal"), 1), (_("Right"), 2), (_("Left"), 3), (_("Inverted"), 4)] self.duration_items = [("1 %s" % _("Minute"), 1), ("2 %s" % _("Minutes"), 2), ("3 %s" % _("Minutes"), 3), ("5 %s" % _("Minutes"), 5), ("10 %s" % _("Minutes"), 10), ("30 %s" % _("Minutes"), 30), ("1 %s" % _("Hour"), 60), (_("Never"), DisplayManager.BIG_NUM / 60)] ''' scrolled_window ''' self.scrolled_window = ScrolledWindow() self.scrolled_window.set_size_request(-1, 425) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.main_box = gtk.VBox() self.main_box.set_size_request(600, -1) self.body_box = gtk.HBox() ''' left, right align ''' self.left_align = self.__setup_align( padding_top=FRAME_TOP_PADDING, padding_left=TEXT_WINDOW_LEFT_PADDING) self.right_align = self.__setup_align(padding_top=FRAME_TOP_PADDING, padding_left=0) ''' left, right box ''' self.left_box = gtk.VBox(spacing=WIDGET_SPACING) self.right_box = gtk.VBox(spacing=WIDGET_SPACING) ''' monitor operation && detect ''' self.monitor_resize_align = self.__setup_align( padding_top=11, padding_left=int(TEXT_WINDOW_LEFT_PADDING / 2)) self.monitor_resize_box = MonitorResizableBox(self.display_manager) self.monitor_resize_box.select_output(self.__current_output_name) self.monitor_resize_box.connect("select-output", self.__select_output) self.monitor_resize_box.connect("resize", self.__resize_box) self.monitor_resize_align.add(self.monitor_resize_box) ''' monitor display ''' self.monitor_display_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_display.png"), _("Display"), 0) ''' monitor ''' self.monitor_align = self.__setup_align() self.monitor_box = gtk.HBox(spacing=WIDGET_SPACING) self.monitor_label = self.__setup_label(_("Monitor")) self.monitor_combo = self.__setup_combo(self.monitor_items) self.monitor_combo.set_select_index( self.display_manager.get_primary_output_name_index( self.monitor_items)) self.monitor_combo.connect("item-selected", self.__combo_item_selected, "monitor_combo") self.__widget_pack_start(self.monitor_box, [self.monitor_label, self.monitor_combo]) self.monitor_align.add(self.monitor_box) ''' goto individuation or power setting ''' self.goto_align = self.__setup_align() self.goto_box = gtk.VBox(spacing=WIDGET_SPACING) self.goto_label = self.__setup_label(_("Relevant Settings"), text_size=TITLE_FONT_SIZE, width=None, align=ALIGN_START) goto_color = GOTO_FG_COLOR self.goto_individuation_label = self.__setup_label(text=_( "<span foreground=\"%s\" underline=\"single\">Personalization</span>" ) % goto_color, width=None, align=ALIGN_START) self.goto_individuation_label.connect("button-press-event", self.__button_press, "individuation") set_clickable_cursor(self.goto_individuation_label) self.goto_power_label = self.__setup_label( text=_("<span foreground=\"%s\" underline=\"single\">Power</span>") % goto_color, width=None, align=ALIGN_START) self.goto_power_label.connect("button-press-event", self.__button_press, "power") set_clickable_cursor(self.goto_power_label) self.__widget_pack_start(self.goto_box, [ self.goto_label, self.goto_individuation_label, self.goto_power_label ]) self.goto_align.add(self.goto_box) ''' sizes ''' self.sizes_align = self.__setup_align() self.sizes_box = gtk.HBox(spacing=WIDGET_SPACING) self.sizes_label = self.__setup_label(_("Resolution")) self.sizes_combo = self.__setup_combo(self.sizes_items) if self.sizes_combo: self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) self.sizes_combo.connect("item-selected", self.__combo_item_selected, "sizes_combo") self.__widget_pack_start(self.sizes_box, [self.sizes_label, self.sizes_combo]) self.sizes_align.add(self.sizes_box) ''' rotation ''' self.rotation_align = self.__setup_align() self.rotation_box = gtk.HBox(spacing=WIDGET_SPACING) self.rotation_label = self.__setup_label(_("Rotation")) self.rotation_combo = self.__setup_combo(self.rotation_items) self.rotation_combo.set_select_index( self.display_manager.get_screen_rotation_index( self.__current_output_name)) self.rotation_combo.connect("item-selected", self.__combo_item_selected, "rotation_combo") self.__widget_pack_start(self.rotation_box, [self.rotation_label, self.rotation_combo]) self.rotation_align.add(self.rotation_box) ''' multi-monitors ''' self.multi_monitors_align = self.__setup_align() self.multi_monitors_box = gtk.HBox(spacing=WIDGET_SPACING) self.multi_monitors_label = self.__setup_label(_("Multi-Monitor")) self.multi_monitors_combo = self.__setup_combo( self.multi_monitors_items) self.multi_monitors_combo.set_select_index( self.display_manager.get_multi_monitor_index()) self.multi_monitors_combo.connect("item-selected", self.__combo_item_selected, "multi_monitors_combo") self.__widget_pack_start( self.multi_monitors_box, [self.multi_monitors_label, self.multi_monitors_combo]) self.multi_monitors_align.add(self.multi_monitors_box) if self.display_manager.get_output_count() < 2: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) ''' monitor brightness ''' self.monitor_bright_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_bright.png"), _("Brightness")) ''' brightness ''' self.brightness_align = self.__setup_align() self.brightness_box = gtk.HBox(spacing=2) self.brightness_label_align = self.__setup_align(padding_top=8, padding_left=0, padding_right=5) self.brightness_label = self.__setup_label(_("Brightness")) self.brightness_label_align.add(self.brightness_label) self.brightness_scale = HScalebar( point_dpixbuf=app_theme.get_pixbuf("scalebar/point.png"), value_min=0.1, value_max=1.0) self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33) self.brightness_scale.set_value( self.display_manager.get_screen_brightness()) self.brightness_scale.connect("value-changed", self.__set_brightness) self.__widget_pack_start( self.brightness_box, [self.brightness_label_align, self.brightness_scale]) self.brightness_align.add(self.brightness_box) ''' auto adjust monitor brightness ''' self.auto_adjust_align = self.__setup_align() self.auto_adjust_box = gtk.HBox(spacing=WIDGET_SPACING) self.auto_adjust_label = self.__setup_label(_("Auto-Brightness")) self.auto_adjust_toggle_align = self.__setup_align(padding_top=4, padding_left=158) self.auto_adjust_toggle = self.__setup_toggle() self.auto_adjust_toggle.set_active( self.display_manager.is_enable_close_monitor()) self.auto_adjust_toggle.connect("toggled", self.__toggled, "auto_adjust_toggle") self.auto_adjust_toggle_align.add(self.auto_adjust_toggle) self.__widget_pack_start( self.auto_adjust_box, [self.auto_adjust_label, self.auto_adjust_toggle_align]) self.auto_adjust_align.add(self.auto_adjust_box) ''' close monitor ''' self.close_monitor_align = self.__setup_align() self.close_monitor_box = gtk.HBox(spacing=WIDGET_SPACING) self.close_monitor_label = self.__setup_label(_("Turn off monitor")) self.close_monitor_combo = self.__setup_combo(self.duration_items) self.close_monitor_combo.set_select_index( self.display_manager.get_close_monitor_index(self.duration_items)) self.close_monitor_combo.connect("item-selected", self.__combo_item_selected, "close_monitor_combo") self.__widget_pack_start( self.close_monitor_box, [self.close_monitor_label, self.close_monitor_combo]) self.close_monitor_align.add(self.close_monitor_box) ''' monitor lock ''' self.monitor_lock_align = self.__setup_title_align( app_theme.get_pixbuf("lock/lock.png"), _("Lock Screen")) ''' auto monitor lock ''' self.auto_lock_align = self.__setup_align() self.auto_lock_box = gtk.HBox(spacing=WIDGET_SPACING) self.auto_lock_label = self.__setup_label( _("Lock screen automatically")) self.auto_lock_toggle_align = self.__setup_align(padding_top=4, padding_left=158) self.auto_lock_toggle = self.__setup_toggle() is_enable_lock_display = self.display_manager.is_enable_lock_display() self.auto_lock_toggle.set_active(is_enable_lock_display) self.auto_lock_toggle.connect("toggled", self.__toggled, "auto_lock_toggle") self.auto_lock_toggle_align.add(self.auto_lock_toggle) self.__widget_pack_start( self.auto_lock_box, [self.auto_lock_label, self.auto_lock_toggle_align]) self.auto_lock_align.add(self.auto_lock_box) ''' lock display ''' self.lock_display_align = self.__setup_align(padding_bottom=20) self.lock_display_box = gtk.HBox(spacing=WIDGET_SPACING) self.lock_display_label = self.__setup_label(_("Lock Screen")) self.lock_display_combo = self.__setup_combo(self.duration_items) self.lock_display_combo.set_select_index( self.display_manager.get_lock_display_index(self.duration_items)) self.lock_display_combo.connect("item-selected", self.__combo_item_selected, "lock_display_combo") self.__widget_pack_start( self.lock_display_box, [self.lock_display_label, self.lock_display_combo]) self.lock_display_align.add(self.lock_display_box) ''' left_align pack_start ''' self.__widget_pack_start( self.left_box, [ self.monitor_display_align, self.monitor_align, self.sizes_align, self.rotation_align, self.multi_monitors_align, self.monitor_bright_align, self.brightness_align, #self.auto_adjust_align, #self.close_monitor_align, self.monitor_lock_align, self.auto_lock_align, self.lock_display_align ]) self.left_align.add(self.left_box) ''' right_align pack_start ''' self.__widget_pack_start(self.right_box, [self.goto_align]) self.right_box.set_size_request(280, -1) self.right_align.add(self.right_box) ''' main && body box ''' self.main_box.pack_start(self.monitor_resize_align, False, False) self.body_box.pack_start(self.left_align) self.body_box.pack_start(self.right_align, False, False) self.main_box.pack_start(self.body_box) ''' this->HBox pack_start ''' self.scrolled_window.add_child(self.main_box) self.pack_start(self.scrolled_window) self.__send_message("status", ("display", "")) def show_again(self): self.__send_message("status", ("display", "")) def reset(self): self.__send_message("status", ("display", _("Reset to default value"))) self.display_manager.reset() self.close_monitor_combo.set_select_index( self.display_manager.get_close_monitor_index(self.duration_items)) self.lock_display_combo.set_select_index( self.display_manager.get_lock_display_index(self.duration_items)) self.multi_monitors_combo.set_select_index(0) def __handle_dbus_replay(self, *reply): pass def __handle_dbus_error(self, *error): pass def __send_message(self, message_type, message_content): if is_dbus_name_exists(APP_DBUS_NAME): bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME, APP_OBJECT_NAME) method = bus_object.get_dbus_method("message_receiver") method(message_type, message_content, reply_handler=self.__handle_dbus_replay, error_handler=self.__handle_dbus_error) def __button_press(self, widget, event, module_id): self.__send_message("goto", (module_id, "")) def __expose(self, widget, event): try: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() except e: print "DEBUG", e def __change_current_output(self, output_name, from_monitor_combo=True): self.__current_output_name = output_name if not from_monitor_combo: self.monitor_combo.set_select_index( self.display_manager.get_output_name_index( output_name, self.monitor_items)) if not self.display_manager.is_copy_monitors(): self.__setup_sizes_items() if len(self.sizes_items): self.sizes_combo.add_items(items=self.sizes_items) self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) def __select_output(self, widget, output_name): print "Output name:", output_name self.__change_current_output(output_name, False) def __set_same_sizes(self): same_sizes = self.display_manager.get_same_sizes( self.display_manager.get_screen_sizes(self.monitor_items[0][1]), self.display_manager.get_screen_sizes(self.monitor_items[1][1])) i = 0 del self.sizes_items[:] while i < len(same_sizes): self.sizes_items.append((same_sizes[i], i)) i += 1 def __xrandr_changed(self, key): if key == "output-names": self.display_manager.init_xml() self.__setup_monitor_items() self.monitor_combo.add_items(items=self.monitor_items) if len(self.monitor_items) > 1: if self.display_manager.is_copy_monitors(): self.__set_same_sizes() self.sizes_combo.add_items(items=self.sizes_items) self.multi_monitors_align.set_size_request(-1, 30) self.multi_monitors_align.set_child_visible(True) else: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) return if key == "brightness": self.brightness_scale.set_value( self.display_manager.get_screen_brightness()) return def __set_brightness_value(self, value): self.display_manager.set_screen_brightness(self.__current_output_name, value) def __set_brightness(self, widget, event): value = self.brightness_scale.get_value() self.__send_message( "status", ("display", _("Changed brightness to %d%%") % int(value * 100))) if self.brightness_id: gobject.source_remove(self.brightness_id) self.brightness_id = gobject.timeout_add_seconds( 1, self.__set_brightness_value, value) def __setup_monitor_items(self): self.__output_names = self.display_manager.get_output_names() del self.monitor_items[:] i = 0 while (i < len(self.__output_names)): self.monitor_items.append( self.display_manager.get_output_name(self.__output_names[i])) i += 1 def __setup_sizes_items(self): screen_sizes = self.display_manager.get_screen_sizes( self.__current_output_name) del self.sizes_items[:] i = 0 while i < len(screen_sizes): self.sizes_items.append((screen_sizes[i], i)) i += 1 def __toggled(self, widget, object=None): if object == "auto_adjust_toggle": if not widget.get_active(): self.__send_message( "status", ("display", _("Changed to manual adjustment"))) self.display_manager.set_close_monitor(DisplayManager.BIG_NUM / 60) else: self.__send_message( "status", ("display", _("Changed to automatic adjustment"))) return if object == "auto_lock_toggle": if not widget.get_active(): self.lock_display_combo.set_sensitive(False) self.__send_message("status", ("display", _("Changed to manual lock"))) else: self.lock_display_combo.set_sensitive(True) self.__send_message( "status", ("display", _("Changed to automatic lock"))) return def __combo_item_selected(self, widget, item_text=None, item_value=None, item_index=None, object=None): if object == "monitor_combo": self.__send_message( "status", ("display", _("Changed current output to %s") % item_text)) self.__change_current_output(item_value) return if object == "sizes_combo": size = self.sizes_items[item_value][0] self.__send_message( "status", ("display", _("Changed resolution to %s") % size)) self.display_manager.set_screen_size(self.__current_output_name, size) return if object == "rotation_combo": self.__send_message( "status", ("display", _("Changed rotation to %s") % item_text)) self.display_manager.set_screen_rotation( self.__current_output_name, item_value) return if object == "multi_monitors_combo": self.__send_message( "status", ("display", _("Changed multi-monitor mode to %s") % item_text)) self.display_manager.set_multi_monitor(item_value) return if object == "close_monitor_combo": self.__send_message("status", ( "display", _("Idle time before turning off display has been changed to to %s" ) % item_text)) self.display_manager.set_close_monitor(item_value) return if object == "lock_display_combo": self.__send_message( "status", ("display", _("Idle time before locking display has been changed to %s") % item_text)) if item_value == DisplayManager.BIG_NUM / 60: self.auto_lock_toggle.set_active(False) else: self.auto_lock_toggle.set_active(True) self.display_manager.set_lock_display(item_value) return def __resize_box(self, widget, height): self.monitor_resize_box.set_size_request(self.resize_width, height - FRAME_TOP_PADDING) def __setup_separator(self): hseparator = HSeparator( app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0) hseparator.set_size_request(500, HSEPARATOR_HEIGHT) return hseparator def __setup_title_label( self, text="", text_color=app_theme.get_color("globalTitleForeground"), text_size=TITLE_FONT_SIZE, text_x_align=ALIGN_START, label_width=180): return Label(text=text, text_color=text_color, text_size=text_size, text_x_align=text_x_align, label_width=label_width, enable_select=False, enable_double_click=False) def __setup_label(self, text="", text_size=CONTENT_FONT_SIZE, width=180, align=ALIGN_END, wrap_width=None): label = Label(text=text, text_color=None, text_size=text_size, text_x_align=align, label_width=width, wrap_width=wrap_width, enable_select=False, enable_double_click=False) return label def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH): if len(items) == 0: return None combo = ComboBox(items=items, select_index=0, max_width=width, fixed_width=width) combo.set_size_request(width, WIDGET_HEIGHT) return combo def __setup_toggle(self): toggle = ToggleButton( app_theme.get_pixbuf("toggle_button/inactive_normal.png"), app_theme.get_pixbuf("toggle_button/active_normal.png")) return toggle def __setup_title_align(self, pixbuf, text, padding_top=FRAME_TOP_PADDING, padding_left=0): align = self.__setup_align(padding_top=padding_top, padding_left=padding_left) align_box = gtk.VBox(spacing=WIDGET_SPACING) title_box = gtk.HBox(spacing=WIDGET_SPACING) image = ImageBox(pixbuf) label = self.__setup_title_label(text) separator = self.__setup_separator() self.__widget_pack_start(title_box, [image, label]) self.__widget_pack_start(align_box, [title_box, separator]) align.add(align_box) return align def __setup_align(self, xalign=0, yalign=0, xscale=0, yscale=0, padding_top=0, padding_bottom=0, padding_left=FRAME_LEFT_PADDING + int(WIDGET_SPACING / 2), padding_right=0): align = gtk.Alignment() align.set(xalign, yalign, xscale, yscale) align.set_padding(padding_top, padding_bottom, padding_left, padding_right) align.connect("expose-event", self.__expose) return align def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False): if parent_widget == None: return for item in widgets: parent_widget.pack_start(item, expand, fill)