Screen rotation and keys

david at lang.hm david at lang.hm
Mon Jan 28 03:00:59 EST 2008


On Sun, 27 Jan 2008, Klaus Weidner wrote:

> On Sun, Jan 27, 2008 at 03:08:34AM -0800, david at lang.hm wrote:
>> Klaus Weidner wrote:
>>> How about the following:
>>>
>>> - by default, the rotate key rotates both the screen and the rocker
>>>  switch, so that pressing the rocker towards the (logical) top of the
>>>  screen always generates an "Up" arrow keystroke. The game keys don't
>>>  rotate.
>>>
>>> - applications can choose to get notified of rotation events and the
>>> new
>>>  orientation in case they want to add actions to the default ones, such
>>>  as optimizing the screen layout for the new orientation.
>>>
>>> - applications can disable auto-rotation, making the rotate button
>>>  available for the application as a normal input. The rocker switch
>>>  doesn't get auto-modified and stays under app control.
>>>
>>> I think it would be important to have something sane happen by default,
>>> and that would let non-rotation-aware apps have basic functionality.
>>
>> I would agree with this proposal. if an application chooses to disable
>> auto-rotation they should be able to re-map all 9 of the game keys. it
>> would be nice to have this done in a way that would be able to be
>> scripted
>> (for use in the terminal window for example)
>>
>> note that the rotation could still take place when other applications are
>> active, so the application still needs to be able to respond to resize
>> events (which should be standard for apps that live in a GUI environment
>> anyway, even if they are text apps that run in an xterm)
>
> It's not just resizing - if a different application rotates the screen,
> that happens via xrandr, and the X server rearranges its framebuffer
> internally to match the orientation. All apps will be flipped if they
> want to be or not, not just resized. It would have to tell the X server
> to flip back if it needed a specific orientation.
>
> So a non-rotating app would need to check for rotations and force a
> specific orientation when it starts, and whenever it regains its status
> as active app if the user had switched away.

since the app has no idea why the user did the rotation, I don't think it 
has any justification in forcing the rotation to anything.

>> while I understand the desire to avoid modal operation and also to not
>> have the e-book mode operate by moving a pointer around, I think that the
>> ability to switch to a mode where you can toggle between the existing
>> functions of the gamepad keys and a mode where the arrows move the mouse
>> pointer and X and O mimic the mouse buttons (with matching lables) would
>> be extremely useful for applications that have not been converted yet.
>>
>> in fact, how's this for an idea?
>>
>> in e-book mode (screen rotated and flat against the keyboard) the rotate
>> button doesn't rotate the screen, instead it toggles between existing
>> behavior and pointer mode. you could change the shape of the exit icon
>> when in pointer mode to indicate what mode you are in.
>
> I can see how this can be useful (I once did similar things to run X apps
> that need 3 mouse buttons on a touchscren handheld), but the modality
> combined with moving the pointer with cursor keys quickly gets
> frustrating. I think it's probably better to use the e-book mode just for
> applications that are designed to work with it - you can just use the
> normal notebook mode for non-converted apps if necessary.

sometimes it's just a lot more convienient to fold the screen down (when 
walking for example). e-book mode isn't just for running book 
applications. browsing is a case where you have no control over what's 
happening, and there are cases where you need a pointer to navigate 
reasonably (you aren't going to fix every website in the world to work 
with your app, microsoft tried and failed, and you don't have nearly the 
power they did)

> Also, you lose the function of the rotate button to rotate the screen,
> and I think people expect that to work. I guess you could use something
> like a long press as opposed to a short press, but that violates the
> principle of least surprise.

all you would have to do to get the rotation functionality back is to lift 
the screen an inch or two and hit the rotation button.

