]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
sync with blackbox
[chaz/openbox] / src / Screen.cc
index d03fa50e6415d73cd19cc7cbd85be6b427f5de5e..3d51a2d20164d9775021448beedc7e0bdb55ef6f 100644 (file)
@@ -417,10 +417,29 @@ void BScreen::saveHideToolbar(bool h) {
 }
 
 
-void BScreen::saveWindowToWindowSnap(bool s) {
-  resource.window_to_window_snap = s;
-  config->setValue(screenstr + "windowToWindowSnap",
-                   resource.window_to_window_snap);
+void BScreen::saveWindowToEdgeSnap(int s) {
+  resource.snap_to_edges = s;
+
+  const char *snap;
+  switch (resource.snap_to_edges) {
+  case WindowNoSnap: snap = "NoSnap"; break;
+  case WindowResistance: snap = "Resistance"; break;
+  case WindowSnap: default: snap = "Snap"; break;
+  }
+  config->setValue(screenstr + "windowToEdgeSnap", snap);
+}
+
+
+void BScreen::saveWindowToWindowSnap(int s) {
+  resource.snap_to_windows = s;
+  
+  const char *snap;
+  switch (resource.snap_to_windows) {
+  case WindowNoSnap: snap = "NoSnap"; break;
+  case WindowResistance: snap = "Resistance"; break;
+  case WindowSnap: default: snap = "Snap"; break;
+  }
+  config->setValue(screenstr + "windowToWindowSnap", snap);
 }
 
 
@@ -457,10 +476,24 @@ void BScreen::savePlacementPolicy(int p) {
 }
 
 
-void BScreen::saveEdgeSnapThreshold(int t) {
-  resource.edge_snap_threshold = t;
+void BScreen::saveResistanceSize(int s) {
+  resource.resistance_size = s;
+  config->setValue(screenstr + "resistanceSize",
+                   resource.resistance_size);
+}
+
+
+void BScreen::saveSnapThreshold(int t) {
+  resource.snap_threshold = t;
   config->setValue(screenstr + "edgeSnapThreshold",
-                   resource.edge_snap_threshold);
+                   resource.snap_threshold);
+}
+
+
+void BScreen::saveSnapOffset(int t) {
+  resource.snap_offset = t;
+  config->setValue(screenstr + "edgeSnapOffset",
+                   resource.snap_offset);
 }
 
 
@@ -567,11 +600,14 @@ void BScreen::save_rc(void) {
   saveFocusNew(resource.focus_new);
   saveFocusLast(resource.focus_last);
   saveHideToolbar(resource.hide_toolbar);
-  saveWindowToWindowSnap(resource.window_to_window_snap);
+  saveWindowToWindowSnap(resource.snap_to_windows);
+  saveWindowToEdgeSnap(resource.snap_to_edges);
   saveWindowCornerSnap(resource.window_corner_snap);
   saveWorkspaces(resource.workspaces);
   savePlacementPolicy(resource.placement_policy);
-  saveEdgeSnapThreshold(resource.edge_snap_threshold);
+  saveSnapThreshold(resource.snap_threshold);
+  saveSnapOffset(resource.snap_offset);
+  saveResistanceSize(resource.resistance_size);
   saveRowPlacementDirection(resource.row_direction);
   saveColPlacementDirection(resource.col_direction);
 #ifdef    HAVE_STRFTIME
@@ -621,9 +657,21 @@ void BScreen::load_rc(void) {
   if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar))
     resource.hide_toolbar = false;
 
-  if (! config->getValue(screenstr + "windowToWindowSnap",
-                         resource.window_to_window_snap))
-    resource.window_to_window_snap = true;
+  resource.snap_to_windows = WindowResistance;
+  if (config->getValue(screenstr + "windowToWindowSnap", s)) {
+    if (s == "NoSnap")
+      resource.snap_to_windows = WindowNoSnap;
+    else if (s == "Snap")
+      resource.snap_to_windows = WindowSnap;
+  }
+
+  resource.snap_to_edges = WindowResistance;
+  if (config->getValue(screenstr + "windowToEdgeSnap", s)) {
+    if (s == "NoSnap")
+      resource.snap_to_edges = WindowNoSnap;
+    else if (s == "Snap")
+      resource.snap_to_edges = WindowSnap;
+  }
 
   if (! config->getValue(screenstr + "windowCornerSnap",
                          resource.window_corner_snap))
@@ -633,9 +681,19 @@ void BScreen::load_rc(void) {
     b = true;
   image_control->setDither(b);
 
+  if (! config->getValue(screenstr + "edgeSnapOffset",
+                        resource.snap_offset))
+    resource.snap_offset = 0;
+  if (resource.snap_offset > 50)  // sanity check, setting this huge would
+    resource.snap_offset = 50;    // seriously suck.
+  
   if (! config->getValue(screenstr + "edgeSnapThreshold",
-                        resource.edge_snap_threshold))
-    resource.edge_snap_threshold = 4;
+                        resource.snap_threshold))
+    resource.snap_threshold = 4;
+  
+  if (! config->getValue(screenstr + "resistanceSize",
+                        resource.resistance_size))
+    resource.resistance_size = 18;
   
   if (config->getValue(screenstr + "rowPlacementDirection", s) &&
       s == "RightToLeft")
@@ -1071,7 +1129,8 @@ void BScreen::removeIcon(BlackboxWindow *w) {
 BlackboxWindow *BScreen::getIcon(unsigned int index) {
   if (index < iconList.size()) {
     BlackboxWindowList::iterator it = iconList.begin();
-    for (; index > 0; --index, ++it) ; /* increment to index */
+    while (index-- > 0) // increment to index
+      ++it;
     return *it;
   }
 
@@ -1127,38 +1186,20 @@ unsigned int BScreen::removeLastWorkspace(void) {
 void BScreen::changeWorkspaceID(unsigned int id) {
   if (! current_workspace || id == current_workspace->getID()) return;
 
-  BlackboxWindow *focused = blackbox->getFocusedWindow();
-  if (focused && focused->getScreen() == this) {
-    assert(focused->isStuck() ||
-           focused->getWorkspaceNumber() == current_workspace->getID());
-
-    current_workspace->setLastFocusedWindow(focused);
-  } else {
-    // if no window had focus, no need to store a last focus
-    current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
-  }
+  current_workspace->hide();
 
-  // when we switch workspaces, unfocus whatever was focused
-  blackbox->setFocusedWindow((BlackboxWindow *) 0);
-    
-  current_workspace->hideAll();
   workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
 
   current_workspace = getWorkspace(id);
 
+  current_workspace->show();
+
   xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
                   XAtom::cardinal, id);
 
   workspacemenu->setItemSelected(current_workspace->getID() + 2, True);
   toolbar->redrawWorkspaceLabel(True);
 
-  current_workspace->showAll();
-
-  if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
-    XSync(blackbox->getXDisplay(), False);
-    current_workspace->getLastFocusedWindow()->setInputFocus();
-  }
-
   updateNetizenCurrentWorkspace();
 }
 
@@ -1448,7 +1489,7 @@ void BScreen::updateNetizenConfigNotify(XEvent *e) {
 
 void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
   // the 13 represents the number of blackbox windows such as menus
-  int bbwins = 13;
+  int bbwins = 15;
 #ifdef    XINERAMA
   ++bbwins;
 #endif // XINERAMA
@@ -1469,6 +1510,8 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
 
   *(session_stack + i++) = configmenu->getFocusmenu()->getWindowID();
   *(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID();
+  *(session_stack + i++) = configmenu->getWindowSnapmenu()->getWindowID();
+  *(session_stack + i++) = configmenu->getEdgeSnapmenu()->getWindowID();
 #ifdef    XINERAMA
   *(session_stack + i++) = configmenu->getXineramamenu()->getWindowID();
 #endif // XINERAMA
@@ -1730,12 +1773,13 @@ void BScreen::InitMenu(void) {
 
 
 static
-void string_within(char begin, char end, const char *input, size_t length,
-                   char *output) {
+size_t string_within(char begin, char end,
+                     const char *input, size_t start_at, size_t length,
+                     char *output) {
   bool parse = False;
   size_t index = 0;
-
-  for (size_t i = 0; i < length; ++i) {
+  size_t i = start_at;
+  for (; i < length; ++i) {
     if (input[i] == begin) {
       parse = True;
     } else if (input[i] == end) {
@@ -1750,6 +1794,8 @@ void string_within(char begin, char end, const char *input, size_t length,
     output[index] = '\0';
   else
     output[0] = '\0';
+
+  return i;
 }
 
 
@@ -1772,7 +1818,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
     unsigned int key = 0;
 
     // get the keyword enclosed in []'s
-    string_within('[', ']', line, line_length, keyword);
+    size_t pos = string_within('[', ']', line, 0, line_length, keyword);
 
     if (keyword[0] == '\0') {  // no keyword, no menu entry
       continue;
@@ -1785,10 +1831,10 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
     }
 
     // get the label enclosed in ()'s
-    string_within('(', ')', line, line_length, label);
+    pos = string_within('(', ')', line, pos, line_length, label);
 
     // get the command enclosed in {}'s
-    string_within('{', '}', line, line_length, command);
+    pos = string_within('{', '}', line, pos, line_length, command);
 
     switch (key) {
     case 311: // end
This page took 0.024987 seconds and 4 git commands to generate.