David Lang
-------------- next part --------------
diff --git a/shell/ev-view.c b/shell/ev-view.c
index b464c3f..3bfe7da 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -360,7 +360,7 @@ scroll_to_current_page (EvView *view, GtkOrientation orientation)
 						   view_point.y + view->vadjustment->page_size);
 		} else {
 			gtk_adjustment_set_value (view->vadjustment,
-						  CLAMP (view_point.y,
+						  CLAMP (view->vadjustment->value,
 						  view->vadjustment->lower,
 						  view->vadjustment->upper -
 						  view->vadjustment->page_size));
@@ -372,7 +372,7 @@ scroll_to_current_page (EvView *view, GtkOrientation orientation)
 						   view_point.x + view->hadjustment->page_size);
 		} else {
 			gtk_adjustment_set_value (view->hadjustment,
-						  CLAMP (view_point.x,
+						  CLAMP (view->hadjustment->value,
 						  view->hadjustment->lower,
 						  view->hadjustment->upper -
 						  view->hadjustment->page_size));
@@ -3996,6 +3996,8 @@ ev_view_class_init (EvViewClass *class)
 
 	binding_set = gtk_binding_set_by_class (class);
 
+	add_scroll_binding_keypad (binding_set, GDK_Page_Up,  0, EV_SCROLL_PAGE_BACKWARD, FALSE);
+	add_scroll_binding_keypad (binding_set, GDK_Page_Down, 0, EV_SCROLL_PAGE_FORWARD,  FALSE);
 	add_scroll_binding_keypad (binding_set, GDK_Left,  0, EV_SCROLL_STEP_BACKWARD, TRUE);
 	add_scroll_binding_keypad (binding_set, GDK_Right, 0, EV_SCROLL_STEP_FORWARD,  TRUE);
 	add_scroll_binding_keypad (binding_set, GDK_Left,  GDK_MOD1_MASK, EV_SCROLL_STEP_DOWN, TRUE);
-------------- next part --------------
diff --git a/readactivity.py b/readactivity.py
index 956e3b0..99b9244 100644
--- a/readactivity.py
+++ b/readactivity.py
@@ -95,7 +95,7 @@ class ReadActivity(activity.Activity):
         toolbox.add_toolbar(_('Read'), self._read_toolbar)
         self._read_toolbar.show()
 
-        self._view_toolbar = ViewToolbar(self._view)
+        self._view_toolbar = ViewToolbar(self._view, self)
         self._view_toolbar.connect('needs-update-size',
                 self.__view_toolbar_needs_update_size_cb)
         toolbox.add_toolbar(_('View'), self._view_toolbar)
diff --git a/readtoolbar.py b/readtoolbar.py
index 332e4fa..be475b2 100644
--- a/readtoolbar.py
+++ b/readtoolbar.py
@@ -258,9 +258,10 @@ class ViewToolbar(gtk.Toolbar):
                               ([]))
     }
 
-    def __init__(self, evince_view):
+    def __init__(self, evince_view, activity):
         gtk.Toolbar.__init__(self)
 
+        self._activity = activity
         self._evince_view = evince_view
         self._document = None
             
@@ -293,6 +294,16 @@ class ViewToolbar(gtk.Toolbar):
         palette.menu.append(menu_item)
         menu_item.show()
 
+        menu_item = MenuItem(_('Single pages'))
+        menu_item.connect('activate', self._continuous_false_menu_item_activate_cb)
+        palette.menu.append(menu_item)
+        menu_item.show()
+
+        menu_item = MenuItem(_('Continuous pages'))
+        menu_item.connect('activate', self._continuous_true_menu_item_activate_cb)
+        palette.menu.append(menu_item)
+        menu_item.show()
+
         tool_item = gtk.ToolItem()
         self.insert(tool_item, -1)
         tool_item.show()
@@ -313,6 +324,14 @@ class ViewToolbar(gtk.Toolbar):
         self.insert(tool_item_zoom_perc_label, -1)
         tool_item_zoom_perc_label.show()
 
+        self._view_fullscreen = ToolButton('view-fullscreen')
+        self._view_fullscreen.set_tooltip(_('Fullscreen mode'))
+        self._view_fullscreen.connect('clicked', self._view_fullscreen_cb)
+        self.insert(self._view_fullscreen, -1)
+        self._view_fullscreen.show()
+
+        self._zoom_to_width.show()
+
         self._view_notify_zoom_handler = self._evince_view.connect(
                 'notify::zoom', self._view_notify_zoom_cb)
 
@@ -364,3 +383,12 @@ class ViewToolbar(gtk.Toolbar):
         self._evince_view.props.zoom = 1.0
         self._update_zoom_buttons()
 
+    def _continuous_false_menu_item_activate_cb(self, menu_item):
+        self._evince_view.set_continuous(False)
+
+    def _continuous_true_menu_item_activate_cb(self, menu_item):
+        self._evince_view.set_continuous(True)
+
+    def _view_fullscreen_cb(self, button):
+        self._activity.fullscreen()
+
-------------- next part --------------
_______________________________________________
Devel mailing list
Devel at lists.laptop.org
http://lists.laptop.org/listinfo/devel


More information about the Devel mailing list